106 lines
6.1 KiB
TypeScript
106 lines
6.1 KiB
TypeScript
export const DEPARTAMENTOS = ['OBRA', 'VENTAS', 'ESCRITURACION', 'FINANZAS', 'POSTVENTA'] as const
|
|
export type Departamento = (typeof DEPARTAMENTOS)[number]
|
|
|
|
export const CAMPOS_POR_DEPARTAMENTO: Record<string, { campo: string; tipo: string; label: string; options?: string[]; conFecha?: string }[]> = {
|
|
OBRA: [
|
|
{ campo: 'certificacion_gas', tipo: 'boolean', label: 'Certificación Gas', conFecha: 'certificacion_gas_fecha' },
|
|
{ campo: 'certificacion_gas_fecha', tipo: 'date', label: 'Fecha Certificación Gas' },
|
|
{ campo: 'to_c4_fianza', tipo: 'boolean', label: 'TO y C4-Fianza', conFecha: 'to_c4_fianza_fecha' },
|
|
{ campo: 'to_c4_fianza_fecha', tipo: 'date', label: 'Fecha TO y C4-Fianza' },
|
|
{ campo: 'regimen_inscrito', tipo: 'boolean', label: 'Régimen Inscrito', conFecha: 'regimen_inscrito_fecha' },
|
|
{ campo: 'regimen_inscrito_fecha', tipo: 'date', label: 'Fecha Régimen Inscrito' },
|
|
{ campo: 'no_oficial', tipo: 'boolean', label: 'No. Oficial', conFecha: 'no_oficial_fecha' },
|
|
{ campo: 'no_oficial_fecha', tipo: 'date', label: 'Fecha No. Oficial' },
|
|
{ campo: 'clave_catastral', tipo: 'boolean', label: 'Clave Catastral', conFecha: 'clave_catastral_fecha' },
|
|
{ campo: 'clave_catastral_fecha', tipo: 'date', label: 'Fecha Clave Catastral' },
|
|
{ campo: 'listas_avaluo', tipo: 'boolean', label: 'Listas para Avaluo', conFecha: 'listas_avaluo_fecha' },
|
|
{ campo: 'listas_avaluo_fecha', tipo: 'date', label: 'Fecha Listas para Avaluo' },
|
|
{ campo: 'habitabilidad', tipo: 'date', label: 'Habitabilidad a partir de' },
|
|
// Fechas de obra (las llena el área de obra; rigen el arranque y la entrega)
|
|
{ campo: 'inicio_obra', tipo: 'boolean', label: 'Inicio Obra', conFecha: 'inicio_obra_fecha' },
|
|
{ campo: 'inicio_obra_fecha', tipo: 'date', label: 'Fecha Inicio Obra' },
|
|
{ campo: 'entrega_programada', tipo: 'boolean', label: 'Entrega Programada', conFecha: 'entrega_programada_fecha' },
|
|
{ campo: 'entrega_programada_fecha', tipo: 'date', label: 'Fecha Programada Entrega Vivienda' },
|
|
{ campo: 'entrega_reprogramada', tipo: 'boolean', label: 'Entrega Reprogramada', conFecha: 'entrega_reprogramada_fecha' },
|
|
{ campo: 'entrega_reprogramada_fecha', tipo: 'date', label: 'Fecha Reprogramada Entrega Vivienda' },
|
|
{ campo: 'desviacion', tipo: 'number', label: 'Desviación (días)' },
|
|
{ campo: 'fecha_autorizacion', tipo: 'date', label: 'Fecha Autorización' },
|
|
{ campo: 'comentarios_obra', tipo: 'text', label: 'Comentarios' },
|
|
],
|
|
VENTAS: [
|
|
{ campo: 'cliente_id', tipo: 'text', label: 'Cliente ID' },
|
|
{ campo: 'nombre_cliente', tipo: 'text', label: 'Nombre Cliente' },
|
|
{ campo: 'ubicacion', tipo: 'text', label: 'Ubicación/Unidad' },
|
|
{ campo: 'modelo', tipo: 'text', label: 'Modelo' },
|
|
{ campo: 'tipo_credito', tipo: 'select', label: 'Tipo Crédito', options: ['BANCARIO', 'COFINAVIT', 'INFONAVIT', 'SANTANDER', 'HSBC', 'BBVA', 'FOVISSSTE', 'CONTADO'] },
|
|
{ campo: 'estatus', tipo: 'select', label: 'Estatus', options: ['DISPONIBLE', 'APARTADO', 'VENDIDO', 'ESCRITURADO'] },
|
|
{ campo: 'fecha_apartado', tipo: 'date', label: 'Fecha Apartado' },
|
|
{ campo: 'fecha_venta', tipo: 'date', label: 'Fecha Venta' },
|
|
{ campo: 'fecha_vencimiento', tipo: 'date', label: 'Fecha Vencimiento Contrato' },
|
|
{ campo: 'precio_venta', tipo: 'number', label: 'Precio Venta' },
|
|
],
|
|
ESCRITURACION: [
|
|
{ campo: 'fecha_firma', tipo: 'date', label: 'Fecha Firma' },
|
|
{ campo: 'notaria', tipo: 'text', label: 'Notaría' },
|
|
{ campo: 'fecha_pago_banco', tipo: 'date', label: 'Fecha Pago Banco' },
|
|
{ campo: 'fecha_pago_infonavit', tipo: 'date', label: 'Fecha Pago Infonavit' },
|
|
{ campo: 'fecha_pago_fovissste', tipo: 'date', label: 'Fecha Pago Fovissste' },
|
|
],
|
|
FINANZAS: [
|
|
{ campo: 'otros_ingresos', tipo: 'number', label: 'Otros Ingresos' },
|
|
{ campo: 'pagado_transferencia', tipo: 'number', label: 'Pagado Transferencia' },
|
|
{ campo: 'infonavit', tipo: 'number', label: 'Infonavit' },
|
|
{ campo: 'bancario', tipo: 'number', label: 'Bancario' },
|
|
{ campo: 'fovissste', tipo: 'number', label: 'Fovissste' },
|
|
{ campo: 'credito_puente', tipo: 'number', label: 'Crédito Puente' },
|
|
{ campo: 'saldo_favor', tipo: 'number', label: 'Saldo a Favor' },
|
|
],
|
|
POSTVENTA: [
|
|
{ campo: 'entrega_sac', tipo: 'boolean', label: 'Entrega a SAC' },
|
|
{ campo: 'comentarios_entrega', tipo: 'text', label: 'Comentarios' },
|
|
],
|
|
}
|
|
|
|
export const DESARROLLOS = ['SENDA', 'ATELIER', 'ESTANZA', 'DIAGONAL', 'SOLANA', 'SOLE', 'MUTUO'] as const
|
|
|
|
// ── Permisos de captura por rol ───────────────────────────────────────
|
|
|
|
/**
|
|
* Departamentos que cada rol puede ver y capturar. Fuente de verdad del
|
|
* ecosistema: el front espeja esta misma matriz en services/captura.ts para
|
|
* ocultar pestañas, pero quien la hace cumplir es el API.
|
|
*
|
|
* Dirección y administración ven todos (incluye los roles legacy de la matriz
|
|
* de módulos: 'director', 'coordinador'); cada rol operativo sólo el suyo.
|
|
*/
|
|
export const DEPARTAMENTOS_POR_ROL: Record<string, readonly Departamento[]> = {
|
|
admin: DEPARTAMENTOS,
|
|
manager: DEPARTAMENTOS,
|
|
direccion_general: DEPARTAMENTOS,
|
|
director_ventas: DEPARTAMENTOS,
|
|
administracion_venta: DEPARTAMENTOS,
|
|
director: DEPARTAMENTOS,
|
|
coordinador: DEPARTAMENTOS,
|
|
vendedor: ['VENTAS'],
|
|
escrituracion: ['ESCRITURACION'],
|
|
cobranza: ['FINANZAS'],
|
|
postventa: ['POSTVENTA'],
|
|
obra: ['OBRA'],
|
|
}
|
|
|
|
/**
|
|
* Departamentos del rol. Sin token (AUTH_ENABLED=false, modo local) no hay
|
|
* restricción; un rol desconocido cae a vendedor, igual que modulosDeRol
|
|
* (fallback seguro: es el conjunto más chico).
|
|
*/
|
|
export function departamentosDeRol(rol: string | undefined): readonly Departamento[] {
|
|
const clave = (rol ?? '').trim().toLowerCase()
|
|
if (clave === '') return DEPARTAMENTOS
|
|
return DEPARTAMENTOS_POR_ROL[clave] ?? DEPARTAMENTOS_POR_ROL['vendedor']!
|
|
}
|
|
|
|
/** ¿El rol puede ver/capturar ese departamento? */
|
|
export function rolPuedeDepartamento(rol: string | undefined, departamento: string): boolean {
|
|
return (departamentosDeRol(rol) as readonly string[]).includes(departamento)
|
|
}
|