feat(alta): guardado progresivo por etapa con réplica a Monday
- Al avanzar cada paso del wizard: upsert silencioso del borrador local + sync a Monday (iniciar → Contacto en PROSPECTO; pasos siguientes → PATCH con los campos mapeables: datos generales, dirección armada, actividad económica) - Al completar: Contacto pasa a CLIENTE + Apartado + funnel (dedup) - progresoId viaja con el borrador (se restaura solo); fallos de sync no bloquean el avance (aviso ámbar no bloqueante); submit final con fallback al endpoint legado si nunca hubo sync - API: POST /clientes/progreso/iniciar, PATCH /clientes/progreso/:id, POST /clientes/progreso/:id/completar; POST /clientes legado intacto - Tests: API 338 (+16), alta-clientes 112 (+4); smoke en vivo verificado (PROSPECTO → patch → CLIENTE + Apartado) y limpiado
This commit is contained in:
@@ -449,6 +449,39 @@ export class MondayService {
|
||||
return this.crearItem(boardId, datos.nombre, columnValues)
|
||||
}
|
||||
|
||||
/**
|
||||
* Actualiza un Contacto existente con los campos presentes (mismo builder de
|
||||
* valores que crearContacto) — usado por el guardado progresivo del alta.
|
||||
* El nombre del item se actualiza por el column id especial 'name'.
|
||||
*/
|
||||
async actualizarContacto(itemId: string, datos: Partial<DatosContacto>): Promise<void> {
|
||||
const boardId = config.monday.boards.contactos
|
||||
const valores = JSON.parse(
|
||||
await this.construirColumnValues(boardId, {
|
||||
Teléfono: datos.telefono,
|
||||
Email: datos.email,
|
||||
CURP: datos.curp,
|
||||
RFC: datos.rfc,
|
||||
Dirección: datos.direccion,
|
||||
Estado: datos.estadoLabel,
|
||||
Sexo: datos.sexoLabel,
|
||||
'Estado Civil': datos.estadoCivilLabel,
|
||||
'Rango de Edad': datos.rangoEdadLabel,
|
||||
'Actividad Economica': datos.actividadEconomicaLabel,
|
||||
'Vivienda Actual': datos.viviendaActualLabel,
|
||||
'Proposito de Compra': datos.propositoCompraLabel,
|
||||
'Fecha Nacimiento': datos.fechaNacimiento,
|
||||
}),
|
||||
) as Record<string, unknown>
|
||||
if (datos.nombre !== undefined && datos.nombre !== '') valores['name'] = datos.nombre
|
||||
await this.graphql(
|
||||
`mutation ($boardId: ID!, $itemId: ID!, $columnValues: JSON!) {
|
||||
change_multiple_column_values(board_id: $boardId, item_id: $itemId, column_values: $columnValues) { id }
|
||||
}`,
|
||||
{ boardId, itemId, columnValues: JSON.stringify(valores) },
|
||||
)
|
||||
}
|
||||
|
||||
async crearApartado(datos: DatosApartado): Promise<string> {
|
||||
const boardId = config.monday.boards.apartado
|
||||
const columnValues = await this.construirColumnValues(boardId, {
|
||||
|
||||
Reference in New Issue
Block a user