feat(captura): Escrituracion con 3 pares fecha+checkbox y columna Desviacion en dias
This commit is contained in:
@@ -30,6 +30,12 @@ export const CAMPOS_POR_DEPARTAMENTO: Record<string, { campo: string; tipo: stri
|
||||
{ campo: 'precio_venta', tipo: 'number', label: 'Precio Venta' },
|
||||
],
|
||||
ESCRITURACION: [
|
||||
{ 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: 'fecha_autorizacion', tipo: 'date', label: 'Fecha Autorización' },
|
||||
{ campo: 'fecha_firma', tipo: 'date', label: 'Fecha Firma' },
|
||||
{ campo: 'notaria', tipo: 'text', label: 'Notaría' },
|
||||
|
||||
@@ -192,6 +192,24 @@ describe('fechas de Obra bloqueadas', () => {
|
||||
).rejects.toThrow('solo puede modificarlas un administrador')
|
||||
expect(prismaMock.$transaction).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('ESCRITURACION: no-admin no puede modificar una fecha ya establecida', async () => {
|
||||
prismaMock.capturaDepartamento.findMany.mockResolvedValue([
|
||||
{ unidadCodigo: 'U-101', campo: 'entrega_programada_fecha', valor: '2026-10-01' },
|
||||
])
|
||||
await expect(
|
||||
guardarCampo(
|
||||
'SENDA',
|
||||
'U-101',
|
||||
'ESCRITURACION',
|
||||
'entrega_programada_fecha',
|
||||
'2026-10-15',
|
||||
'user-1',
|
||||
'escrituracion',
|
||||
),
|
||||
).rejects.toThrow('solo puede modificarlas un administrador')
|
||||
expect(prismaMock.capturaDepartamento.upsert).not.toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
|
||||
describe('resumenAvance', () => {
|
||||
|
||||
@@ -2,22 +2,24 @@ import { prisma } from './prisma.js'
|
||||
import { CAMPOS_POR_DEPARTAMENTO, DEPARTAMENTOS } from '../config/campos-departamento.js'
|
||||
import { AppError } from '../utils/errors.js'
|
||||
|
||||
/** Fechas de Obra emparejadas a checkboxes: tras establecerse solo las cambia un admin */
|
||||
const CAMPOS_FECHA_OBRA = new Set(
|
||||
(CAMPOS_POR_DEPARTAMENTO.OBRA ?? [])
|
||||
.filter((c) => c.conFecha)
|
||||
.map((c) => c.conFecha as string),
|
||||
)
|
||||
/** Fechas emparejadas a checkboxes por departamento: tras establecerse solo las cambia un admin */
|
||||
const CAMPOS_FECHA_BLOQUEADOS: Record<string, Set<string>> = {}
|
||||
for (const [dept, campos] of Object.entries(CAMPOS_POR_DEPARTAMENTO)) {
|
||||
const fechas = campos.filter((c) => c.conFecha).map((c) => c.conFecha as string)
|
||||
if (fechas.length > 0) CAMPOS_FECHA_BLOQUEADOS[dept] = new Set(fechas)
|
||||
}
|
||||
|
||||
/** Bloquear modificación de fechas de Obra ya establecidas (solo admin) */
|
||||
async function validarFechasObra(
|
||||
/** Bloquear modificación de fechas ya establecidas (solo admin) */
|
||||
async function validarFechasBloqueadas(
|
||||
desarrollo: string,
|
||||
departamento: string,
|
||||
registros: { unidad: string; campo: string; valor: string | null }[],
|
||||
rol: string,
|
||||
): Promise<void> {
|
||||
if (rol === 'admin' || departamento !== 'OBRA') return
|
||||
const candidatos = registros.filter((r) => CAMPOS_FECHA_OBRA.has(r.campo))
|
||||
if (rol === 'admin') return
|
||||
const bloqueados = CAMPOS_FECHA_BLOQUEADOS[departamento]
|
||||
if (!bloqueados) return
|
||||
const candidatos = registros.filter((r) => bloqueados.has(r.campo))
|
||||
if (candidatos.length === 0) return
|
||||
|
||||
const existentes = await prisma.capturaDepartamento.findMany({
|
||||
@@ -106,7 +108,7 @@ export async function guardarCampo(
|
||||
usuarioId: string,
|
||||
rol: string,
|
||||
): Promise<void> {
|
||||
await validarFechasObra(desarrollo, departamento, [{ unidad: unidadCodigo, campo, valor }], rol)
|
||||
await validarFechasBloqueadas(desarrollo, departamento, [{ unidad: unidadCodigo, campo, valor }], rol)
|
||||
|
||||
const tipo = CAMPOS_POR_DEPARTAMENTO[departamento]?.find((c) => c.campo === campo)?.tipo ?? 'text'
|
||||
|
||||
@@ -133,7 +135,7 @@ export async function guardarBulk(
|
||||
usuarioId: string,
|
||||
rol: string,
|
||||
): Promise<void> {
|
||||
await validarFechasObra(desarrollo, departamento, registros, rol)
|
||||
await validarFechasBloqueadas(desarrollo, departamento, registros, rol)
|
||||
|
||||
const tipoPorCampo = new Map(
|
||||
(CAMPOS_POR_DEPARTAMENTO[departamento] ?? []).map((c) => [c.campo, c.tipo]),
|
||||
|
||||
Reference in New Issue
Block a user