feat(leads): captura rápida pide email y desarrollo de interés

- Columna 'Desarrollo' (status, 5 labels) creada en el board Leads de
  Monday (color_mm6sw4c2)
- API: crearLead acepta email y desarrollo; el desarrollo se valida
  contra los labels reales de la columna (mismo patrón que Origen)
- Mi día: formulario de captura con campos Email y Desarrollo de interés
  (select con los 5 desarrollos, opcional)
- Tests: api 296, mi-dia 12
This commit is contained in:
2026-09-01 07:43:42 +00:00
parent 1692dde887
commit ead7a71025
7 changed files with 90 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ import {
esRolConEquipo,
formatoFechaCorta,
hoyLocal,
DESARROLLOS_LEAD,
MOTIVOS_NO_COMPRA,
ORIGENES_LEAD,
textoDiasRestantes,
@@ -186,7 +187,9 @@ export default function MiDiaPage() {
// Captura rápida
const [capNombre, setCapNombre] = useState('')
const [capTelefono, setCapTelefono] = useState('')
const [capEmail, setCapEmail] = useState('')
const [capOrigen, setCapOrigen] = useState<string>(ORIGENES_LEAD[0])
const [capDesarrollo, setCapDesarrollo] = useState<string>('')
const [capNotas, setCapNotas] = useState('')
const [capEnviando, setCapEnviando] = useState(false)
const [capMensaje, setCapMensaje] = useState<{ tipo: 'ok' | 'error'; texto: string } | null>(null)
@@ -229,12 +232,16 @@ export default function MiDiaPage() {
await crearLead({
nombre: capNombre.trim(),
...(capTelefono.trim() !== '' ? { telefono: capTelefono.trim() } : {}),
...(capEmail.trim() !== '' ? { email: capEmail.trim() } : {}),
...(capOrigen !== '' ? { origen: capOrigen } : {}),
...(capDesarrollo !== '' ? { desarrollo: capDesarrollo } : {}),
...(capNotas.trim() !== '' ? { notas: capNotas.trim() } : {}),
})
setCapMensaje({ tipo: 'ok', texto: 'Lead registrado, se asignará por round-robin' })
setCapNombre('')
setCapTelefono('')
setCapEmail('')
setCapDesarrollo('')
setCapNotas('')
} catch (err) {
setCapMensaje({ tipo: 'error', texto: err instanceof Error ? err.message : 'No se pudo registrar el lead' })
@@ -388,6 +395,18 @@ export default function MiDiaPage() {
className="w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none"
/>
</div>
<div>
<label htmlFor="cap-email" className="mb-2 block text-xs font-bold uppercase tracking-widest text-neutral-500">
Email
</label>
<input
id="cap-email"
type="email"
value={capEmail}
onChange={(e) => setCapEmail(e.target.value)}
className="w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none"
/>
</div>
<div>
<label htmlFor="cap-origen" className="mb-2 block text-xs font-bold uppercase tracking-widest text-neutral-500">
Origen
@@ -405,6 +424,24 @@ export default function MiDiaPage() {
))}
</select>
</div>
<div>
<label htmlFor="cap-desarrollo" className="mb-2 block text-xs font-bold uppercase tracking-widest text-neutral-500">
Desarrollo de interés
</label>
<select
id="cap-desarrollo"
value={capDesarrollo}
onChange={(e) => setCapDesarrollo(e.target.value)}
className="w-full border border-neutral-300 px-4 py-3 text-sm focus:border-accent focus:outline-none"
>
<option value="">Sin especificar</option>
{DESARROLLOS_LEAD.map((d) => (
<option key={d} value={d}>
{d}
</option>
))}
</select>
</div>
<div>
<label htmlFor="cap-notas" className="mb-2 block text-xs font-bold uppercase tracking-widest text-neutral-500">
Notas