feat(captura): Escrituracion con 3 pares fecha+checkbox y columna Desviacion en dias

This commit is contained in:
2026-09-12 08:03:44 +00:00
parent d2e97f33f5
commit b2d3287c31
6 changed files with 155 additions and 48 deletions

View File

@@ -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]),