Skip to content

Commit 5d9d6e8

Browse files
committed
locais de votacao no ar
1 parent d2756ab commit 5d9d6e8

File tree

2 files changed

+122
-69
lines changed

2 files changed

+122
-69
lines changed

layouts/default.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ function navigateTo(path: string) {
8888

8989
<v-app-bar-title class="text-uppercase">
9090
<v-btn size="large" to="/">
91-
Coligação Municipal
91+
Softagon Sistemas
9292
</v-btn>
9393
</v-app-bar-title>
9494

pages/locais/index.vue

+121-68
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { ref, watch, computed, onMounted } from 'vue'
2+
import { computed, onMounted, ref, watch } from 'vue'
33
44
const estados = ref([])
55
const municipios = ref([])
@@ -8,6 +8,40 @@ const votosEsperados = ref({})
88
const selectedUF = ref('')
99
const selectedMunicipio = ref('')
1010
const loading = ref(false)
11+
const arquivosPorEstado = {
12+
AC: ['eleitorado_local_votacao_2024_AC_part1.json'],
13+
AL: ['eleitorado_local_votacao_2024_AL_part1.json'],
14+
AM: ['eleitorado_local_votacao_2024_AM_part1.json'],
15+
AP: ['eleitorado_local_votacao_2024_AP_part1.json'],
16+
BA: ['eleitorado_local_votacao_2024_BA_part1.json', 'eleitorado_local_votacao_2024_BA_part2.json'],
17+
CE: ['eleitorado_local_votacao_2024_CE_part1.json'],
18+
ES: ['eleitorado_local_votacao_2024_ES_part1.json'],
19+
GO: ['eleitorado_local_votacao_2024_GO_part1.json'],
20+
MA: ['eleitorado_local_votacao_2024_MA_part1.json'],
21+
MG: ['eleitorado_local_votacao_2024_MG_part1.json', 'eleitorado_local_votacao_2024_MG_part2.json'],
22+
MS: ['eleitorado_local_votacao_2024_MS_part1.json'],
23+
MT: ['eleitorado_local_votacao_2024_MT_part1.json'],
24+
PA: ['eleitorado_local_votacao_2024_PA_part1.json'],
25+
PB: ['eleitorado_local_votacao_2024_PB_part1.json'],
26+
PE: ['eleitorado_local_votacao_2024_PE_part1.json'],
27+
PI: ['eleitorado_local_votacao_2024_PI_part1.json'],
28+
PR: ['eleitorado_local_votacao_2024_PR_part1.json'],
29+
RJ: ['eleitorado_local_votacao_2024_RJ_part1.json', 'eleitorado_local_votacao_2024_RJ_part2.json'],
30+
RN: ['eleitorado_local_votacao_2024_RN_part1.json'],
31+
RO: ['eleitorado_local_votacao_2024_RO_part1.json'],
32+
RR: ['eleitorado_local_votacao_2024_RR_part1.json'],
33+
RS: ['eleitorado_local_votacao_2024_RS_part1.json'],
34+
SC: ['eleitorado_local_votacao_2024_SC_part1.json'],
35+
SE: ['eleitorado_local_votacao_2024_SE_part1.json'],
36+
SP: [
37+
'eleitorado_local_votacao_2024_SP_part1.json',
38+
'eleitorado_local_votacao_2024_SP_part2.json',
39+
'eleitorado_local_votacao_2024_SP_part3.json',
40+
'eleitorado_local_votacao_2024_SP_part4.json',
41+
],
42+
TO: ['eleitorado_local_votacao_2024_TO_part1.json'],
43+
undefined: ['eleitorado_local_votacao_2024_undefined_part1.json'],
44+
}
1145
1246
// Função para buscar dados com cache no localStorage, mas evita cache se o tamanho for muito grande
1347
async function fetchWithLocalStorage(key, url) {
@@ -26,15 +60,18 @@ async function fetchWithLocalStorage(key, url) {
2660
if (dataSize < maxLocalStorageSize) {
2761
try {
2862
localStorage.setItem(key, JSON.stringify(data))
29-
} catch (storageError) {
63+
}
64+
catch (storageError) {
3065
console.warn('Dados muito grandes para armazenar no localStorage:', storageError)
3166
}
32-
} else {
67+
}
68+
else {
3369
console.warn('Dados excedem o limite de 4MB. Não serão armazenados no localStorage.')
3470
}
3571
3672
return data
37-
} catch (error) {
73+
}
74+
catch (error) {
3875
console.error('Erro ao buscar os dados:', error)
3976
throw error
4077
}
@@ -49,32 +86,38 @@ async function carregarEstados() {
4986
sigla: estado.sigla,
5087
nome: estado.nome,
5188
}))
52-
} else {
89+
}
90+
else {
5391
console.error('Dados de estados não encontrados')
5492
}
55-
} catch (error) {
93+
}
94+
catch (error) {
5695
console.error('Erro ao carregar estados:', error)
5796
}
5897
}
5998
6099
// Função para carregar os municípios com base no UF selecionado
61-
async function carregarMunicipios(siglaUF: string) {
100+
async function carregarMunicipios(siglaUF) {
62101
try {
63-
const data = await fetchWithLocalStorage(municipios_${siglaUF}, /municipios_${siglaUF}.json)
102+
const data = await fetchWithLocalStorage(`municipios_${siglaUF}`, `/municipios_${siglaUF}.json`)
64103
if (data && data.municipios) {
65104
municipios.value = data.municipios.map(municipio => ({
66105
nome: municipio.nome,
67106
codigo: municipio.codigo,
68107
}))
69-
} else {
70-
console.error(Nenhum município encontrado para ${siglaUF})
108+
}
109+
else {
110+
console.error(`Nenhum município encontrado para ${siglaUF}`)
71111
municipios.value = []
72112
}
73-
} catch (error) {
74-
console.error(Erro ao carregar municípios para ${siglaUF}:, error)
113+
}
114+
catch (error) {
115+
console.error(`Erro ao carregar municípios para ${siglaUF}:`, error)
75116
}
76117
}
77-
async function carregarLocaisVotacao(siglaUF: string) {
118+
119+
// Função para carregar locais de votação de um estado, buscando múltiplos arquivos se necessário
120+
async function carregarLocaisVotacao(siglaUF) {
78121
const cacheKey = `locais_votacao_${siglaUF}_${selectedMunicipio.value}`
79122
const votosCacheKey = `votos_esperados_${selectedMunicipio.value}`
80123
const cachedData = localStorage.getItem(cacheKey)
@@ -86,7 +129,7 @@ async function carregarLocaisVotacao(siglaUF: string) {
86129
87130
if (cachedData) {
88131
locaisVotacao.value = JSON.parse(cachedData)
89-
locaisVotacao.value.forEach(local => {
132+
locaisVotacao.value.forEach((local) => {
90133
if (!votosEsperados.value[local.nome]) {
91134
votosEsperados.value[local.nome] = 0
92135
}
@@ -96,54 +139,62 @@ async function carregarLocaisVotacao(siglaUF: string) {
96139
97140
loading.value = true
98141
try {
99-
const data = await fetchWithLocalStorage(`locais_votacao_${siglaUF}`, `/locais/eleitorado_local_votacao_2024_${siglaUF}.json`)
100-
if (data) {
101-
const locaisAgrupados = data
102-
.filter(local => local.CD_MUNICIPIO === selectedMunicipio.value)
103-
.reduce((acc, local) => {
104-
const { NM_LOCAL_VOTACAO, DS_ENDERECO, NR_SECAO, QT_ELEITOR_SECAO } = local
105-
if (!acc[NM_LOCAL_VOTACAO]) {
106-
acc[NM_LOCAL_VOTACAO] = {
107-
nome: NM_LOCAL_VOTACAO,
108-
endereco: DS_ENDERECO,
109-
secoes: [],
110-
totalEleitores: 0,
111-
}
112-
}
113-
acc[NM_LOCAL_VOTACAO].secoes.push(NR_SECAO)
114-
acc[NM_LOCAL_VOTACAO].totalEleitores += Number(QT_ELEITOR_SECAO) || 0
115-
return acc
116-
}, {})
142+
// Verifica os arquivos associados ao estado selecionado
143+
const arquivosEstado = arquivosPorEstado[siglaUF] || []
144+
const data = []
117145
118-
const locaisArray = Object.values(locaisAgrupados)
119-
locaisVotacao.value = locaisArray
146+
// Busca e concatena os dados de todos os arquivos de um estado
147+
for (const arquivo of arquivosEstado) {
148+
const partialData = await fetchWithLocalStorage(`locais_votacao_${siglaUF}_${arquivo}`, `/locais/${arquivo}`)
149+
data.push(...partialData)
150+
}
120151
121-
// Inicializa votosEsperados para garantir que o objeto esteja preenchido
122-
locaisArray.forEach(local => {
123-
if (!votosEsperados.value[local.nome]) {
124-
votosEsperados.value[local.nome] = 0
152+
const locaisAgrupados = data
153+
.filter(local => local.CD_MUNICIPIO === selectedMunicipio.value)
154+
.reduce((acc, local) => {
155+
const { NM_LOCAL_VOTACAO, DS_ENDERECO, NM_BAIRRO, NR_SECAO, QT_ELEITOR_SECAO } = local
156+
if (!acc[NM_LOCAL_VOTACAO]) {
157+
acc[NM_LOCAL_VOTACAO] = {
158+
nome: NM_LOCAL_VOTACAO,
159+
endereco: `${DS_ENDERECO}, ${NM_BAIRRO}`,
160+
secoes: [],
161+
totalEleitores: 0,
162+
}
125163
}
126-
})
164+
acc[NM_LOCAL_VOTACAO].secoes.push(NR_SECAO)
165+
acc[NM_LOCAL_VOTACAO].totalEleitores += Number(QT_ELEITOR_SECAO) || 0
166+
return acc
167+
}, {})
127168
128-
localStorage.setItem(cacheKey, JSON.stringify(locaisArray))
129-
} else {
130-
console.error('Nenhum local de votação encontrado para o município selecionado')
131-
locaisVotacao.value = []
132-
}
133-
} catch (error) {
169+
const locaisArray = Object.values(locaisAgrupados)
170+
locaisVotacao.value = locaisArray
171+
172+
// Inicializa votosEsperados para garantir que o objeto esteja preenchido
173+
locaisArray.forEach((local) => {
174+
if (!votosEsperados.value[local.nome]) {
175+
votosEsperados.value[local.nome] = 0
176+
}
177+
})
178+
179+
localStorage.setItem(cacheKey, JSON.stringify(locaisArray))
180+
}
181+
catch (error) {
134182
console.error('Erro ao carregar locais de votação:', error)
135183
locaisVotacao.value = []
136-
} finally {
184+
}
185+
finally {
137186
loading.value = false
138187
}
139188
}
140189
190+
// Função para validar a quantidade de votos esperados
141191
function validarVotos(local, valor) {
142192
const votos = Number(valor)
143193
144194
if (votos > local.totalEleitores) {
145195
votosEsperados.value[local.nome] = local.totalEleitores
146-
} else {
196+
}
197+
else {
147198
votosEsperados.value[local.nome] = votos
148199
}
149200
@@ -160,7 +211,6 @@ function validarVotos(local, valor) {
160211
localStorage.setItem(cacheKey, JSON.stringify(votosCache))
161212
}
162213
163-
164214
// Computed para somar os votos esperados
165215
const somaVotosEsperados = computed(() => {
166216
return Object.values(votosEsperados.value).reduce((acc, val) => acc + Number(val), 0)
@@ -171,7 +221,8 @@ watch(selectedUF, (novoUF) => {
171221
if (novoUF) {
172222
selectedMunicipio.value = ''
173223
carregarMunicipios(novoUF)
174-
} else {
224+
}
225+
else {
175226
selectedMunicipio.value = ''
176227
municipios.value = []
177228
}
@@ -218,34 +269,36 @@ onMounted(() => {
218269

219270
<!-- Lista de Locais de Votação agrupados -->
220271
<v-card v-if="!loading && locaisVotacao.length > 0">
221-
<v-card-title>
222-
Locais de Votação - Total de Votos Esperados: {{ somaVotosEsperados.toLocaleString('pt-BR') }}
272+
<v-card-title class="d-flex justify-space-between align-center">
273+
<span>Locais de Votação</span>
274+
<v-chip color="green" text-color="white" label>
275+
Soma de votos: {{ somaVotosEsperados.toLocaleString('pt-BR') }}
276+
</v-chip>
223277
</v-card-title>
224278

225279
<v-list>
226280
<v-row v-for="(local, index) in locaisVotacao" :key="index" class="mb-4">
227-
<!-- Coluna 1: Detalhes do local -->
228-
<v-col cols="6">
281+
<!-- Coluna Única: Detalhes do local e input para votos esperados -->
282+
<v-col cols="12">
229283
<v-list-item>
230284
<v-list-item-title>{{ local.nome }}</v-list-item-title>
231285
<v-list-item-subtitle>{{ local.endereco }}</v-list-item-subtitle>
232286
<v-list-item-subtitle>Seções: {{ local.secoes.join(', ') }}</v-list-item-subtitle>
233287
<v-list-item-subtitle>Total de Eleitores: {{ local.totalEleitores }}</v-list-item-subtitle>
288+
<br>
289+
<!-- Input para votos esperados -->
290+
<v-text-field
291+
v-model="votosEsperados[local.nome]"
292+
label="Votos Esperados"
293+
type="number"
294+
:error="votosEsperados[local.nome] > local.totalEleitores"
295+
:error-messages="votosEsperados[local.nome] > local.totalEleitores ? 'Quantidade excede total de eleitores' : ''"
296+
:max="local.totalEleitores"
297+
outlined
298+
@input="validarVotos(local, $event.target.value)"
299+
/>
234300
</v-list-item>
235-
</v-col>
236-
237-
<!-- Coluna 2: Input para votos esperados -->
238-
<v-col cols="6">
239-
<v-text-field
240-
v-model="votosEsperados[local.nome]"
241-
label="Votos Esperados"
242-
type="number"
243-
:error="votosEsperados[local.nome] > local.totalEleitores"
244-
:error-messages="votosEsperados[local.nome] > local.totalEleitores ? 'Quantidade excede total de eleitores' : ''"
245-
@input="validarVotos(local, $event.target.value)"
246-
:max="local.totalEleitores"
247-
outlined
248-
/>
301+
<v-divider /> <!-- Separador entre os locais -->
249302
</v-col>
250303
</v-row>
251304
</v-list>
@@ -256,4 +309,4 @@ onMounted(() => {
256309
Nenhum local de votação encontrado para o município selecionado.
257310
</v-alert>
258311
</v-container>
259-
</template>
312+
</template>

0 commit comments

Comments
 (0)