fix(apartados): rename firma→alta enkontrol + campo usuario + bloqueo unidad
- Firma Cliente (Venta) renombrada a Alta Enkontrol (mismo redirect a alta cliente) - Campo 'Usuario Enkontrol' añadido en Datos Generales del alta cliente - Unidad se bloquea (APARTADA) al pasar cliente a etapa Aparto - Backend y frontend actualizados
This commit is contained in:
@@ -74,10 +74,10 @@ describe('cambiarEstadoApartado (POST /api/apartados/:id/estado)', () => {
|
|||||||
expect(monday.movimientos).toEqual([])
|
expect(monday.movimientos).toEqual([])
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Firma Cliente (Venta) mueve el item a "Clientes Activos"', async () => {
|
it('Alta Enkontrol se queda en "Nuevos Clientes" (grupo topics)', async () => {
|
||||||
const monday = mondayMock()
|
const monday = mondayMock()
|
||||||
await cambiarEstadoApartado(monday, 'apt-2', 'Firma Cliente (Venta)')
|
await cambiarEstadoApartado(monday, 'apt-2', 'Alta Enkontrol')
|
||||||
expect(monday.movimientos).toEqual([{ itemId: 'apt-2', grupo: 'group_mm6sx3rn' }])
|
expect(monday.movimientos).toEqual([])
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Cancelacion Apartado mueve el item a "Historico"', async () => {
|
it('Cancelacion Apartado mueve el item a "Historico"', async () => {
|
||||||
@@ -93,7 +93,6 @@ describe('cambiarEstadoApartado (POST /api/apartados/:id/estado)', () => {
|
|||||||
'Entrego Documentacion',
|
'Entrego Documentacion',
|
||||||
'Cita Clientes',
|
'Cita Clientes',
|
||||||
'Contrato Enkontrol',
|
'Contrato Enkontrol',
|
||||||
'Firma Cliente (Venta)',
|
|
||||||
'Cancelacion Apartado',
|
'Cancelacion Apartado',
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ export const FASES_APARTADO_PERMITIDAS = [
|
|||||||
'Entrego Documentacion',
|
'Entrego Documentacion',
|
||||||
'Cita Clientes',
|
'Cita Clientes',
|
||||||
'Contrato Enkontrol',
|
'Contrato Enkontrol',
|
||||||
'Firma Cliente (Venta)',
|
|
||||||
'Cancelacion Apartado',
|
'Cancelacion Apartado',
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ export const crearClienteSchema = z
|
|||||||
estadoCivil: z.string().optional(),
|
estadoCivil: z.string().optional(),
|
||||||
tipoVivienda: z.string().optional(),
|
tipoVivienda: z.string().optional(),
|
||||||
tipoCompra: z.string().optional(),
|
tipoCompra: z.string().optional(),
|
||||||
|
usuarioEnkontrol: z.string().optional(),
|
||||||
})
|
})
|
||||||
.passthrough(),
|
.passthrough(),
|
||||||
empleo: z.object({ tipoEmpleo: z.string().optional() }).passthrough().optional(),
|
empleo: z.object({ tipoEmpleo: z.string().optional() }).passthrough().optional(),
|
||||||
@@ -312,7 +313,7 @@ async function encolarReplicasPendientesCliente(
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Apartado Monday del alta: con apartadoMondayId (alta arrancada desde un
|
* Apartado Monday del alta: con apartadoMondayId (alta arrancada desde un
|
||||||
* apartado existente, botón "Firma Cliente (Venta)" de Mis apartados) se
|
* apartado existente, botón "Alta Enkontrol" de Mis apartados) se
|
||||||
* LIGA y enriquece ese item; sin él, se crea uno nuevo como siempre.
|
* LIGA y enriquece ese item; sin él, se crea uno nuevo como siempre.
|
||||||
*/
|
*/
|
||||||
async function apartadoDeAlta(
|
async function apartadoDeAlta(
|
||||||
@@ -444,6 +445,7 @@ export const iniciarProgresoSchema = z
|
|||||||
estadoCivil: z.string().optional(),
|
estadoCivil: z.string().optional(),
|
||||||
tipoVivienda: z.string().optional(),
|
tipoVivienda: z.string().optional(),
|
||||||
tipoCompra: z.string().optional(),
|
tipoCompra: z.string().optional(),
|
||||||
|
usuarioEnkontrol: z.string().optional(),
|
||||||
})
|
})
|
||||||
.passthrough(),
|
.passthrough(),
|
||||||
leadMondayId: z.string().optional(),
|
leadMondayId: z.string().optional(),
|
||||||
@@ -767,8 +769,8 @@ export async function listarDocumentos(req: Request, res: Response): Promise<voi
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* GET /api/altas/prefill-apartado/:itemId — todo lo ya recolectado de un
|
* GET /api/altas/prefill-apartado/:itemId — todo lo ya recolectado de un
|
||||||
* apartado de Monday para prellenar el alta de cliente (botón "Firma Cliente
|
* apartado de Monday para prellenar el alta de cliente (botón "Alta Enkontrol"
|
||||||
* (Venta)" de Mis apartados): ficha del apartado, contacto relacionado
|
* de Mis apartados): ficha del apartado, contacto relacionado
|
||||||
* (perfil completo), oportunidad relacionada (perfil de la afluencia) y la
|
* (perfil completo), oportunidad relacionada (perfil de la afluencia) y la
|
||||||
* cotización más reciente vinculada. Las relaciones se arman por teléfono
|
* cotización más reciente vinculada. Las relaciones se arman por teléfono
|
||||||
* (últimos 10 dígitos) o email.
|
* (últimos 10 dígitos) o email.
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { automatizacionesService } from '../services/automatizaciones.service.js
|
|||||||
import { saludMonday } from '../services/salud-monday.service.js'
|
import { saludMonday } from '../services/salud-monday.service.js'
|
||||||
import { crmLocal, esIdLocal } from '../services/crm-local.service.js'
|
import { crmLocal, esIdLocal } from '../services/crm-local.service.js'
|
||||||
import { esFalloMonday } from '../services/sync-monday.service.js'
|
import { esFalloMonday } from '../services/sync-monday.service.js'
|
||||||
|
import { prisma } from '../services/prisma.js'
|
||||||
import * as auditoria from '../services/auditoria.service.js'
|
import * as auditoria from '../services/auditoria.service.js'
|
||||||
|
|
||||||
/** Categorías del dropdown "Motivo No Compra" (vocabulario CRM FRASA) */
|
/** Categorías del dropdown "Motivo No Compra" (vocabulario CRM FRASA) */
|
||||||
@@ -154,22 +155,33 @@ export async function cambiarEtapaOportunidad(
|
|||||||
* Cambio de etapa en modo local: guarda la etapa en la fila local y encola
|
* Cambio de etapa en modo local: guarda la etapa en la fila local y encola
|
||||||
* CAMBIO_ETAPA. En 'Aparto' crea además el apartado local (crmLocal.apartar),
|
* CAMBIO_ETAPA. En 'Aparto' crea además el apartado local (crmLocal.apartar),
|
||||||
* el equivalente al asegurarApartado del flujo Monday.
|
* el equivalente al asegurarApartado del flujo Monday.
|
||||||
|
* Devuelve el unidadCodigo de la oportunidad si existe (para bloquear la unidad).
|
||||||
*/
|
*/
|
||||||
async function cambiarEtapaLocal(
|
async function cambiarEtapaLocal(
|
||||||
itemId: string,
|
itemId: string,
|
||||||
etapa: (typeof ETAPAS_OPORTUNIDAD_PERMITIDAS)[number],
|
etapa: (typeof ETAPAS_OPORTUNIDAD_PERMITIDAS)[number],
|
||||||
fecha: string | undefined,
|
fecha: string | undefined,
|
||||||
usuarioId: string | undefined,
|
usuarioId: string | undefined,
|
||||||
): Promise<void> {
|
): Promise<string | null> {
|
||||||
if (etapa === 'Aparto') {
|
if (etapa === 'Aparto') {
|
||||||
await crmLocal.apartar(itemId, usuarioId)
|
await crmLocal.apartar(itemId, usuarioId)
|
||||||
return
|
// Leer la oportunidad local para obtener el unidadCodigo y bloquear la unidad
|
||||||
|
const captura = await prisma.leadCaptura.findUnique({ where: { leadId: itemId } })
|
||||||
|
let unidadCodigo = ''
|
||||||
|
if (captura?.datosJson) {
|
||||||
|
try {
|
||||||
|
const datos = JSON.parse(captura.datosJson) as Record<string, unknown>
|
||||||
|
if (typeof datos['unidadCodigo'] === 'string') unidadCodigo = datos['unidadCodigo']
|
||||||
|
} catch { /* datosJson inválido: se ignora */ }
|
||||||
|
}
|
||||||
|
return unidadCodigo.trim() !== '' ? unidadCodigo.trim() : null
|
||||||
}
|
}
|
||||||
await crmLocal.cambiarEstado(itemId, etapa, 'OPORTUNIDADES', {
|
await crmLocal.cambiarEstado(itemId, etapa, 'OPORTUNIDADES', {
|
||||||
fecha,
|
fecha,
|
||||||
usuarioId,
|
usuarioId,
|
||||||
sombra: !esIdLocal(itemId),
|
sombra: !esIdLocal(itemId),
|
||||||
})
|
})
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
/** POST /api/oportunidades/:itemId/etapa { etapa, fecha? } */
|
/** POST /api/oportunidades/:itemId/etapa { etapa, fecha? } */
|
||||||
@@ -178,13 +190,31 @@ export async function cambiarEtapaOportunidadEndpoint(req: Request, res: Respons
|
|||||||
const itemId = String(req.params['itemId'])
|
const itemId = String(req.params['itemId'])
|
||||||
const usuarioSub = req.usuarioToken?.sub
|
const usuarioSub = req.usuarioToken?.sub
|
||||||
if (esIdLocal(itemId) || !saludMonday.estaDisponible()) {
|
if (esIdLocal(itemId) || !saludMonday.estaDisponible()) {
|
||||||
await cambiarEtapaLocal(itemId, body.etapa, body.fecha, usuarioSub)
|
const unidadCodigo = await cambiarEtapaLocal(itemId, body.etapa, body.fecha, usuarioSub)
|
||||||
|
// Bloquear la unidad del inventario si la oportunidad tiene una asignada
|
||||||
|
if (body.etapa === 'Aparto' && unidadCodigo !== null) {
|
||||||
|
try {
|
||||||
|
await mondayService.actualizarDisponibilidadUnidad(unidadCodigo, 'APARTADA')
|
||||||
|
} catch (err) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(`No se pudo bloquear la unidad ${unidadCodigo} de la oportunidad ${itemId}:`, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
await cambiarEtapaOportunidad(mondayService, itemId, body.etapa, body.fecha)
|
await cambiarEtapaOportunidad(mondayService, itemId, body.etapa, body.fecha)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (!esFalloMonday(err)) throw err
|
if (!esFalloMonday(err)) throw err
|
||||||
await cambiarEtapaLocal(itemId, body.etapa, body.fecha, usuarioSub)
|
const unidadCodigo = await cambiarEtapaLocal(itemId, body.etapa, body.fecha, usuarioSub)
|
||||||
|
// Bloquear la unidad del inventario si la oportunidad tiene una asignada
|
||||||
|
if (body.etapa === 'Aparto' && unidadCodigo !== null) {
|
||||||
|
try {
|
||||||
|
await mondayService.actualizarDisponibilidadUnidad(unidadCodigo, 'APARTADA')
|
||||||
|
} catch (err2) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(`No se pudo bloquear la unidad ${unidadCodigo} de la oportunidad ${itemId}:`, err2)
|
||||||
|
}
|
||||||
|
}
|
||||||
res.json({ itemId, etapa: body.etapa, ...(body.fecha !== undefined ? { fecha: body.fecha } : {}) })
|
res.json({ itemId, etapa: body.etapa, ...(body.fecha !== undefined ? { fecha: body.fecha } : {}) })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -199,6 +229,24 @@ export async function cambiarEtapaOportunidadEndpoint(req: Request, res: Respons
|
|||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error(`No se pudo crear el apartado de la oportunidad ${itemId}:`, err)
|
console.error(`No se pudo crear el apartado de la oportunidad ${itemId}:`, err)
|
||||||
}
|
}
|
||||||
|
// Bloquear la unidad del inventario (colocar en APARTADA)
|
||||||
|
try {
|
||||||
|
const boardOportunidades = config.monday.boards.oportunidades
|
||||||
|
const svc = mondayService as MondayService
|
||||||
|
const item = await svc.getItemConGrupo(itemId)
|
||||||
|
if (item) {
|
||||||
|
const colUnidad = await svc.columnaIdPorTitulo(boardOportunidades, 'Unidad')
|
||||||
|
const unidadCodigo = colUnidad
|
||||||
|
? (item.column_values.find((cv) => cv.id === colUnidad)?.text ?? '').trim()
|
||||||
|
: ''
|
||||||
|
if (unidadCodigo !== '') {
|
||||||
|
await svc.actualizarDisponibilidadUnidad(unidadCodigo, 'APARTADA')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(`No se pudo bloquear la unidad de la oportunidad ${itemId}:`, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.json({ itemId, etapa: body.etapa, ...(body.fecha !== undefined ? { fecha: body.fecha } : {}) })
|
res.json({ itemId, etapa: body.etapa, ...(body.fecha !== undefined ? { fecha: body.fecha } : {}) })
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ apiRouter.get('/cotizaciones/:id/publico', obtenerCotizacionPublica)
|
|||||||
apiRouter.get('/cotizaciones/:id', obtenerCotizacion)
|
apiRouter.get('/cotizaciones/:id', obtenerCotizacion)
|
||||||
|
|
||||||
apiRouter.post('/clientes', crearCliente)
|
apiRouter.post('/clientes', crearCliente)
|
||||||
// Prefill del alta desde un apartado de Monday (botón "Firma Cliente (Venta)"
|
// Prefill del alta desde un apartado de Monday (botón "Alta Enkontrol"
|
||||||
// de Mis apartados). Va ANTES de /clientes/:id para no colisionar.
|
// de Mis apartados). Va ANTES de /clientes/:id para no colisionar.
|
||||||
apiRouter.get('/altas/prefill-apartado/:itemId', prefillApartadoEndpoint)
|
apiRouter.get('/altas/prefill-apartado/:itemId', prefillApartadoEndpoint)
|
||||||
// Alta progresiva: guardado etapa por etapa del wizard (Contacto PROSPECTO → CLIENTE).
|
// Alta progresiva: guardado etapa por etapa del wizard (Contacto PROSPECTO → CLIENTE).
|
||||||
|
|||||||
@@ -899,7 +899,7 @@ export class AutomatizacionesService {
|
|||||||
const apartados = await prisma.leadCaptura.findMany({
|
const apartados = await prisma.leadCaptura.findMany({
|
||||||
where: {
|
where: {
|
||||||
board: 'APARTADO',
|
board: 'APARTADO',
|
||||||
etapa: { notIn: ['Cancelacion Apartado', 'Firma Cliente (Venta)'] },
|
etapa: { notIn: ['Cancelacion Apartado', 'Alta Enkontrol'] },
|
||||||
fechaLimite: { not: null, lte: limite, gte: ahora },
|
fechaLimite: { not: null, lte: limite, gte: ahora },
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ export const GRUPOS_POR_ESTADO: Record<string, { columna: string; destinos: Reco
|
|||||||
'Cita Clientes': 'topics',
|
'Cita Clientes': 'topics',
|
||||||
'Contrato Enkontrol': 'topics',
|
'Contrato Enkontrol': 'topics',
|
||||||
VIGENTE: 'topics',
|
VIGENTE: 'topics',
|
||||||
'Firma Cliente (Venta)': 'group_mm6sx3rn',
|
|
||||||
'X Escriturar': 'group_mm6sx3rn',
|
'X Escriturar': 'group_mm6sx3rn',
|
||||||
Escriturado: 'group_mm6s40br',
|
Escriturado: 'group_mm6s40br',
|
||||||
FORMALIZADO: 'group_mm6s40br',
|
FORMALIZADO: 'group_mm6s40br',
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
|||||||
apartado({ id: 'p1', fechaLimite: '2026-09-05' }),
|
apartado({ id: 'p1', fechaLimite: '2026-09-05' }),
|
||||||
apartado({ id: 'p2', fechaLimite: '2026-09-01', estado: 'Cita Clientes' }),
|
apartado({ id: 'p2', fechaLimite: '2026-09-01', estado: 'Cita Clientes' }),
|
||||||
apartado({ id: 'p3', fechaLimite: '', estado: 'Alta Enkontrol' }),
|
apartado({ id: 'p3', fechaLimite: '', estado: 'Alta Enkontrol' }),
|
||||||
apartado({ id: 'p4', estado: 'Firma Cliente (Venta)' }), // final: fuera
|
apartado({ id: 'p4', estado: 'Escriturado' }), // final: fuera
|
||||||
apartado({ id: 'p5', estado: 'Cancelacion Apartado' }), // final: fuera
|
apartado({ id: 'p5', estado: 'Cancelacion Apartado' }), // final: fuera
|
||||||
apartado({ id: 'p6', vendedorIds: [OTRO_ID] }), // de otro: fuera
|
apartado({ id: 'p6', vendedorIds: [OTRO_ID] }), // de otro: fuera
|
||||||
],
|
],
|
||||||
@@ -254,7 +254,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('esEstadoFinalApartado: venta y cancelación cierran el pipeline', () => {
|
it('esEstadoFinalApartado: venta y cancelación cierran el pipeline', () => {
|
||||||
expect(esEstadoFinalApartado('Firma Cliente (Venta)')).toBe(true)
|
expect(esEstadoFinalApartado('Alta Enkontrol')).toBe(false)
|
||||||
expect(esEstadoFinalApartado('Cancelacion Apartado')).toBe(true)
|
expect(esEstadoFinalApartado('Cancelacion Apartado')).toBe(true)
|
||||||
expect(esEstadoFinalApartado('Escriturado')).toBe(true)
|
expect(esEstadoFinalApartado('Escriturado')).toBe(true)
|
||||||
expect(esEstadoFinalApartado('Pago Apartado')).toBe(false)
|
expect(esEstadoFinalApartado('Pago Apartado')).toBe(false)
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ export const ESTADOS_FINALES_APARTADO = [
|
|||||||
'CANCELADO',
|
'CANCELADO',
|
||||||
'LIBERADO',
|
'LIBERADO',
|
||||||
'FORMALIZADO',
|
'FORMALIZADO',
|
||||||
'FIRMA CLIENTE (VENTA)', // la venta se concreta: pasa a Escrituración
|
|
||||||
]
|
]
|
||||||
|
|
||||||
const ROLES_CON_EQUIPO = ['coordinador', 'corporativo', 'admin']
|
const ROLES_CON_EQUIPO = ['coordinador', 'corporativo', 'admin']
|
||||||
|
|||||||
@@ -736,7 +736,7 @@ export class MondayService {
|
|||||||
/**
|
/**
|
||||||
* Actualiza un apartado existente con los campos presentes (mismo builder de
|
* Actualiza un apartado existente con los campos presentes (mismo builder de
|
||||||
* valores que crearApartado) — usado cuando el alta de cliente arranca desde
|
* valores que crearApartado) — usado cuando el alta de cliente arranca desde
|
||||||
* un apartado ya creado (botón "Firma Cliente (Venta)" de Mis apartados):
|
* un apartado ya creado (botón "Alta Enkontrol" de Mis apartados):
|
||||||
* se enriquece el item en vez de crear uno duplicado.
|
* se enriquece el item en vez de crear uno duplicado.
|
||||||
*/
|
*/
|
||||||
async actualizarApartado(itemId: string, datos: Partial<DatosApartado>): Promise<void> {
|
async actualizarApartado(itemId: string, datos: Partial<DatosApartado>): Promise<void> {
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ export default function DatosGeneralesCampos({ prefix, compacto = false }: Props
|
|||||||
className="sm:col-span-2"
|
className="sm:col-span-2"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{!compacto && (
|
||||||
|
<CampoTexto nombre={p('usuarioEnkontrol')} etiqueta="Usuario Enkontrol" />
|
||||||
|
)}
|
||||||
</SectionCard>
|
</SectionCard>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export const datosGeneralesSchema = z
|
|||||||
tipoVivienda: z.enum(['PRESTADA', 'RENTADA', 'FAMILIAR', 'PROPIA', '']),
|
tipoVivienda: z.enum(['PRESTADA', 'RENTADA', 'FAMILIAR', 'PROPIA', '']),
|
||||||
tipoCompra: z.enum(['INVERSION', 'VIVIR_AHI', '']),
|
tipoCompra: z.enum(['INVERSION', 'VIVIR_AHI', '']),
|
||||||
actividadOcupacion: textoOpcional,
|
actividadOcupacion: textoOpcional,
|
||||||
|
usuarioEnkontrol: textoOpcional,
|
||||||
})
|
})
|
||||||
.superRefine((datos, ctx) => {
|
.superRefine((datos, ctx) => {
|
||||||
// Régimen de bienes solo aplica (y se exige) cuando el estado civil es CASADO
|
// Régimen de bienes solo aplica (y se exige) cuando el estado civil es CASADO
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ function paramsAfluencia(): { oportunidadId: string; valores: Record<string, str
|
|||||||
return { oportunidadId: id, valores }
|
return { oportunidadId: id, valores }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Lee ?apartado=<itemId> — botón "Firma Cliente (Venta)" de Mis apartados en Mi día */
|
/** Lee ?apartado=<itemId> — botón "Alta Enkontrol" de Mis apartados en Mi día */
|
||||||
function paramApartado(): string | null {
|
function paramApartado(): string | null {
|
||||||
return new URLSearchParams(window.location.search).get('apartado')
|
return new URLSearchParams(window.location.search).get('apartado')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export interface DatosGenerales {
|
|||||||
tipoVivienda: TipoVivienda | ''
|
tipoVivienda: TipoVivienda | ''
|
||||||
tipoCompra: TipoCompra | ''
|
tipoCompra: TipoCompra | ''
|
||||||
actividadOcupacion: string
|
actividadOcupacion: string
|
||||||
|
usuarioEnkontrol?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DatosEmpleo {
|
export interface DatosEmpleo {
|
||||||
@@ -150,7 +151,7 @@ export interface AltaCliente {
|
|||||||
// un lead (null = captura manual). Passthrough hasta payloadJson del API.
|
// un lead (null = captura manual). Passthrough hasta payloadJson del API.
|
||||||
leadMondayId: string | null
|
leadMondayId: string | null
|
||||||
// ID del item del tablero Apartado de Monday cuando el alta arrancó desde un
|
// ID del item del tablero Apartado de Monday cuando el alta arrancó desde un
|
||||||
// apartado existente (botón "Firma Cliente (Venta)" de Mis apartados): el
|
// apartado existente (botón "Alta Enkontrol" de Mis apartados): el
|
||||||
// API lo LIGA y enriquece en vez de crear un apartado duplicado.
|
// API lo LIGA y enriquece en vez de crear un apartado duplicado.
|
||||||
apartadoMondayId: string | null
|
apartadoMondayId: string | null
|
||||||
// ID del Cliente creado por el guardado progresivo (POST /clientes/progreso/
|
// ID del Cliente creado por el guardado progresivo (POST /clientes/progreso/
|
||||||
|
|||||||
@@ -172,7 +172,6 @@ export const FASES_APARTADO = [
|
|||||||
'Entrego Documentacion',
|
'Entrego Documentacion',
|
||||||
'Cita Clientes',
|
'Cita Clientes',
|
||||||
'Contrato Enkontrol',
|
'Contrato Enkontrol',
|
||||||
'Firma Cliente (Venta)',
|
|
||||||
'Cancelacion Apartado',
|
'Cancelacion Apartado',
|
||||||
] as const
|
] as const
|
||||||
export type FaseApartado = (typeof FASES_APARTADO)[number]
|
export type FaseApartado = (typeof FASES_APARTADO)[number]
|
||||||
@@ -184,7 +183,6 @@ export const ETIQUETA_FASE_APARTADO: Record<FaseApartado, string> = {
|
|||||||
'Entrego Documentacion': 'Entregó documentación',
|
'Entrego Documentacion': 'Entregó documentación',
|
||||||
'Cita Clientes': 'Cita cliente',
|
'Cita Clientes': 'Cita cliente',
|
||||||
'Contrato Enkontrol': 'Contrato Enkontrol',
|
'Contrato Enkontrol': 'Contrato Enkontrol',
|
||||||
'Firma Cliente (Venta)': 'Firma cliente (venta)',
|
|
||||||
'Cancelacion Apartado': 'Cancelación',
|
'Cancelacion Apartado': 'Cancelación',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -329,9 +329,9 @@ function FilaApartado({
|
|||||||
type="button"
|
type="button"
|
||||||
disabled={enviando}
|
disabled={enviando}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
// Firma Cliente (Venta): abre el alta de cliente prellenada con
|
// Alta Enkontrol: abre el alta de cliente prellenada con
|
||||||
// todo lo recolectado del apartado (ligada, sin duplicar)
|
// todo lo recolectado del apartado (ligada, sin duplicar)
|
||||||
if (fase === 'Firma Cliente (Venta)') {
|
if (fase === 'Alta Enkontrol') {
|
||||||
window.location.href = `/client/?apartado=${apartado.id}`
|
window.location.href = `/client/?apartado=${apartado.id}`
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -340,14 +340,14 @@ function FilaApartado({
|
|||||||
className={
|
className={
|
||||||
fase === 'Cancelacion Apartado'
|
fase === 'Cancelacion Apartado'
|
||||||
? 'rounded-lg border border-red-200 bg-white px-3 py-1.5 text-xs font-medium text-red-600 shadow-sm transition-all duration-100 ease-out hover:bg-red-50 disabled:opacity-50 dark:bg-[#0F172A] dark:border-red-800 dark:text-red-400'
|
? 'rounded-lg border border-red-200 bg-white px-3 py-1.5 text-xs font-medium text-red-600 shadow-sm transition-all duration-100 ease-out hover:bg-red-50 disabled:opacity-50 dark:bg-[#0F172A] dark:border-red-800 dark:text-red-400'
|
||||||
: fase === 'Firma Cliente (Venta)'
|
: fase === 'Alta Enkontrol'
|
||||||
? 'rounded-lg bg-accent px-3 py-1.5 text-xs font-medium text-white shadow-sm transition-all duration-100 ease-out hover:bg-accent-hover disabled:opacity-50'
|
? 'rounded-lg bg-accent px-3 py-1.5 text-xs font-medium text-white shadow-sm transition-all duration-100 ease-out hover:bg-accent-hover disabled:opacity-50'
|
||||||
: fase === apartado.estado
|
: fase === apartado.estado
|
||||||
? 'rounded-lg border border-accent bg-accent/5 px-3 py-1.5 text-xs font-medium text-accent shadow-sm disabled:opacity-50'
|
? 'rounded-lg border border-accent bg-accent/5 px-3 py-1.5 text-xs font-medium text-accent shadow-sm disabled:opacity-50'
|
||||||
: CLASE_BOTON_ACCION
|
: CLASE_BOTON_ACCION
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{fase === 'Firma Cliente (Venta)' ? 'Firma cliente (venta) →' : ETIQUETA_FASE_APARTADO[fase]}
|
{fase === 'Alta Enkontrol' ? 'Alta Enkontrol →' : ETIQUETA_FASE_APARTADO[fase]}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
<button
|
<button
|
||||||
|
|||||||
Reference in New Issue
Block a user