import { useState, type FormEvent } from 'react' import { z } from 'zod' import { crearLead, type LeadResumen } from '../services/api' import { DESARROLLOS_LEAD, ESTADOS_CIVILES, MODELOS_POR_PROYECTO, OPCIONES_CALIFICA, ORIGENES_LEAD, TIPOS_CREDITO, TIPOS_ECONOMIA, TIPOS_EMPLEO, } from '../data/constantes' interface Props { onVolver: () => void /** Conversión directa: tras registrar la afluencia, abrir el alta completa * prellenada con los datos recién capturados (sin rebuscar el lead) */ onPasarAAltaCliente: (lead: LeadResumen) => void } const emailSchema = z.string().trim().email() const inputClase = 'w-full rounded-lg border border-[#D1D5DB] bg-white px-3 py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20' const labelClase = 'mb-1 block text-xs font-medium text-[#4B5563]' interface Errores { nombre?: string telefono?: string email?: string } const FORM_INICIAL = { nombre: '', telefono: '', email: '', origen: '', desarrollo: '', modelo: '', medioContacto: '', edad: '', estadoCivil: '', tipoEmpleo: '', ocupacion: '', rangoSalarial: '', credito: '', tipoEconomia: '', califica: '', loQuierePara: '', notas: '', } /** * Captura ligera del interesado al entrar al embudo (POST /leads): crea el * lead en Monday y su oportunidad en etapa Afluencia. El alta completa de * cliente sigue siendo el wizard del picker. */ export default function AltaAfluenciaForm({ onVolver, onPasarAAltaCliente }: Props) { const [form, setForm] = useState(FORM_INICIAL) const [errores, setErrores] = useState({}) const [enviando, setEnviando] = useState(false) const [leadCreado, setLeadCreado] = useState(null) const [aviso, setAviso] = useState('') const cambiar = (campo: keyof typeof FORM_INICIAL) => (e: { target: { value: string } }) => { setForm((prev) => ({ ...prev, [campo]: e.target.value })) setErrores((prev) => ({ ...prev, [campo]: undefined })) } // Al cambiar de desarrollo se resetea el modelo (las opciones dependen de él) const cambiarDesarrollo = (e: { target: { value: string } }) => { setForm((prev) => ({ ...prev, desarrollo: e.target.value, modelo: '' })) } const modelosDelDesarrollo = MODELOS_POR_PROYECTO[form.desarrollo as keyof typeof MODELOS_POR_PROYECTO] ?? [] const validar = (): boolean => { const nuevos: Errores = {} if (!form.nombre.trim()) nuevos.nombre = 'El nombre es obligatorio' if (!form.telefono.trim()) nuevos.telefono = 'El teléfono es obligatorio' if (form.email.trim() && !emailSchema.safeParse(form.email).success) { nuevos.email = 'Correo electrónico inválido' } setErrores(nuevos) return Object.keys(nuevos).length === 0 } const enviar = async (e: FormEvent) => { e.preventDefault() setAviso('') if (!validar()) return setEnviando(true) const res = await crearLead({ nombre: form.nombre.trim(), telefono: form.telefono.trim(), ...(form.email.trim() ? { email: form.email.trim() } : {}), ...(form.origen ? { origen: form.origen } : {}), ...(form.desarrollo ? { desarrollo: form.desarrollo } : {}), ...(form.modelo ? { modelo: form.modelo } : {}), ...(form.medioContacto.trim() ? { medioContacto: form.medioContacto.trim() } : {}), ...(form.edad.trim() ? { edad: form.edad.trim() } : {}), ...(form.estadoCivil ? { estadoCivil: form.estadoCivil } : {}), ...(form.tipoEmpleo ? { tipoEmpleo: form.tipoEmpleo } : {}), ...(form.ocupacion.trim() ? { ocupacion: form.ocupacion.trim() } : {}), ...(form.rangoSalarial.trim() ? { rangoSalarial: form.rangoSalarial.trim() } : {}), ...(form.credito ? { credito: form.credito } : {}), ...(form.tipoEconomia ? { tipoEconomia: form.tipoEconomia } : {}), ...(form.califica ? { califica: form.califica } : {}), ...(form.loQuierePara.trim() ? { loQuierePara: form.loQuierePara.trim() } : {}), ...(form.notas.trim() ? { notas: form.notas.trim() } : {}), }) setEnviando(false) if (res.ok) { setLeadCreado({ id: res.lead.id, nombre: form.nombre.trim(), telefono: form.telefono.trim(), email: form.email.trim(), estado: res.lead.estado, origen: form.origen, }) } else if (res.motivo === 'duplicado') { setAviso(`Ya existe un lead con ese teléfono: ${res.nombre}.`) } else { setAviso('No se pudo registrar el lead. Revisa tu conexión e intenta de nuevo.') } } const capturarOtro = () => { setForm(FORM_INICIAL) setErrores({}) setAviso('') setLeadCreado(null) } if (leadCreado !== null) { return (

Registrado en afluencia — se asignará por round-robin

) } return (
void enviar(e)} noValidate className="max-w-2xl">
{aviso && (

{aviso}

)}
) }