Feat Telegramas Busquedas
This commit is contained in:
		| @@ -208,4 +208,9 @@ export const getRankingResultadosPorSeccion = async (seccionId: string): Promise | |||||||
| export const getRankingMunicipiosPorSeccion = async (seccionId: string): Promise<ApiResponseRankingMunicipio> => { | export const getRankingMunicipiosPorSeccion = async (seccionId: string): Promise<ApiResponseRankingMunicipio> => { | ||||||
|   const { data } = await apiClient.get(`/resultados/ranking-municipios-por-seccion/${seccionId}`); |   const { data } = await apiClient.get(`/resultados/ranking-municipios-por-seccion/${seccionId}`); | ||||||
|   return data; |   return data; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export const getEstablecimientosPorMunicipio = async (municipioId: string): Promise<CatalogoItem[]> => { | ||||||
|  |   const response = await apiClient.get(`/catalogos/establecimientos-por-municipio/${municipioId}`); | ||||||
|  |   return response.data; | ||||||
| }; | }; | ||||||
| @@ -1,12 +1,13 @@ | |||||||
| // src/components/TelegramaWidget.tsx | // src/components/TelegramaWidget.tsx | ||||||
| import { useState, useEffect } from 'react'; | import { useState, useEffect, useMemo } from 'react'; | ||||||
|  | import Select, { type FilterOptionOption } from 'react-select'; // <-- Importar react-select | ||||||
| import { | import { | ||||||
|   getSecciones, |   getSecciones, | ||||||
|   getMunicipiosPorSeccion, |   getMunicipiosPorSeccion, | ||||||
|   getCircuitosPorMunicipio, |   getEstablecimientosPorMunicipio, // <-- Nueva función | ||||||
|   getEstablecimientosPorCircuito, |  | ||||||
|   getMesasPorEstablecimiento, |   getMesasPorEstablecimiento, | ||||||
|   getTelegramaPorId |   getTelegramaPorId, | ||||||
|  |   assetBaseUrl | ||||||
| } from '../apiService'; | } from '../apiService'; | ||||||
| import type { TelegramaData, CatalogoItem } from '../types/types'; | import type { TelegramaData, CatalogoItem } from '../types/types'; | ||||||
| import './TelegramaWidget.css'; | import './TelegramaWidget.css'; | ||||||
| @@ -15,103 +16,152 @@ import { pdfjs, Document, Page } from 'react-pdf'; | |||||||
| import 'react-pdf/dist/Page/AnnotationLayer.css'; | import 'react-pdf/dist/Page/AnnotationLayer.css'; | ||||||
| import 'react-pdf/dist/Page/TextLayer.css'; | import 'react-pdf/dist/Page/TextLayer.css'; | ||||||
|  |  | ||||||
| pdfjs.GlobalWorkerOptions.workerSrc = '/pdf.worker.min.mjs'; | pdfjs.GlobalWorkerOptions.workerSrc = `${assetBaseUrl}/pdf.worker.min.mjs`; | ||||||
|  |  | ||||||
|  | // Estilos para los selectores | ||||||
|  | const customSelectStyles = { | ||||||
|  |   control: (base: any) => ({ ...base, marginBottom: '1rem' }), | ||||||
|  |   menu: (base: any) => ({ ...base, zIndex: 10 }), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // --- FUNCIÓN DE FILTRO "SMART SEARCH" --- | ||||||
|  | const smartSearchFilter = ( | ||||||
|  |   option: FilterOptionOption<{ label: string; value: string }>, | ||||||
|  |   inputValue: string | ||||||
|  | ) => { | ||||||
|  |   // 1. Si no hay entrada de búsqueda, muestra todas las opciones. | ||||||
|  |   if (!inputValue) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // 2. Normalizamos tanto la etiqueta de la opción como la entrada del usuario: | ||||||
|  |   //    - a minúsculas | ||||||
|  |   //    - quitamos los acentos (si fuera necesario, aunque aquí no tanto) | ||||||
|  |   const normalizedLabel = option.label.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); | ||||||
|  |   const normalizedInput = inputValue.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); | ||||||
|  |  | ||||||
|  |   // 3. Dividimos la entrada del usuario en palabras individuales. | ||||||
|  |   const searchTerms = normalizedInput.split(' ').filter(term => term.length > 0); | ||||||
|  |  | ||||||
|  |   // 4. La opción es válida si CADA TÉRMINO de búsqueda está incluido en la etiqueta. | ||||||
|  |   return searchTerms.every(term => normalizedLabel.includes(term)); | ||||||
|  | }; | ||||||
|  |  | ||||||
| export const TelegramaWidget = () => { | export const TelegramaWidget = () => { | ||||||
|   // Estados para los filtros geográficos |   // Estados para los datos de los dropdowns | ||||||
|   const [secciones, setSecciones] = useState<CatalogoItem[]>([]); |   const [secciones, setSecciones] = useState<CatalogoItem[]>([]); | ||||||
|   const [municipios, setMunicipios] = useState<CatalogoItem[]>([]); |   const [municipios, setMunicipios] = useState<CatalogoItem[]>([]); | ||||||
|   const [circuitos, setCircuitos] = useState<CatalogoItem[]>([]); |  | ||||||
|   const [establecimientos, setEstablecimientos] = useState<CatalogoItem[]>([]); |   const [establecimientos, setEstablecimientos] = useState<CatalogoItem[]>([]); | ||||||
|   const [mesas, setMesas] = useState<CatalogoItem[]>([]); |   const [mesas, setMesas] = useState<CatalogoItem[]>([]); | ||||||
|  |  | ||||||
|   // Estados para los valores seleccionados |   // Estados para los valores seleccionados (adaptados para react-select) | ||||||
|   const [selectedSeccion, setSelectedSeccion] = useState(''); |   const [selectedSeccion, setSelectedSeccion] = useState<{ value: string; label: string } | null>(null); | ||||||
|   const [selectedMunicipio, setSelectedMunicipio] = useState(''); |   const [selectedMunicipio, setSelectedMunicipio] = useState<{ value: string; label: string } | null>(null); | ||||||
|   const [selectedCircuito, setSelectedCircuito] = useState(''); |   const [selectedEstablecimiento, setSelectedEstablecimiento] = useState<{ value: string; label: string } | null>(null); | ||||||
|   const [selectedEstablecimiento, setSelectedEstablecimiento] = useState(''); |   const [selectedMesa, setSelectedMesa] = useState<{ value: string; label: string } | null>(null); | ||||||
|   const [selectedMesa, setSelectedMesa] = useState(''); |  | ||||||
|  |  | ||||||
|   // Estados para la visualización del telegrama |   // Estados para la visualización del telegrama (sin cambios) | ||||||
|   const [telegrama, setTelegrama] = useState<TelegramaData | null>(null); |   const [telegrama, setTelegrama] = useState<TelegramaData | null>(null); | ||||||
|   const [loading, setLoading] = useState(false); |   const [loading, setLoading] = useState(false); | ||||||
|   const [error, setError] = useState<string | null>(null); |   const [error, setError] = useState<string | null>(null); | ||||||
|  |  | ||||||
|   // Cargar secciones iniciales |   // Cargar secciones iniciales y aplicar orden | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     getSecciones().then(setSecciones); |     getSecciones().then(seccionesData => { | ||||||
|  |       const orden = new Map([ | ||||||
|  |         ['Capital', 0], ['Primera', 1], ['Segunda', 2], ['Tercera', 3], | ||||||
|  |         ['Cuarta', 4], ['Quinta', 5], ['Sexta', 6], ['Séptima', 7] | ||||||
|  |       ]); | ||||||
|  |       const getOrden = (nombre: string) => { | ||||||
|  |         const match = nombre.match(/Capital|Primera|Segunda|Tercera|Cuarta|Quinta|Sexta|Séptima/); | ||||||
|  |         return match ? orden.get(match[0]) ?? 99 : 99; | ||||||
|  |       }; | ||||||
|  |       seccionesData.sort((a, b) => getOrden(a.nombre) - getOrden(b.nombre)); | ||||||
|  |       setSecciones(seccionesData); | ||||||
|  |     }); | ||||||
|   }, []); |   }, []); | ||||||
|  |  | ||||||
|   // Cargar municipios cuando cambia la sección |   // Cargar municipios cuando cambia la sección | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (selectedSeccion) { |     if (selectedSeccion) { | ||||||
|       setMunicipios([]); setCircuitos([]); setEstablecimientos([]); setMesas([]); |       setMunicipios([]); setEstablecimientos([]); setMesas([]); | ||||||
|       setSelectedMunicipio(''); setSelectedCircuito(''); setSelectedEstablecimiento(''); setSelectedMesa(''); |       setSelectedMunicipio(null); setSelectedEstablecimiento(null); setSelectedMesa(null); | ||||||
|       getMunicipiosPorSeccion(selectedSeccion).then(setMunicipios); |       getMunicipiosPorSeccion(selectedSeccion.value).then(setMunicipios); | ||||||
|     } |     } | ||||||
|   }, [selectedSeccion]); |   }, [selectedSeccion]); | ||||||
|  |  | ||||||
|  |   // Cargar establecimientos cuando cambia el municipio (SIN pasar por circuito) | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (selectedMunicipio) { |     if (selectedMunicipio) { | ||||||
|       setCircuitos([]); setEstablecimientos([]); setMesas([]); |       setEstablecimientos([]); setMesas([]); | ||||||
|       setSelectedCircuito(''); setSelectedEstablecimiento(''); setSelectedMesa(''); |       setSelectedEstablecimiento(null); setSelectedMesa(null); | ||||||
|       getCircuitosPorMunicipio(selectedMunicipio).then(setCircuitos); |       getEstablecimientosPorMunicipio(selectedMunicipio.value).then(setEstablecimientos); | ||||||
|     } |     } | ||||||
|   }, [selectedMunicipio]); |   }, [selectedMunicipio]); | ||||||
|  |  | ||||||
|   useEffect(() => { |   // Cargar mesas cuando cambia el establecimiento | ||||||
|     if (selectedCircuito) { |  | ||||||
|       setEstablecimientos([]); setMesas([]); |  | ||||||
|       setSelectedEstablecimiento(''); setSelectedMesa(''); |  | ||||||
|       getEstablecimientosPorCircuito(selectedCircuito).then(setEstablecimientos); |  | ||||||
|     } |  | ||||||
|   }, [selectedCircuito]); |  | ||||||
|  |  | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (selectedEstablecimiento) { |     if (selectedEstablecimiento) { | ||||||
|       setMesas([]); |       setMesas([]); | ||||||
|       setSelectedMesa(''); |       setSelectedMesa(null); | ||||||
|       getMesasPorEstablecimiento(selectedEstablecimiento).then(setMesas); |       getMesasPorEstablecimiento(selectedEstablecimiento.value).then(setMesas); | ||||||
|     } |     } | ||||||
|   }, [selectedEstablecimiento]); |   }, [selectedEstablecimiento]); | ||||||
|  |  | ||||||
|   // Buscar el telegrama cuando se selecciona una mesa |   // Buscar el telegrama cuando se selecciona una mesa | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (selectedMesa) { |     if (selectedMesa) { | ||||||
|       setLoading(true); |       setLoading(true); setError(null); setTelegrama(null); | ||||||
|       setError(null); |       getTelegramaPorId(selectedMesa.value) | ||||||
|       setTelegrama(null); |  | ||||||
|       getTelegramaPorId(selectedMesa) |  | ||||||
|         .then(setTelegrama) |         .then(setTelegrama) | ||||||
|         .catch(() => setError(`El telegrama para la mesa seleccionada, aún no se cargó en el sistema.`)) |         .catch(() => setError(`El telegrama para la mesa seleccionada, aún no se cargó en el sistema.`)) | ||||||
|         .finally(() => setLoading(false)); |         .finally(() => setLoading(false)); | ||||||
|     } |     } | ||||||
|   }, [selectedMesa]); |   }, [selectedMesa]); | ||||||
|          |  | ||||||
|  |   // Formateo de opciones para react-select | ||||||
|  |   const seccionOptions = useMemo(() => secciones.map(s => ({ value: s.id, label: s.nombre })), [secciones]); | ||||||
|  |   const municipioOptions = useMemo(() => municipios.map(m => ({ value: m.id, label: m.nombre })), [municipios]); | ||||||
|  |   const establecimientoOptions = useMemo(() => establecimientos.map(e => ({ value: e.id, label: e.nombre })), [establecimientos]); | ||||||
|  |   const mesaOptions = useMemo(() => mesas.map(m => ({ value: m.id, label: m.nombre })), [mesas]); | ||||||
|  |  | ||||||
|   return ( |   return ( | ||||||
|     <div className="telegrama-container"> |     <div className="telegrama-container"> | ||||||
|       <h4>Consulta de Telegramas por Ubicación</h4> |       <h4>Consulta de Telegramas por Ubicación</h4> | ||||||
|       <div className="filters-grid"> |       <div className="filters-grid"> | ||||||
|         <select value={selectedSeccion} onChange={e => setSelectedSeccion(e.target.value)}> |         <Select | ||||||
|           <option value="">1. Sección</option> |           options={seccionOptions} | ||||||
|           {secciones.map(s => <option key={s.id} value={s.id}>{s.nombre}</option>)} |           value={selectedSeccion} | ||||||
|         </select> |           onChange={setSelectedSeccion} | ||||||
|         <select value={selectedMunicipio} onChange={e => setSelectedMunicipio(e.target.value)} disabled={!municipios.length}> |           placeholder="1. Sección..." | ||||||
|           <option value="">2. Municipio</option> |           styles={customSelectStyles} | ||||||
|           {municipios.map(m => <option key={m.id} value={m.id}>{m.nombre}</option>)} |         /> | ||||||
|         </select> |         <Select | ||||||
|         <select value={selectedCircuito} onChange={e => setSelectedCircuito(e.target.value)} disabled={!circuitos.length}> |           options={municipioOptions} | ||||||
|           <option value="">3. Circuito</option> |           value={selectedMunicipio} | ||||||
|           {circuitos.map(c => <option key={c.id} value={c.id}>{c.nombre}</option>)} |           onChange={setSelectedMunicipio} | ||||||
|         </select> |           placeholder="2. Municipio..." | ||||||
|         <select value={selectedEstablecimiento} onChange={e => setSelectedEstablecimiento(e.target.value)} disabled={!establecimientos.length}> |           isDisabled={!selectedSeccion} | ||||||
|           <option value="">4. Establecimiento</option> |           styles={customSelectStyles} | ||||||
|           {establecimientos.map(e => <option key={e.id} value={e.id}>{e.nombre}</option>)} |         /> | ||||||
|         </select> |         <Select | ||||||
|         <select value={selectedMesa} onChange={e => setSelectedMesa(e.target.value)} disabled={!mesas.length}> |           options={establecimientoOptions} | ||||||
|           <option value="">5. Mesa</option> |           value={selectedEstablecimiento} | ||||||
|           {mesas.map(m => <option key={m.id} value={m.id}>{m.nombre}</option>)} |           onChange={setSelectedEstablecimiento} | ||||||
|         </select> |           placeholder="3. Establecimiento..." | ||||||
|  |           isDisabled={!selectedMunicipio} | ||||||
|  |           styles={customSelectStyles} | ||||||
|  |           filterOption={smartSearchFilter} | ||||||
|  |           isSearchable // Habilitamos la búsqueda | ||||||
|  |         /> | ||||||
|  |         <Select | ||||||
|  |           options={mesaOptions} | ||||||
|  |           value={selectedMesa} | ||||||
|  |           onChange={setSelectedMesa} | ||||||
|  |           placeholder="4. Mesa..." | ||||||
|  |           isDisabled={!selectedEstablecimiento} | ||||||
|  |           styles={customSelectStyles} | ||||||
|  |         /> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|       <div className="telegrama-viewer"> |       <div className="telegrama-viewer"> | ||||||
|   | |||||||
| @@ -157,4 +157,22 @@ public class CatalogosController : ControllerBase | |||||||
|             .Distinct().OrderBy(m => m.Nombre).ToListAsync(); |             .Distinct().OrderBy(m => m.Nombre).ToListAsync(); | ||||||
|         return Ok(mesas); |         return Ok(mesas); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// Obtiene todos los establecimientos de un municipio, sin necesidad de especificar un circuito. | ||||||
|  |     /// </summary> | ||||||
|  |     [HttpGet("establecimientos-por-municipio/{municipioId}")] | ||||||
|  |     public async Task<IActionResult> GetEstablecimientosPorMunicipio(string municipioId) | ||||||
|  |     { | ||||||
|  |         // Buscamos todos los ámbitos de Nivel 60 (Establecimiento) que pertenezcan | ||||||
|  |         // al Municipio (Nivel 30) a través del campo 'SeccionId'. | ||||||
|  |         var establecimientos = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||||
|  |             .Where(a => a.NivelId == 60 && a.SeccionId == municipioId && !string.IsNullOrEmpty(a.EstablecimientoId)) | ||||||
|  |             .Select(a => new { Id = a.EstablecimientoId, a.Nombre }) | ||||||
|  |             .Distinct() | ||||||
|  |             .OrderBy(e => e.Nombre) | ||||||
|  |             .ToListAsync(); | ||||||
|  |  | ||||||
|  |         return Ok(establecimientos); | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -14,7 +14,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7f49362e55449c7400f7099fc78a9c975e8268f1")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c105106f3b420a1c1c19b125cdf5c31e59bfbe3b")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| {"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TyIJk/eQMWjmB5LsDE\u002BZIJC9P9ciVxd7bnzRiTZsGt4=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","A7nz7qgOtQ1CwZZLvNnr0b5QZB3fTi3y4i6y7rBIcxQ=","znnuRi2tsk7AACuYo4WSgj7NcLriG4PKVaF4L35SvDk=","GelE32odx/vTului267wqi6zL3abBnF9yvwC2Q66LoM=","TEsXImnzxFKTIq2f5fiDu7i6Ar/cbecW5MZ3z8Wb/a4=","5WogJu\u002BUPlF\u002BE5mq/ILtDXpVwqwmhHtsEB13nmT5JJk=","dcHQRkttjMjo2dvhL7hA9t4Pg\u002B7OnjZpkFmakT4QR9U=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","taDH73UT7ynWh85nq2etLidK9sPQF85kWam\u002BdE5RD8w=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","wUbgaUpdwuF5YmyAUI1ZjPse4/SaT06idesVz21NM\u002Bk="],"CachedAssets":{},"CachedCopyCandidates":{}} | {"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TyIJk/eQMWjmB5LsDE\u002BZIJC9P9ciVxd7bnzRiTZsGt4=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","A7nz7qgOtQ1CwZZLvNnr0b5QZB3fTi3y4i6y7rBIcxQ=","znnuRi2tsk7AACuYo4WSgj7NcLriG4PKVaF4L35SvDk=","GelE32odx/vTului267wqi6zL3abBnF9yvwC2Q66LoM=","TEsXImnzxFKTIq2f5fiDu7i6Ar/cbecW5MZ3z8Wb/a4=","5WogJu\u002BUPlF\u002BE5mq/ILtDXpVwqwmhHtsEB13nmT5JJk=","dcHQRkttjMjo2dvhL7hA9t4Pg\u002B7OnjZpkFmakT4QR9U=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","Mo7tdPQiZw6/WSnll8t7xy4SU1EoFW4N6EN7JftvBYs=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","eix/dR870pRbtIGVeoF7YpZlG47M4PrBntvgxdO1oDM="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||||
| @@ -1 +1 @@ | |||||||
| {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TyIJk/eQMWjmB5LsDE\u002BZIJC9P9ciVxd7bnzRiTZsGt4=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","A7nz7qgOtQ1CwZZLvNnr0b5QZB3fTi3y4i6y7rBIcxQ=","znnuRi2tsk7AACuYo4WSgj7NcLriG4PKVaF4L35SvDk=","GelE32odx/vTului267wqi6zL3abBnF9yvwC2Q66LoM=","TEsXImnzxFKTIq2f5fiDu7i6Ar/cbecW5MZ3z8Wb/a4=","5WogJu\u002BUPlF\u002BE5mq/ILtDXpVwqwmhHtsEB13nmT5JJk=","dcHQRkttjMjo2dvhL7hA9t4Pg\u002B7OnjZpkFmakT4QR9U=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","taDH73UT7ynWh85nq2etLidK9sPQF85kWam\u002BdE5RD8w=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","wUbgaUpdwuF5YmyAUI1ZjPse4/SaT06idesVz21NM\u002Bk="],"CachedAssets":{},"CachedCopyCandidates":{}} | {"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["TyIJk/eQMWjmB5LsDE\u002BZIJC9P9ciVxd7bnzRiTZsGt4=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","E2ODTAlJxzsXY1iP1eB/02NIUK\u002BnQveGlWAOHY1cpgA=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","A7nz7qgOtQ1CwZZLvNnr0b5QZB3fTi3y4i6y7rBIcxQ=","znnuRi2tsk7AACuYo4WSgj7NcLriG4PKVaF4L35SvDk=","GelE32odx/vTului267wqi6zL3abBnF9yvwC2Q66LoM=","TEsXImnzxFKTIq2f5fiDu7i6Ar/cbecW5MZ3z8Wb/a4=","5WogJu\u002BUPlF\u002BE5mq/ILtDXpVwqwmhHtsEB13nmT5JJk=","dcHQRkttjMjo2dvhL7hA9t4Pg\u002B7OnjZpkFmakT4QR9U=","Of8nTYw5l\u002BgiAJo7z6XYIntG2tUtCFcILzHbTiiXn\u002Bw=","PDy\u002BTiayvNAoXXBEgwC/kCojpgOOMI6RQOIoSXs3LJc=","ePXrkee3hv3wHUr8S7aYmRVvXUTxQf76zApKGv3/l3o=","Mo7tdPQiZw6/WSnll8t7xy4SU1EoFW4N6EN7JftvBYs=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","eix/dR870pRbtIGVeoF7YpZlG47M4PrBntvgxdO1oDM="],"CachedAssets":{},"CachedCopyCandidates":{}} | ||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7f49362e55449c7400f7099fc78a9c975e8268f1")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c105106f3b420a1c1c19b125cdf5c31e59bfbe3b")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Core")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Core")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7f49362e55449c7400f7099fc78a9c975e8268f1")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c105106f3b420a1c1c19b125cdf5c31e59bfbe3b")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Database")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Database")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7f49362e55449c7400f7099fc78a9c975e8268f1")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c105106f3b420a1c1c19b125cdf5c31e59bfbe3b")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user