# =============================================================================
# INVENTARIO DE OBJETOS DE BASE DE DATOS - ERP CONSTRUCCION
# =============================================================================
# Fecha: 2025-11-24
# Version: 1.0.0
# Basado en: ADR-007, ADR-012
# DBMS: PostgreSQL 15+ con PostGIS
# =============================================================================

metadata:
  proyecto: ERP Construccion
  version: 1.0.0
  fecha_actualizacion: 2025-11-24
  responsable: Architecture-Analyst
  total_schemas: 8
  total_tablas: 67
  total_enums: 22
  total_funciones: 6
  total_triggers: 5
  total_policies: 47

# =============================================================================
# SCHEMAS
# =============================================================================
schemas:
  - name: auth
    tipo: generico
    origen: ERP-Generico
    descripcion: Autenticacion, usuarios, roles, permisos
    modulos: [MAI-001, MAI-013]

  - name: core
    tipo: generico
    origen: ERP-Generico
    descripcion: Datos maestros, catalogos, partners
    modulos: [MAI-001]

  - name: construction
    tipo: especifico
    origen: ERP-Construccion
    descripcion: Obras, proyectos, lotes, prototipos, avances
    modulos: [MAI-002, MAI-003, MAI-005, MAI-009, MAI-012]

  - name: estimates
    tipo: especifico
    origen: ERP-Construccion
    descripcion: Estimaciones, anticipos, retenciones
    modulos: [MAI-008]

  - name: infonavit
    tipo: especifico
    origen: ERP-Construccion
    descripcion: Cumplimiento INFONAVIT, derechohabientes
    modulos: [MAI-010, MAI-011]

  - name: inventory
    tipo: generico_ext
    origen: ERP-Generico + Extension
    descripcion: Inventarios con extensiones de obra
    modulos: [MAI-004]

  - name: purchase
    tipo: generico_ext
    origen: ERP-Generico + Extension
    descripcion: Compras con extensiones de obra
    modulos: [MAI-004]

  - name: hr
    tipo: generico_ext
    origen: ERP-Generico + Extension
    descripcion: RRHH con asistencias GPS y destajo
    modulos: [MAI-007]

# =============================================================================
# TABLAS POR SCHEMA
# =============================================================================
tablas:

  # ---------------------------------------------------------------------------
  # SCHEMA: construction (25 tablas)
  # ---------------------------------------------------------------------------
  construction:
    - nombre: fraccionamientos
      modulo: MAI-002
      descripcion: Desarrollos inmobiliarios/fraccionamientos
      campos_clave: [id, tenant_id, code, name, status]
      rls: true
      postgis: true

    - nombre: etapas
      modulo: MAI-002
      descripcion: Etapas/fases de un fraccionamiento
      campos_clave: [id, tenant_id, fraccionamiento_id, code, status]
      rls: true

    - nombre: manzanas
      modulo: MAI-002
      descripcion: Manzanas dentro de una etapa
      campos_clave: [id, tenant_id, etapa_id, code]
      rls: true
      postgis: true

    - nombre: lotes
      modulo: MAI-002
      descripcion: Lotes/terrenos vendibles (horizontal)
      campos_clave: [id, tenant_id, manzana_id, prototipo_id, code, status]
      rls: true
      postgis: true

    - nombre: torres
      modulo: MAI-002
      descripcion: Torres/edificios (vertical)
      campos_clave: [id, tenant_id, etapa_id, code, status]
      rls: true
      postgis: true

    - nombre: niveles
      modulo: MAI-002
      descripcion: Pisos de una torre
      campos_clave: [id, tenant_id, torre_id, floor_number]
      rls: true

    - nombre: departamentos
      modulo: MAI-002
      descripcion: Departamentos/unidades en torre
      campos_clave: [id, tenant_id, nivel_id, prototipo_id, code, status]
      rls: true

    - nombre: prototipos
      modulo: MAI-002
      descripcion: Tipos de vivienda/prototipos
      campos_clave: [id, tenant_id, code, name, type]
      rls: true

    - nombre: conceptos
      modulo: MAI-003
      descripcion: Catalogo de conceptos de obra
      campos_clave: [id, tenant_id, code, name, parent_id, unit_price]
      rls: true

    - nombre: presupuestos
      modulo: MAI-003
      descripcion: Presupuestos por prototipo u obra
      campos_clave: [id, tenant_id, code, fraccionamiento_id, prototipo_id, version]
      rls: true

    - nombre: presupuesto_partidas
      modulo: MAI-003
      descripcion: Lineas de presupuesto
      campos_clave: [id, tenant_id, presupuesto_id, concepto_id, quantity, unit_price]
      rls: true

    - nombre: programa_obra
      modulo: MAI-005
      descripcion: Programa maestro de obra
      campos_clave: [id, tenant_id, fraccionamiento_id, code, version]
      rls: true

    - nombre: programa_actividades
      modulo: MAI-005
      descripcion: Actividades del programa
      campos_clave: [id, tenant_id, programa_id, concepto_id, wbs_code]
      rls: true

    - nombre: avances_obra
      modulo: MAI-005
      descripcion: Captura de avances fisicos
      campos_clave: [id, tenant_id, lote_id, concepto_id, capture_date, status]
      rls: true

    - nombre: fotos_avance
      modulo: MAI-005
      descripcion: Evidencia fotografica de avances
      campos_clave: [id, tenant_id, avance_id, file_url]
      rls: true
      postgis: true

    - nombre: bitacora_obra
      modulo: MAI-005
      descripcion: Bitacora diaria de obra
      campos_clave: [id, tenant_id, fraccionamiento_id, entry_date, entry_number]
      rls: true

    - nombre: checklists
      modulo: MAI-009
      descripcion: Plantillas de verificacion de calidad
      campos_clave: [id, tenant_id, code, name, prototipo_id]
      rls: true

    - nombre: checklist_items
      modulo: MAI-009
      descripcion: Items del checklist
      campos_clave: [id, tenant_id, checklist_id, sequence, name]
      rls: true

    - nombre: inspecciones
      modulo: MAI-009
      descripcion: Inspecciones de calidad
      campos_clave: [id, tenant_id, checklist_id, lote_id, status]
      rls: true

    - nombre: inspeccion_resultados
      modulo: MAI-009
      descripcion: Resultados de inspeccion por item
      campos_clave: [id, tenant_id, inspeccion_id, checklist_item_id, is_passed]
      rls: true

    - nombre: tickets_postventa
      modulo: MAI-009
      descripcion: Tickets de garantia/postventa
      campos_clave: [id, tenant_id, ticket_number, lote_id, status]
      rls: true

    - nombre: subcontratistas
      modulo: MAI-012
      descripcion: Catalogo de subcontratistas
      campos_clave: [id, tenant_id, code, name, specialty]
      rls: true

    - nombre: contratos
      modulo: MAI-012
      descripcion: Contratos con subcontratistas
      campos_clave: [id, tenant_id, contract_number, subcontratista_id, status]
      rls: true

    - nombre: contrato_partidas
      modulo: MAI-012
      descripcion: Lineas del contrato
      campos_clave: [id, tenant_id, contrato_id, concepto_id, quantity, unit_price]
      rls: true

  # ---------------------------------------------------------------------------
  # SCHEMA: estimates (8 tablas)
  # ---------------------------------------------------------------------------
  estimates:
    - nombre: estimaciones
      modulo: MAI-008
      descripcion: Estimaciones de obra periodicas
      campos_clave: [id, tenant_id, estimate_number, contrato_id, status]
      rls: true

    - nombre: estimacion_conceptos
      modulo: MAI-008
      descripcion: Lineas de concepto por estimacion
      campos_clave: [id, tenant_id, estimacion_id, concepto_id, quantity_current]
      rls: true

    - nombre: generadores
      modulo: MAI-008
      descripcion: Generadores de cantidades
      campos_clave: [id, tenant_id, estimacion_concepto_id, generator_number, quantity]
      rls: true

    - nombre: anticipos
      modulo: MAI-008
      descripcion: Anticipos otorgados a subcontratistas
      campos_clave: [id, tenant_id, advance_number, contrato_id, net_amount]
      rls: true

    - nombre: amortizaciones
      modulo: MAI-008
      descripcion: Amortizaciones de anticipos
      campos_clave: [id, tenant_id, anticipo_id, estimacion_id, amount]
      rls: true

    - nombre: retenciones
      modulo: MAI-008
      descripcion: Retenciones aplicadas
      campos_clave: [id, tenant_id, estimacion_id, retention_type, amount]
      rls: true

    - nombre: fondo_garantia
      modulo: MAI-008
      descripcion: Fondo de garantia por contrato
      campos_clave: [id, tenant_id, contrato_id, accumulated_amount]
      rls: true

    - nombre: estimacion_workflow
      modulo: MAI-008
      descripcion: Historial de workflow de estimaciones
      campos_clave: [id, tenant_id, estimacion_id, from_status, to_status, action]
      rls: true

  # ---------------------------------------------------------------------------
  # SCHEMA: infonavit (8 tablas)
  # ---------------------------------------------------------------------------
  infonavit:
    - nombre: registro_infonavit
      modulo: MAI-011
      descripcion: Registro del constructor ante INFONAVIT
      campos_clave: [id, tenant_id, registro_number, company_id]
      rls: true

    - nombre: oferta_vivienda
      modulo: MAI-011
      descripcion: Oferta de viviendas ante INFONAVIT
      campos_clave: [id, tenant_id, oferta_number, fraccionamiento_id, status]
      rls: true

    - nombre: derechohabientes
      modulo: MAI-010
      descripcion: Derechohabientes INFONAVIT/compradores
      campos_clave: [id, tenant_id, nss, full_name, status, credit_type]
      rls: true

    - nombre: asignacion_vivienda
      modulo: MAI-010
      descripcion: Asignacion de vivienda a derechohabiente
      campos_clave: [id, tenant_id, derechohabiente_id, lote_id, status]
      rls: true

    - nombre: actas
      modulo: MAI-011
      descripcion: Actas oficiales INFONAVIT
      campos_clave: [id, tenant_id, acta_number, acta_type, status]
      rls: true

    - nombre: acta_viviendas
      modulo: MAI-011
      descripcion: Viviendas incluidas en acta
      campos_clave: [id, tenant_id, acta_id, lote_id]
      rls: true

    - nombre: reportes_infonavit
      modulo: MAI-011
      descripcion: Reportes periodicos a INFONAVIT
      campos_clave: [id, tenant_id, report_number, report_type, status]
      rls: true

    - nombre: historico_puntos
      modulo: MAI-010
      descripcion: Historico de puntos INFONAVIT
      campos_clave: [id, tenant_id, derechohabiente_id, query_date, puntos]
      rls: true

  # ---------------------------------------------------------------------------
  # SCHEMA: inventory (EXTENSIONES - 4 tablas)
  # ---------------------------------------------------------------------------
  inventory_ext:
    - nombre: almacenes_proyecto
      modulo: MAI-004
      descripcion: Almacenes por proyecto de construccion
      campos_clave: [id, tenant_id, warehouse_id, fraccionamiento_id, warehouse_type]
      rls: true
      postgis: true

    - nombre: requisiciones_obra
      modulo: MAI-004
      descripcion: Requisiciones de material desde obra
      campos_clave: [id, tenant_id, requisition_number, fraccionamiento_id, status]
      rls: true

    - nombre: requisicion_lineas
      modulo: MAI-004
      descripcion: Lineas de requisicion de obra
      campos_clave: [id, tenant_id, requisicion_id, product_id, quantity_requested]
      rls: true

    - nombre: consumos_obra
      modulo: MAI-004
      descripcion: Consumos de materiales por obra/lote
      campos_clave: [id, tenant_id, fraccionamiento_id, lote_id, product_id, quantity]
      rls: true

  # ---------------------------------------------------------------------------
  # SCHEMA: purchase (EXTENSIONES - 5 tablas)
  # ---------------------------------------------------------------------------
  purchase_ext:
    - nombre: purchase_order_construction
      modulo: MAI-004
      descripcion: Extension de OC para construccion
      campos_clave: [id, tenant_id, purchase_order_id, fraccionamiento_id]
      rls: true

    - nombre: supplier_construction
      modulo: MAI-004
      descripcion: Extension de proveedores para construccion
      campos_clave: [id, tenant_id, supplier_id, specialties, overall_rating]
      rls: true

    - nombre: comparativo_cotizaciones
      modulo: MAI-004
      descripcion: Cuadro comparativo de cotizaciones
      campos_clave: [id, tenant_id, code, requisicion_id, status]
      rls: true

    - nombre: comparativo_proveedores
      modulo: MAI-004
      descripcion: Proveedores en comparativo
      campos_clave: [id, tenant_id, comparativo_id, supplier_id, total_amount]
      rls: true

    - nombre: comparativo_productos
      modulo: MAI-004
      descripcion: Productos cotizados por proveedor
      campos_clave: [id, tenant_id, comparativo_proveedor_id, product_id, unit_price]
      rls: true

  # ---------------------------------------------------------------------------
  # SCHEMA: hr (EXTENSIONES - 8 tablas)
  # ---------------------------------------------------------------------------
  hr_ext:
    - nombre: employee_construction
      modulo: MAI-007
      descripcion: Extension de empleados para construccion
      campos_clave: [id, tenant_id, employee_id, worker_type, specialty]
      rls: true

    - nombre: asistencias
      modulo: MAI-007
      descripcion: Registro de asistencia con GPS/biometrico
      campos_clave: [id, tenant_id, employee_id, attendance_date, attendance_type]
      rls: true
      postgis: true

    - nombre: asistencia_biometrico
      modulo: MAI-007
      descripcion: Detalles de registro biometrico
      campos_clave: [id, tenant_id, asistencia_id, device_id, biometric_type]
      rls: true

    - nombre: geocercas
      modulo: MAI-007
      descripcion: Geocercas para validacion de ubicacion
      campos_clave: [id, tenant_id, fraccionamiento_id, name, polygon]
      rls: true
      postgis: true

    - nombre: destajo
      modulo: MAI-007
      descripcion: Trabajo a destajo/precio unitario
      campos_clave: [id, tenant_id, employee_id, concepto_id, quantity_measured, status]
      rls: true

    - nombre: destajo_detalle
      modulo: MAI-007
      descripcion: Detalle de mediciones de destajo
      campos_clave: [id, tenant_id, destajo_id, description, quantity]
      rls: true

    - nombre: cuadrillas
      modulo: MAI-007
      descripcion: Cuadrillas de trabajo
      campos_clave: [id, tenant_id, fraccionamiento_id, code, name, leader_id]
      rls: true

    - nombre: cuadrilla_miembros
      modulo: MAI-007
      descripcion: Miembros de cuadrillas
      campos_clave: [id, tenant_id, cuadrilla_id, employee_id, role]
      rls: true

# =============================================================================
# ENUMs / TYPES
# =============================================================================
enums:
  # Construction
  - schema: construction
    name: project_status
    values: [draft, planning, in_progress, paused, completed, cancelled]

  - schema: construction
    name: lot_status
    values: [available, reserved, sold, under_construction, delivered, warranty]

  - schema: construction
    name: prototype_type
    values: [horizontal, vertical, commercial, mixed]

  - schema: construction
    name: advance_status
    values: [pending, captured, reviewed, approved, rejected]

  - schema: construction
    name: quality_status
    values: [pending, in_review, approved, rejected, rework]

  - schema: construction
    name: contract_type
    values: [fixed_price, unit_price, cost_plus, mixed]

  - schema: construction
    name: contract_status
    values: [draft, pending_approval, active, suspended, terminated, closed]

  # Estimates
  - schema: estimates
    name: estimate_status
    values: [draft, submitted, reviewed, approved, invoiced, paid, rejected, cancelled]

  - schema: estimates
    name: advance_type
    values: [initial, progress, materials]

  - schema: estimates
    name: retention_type
    values: [guarantee, tax, penalty, other]

  - schema: estimates
    name: generator_status
    values: [draft, in_progress, completed, approved]

  # Infonavit
  - schema: infonavit
    name: derechohabiente_status
    values: [prospect, pre_qualified, qualified, assigned, in_process, owner, cancelled]

  - schema: infonavit
    name: credit_type
    values: [infonavit_tradicional, infonavit_total, cofinavit, mejoravit, fovissste, fovissste_infonavit, bank_credit, cash]

  - schema: infonavit
    name: acta_type
    values: [inicio_obra, verificacion_avance, entrega_recepcion, conclusion_obra, liberacion_vivienda]

  - schema: infonavit
    name: acta_status
    values: [draft, pending, signed, submitted, approved, rejected, cancelled]

  - schema: infonavit
    name: report_type
    values: [avance_fisico, avance_financiero, inventario_viviendas, asignaciones, escrituraciones, cartera_vencida]

  # Inventory Extensions
  - schema: inventory
    name: warehouse_type_construction
    values: [central, obra, temporal, transito]

  - schema: inventory
    name: requisition_status
    values: [draft, submitted, approved, partially_served, served, cancelled]

  # HR Extensions
  - schema: hr
    name: attendance_type_construction
    values: [manual, biometric, gps, qr_code]

  - schema: hr
    name: worker_type
    values: [permanent, temporary, subcontract, piece_rate]

  - schema: hr
    name: destajo_status
    values: [pending, measured, approved, paid]

# =============================================================================
# FUNCIONES
# =============================================================================
funciones:
  - schema: estimates
    name: calculate_estimate_totals
    parametros: [p_estimacion_id UUID]
    retorno: VOID
    descripcion: Recalcula los totales de una estimacion

  - schema: estimates
    name: update_advance_amortization
    parametros: []
    retorno: TRIGGER
    descripcion: Actualiza amortizacion de anticipo

  - schema: hr
    name: validate_attendance_location
    parametros: [p_location GEOMETRY, p_fraccionamiento_id UUID]
    retorno: BOOLEAN
    descripcion: Valida si ubicacion esta dentro de geocercas

# =============================================================================
# TRIGGERS
# =============================================================================
triggers:
  - schema: estimates
    name: trg_update_advance_amortization
    tabla: amortizaciones
    eventos: [INSERT, UPDATE, DELETE]
    funcion: update_advance_amortization

# =============================================================================
# VISTAS
# =============================================================================
vistas: []
  # Pendiente: Definir vistas en sprints posteriores

# =============================================================================
# ESTADISTICAS
# =============================================================================
estadisticas:
  por_schema:
    construction: 25
    estimates: 8
    infonavit: 8
    inventory_ext: 4
    purchase_ext: 5
    hr_ext: 8

  por_modulo:
    MAI-002: 8   # Proyectos y Estructura
    MAI-003: 3   # Presupuestos y Costos
    MAI-004: 9   # Compras e Inventarios
    MAI-005: 6   # Control de Obra
    MAI-007: 8   # RRHH y Asistencias
    MAI-008: 8   # Estimaciones
    MAI-009: 5   # Calidad y Postventa
    MAI-010: 3   # CRM Derechohabientes
    MAI-011: 5   # INFONAVIT
    MAI-012: 3   # Contratos

  tablas_con_postgis: 7
  tablas_con_rls: 58

# =============================================================================
# FIN DEL INVENTARIO
# =============================================================================
