# 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
