feat: módulo de inteligência de mercado
This commit is contained in:
49
front-end/app/composables/useInteligencia.ts
Normal file
49
front-end/app/composables/useInteligencia.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
// front-end/app/composables/useInteligencia.ts
|
||||
import { editais } from '~/data/mock/editais'
|
||||
import { concorrentes } from '~/data/mock/concorrentes'
|
||||
|
||||
export function useInteligencia() {
|
||||
const totalEditais = editais.length
|
||||
const vencidas = editais.filter(e => e.status === 'vencida')
|
||||
const perdidas = editais.filter(e => e.status === 'perdida')
|
||||
|
||||
const taxaVitoria = computed(() =>
|
||||
totalEditais > 0 ? Math.round((vencidas.length / totalEditais) * 100) : 0
|
||||
)
|
||||
|
||||
const valorGanho = computed(() =>
|
||||
vencidas.reduce((acc, e) => acc + e.valorEstimado, 0)
|
||||
)
|
||||
|
||||
const ticketMedio = computed(() =>
|
||||
vencidas.length > 0 ? valorGanho.value / vencidas.length : 0
|
||||
)
|
||||
|
||||
const porModalidade = computed(() => {
|
||||
const counts: Record<string, { total: number; vitorias: number }> = {}
|
||||
for (const e of editais) {
|
||||
if (!counts[e.modalidade]) counts[e.modalidade] = { total: 0, vitorias: 0 }
|
||||
counts[e.modalidade].total++
|
||||
if (e.status === 'vencida') counts[e.modalidade].vitorias++
|
||||
}
|
||||
return counts
|
||||
})
|
||||
|
||||
const motivoPerda = computed(() => {
|
||||
const motivos = [
|
||||
'GOV - PERDIDO POR PREÇO',
|
||||
'GOV - PERDIDO POR DOCUMENTAÇÃO',
|
||||
'GOV - PERDIDO NO ALEATÓRIO',
|
||||
'GOV - DECLINADO POR REQUISITO TÉCNICO',
|
||||
'GOV - DECLINADO OUTROS',
|
||||
'Outro',
|
||||
]
|
||||
return motivos.map((m, i) => ({ motivo: m, quantidade: [3, 1, 1, 1, 0, 1][i] ?? 0 }))
|
||||
})
|
||||
|
||||
const concorrentesFrequentes = computed(() =>
|
||||
[...concorrentes].sort((a, b) => b.totalDisputas - a.totalDisputas).slice(0, 5)
|
||||
)
|
||||
|
||||
return { taxaVitoria, valorGanho, ticketMedio, porModalidade, motivoPerda, concorrentesFrequentes, vencidas, perdidas }
|
||||
}
|
||||
Reference in New Issue
Block a user