# TRACEABILITY - MAI-006: Calidad metadata: modulo: MAI-006 nombre: Calidad version: 1.0.0 fecha: 2025-12-06 reutilizacion_core: 0% descripcion: Sistema de gestión de calidad para obras de construcción vertical: Construcción dependencias: - MAI-001 # Proyectos - MAI-003 # Recursos - MAI-004 # Avance de Obra requerimientos: - id: RF-CAL-001 titulo: Inspecciones de Calidad descripcion: Gestión completa de inspecciones de calidad en obra prioridad: Alta estado: Pendiente criterios_aceptacion: - Registrar inspecciones programadas y no programadas - Capturar hallazgos y observaciones con evidencias fotográficas - Asignar responsables y fechas de corrección - Generar reportes de inspección - Notificar a responsables sobre hallazgos endpoints: - metodo: POST ruta: /api/v1/calidad/inspecciones descripcion: Crear nueva inspección de calidad autenticacion: JWT permisos: [quality.inspection.create] request_body: proyecto_id: integer obra_id: integer tipo_inspeccion: string area_inspeccion: string fecha_programada: datetime inspector_id: integer checklist_id: integer observaciones: string response: InspeccionCalidadDto - metodo: GET ruta: /api/v1/calidad/inspecciones descripcion: Listar inspecciones con filtros autenticacion: JWT permisos: [quality.inspection.read] query_params: proyecto_id: integer obra_id: integer estado: string fecha_desde: date fecha_hasta: date inspector_id: integer tipo_inspeccion: string page: integer limit: integer response: PaginatedInspeccionCalidadDto - metodo: GET ruta: /api/v1/calidad/inspecciones/{id} descripcion: Obtener detalle de inspección autenticacion: JWT permisos: [quality.inspection.read] path_params: id: integer response: InspeccionCalidadDetalleDto - metodo: PUT ruta: /api/v1/calidad/inspecciones/{id} descripcion: Actualizar inspección autenticacion: JWT permisos: [quality.inspection.update] path_params: id: integer request_body: fecha_programada: datetime inspector_id: integer estado: string observaciones: string response: InspeccionCalidadDto - metodo: POST ruta: /api/v1/calidad/inspecciones/{id}/ejecutar descripcion: Ejecutar inspección y registrar resultados autenticacion: JWT permisos: [quality.inspection.execute] path_params: id: integer request_body: fecha_ejecucion: datetime items_checklist: - item_id: integer conforme: boolean observaciones: string evidencias: array[string] hallazgos: - descripcion: string severidad: string ubicacion: string responsable_id: integer fecha_correccion: date evidencias: array[string] resultado_general: string observaciones_finales: string response: InspeccionCalidadDto - metodo: POST ruta: /api/v1/calidad/inspecciones/{id}/hallazgos descripcion: Registrar hallazgo en inspección autenticacion: JWT permisos: [quality.inspection.update] path_params: id: integer request_body: descripcion: string severidad: string categoria: string ubicacion: string responsable_id: integer fecha_correccion: date evidencias: array[string] response: HallazgoCalidadDto - metodo: PUT ruta: /api/v1/calidad/inspecciones/hallazgos/{id}/corregir descripcion: Registrar corrección de hallazgo autenticacion: JWT permisos: [quality.inspection.update] path_params: id: integer request_body: fecha_correccion: datetime accion_correctiva: string evidencias: array[string] verificado_por: integer response: HallazgoCalidadDto - metodo: GET ruta: /api/v1/calidad/inspecciones/{id}/reporte descripcion: Generar reporte de inspección autenticacion: JWT permisos: [quality.inspection.read] path_params: id: integer query_params: formato: string response: application/pdf tablas: - nombre: inspecciones_calidad descripcion: Registro de inspecciones de calidad columnas: - nombre: id tipo: SERIAL pk: true - nombre: proyecto_id tipo: INTEGER fk: proyectos.id notnull: true - nombre: obra_id tipo: INTEGER fk: obras.id notnull: true - nombre: codigo tipo: VARCHAR(50) unique: true notnull: true - nombre: tipo_inspeccion tipo: VARCHAR(100) notnull: true comment: Estructural, acabados, instalaciones, etc. - nombre: area_inspeccion tipo: VARCHAR(200) notnull: true - nombre: fecha_programada tipo: TIMESTAMP notnull: true - nombre: fecha_ejecucion tipo: TIMESTAMP - nombre: inspector_id tipo: INTEGER fk: usuarios.id notnull: true - nombre: checklist_id tipo: INTEGER fk: checklists_calidad.id - nombre: estado tipo: VARCHAR(50) notnull: true default: "'programada'" comment: programada, en_progreso, completada, cancelada - nombre: resultado_general tipo: VARCHAR(50) comment: aprobado, rechazado, condicional - nombre: observaciones tipo: TEXT - nombre: observaciones_finales tipo: TEXT - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: created_by tipo: INTEGER fk: usuarios.id - nombre: updated_by tipo: INTEGER fk: usuarios.id indices: - columnas: [proyecto_id, fecha_programada] - columnas: [obra_id, estado] - columnas: [inspector_id, fecha_programada] - columnas: [codigo] - columnas: [tenant_id] - nombre: hallazgos_calidad descripcion: Hallazgos detectados en inspecciones columnas: - nombre: id tipo: SERIAL pk: true - nombre: inspeccion_id tipo: INTEGER fk: inspecciones_calidad.id notnull: true - nombre: codigo tipo: VARCHAR(50) unique: true notnull: true - nombre: descripcion tipo: TEXT notnull: true - nombre: severidad tipo: VARCHAR(50) notnull: true comment: critica, alta, media, baja - nombre: categoria tipo: VARCHAR(100) comment: estructural, acabados, instalaciones, seguridad - nombre: ubicacion tipo: VARCHAR(200) - nombre: responsable_id tipo: INTEGER fk: usuarios.id notnull: true - nombre: fecha_deteccion tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: fecha_correccion_requerida tipo: DATE notnull: true - nombre: fecha_correccion_real tipo: TIMESTAMP - nombre: accion_correctiva tipo: TEXT - nombre: verificado_por tipo: INTEGER fk: usuarios.id - nombre: estado tipo: VARCHAR(50) notnull: true default: "'pendiente'" comment: pendiente, en_correccion, corregido, verificado - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [inspeccion_id] - columnas: [responsable_id, estado] - columnas: [severidad, estado] - columnas: [tenant_id] - nombre: evidencias_inspeccion descripcion: Evidencias fotográficas y documentales columnas: - nombre: id tipo: SERIAL pk: true - nombre: inspeccion_id tipo: INTEGER fk: inspecciones_calidad.id - nombre: hallazgo_id tipo: INTEGER fk: hallazgos_calidad.id - nombre: tipo tipo: VARCHAR(50) notnull: true comment: foto, video, documento - nombre: url tipo: VARCHAR(500) notnull: true - nombre: descripcion tipo: TEXT - nombre: fecha_captura tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: capturado_por tipo: INTEGER fk: usuarios.id - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [inspeccion_id] - columnas: [hallazgo_id] - columnas: [tenant_id] - nombre: checklists_calidad descripcion: Plantillas de checklist para inspecciones columnas: - nombre: id tipo: SERIAL pk: true - nombre: nombre tipo: VARCHAR(200) notnull: true - nombre: descripcion tipo: TEXT - nombre: tipo_inspeccion tipo: VARCHAR(100) notnull: true - nombre: activo tipo: BOOLEAN default: true - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [tenant_id, activo] - nombre: items_checklist descripcion: Items de verificación en checklists columnas: - nombre: id tipo: SERIAL pk: true - nombre: checklist_id tipo: INTEGER fk: checklists_calidad.id notnull: true - nombre: orden tipo: INTEGER notnull: true - nombre: descripcion tipo: TEXT notnull: true - nombre: criterio_aceptacion tipo: TEXT - nombre: requerido tipo: BOOLEAN default: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [checklist_id, orden] - nombre: resultados_checklist descripcion: Resultados de items verificados columnas: - nombre: id tipo: SERIAL pk: true - nombre: inspeccion_id tipo: INTEGER fk: inspecciones_calidad.id notnull: true - nombre: item_id tipo: INTEGER fk: items_checklist.id notnull: true - nombre: conforme tipo: BOOLEAN notnull: true - nombre: observaciones tipo: TEXT - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [inspeccion_id] - columnas: [item_id] componentes_ui: - ruta: /calidad/inspecciones componente: InspeccionesCalidadPage descripcion: Lista de inspecciones de calidad permisos: [quality.inspection.read] funcionalidades: - Filtrar por proyecto, obra, estado, fechas - Crear nueva inspección - Ejecutar inspección - Ver detalle y resultados - Generar reportes - ruta: /calidad/inspecciones/nueva componente: NuevaInspeccionForm descripcion: Formulario para crear inspección permisos: [quality.inspection.create] funcionalidades: - Seleccionar proyecto y obra - Definir tipo y área de inspección - Asignar inspector - Programar fecha - Seleccionar checklist - ruta: /calidad/inspecciones/:id componente: InspeccionCalidadDetailPage descripcion: Detalle completo de inspección permisos: [quality.inspection.read] funcionalidades: - Ver información general - Revisar checklist y resultados - Ver hallazgos registrados - Gestionar evidencias - Generar reporte - ruta: /calidad/inspecciones/:id/ejecutar componente: EjecutarInspeccionPage descripcion: Interfaz para ejecutar inspección permisos: [quality.inspection.execute] funcionalidades: - Marcar items de checklist - Registrar hallazgos in-situ - Capturar evidencias fotográficas - Registrar observaciones - Completar inspección - ruta: /calidad/hallazgos componente: HallazgosCalidadPage descripcion: Gestión de hallazgos y seguimiento permisos: [quality.inspection.read] funcionalidades: - Lista de hallazgos por estado - Filtrar por severidad y responsable - Registrar correcciones - Verificar correcciones - Dashboard de hallazgos pendientes - componente: InspeccionCalidadCard descripcion: Tarjeta resumen de inspección props: - inspeccion: InspeccionCalidadDto - onEdit: function - onExecute: function - onViewDetails: function - componente: ChecklistEjecucionForm descripcion: Formulario para ejecutar checklist props: - checklist: ChecklistCalidadDto - onItemCheck: function - onAddEvidence: function - componente: HallazgoForm descripcion: Formulario para registrar hallazgo props: - inspeccionId: number - onSubmit: function - onCancel: function - componente: EvidenciaUploader descripcion: Componente para subir evidencias props: - tipo: string - onUpload: function - maxFiles: number app_movil: modulo: MOB-003 nombre: Supervisor funcionalidades: - Ejecutar inspecciones offline - Registrar hallazgos con cámara - Completar checklists - Sincronizar resultados pantallas: - InspeccionesListScreen - EjecutarInspeccionScreen - ChecklistScreen - RegistrarHallazgoScreen - CapturaEvidenciaScreen - id: RF-CAL-002 titulo: Reportes de No Conformidad descripcion: Gestión de reportes de no conformidad (RNC) prioridad: Alta estado: Pendiente criterios_aceptacion: - Emitir RNC por incumplimientos detectados - Asignar responsables y plazos de corrección - Registrar acciones correctivas y preventivas - Hacer seguimiento hasta el cierre - Generar estadísticas de RNC endpoints: - metodo: POST ruta: /api/v1/calidad/no-conformidades descripcion: Crear reporte de no conformidad autenticacion: JWT permisos: [quality.ncr.create] request_body: proyecto_id: integer origen_tipo: string origen_id: integer categoria: string descripcion: string severidad: string responsable_id: integer fecha_limite: date evidencias: array[string] response: NoConformidadDto - metodo: GET ruta: /api/v1/calidad/no-conformidades descripcion: Listar reportes de no conformidad autenticacion: JWT permisos: [quality.ncr.read] query_params: proyecto_id: integer estado: string severidad: string responsable_id: integer fecha_desde: date fecha_hasta: date page: integer limit: integer response: PaginatedNoConformidadDto - metodo: GET ruta: /api/v1/calidad/no-conformidades/{id} descripcion: Obtener detalle de RNC autenticacion: JWT permisos: [quality.ncr.read] path_params: id: integer response: NoConformidadDetalleDto - metodo: PUT ruta: /api/v1/calidad/no-conformidades/{id} descripcion: Actualizar RNC autenticacion: JWT permisos: [quality.ncr.update] path_params: id: integer request_body: descripcion: string severidad: string responsable_id: integer fecha_limite: date response: NoConformidadDto - metodo: POST ruta: /api/v1/calidad/no-conformidades/{id}/acciones-correctivas descripcion: Registrar acción correctiva autenticacion: JWT permisos: [quality.ncr.update] path_params: id: integer request_body: tipo: string descripcion: string fecha_implementacion: date responsable_id: integer evidencias: array[string] response: AccionCorrectivaDto - metodo: POST ruta: /api/v1/calidad/no-conformidades/{id}/cerrar descripcion: Cerrar RNC autenticacion: JWT permisos: [quality.ncr.close] path_params: id: integer request_body: fecha_cierre: datetime verificado_por: integer observaciones_cierre: string evidencias_cierre: array[string] response: NoConformidadDto - metodo: GET ruta: /api/v1/calidad/no-conformidades/estadisticas descripcion: Estadísticas de RNC autenticacion: JWT permisos: [quality.ncr.read] query_params: proyecto_id: integer fecha_desde: date fecha_hasta: date response: EstadisticasRNCDto - metodo: GET ruta: /api/v1/calidad/no-conformidades/{id}/reporte descripcion: Generar reporte de RNC autenticacion: JWT permisos: [quality.ncr.read] path_params: id: integer query_params: formato: string response: application/pdf tablas: - nombre: no_conformidades descripcion: Reportes de no conformidad columnas: - nombre: id tipo: SERIAL pk: true - nombre: proyecto_id tipo: INTEGER fk: proyectos.id notnull: true - nombre: codigo tipo: VARCHAR(50) unique: true notnull: true - nombre: origen_tipo tipo: VARCHAR(50) notnull: true comment: inspeccion, auditoria, queja_cliente, observacion_interna - nombre: origen_id tipo: INTEGER comment: ID del registro origen - nombre: categoria tipo: VARCHAR(100) notnull: true comment: calidad_materiales, proceso_constructivo, seguridad, etc. - nombre: descripcion tipo: TEXT notnull: true - nombre: severidad tipo: VARCHAR(50) notnull: true comment: critica, mayor, menor - nombre: responsable_id tipo: INTEGER fk: usuarios.id notnull: true - nombre: fecha_emision tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: fecha_limite tipo: DATE notnull: true - nombre: fecha_cierre tipo: TIMESTAMP - nombre: estado tipo: VARCHAR(50) notnull: true default: "'abierta'" comment: abierta, en_correccion, cerrada, cancelada - nombre: causa_raiz tipo: TEXT - nombre: observaciones_cierre tipo: TEXT - nombre: verificado_por tipo: INTEGER fk: usuarios.id - nombre: emitido_por tipo: INTEGER fk: usuarios.id notnull: true - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [proyecto_id, estado] - columnas: [responsable_id, estado] - columnas: [codigo] - columnas: [severidad, estado] - columnas: [tenant_id] - nombre: acciones_correctivas descripcion: Acciones correctivas y preventivas columnas: - nombre: id tipo: SERIAL pk: true - nombre: no_conformidad_id tipo: INTEGER fk: no_conformidades.id notnull: true - nombre: tipo tipo: VARCHAR(50) notnull: true comment: correctiva, preventiva - nombre: descripcion tipo: TEXT notnull: true - nombre: fecha_planificada tipo: DATE notnull: true - nombre: fecha_implementacion tipo: DATE - nombre: responsable_id tipo: INTEGER fk: usuarios.id notnull: true - nombre: estado tipo: VARCHAR(50) notnull: true default: "'planificada'" comment: planificada, implementada, verificada - nombre: resultado_verificacion tipo: TEXT - nombre: verificado_por tipo: INTEGER fk: usuarios.id - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [no_conformidad_id] - columnas: [responsable_id, estado] - columnas: [tenant_id] - nombre: evidencias_rnc descripcion: Evidencias de RNC y acciones correctivas columnas: - nombre: id tipo: SERIAL pk: true - nombre: no_conformidad_id tipo: INTEGER fk: no_conformidades.id - nombre: accion_correctiva_id tipo: INTEGER fk: acciones_correctivas.id - nombre: tipo tipo: VARCHAR(50) notnull: true comment: foto, documento, video - nombre: url tipo: VARCHAR(500) notnull: true - nombre: descripcion tipo: TEXT - nombre: etapa tipo: VARCHAR(50) comment: deteccion, correccion, verificacion, cierre - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: created_by tipo: INTEGER fk: usuarios.id indices: - columnas: [no_conformidad_id] - columnas: [accion_correctiva_id] - columnas: [tenant_id] componentes_ui: - ruta: /calidad/no-conformidades componente: NoConformidadesPage descripcion: Lista de reportes de no conformidad permisos: [quality.ncr.read] funcionalidades: - Filtrar por proyecto, estado, severidad - Crear nuevo RNC - Ver detalle de RNC - Dashboard de RNC por estado - Exportar listado - ruta: /calidad/no-conformidades/nueva componente: NuevaNoConformidadForm descripcion: Formulario para crear RNC permisos: [quality.ncr.create] funcionalidades: - Seleccionar proyecto - Definir origen y categoría - Describir no conformidad - Asignar responsable y plazo - Adjuntar evidencias - ruta: /calidad/no-conformidades/:id componente: NoConformidadDetailPage descripcion: Detalle de RNC permisos: [quality.ncr.read] funcionalidades: - Ver información completa - Registrar acciones correctivas - Hacer seguimiento - Verificar y cerrar RNC - Generar reporte - componente: NoConformidadCard descripcion: Tarjeta resumen de RNC props: - noConformidad: NoConformidadDto - onEdit: function - onViewDetails: function - componente: AccionCorrectivaForm descripcion: Formulario para acción correctiva props: - rncId: number - tipo: string - onSubmit: function - componente: RNCEstadisticasWidget descripcion: Widget de estadísticas de RNC props: - proyectoId: number - periodo: DateRange - componente: TimelineRNC descripcion: Línea de tiempo de RNC props: - rncId: number - eventos: array app_movil: modulo: MOB-003 nombre: Supervisor funcionalidades: - Emitir RNC desde campo - Registrar acciones correctivas - Capturar evidencias - Consultar RNC asignadas pantallas: - NoConformidadesListScreen - NuevaRNCScreen - RNCDetailScreen - AccionCorrectivaScreen - id: RF-CAL-003 titulo: Pruebas de Laboratorio descripcion: Gestión de pruebas de laboratorio y ensayos de materiales prioridad: Alta estado: Pendiente criterios_aceptacion: - Registrar solicitudes de pruebas de laboratorio - Gestionar envío de muestras - Registrar resultados de laboratorio - Comparar con especificaciones técnicas - Generar certificados de pruebas endpoints: - metodo: POST ruta: /api/v1/calidad/pruebas-laboratorio descripcion: Crear solicitud de prueba autenticacion: JWT permisos: [quality.lab.create] request_body: proyecto_id: integer obra_id: integer tipo_prueba: string material: string especificacion_id: integer cantidad_muestras: integer fecha_muestreo: datetime ubicacion_muestreo: string laboratorio_id: integer solicitante_id: integer observaciones: string response: PruebaLaboratorioDto - metodo: GET ruta: /api/v1/calidad/pruebas-laboratorio descripcion: Listar pruebas de laboratorio autenticacion: JWT permisos: [quality.lab.read] query_params: proyecto_id: integer estado: string tipo_prueba: string laboratorio_id: integer fecha_desde: date fecha_hasta: date page: integer limit: integer response: PaginatedPruebaLaboratorioDto - metodo: GET ruta: /api/v1/calidad/pruebas-laboratorio/{id} descripcion: Obtener detalle de prueba autenticacion: JWT permisos: [quality.lab.read] path_params: id: integer response: PruebaLaboratorioDetalleDto - metodo: PUT ruta: /api/v1/calidad/pruebas-laboratorio/{id} descripcion: Actualizar solicitud de prueba autenticacion: JWT permisos: [quality.lab.update] path_params: id: integer request_body: laboratorio_id: integer fecha_envio: date observaciones: string response: PruebaLaboratorioDto - metodo: POST ruta: /api/v1/calidad/pruebas-laboratorio/{id}/resultados descripcion: Registrar resultados de laboratorio autenticacion: JWT permisos: [quality.lab.results] path_params: id: integer request_body: fecha_resultados: datetime resultados: - parametro: string valor_obtenido: decimal valor_especificado: decimal unidad: string cumple: boolean resultado_general: string observaciones_laboratorio: string certificado_url: string response: PruebaLaboratorioDto - metodo: POST ruta: /api/v1/calidad/pruebas-laboratorio/{id}/aprobar descripcion: Aprobar o rechazar resultados autenticacion: JWT permisos: [quality.lab.approve] path_params: id: integer request_body: aprobado: boolean aprobado_por: integer fecha_aprobacion: datetime observaciones_aprobacion: string response: PruebaLaboratorioDto - metodo: GET ruta: /api/v1/calidad/pruebas-laboratorio/{id}/certificado descripcion: Descargar certificado de prueba autenticacion: JWT permisos: [quality.lab.read] path_params: id: integer response: application/pdf - metodo: GET ruta: /api/v1/calidad/laboratorios descripcion: Listar laboratorios certificados autenticacion: JWT permisos: [quality.lab.read] query_params: activo: boolean response: array[LaboratorioDto] - metodo: POST ruta: /api/v1/calidad/laboratorios descripcion: Registrar laboratorio autenticacion: JWT permisos: [quality.lab.admin] request_body: nombre: string ruc: string direccion: string telefono: string email: string certificaciones: array[string] especialidades: array[string] activo: boolean response: LaboratorioDto tablas: - nombre: pruebas_laboratorio descripcion: Solicitudes y resultados de pruebas columnas: - nombre: id tipo: SERIAL pk: true - nombre: proyecto_id tipo: INTEGER fk: proyectos.id notnull: true - nombre: obra_id tipo: INTEGER fk: obras.id - nombre: codigo tipo: VARCHAR(50) unique: true notnull: true - nombre: tipo_prueba tipo: VARCHAR(100) notnull: true comment: concreto, suelos, asfalto, acero, etc. - nombre: subtipo_prueba tipo: VARCHAR(100) comment: resistencia_compresion, granulometria, etc. - nombre: material tipo: VARCHAR(200) notnull: true - nombre: especificacion_id tipo: INTEGER fk: especificaciones_tecnicas.id - nombre: cantidad_muestras tipo: INTEGER notnull: true - nombre: fecha_muestreo tipo: TIMESTAMP notnull: true - nombre: ubicacion_muestreo tipo: VARCHAR(200) - nombre: responsable_muestreo tipo: INTEGER fk: usuarios.id - nombre: laboratorio_id tipo: INTEGER fk: laboratorios.id - nombre: fecha_envio tipo: DATE - nombre: fecha_resultados tipo: TIMESTAMP - nombre: resultado_general tipo: VARCHAR(50) comment: aprobado, rechazado, condicional - nombre: observaciones_laboratorio tipo: TEXT - nombre: certificado_url tipo: VARCHAR(500) - nombre: aprobado tipo: BOOLEAN - nombre: aprobado_por tipo: INTEGER fk: usuarios.id - nombre: fecha_aprobacion tipo: TIMESTAMP - nombre: observaciones_aprobacion tipo: TEXT - nombre: estado tipo: VARCHAR(50) notnull: true default: "'solicitada'" comment: solicitada, enviada, en_proceso, completada, aprobada, rechazada - nombre: solicitante_id tipo: INTEGER fk: usuarios.id notnull: true - nombre: observaciones tipo: TEXT - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [proyecto_id, estado] - columnas: [laboratorio_id, estado] - columnas: [codigo] - columnas: [tipo_prueba, estado] - columnas: [tenant_id] - nombre: resultados_prueba descripcion: Parámetros y resultados detallados columnas: - nombre: id tipo: SERIAL pk: true - nombre: prueba_id tipo: INTEGER fk: pruebas_laboratorio.id notnull: true - nombre: parametro tipo: VARCHAR(200) notnull: true comment: resistencia, granulometria, humedad, etc. - nombre: valor_obtenido tipo: DECIMAL(15,4) notnull: true - nombre: valor_especificado tipo: DECIMAL(15,4) - nombre: valor_minimo tipo: DECIMAL(15,4) - nombre: valor_maximo tipo: DECIMAL(15,4) - nombre: unidad tipo: VARCHAR(50) notnull: true - nombre: cumple tipo: BOOLEAN notnull: true - nombre: observaciones tipo: TEXT - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [prueba_id] - nombre: laboratorios descripcion: Catálogo de laboratorios certificados columnas: - nombre: id tipo: SERIAL pk: true - nombre: nombre tipo: VARCHAR(200) notnull: true - nombre: ruc tipo: VARCHAR(20) unique: true - nombre: direccion tipo: TEXT - nombre: telefono tipo: VARCHAR(50) - nombre: email tipo: VARCHAR(200) - nombre: contacto_nombre tipo: VARCHAR(200) - nombre: contacto_telefono tipo: VARCHAR(50) - nombre: contacto_email tipo: VARCHAR(200) - nombre: certificaciones tipo: JSONB comment: Certificaciones y acreditaciones - nombre: especialidades tipo: JSONB comment: Tipos de pruebas que realiza - nombre: activo tipo: BOOLEAN default: true - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [tenant_id, activo] - columnas: [ruc] - nombre: especificaciones_tecnicas descripcion: Especificaciones técnicas de materiales columnas: - nombre: id tipo: SERIAL pk: true - nombre: nombre tipo: VARCHAR(200) notnull: true - nombre: codigo tipo: VARCHAR(50) unique: true - nombre: tipo_material tipo: VARCHAR(100) notnull: true - nombre: norma_referencia tipo: VARCHAR(100) - nombre: parametros tipo: JSONB notnull: true comment: Parámetros y valores esperados - nombre: descripcion tipo: TEXT - nombre: activo tipo: BOOLEAN default: true - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [tenant_id, activo] - columnas: [codigo] - nombre: muestras_laboratorio descripcion: Control de muestras enviadas columnas: - nombre: id tipo: SERIAL pk: true - nombre: prueba_id tipo: INTEGER fk: pruebas_laboratorio.id notnull: true - nombre: codigo_muestra tipo: VARCHAR(50) notnull: true - nombre: descripcion tipo: TEXT - nombre: fecha_toma tipo: TIMESTAMP notnull: true - nombre: estado tipo: VARCHAR(50) notnull: true default: "'tomada'" comment: tomada, enviada, en_analisis, analizada - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [prueba_id] - columnas: [codigo_muestra] - columnas: [tenant_id] componentes_ui: - ruta: /calidad/pruebas-laboratorio componente: PruebasLaboratorioPage descripcion: Lista de pruebas de laboratorio permisos: [quality.lab.read] funcionalidades: - Filtrar por proyecto, tipo, estado - Crear solicitud de prueba - Registrar resultados - Aprobar/rechazar resultados - Descargar certificados - ruta: /calidad/pruebas-laboratorio/nueva componente: NuevaPruebaForm descripcion: Formulario para solicitar prueba permisos: [quality.lab.create] funcionalidades: - Seleccionar proyecto y obra - Definir tipo de prueba y material - Registrar datos de muestreo - Seleccionar laboratorio - Especificar parámetros a evaluar - ruta: /calidad/pruebas-laboratorio/:id componente: PruebaLaboratorioDetailPage descripcion: Detalle de prueba de laboratorio permisos: [quality.lab.read] funcionalidades: - Ver información de solicitud - Ver resultados detallados - Comparar con especificaciones - Aprobar/rechazar - Descargar certificado - ruta: /calidad/pruebas-laboratorio/:id/resultados componente: RegistrarResultadosForm descripcion: Formulario para resultados permisos: [quality.lab.results] funcionalidades: - Ingresar valores por parámetro - Comparar con especificaciones - Adjuntar certificado - Determinar cumplimiento - ruta: /calidad/laboratorios componente: LaboratoriosPage descripcion: Gestión de laboratorios permisos: [quality.lab.admin] funcionalidades: - Lista de laboratorios - Registrar nuevo laboratorio - Editar información - Gestionar especialidades - componente: PruebaLaboratorioCard descripcion: Tarjeta resumen de prueba props: - prueba: PruebaLaboratorioDto - onViewDetails: function - componente: ResultadosComparativaTable descripcion: Tabla comparativa de resultados props: - resultados: array - especificacion: object - componente: CertificadoViewer descripcion: Visor de certificados PDF props: - certificadoUrl: string app_movil: modulo: MOB-003 nombre: Supervisor funcionalidades: - Solicitar pruebas de laboratorio - Registrar toma de muestras - Consultar resultados - Ver certificados pantallas: - PruebasLaboratorioListScreen - SolicitudPruebaScreen - RegistroMuestraScreen - ResultadosScreen - id: RF-CAL-004 titulo: Certificaciones descripcion: Gestión de certificaciones de calidad y conformidad prioridad: Media estado: Pendiente criterios_aceptacion: - Emitir certificados de calidad de obra - Gestionar certificados de conformidad de materiales - Mantener registro de certificaciones - Generar reportes consolidados - Integrar con inspecciones y pruebas endpoints: - metodo: POST ruta: /api/v1/calidad/certificaciones descripcion: Crear certificación autenticacion: JWT permisos: [quality.cert.create] request_body: proyecto_id: integer tipo_certificacion: string alcance: string elementos_certificados: array inspecciones_ids: array[integer] pruebas_ids: array[integer] fecha_emision: date vigencia: date emitido_por: integer observaciones: string response: CertificacionDto - metodo: GET ruta: /api/v1/calidad/certificaciones descripcion: Listar certificaciones autenticacion: JWT permisos: [quality.cert.read] query_params: proyecto_id: integer tipo: string estado: string fecha_desde: date fecha_hasta: date page: integer limit: integer response: PaginatedCertificacionDto - metodo: GET ruta: /api/v1/calidad/certificaciones/{id} descripcion: Obtener detalle de certificación autenticacion: JWT permisos: [quality.cert.read] path_params: id: integer response: CertificacionDetalleDto - metodo: PUT ruta: /api/v1/calidad/certificaciones/{id} descripcion: Actualizar certificación autenticacion: JWT permisos: [quality.cert.update] path_params: id: integer request_body: alcance: string observaciones: string vigencia: date response: CertificacionDto - metodo: POST ruta: /api/v1/calidad/certificaciones/{id}/aprobar descripcion: Aprobar certificación autenticacion: JWT permisos: [quality.cert.approve] path_params: id: integer request_body: aprobado_por: integer fecha_aprobacion: datetime observaciones: string response: CertificacionDto - metodo: POST ruta: /api/v1/calidad/certificaciones/{id}/anular descripcion: Anular certificación autenticacion: JWT permisos: [quality.cert.cancel] path_params: id: integer request_body: motivo_anulacion: string anulado_por: integer response: CertificacionDto - metodo: GET ruta: /api/v1/calidad/certificaciones/{id}/documento descripcion: Generar documento de certificación autenticacion: JWT permisos: [quality.cert.read] path_params: id: integer query_params: formato: string response: application/pdf - metodo: GET ruta: /api/v1/calidad/certificaciones/consolidado descripcion: Reporte consolidado de certificaciones autenticacion: JWT permisos: [quality.cert.read] query_params: proyecto_id: integer fecha_desde: date fecha_hasta: date formato: string response: application/pdf tablas: - nombre: certificaciones descripcion: Certificaciones de calidad emitidas columnas: - nombre: id tipo: SERIAL pk: true - nombre: proyecto_id tipo: INTEGER fk: proyectos.id notnull: true - nombre: codigo tipo: VARCHAR(50) unique: true notnull: true - nombre: tipo_certificacion tipo: VARCHAR(100) notnull: true comment: obra_civil, estructural, acabados, instalaciones, conformidad_material - nombre: alcance tipo: TEXT notnull: true - nombre: elementos_certificados tipo: JSONB comment: Desglose de elementos incluidos - nombre: fecha_emision tipo: DATE notnull: true - nombre: fecha_vigencia tipo: DATE - nombre: emitido_por tipo: INTEGER fk: usuarios.id notnull: true - nombre: aprobado_por tipo: INTEGER fk: usuarios.id - nombre: fecha_aprobacion tipo: TIMESTAMP - nombre: estado tipo: VARCHAR(50) notnull: true default: "'borrador'" comment: borrador, aprobada, vigente, vencida, anulada - nombre: observaciones tipo: TEXT - nombre: motivo_anulacion tipo: TEXT - nombre: anulado_por tipo: INTEGER fk: usuarios.id - nombre: fecha_anulacion tipo: TIMESTAMP - nombre: documento_url tipo: VARCHAR(500) - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: updated_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [proyecto_id, estado] - columnas: [codigo] - columnas: [tipo_certificacion, estado] - columnas: [tenant_id] - nombre: certificaciones_inspecciones descripcion: Relación certificación-inspecciones columnas: - nombre: id tipo: SERIAL pk: true - nombre: certificacion_id tipo: INTEGER fk: certificaciones.id notnull: true - nombre: inspeccion_id tipo: INTEGER fk: inspecciones_calidad.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [certificacion_id] - columnas: [inspeccion_id] constraints: - tipo: unique columnas: [certificacion_id, inspeccion_id] - nombre: certificaciones_pruebas descripcion: Relación certificación-pruebas laboratorio columnas: - nombre: id tipo: SERIAL pk: true - nombre: certificacion_id tipo: INTEGER fk: certificaciones.id notnull: true - nombre: prueba_id tipo: INTEGER fk: pruebas_laboratorio.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP indices: - columnas: [certificacion_id] - columnas: [prueba_id] constraints: - tipo: unique columnas: [certificacion_id, prueba_id] - nombre: anexos_certificacion descripcion: Anexos y documentos adjuntos columnas: - nombre: id tipo: SERIAL pk: true - nombre: certificacion_id tipo: INTEGER fk: certificaciones.id notnull: true - nombre: tipo tipo: VARCHAR(50) notnull: true comment: plano, foto, reporte, certificado_laboratorio - nombre: titulo tipo: VARCHAR(200) notnull: true - nombre: url tipo: VARCHAR(500) notnull: true - nombre: descripcion tipo: TEXT - nombre: orden tipo: INTEGER - nombre: tenant_id tipo: INTEGER fk: tenants.id notnull: true - nombre: created_at tipo: TIMESTAMP default: CURRENT_TIMESTAMP - nombre: created_by tipo: INTEGER fk: usuarios.id indices: - columnas: [certificacion_id, orden] - columnas: [tenant_id] componentes_ui: - ruta: /calidad/certificaciones componente: CertificacionesPage descripcion: Lista de certificaciones permisos: [quality.cert.read] funcionalidades: - Filtrar por proyecto, tipo, estado - Crear nueva certificación - Ver detalles - Aprobar certificaciones - Descargar documentos - Reporte consolidado - ruta: /calidad/certificaciones/nueva componente: NuevaCertificacionForm descripcion: Formulario para crear certificación permisos: [quality.cert.create] funcionalidades: - Seleccionar proyecto - Definir tipo y alcance - Vincular inspecciones - Vincular pruebas de laboratorio - Agregar anexos - Definir vigencia - ruta: /calidad/certificaciones/:id componente: CertificacionDetailPage descripcion: Detalle de certificación permisos: [quality.cert.read] funcionalidades: - Ver información completa - Ver inspecciones vinculadas - Ver pruebas vinculadas - Ver anexos - Aprobar/anular - Generar documento - componente: CertificacionCard descripcion: Tarjeta resumen de certificación props: - certificacion: CertificacionDto - onViewDetails: function - onDownload: function - componente: CertificacionBuilder descripcion: Constructor de certificación props: - proyectoId: number - onSelectInspecciones: function - onSelectPruebas: function - onAddAnexo: function - componente: CertificacionPreview descripcion: Vista previa de certificación props: - certificacion: CertificacionDto - componente: ConsolidadoCertificacionesReport descripcion: Reporte consolidado props: - proyectoId: number - periodo: DateRange app_movil: modulo: MOB-003 nombre: Supervisor funcionalidades: - Consultar certificaciones vigentes - Ver documentos de certificación - Validar QR de certificados pantallas: - CertificacionesListScreen - CertificacionDetailScreen - DocumentoViewerScreen integracion: modulos_relacionados: - modulo: MAI-001 relacion: Vinculación con proyectos y obras endpoints_consumidos: - GET /api/v1/proyectos/{id} - GET /api/v1/obras - modulo: MAI-003 relacion: Asignación de personal para inspecciones endpoints_consumidos: - GET /api/v1/personal - GET /api/v1/personal/{id} - modulo: MAI-004 relacion: Validación de calidad del avance endpoints_consumidos: - GET /api/v1/avance/{id} - modulo: MGN-001 relacion: Usuarios, roles y permisos endpoints_consumidos: - GET /api/v1/users - GET /api/v1/users/{id} - modulo: MGN-008 relacion: Notificaciones de hallazgos y RNC endpoints_provistos: - POST /api/v1/notifications app_movil: - app: MOB-003 nombre: Supervisor sincronizacion: - Inspecciones asignadas - Checklists - Hallazgos registrados - Evidencias capturadas modo_offline: true funcionalidades: - Ejecutar inspecciones sin conexión - Capturar evidencias con cámara - Registrar hallazgos - Sincronizar al recuperar conexión migraciones: - version: 001 descripcion: Creación inicial de tablas de calidad orden: - checklists_calidad - items_checklist - inspecciones_calidad - resultados_checklist - hallazgos_calidad - evidencias_inspeccion - no_conformidades - acciones_correctivas - evidencias_rnc - laboratorios - especificaciones_tecnicas - pruebas_laboratorio - resultados_prueba - muestras_laboratorio - certificaciones - certificaciones_inspecciones - certificaciones_pruebas - anexos_certificacion seeds: - tabla: checklists_calidad descripcion: Checklists predefinidos registros: - nombre: Inspección Estructural de Concreto tipo_inspeccion: estructural items: - Verificación de encofrado - Revisión de armadura de refuerzo - Control de vaciado - Curado del concreto - nombre: Inspección de Acabados tipo_inspeccion: acabados items: - Nivelación de pisos - Verticalidad de muros - Acabado de pintura - Instalación de revestimientos - tabla: especificaciones_tecnicas descripcion: Especificaciones técnicas comunes registros: - codigo: CONC-210 nombre: Concreto f'c=210 kg/cm2 tipo_material: concreto norma_referencia: ACI 318 parametros: resistencia_minima: 210 slump: 3-4 edad_ensayo: 28 - tabla: laboratorios descripcion: Laboratorios certificados ejemplo registros: - nombre: Laboratorio de Ensayos de Materiales SAC especialidades: - concreto - suelos - asfalto testing: unitarios: - InspeccionesCalidadService - NoConformidadesService - PruebasLaboratorioService - CertificacionesService integracion: - Flujo completo de inspección - Emisión y cierre de RNC - Registro y aprobación de pruebas - Generación de certificaciones e2e: - Ejecutar inspección desde móvil - Registrar RNC con acciones correctivas - Solicitar y aprobar prueba de laboratorio - Emitir certificación de calidad documentacion: swagger: /api/docs/calidad postman_collection: MAI-006-Calidad.postman_collection.json diagramas: - Flujo de inspección de calidad - Ciclo de vida de RNC - Proceso de pruebas de laboratorio - Emisión de certificaciones permisos: roles: - quality.manager: - quality.inspection.* - quality.ncr.* - quality.lab.* - quality.cert.* - quality.inspector: - quality.inspection.read - quality.inspection.execute - quality.inspection.create - quality.ncr.read - quality.ncr.create - quality.supervisor: - quality.inspection.read - quality.ncr.read - quality.ncr.update - quality.ncr.close - quality.lab.read - quality.cert.read - quality.lab_tech: - quality.lab.read - quality.lab.create - quality.lab.results - quality.certifier: - quality.cert.read - quality.cert.create - quality.cert.approve metricas: kpis: - Índice de inspecciones realizadas vs programadas - Tiempo promedio de cierre de RNC - Porcentaje de pruebas aprobadas - Certificaciones emitidas por proyecto - Hallazgos por severidad - Tendencia de no conformidades reportes: - nombre: Reporte de Inspección tipo: PDF parametros: [inspeccion_id] - nombre: Reporte de No Conformidad tipo: PDF parametros: [rnc_id] - nombre: Certificado de Prueba de Laboratorio tipo: PDF parametros: [prueba_id] - nombre: Certificación de Calidad tipo: PDF parametros: [certificacion_id] - nombre: Consolidado de Calidad del Proyecto tipo: PDF/Excel parametros: [proyecto_id, fecha_desde, fecha_hasta] - nombre: Dashboard de Calidad tipo: Web parametros: [proyecto_id] metricas: - Inspecciones por estado - RNC abiertas vs cerradas - Pruebas por resultado - Certificaciones vigentes notas_implementacion: - Implementar captura offline de inspecciones en app móvil - Integrar con servicio de almacenamiento para evidencias - Configurar notificaciones automáticas para hallazgos críticos - Implementar workflow de aprobación para certificaciones - Considerar integración con laboratorios externos vía API - Implementar validación QR para certificados - Configurar recordatorios de vencimiento de certificaciones