feat: vínculo con usuario Monday en landing + alta prellenada desde leads
API: - GET /api/monday/usuarios: usuarios activos no-guest del workspace - PATCH /api/usuarios/me/monday: vincula/desvincula el mondayUserId del usuario autenticado (valida contra el workspace) - GET /api/leads/buscar?q=: búsqueda de leads por nombre/teléfono/email (sin acentos, orden updatedAt desc, límite 15) - aPublico/me ahora incluyen mondayUserId Landing (/): - Nueva sección 'Configuración de cuenta': login inline, selector del usuario de Monday, guardar/desvincular, cerrar sesión Alta de clientes (/client): - Búsqueda de leads de Monday con debounce en la pantalla de entrada; al elegir uno prellena nombre/email/celular y guarda leadMondayId - El picker (borradores + alta nueva + búsqueda de lead) es ahora siempre la pantalla de entrada Tests: api 294, landing 8, alta-clientes 96 — todos verdes
This commit is contained in:
@@ -9,6 +9,7 @@ export const FIRMA_PRUEBA =
|
||||
* (PASCUAL MARTIN TELLEZ CHIGUINDO — pdf_formatos.txt)
|
||||
*/
|
||||
export const fixtureAlta: AltaCliente = {
|
||||
leadMondayId: null,
|
||||
datosGenerales: {
|
||||
campaniaVenta: '',
|
||||
fecha: '2026-07-19',
|
||||
|
||||
25
apps/alta-clientes/src/lib/leadAlta.test.ts
Normal file
25
apps/alta-clientes/src/lib/leadAlta.test.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { leadAPrellenado } from './leadAlta'
|
||||
|
||||
describe('leadAPrellenado', () => {
|
||||
it('prellena nombre (mayúsculas), email y celular cuando el lead los trae', () => {
|
||||
const pre = leadAPrellenado({ nombre: ' María Fernanda López ', email: 'maria@correo.com', telefono: '4771234567' })
|
||||
expect(pre).toEqual({
|
||||
nombreCompleto: 'MARÍA FERNANDA LÓPEZ',
|
||||
email: 'maria@correo.com',
|
||||
celular: '4771234567',
|
||||
})
|
||||
})
|
||||
|
||||
it('omite email y celular cuando el lead no los tiene (no inventa datos)', () => {
|
||||
expect(leadAPrellenado({ nombre: 'Lead Sin Contacto', email: '', telefono: '' })).toEqual({
|
||||
nombreCompleto: 'LEAD SIN CONTACTO',
|
||||
})
|
||||
})
|
||||
|
||||
it('prellena solo lo que haya (email sin teléfono)', () => {
|
||||
const pre = leadAPrellenado({ nombre: 'Solo Email', email: 'solo@correo.com', telefono: '' })
|
||||
expect(pre).toEqual({ nombreCompleto: 'SOLO EMAIL', email: 'solo@correo.com' })
|
||||
expect(pre.celular).toBeUndefined()
|
||||
})
|
||||
})
|
||||
16
apps/alta-clientes/src/lib/leadAlta.ts
Normal file
16
apps/alta-clientes/src/lib/leadAlta.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import type { DatosGenerales } from '../types'
|
||||
import type { LeadResumen } from '../services/api'
|
||||
|
||||
/**
|
||||
* Transformación pura lead de Monday → campos del wizard de alta.
|
||||
* Prellena solo lo que el lead tenga (nombre en mayúsculas, como el formato).
|
||||
*/
|
||||
export function leadAPrellenado(
|
||||
lead: Pick<LeadResumen, 'nombre' | 'email' | 'telefono'>,
|
||||
): Partial<DatosGenerales> {
|
||||
return {
|
||||
nombreCompleto: lead.nombre.trim().toUpperCase(),
|
||||
...(lead.email ? { email: lead.email.trim() } : {}),
|
||||
...(lead.telefono ? { celular: lead.telefono.trim() } : {}),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user