feat(mi-dia): captura rapida arriba de actividades, filtro admin por vendedor, hora en notas, orden Intento->Contactado y kanban de oportunidades alineado

This commit is contained in:
2026-09-25 09:21:23 +00:00
parent 8a2584438d
commit 8a5db114ec
5 changed files with 113 additions and 36 deletions

View File

@@ -23,6 +23,8 @@ export interface ActividadMiDia {
tipo: string
fecha: string // 'YYYY-MM-DD'
estado: string
/** Captura (lead/oportunidad/apartado) ligada a la actividad; null si no aplica */
leadCapturaId: string | null
}
export interface ApartadoPorVencer {
@@ -127,7 +129,7 @@ export interface ResumenMiDia {
export const VOCABULARIO = {
// Estados de la columna status del board Leads (ESTADOS_LEAD_PERMITIDOS del
// API + NUEVO/DESCARTADO)
FASES_LEAD: ['NUEVO', 'CONTACTADO', 'Intento de contacto', 'INTERESADO', 'AGENDA CITA', 'CALIFICADO', 'DESCARTADO'],
FASES_LEAD: ['NUEVO', 'Intento de contacto', 'CONTACTADO', 'INTERESADO', 'AGENDA CITA', 'CALIFICADO', 'DESCARTADO'],
// Etapas del funnel de Oportunidades (labels REALES del board; el API las valida tal cual)
FASES_OPORTUNIDAD: ['Agendo Cita', 'Afluencia', 'Cotizador', 'Aparto', 'No Asistio', 'Abandono'],
// Fases del pipeline Enkontrol del tablero Apartado (labels REALES del board)
@@ -303,6 +305,18 @@ export function formatoFechaCorta(fecha: string): string {
return `${d}/${m}`
}
/** ISO → 'dd/mm/aaaa hh:mm' (hora local): bitácoras y notas con hora exacta */
export function formatoFechaHora(iso: string): string {
const d = new Date(iso)
if (Number.isNaN(d.getTime())) return iso
const dd = String(d.getDate()).padStart(2, '0')
const m = String(d.getMonth() + 1).padStart(2, '0')
const y = d.getFullYear()
const hh = String(d.getHours()).padStart(2, '0')
const mm = String(d.getMinutes()).padStart(2, '0')
return `${dd}/${m}/${y} ${hh}:${mm}`
}
/** Texto de urgencia de un apartado según los días que faltan */
export function textoDiasRestantes(dias: number): string {
if (dias <= 0) return 'Vence hoy'