-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-26_03 · Módulo Supervisión de proyectos
-- ═══════════════════════════════════════════════════════════════════════
-- Toma los proyectos aprobados (cotizacion_venta 'aprobada' con su oferta
-- seleccionada) y permite:
--   · un plan de tareas (proyecto_tarea), que puede salir de los ítems de la oferta
--   · personal de mano de obra propio, interno o externo (personal_obra)
--   · pactos de mano de obra (pacto_mano_obra): acuerdo con una persona y las
--     tareas que hará, cada una con su valor (proyecto_tarea.id_pacto/monto_pacto)
--   · pagos por tarea finalizada (pago_mano_obra): se generan en Supervisión y se
--     pagan en Facturación y Caja → Pagos de mano de obra, saliendo de una cuenta
--     de fondos (cuenta_movimiento tipo 'pago_mano_obra')
--   · tope: la mano de obra de la oferta seleccionada (proyecto_supervision.
--     presupuesto_mo). Solo el permiso especial ampliar_presupuesto_obra lo sube;
--     cada cambio queda en proyecto_ampliacion y sale al final del reporte.
--
-- Respaldo: backups/tinsa_db_pre-supervision_2026-10-26.sql
-- Reversa:  database/rollback/2026-10-26_03_supervision_proyectos.down.sql
-- ═══════════════════════════════════════════════════════════════════════

USE tinsa_db;

-- ── Módulo, pestañas y permisos ────────────────────────────────────────
INSERT INTO modulos (id, nombre, icono, orden, estado) VALUES (10, 'Supervisión', 'fa-helmet-safety', 10, 1);
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (10, 'Proyectos en supervisión',   '/supervision',          'fa-diagram-project', 1, 1),
  (10, 'Personal de mano de obra',   '/supervision/personal', 'fa-people-carry-box', 2, 1);
UPDATE pestanas SET orden = orden + 1 WHERE id_modulo = 7 AND orden >= 9;
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (7, 'Pagos de mano de obra', '/caja/pagos-mano-obra', 'fa-helmet-safety', 9, 1);

INSERT INTO permisos_roles (id_rol, id_pestana, puede_leer, puede_escribir, puede_eliminar, puede_ver_historial)
SELECT 1, p.id, 1, 1, 1, 1 FROM pestanas p WHERE p.ruta IN ('/supervision', '/supervision/personal');
-- Pagos de mano de obra: quien maneja Pagos a proveedores
INSERT INTO permisos_roles (id_rol, id_pestana, puede_leer, puede_escribir, puede_eliminar, puede_ver_historial)
SELECT pr.id_rol, n.id, pr.puede_leer, pr.puede_escribir, pr.puede_eliminar, pr.puede_ver_historial
  FROM permisos_roles pr
  JOIN pestanas pp ON pp.id = pr.id_pestana AND pp.ruta = '/caja/pagos-proveedores'
  JOIN pestanas n ON n.ruta = '/caja/pagos-mano-obra';

INSERT INTO rol_permiso_especial (id_rol, clave) VALUES (1, 'ampliar_presupuesto_obra');

-- ── Personal de mano de obra ───────────────────────────────────────────
CREATE TABLE personal_obra (
  id               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  nombre           VARCHAR(150) NOT NULL,
  tipo             ENUM('interno','externo') NOT NULL COMMENT 'interno = empleado; externo = contratista',
  documento        VARCHAR(30)  DEFAULT NULL COMMENT 'DUI o NIT',
  telefono         VARCHAR(30)  DEFAULT NULL,
  oficio           VARCHAR(80)  DEFAULT NULL,
  notas            VARCHAR(255) DEFAULT NULL,
  activo           TINYINT(1) NOT NULL DEFAULT 1,
  usuario_modifico INT UNSIGNED DEFAULT NULL,
  created_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_personal_obra_nombre (nombre),
  KEY fk_personal_obra_usuario (usuario_modifico),
  CONSTRAINT fk_personal_obra_usuario FOREIGN KEY (usuario_modifico) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Personal de mano de obra (interno o externo) para los pactos';

-- ── Proyecto en supervisión ────────────────────────────────────────────
CREATE TABLE proyecto_supervision (
  id                     INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_cotizacion_venta    INT UNSIGNED NOT NULL,
  id_oferta              INT UNSIGNED NOT NULL COMMENT 'oferta seleccionada al iniciar',
  id_responsable         INT UNSIGNED DEFAULT NULL COMMENT 'quien tiene a cargo el proyecto',
  presupuesto_mo_inicial DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT 'mano de obra de la oferta al iniciar',
  presupuesto_mo         DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT 'tope vigente (cambia solo con una ampliación aprobada)',
  estado                 ENUM('planificacion','en_ejecucion','finalizado') NOT NULL DEFAULT 'planificacion',
  fecha_inicio           DATE DEFAULT NULL,
  fecha_fin_estimada     DATE DEFAULT NULL,
  fecha_finalizado       DATETIME DEFAULT NULL,
  observaciones          TEXT DEFAULT NULL,
  id_usuario_creo        INT UNSIGNED DEFAULT NULL,
  created_at             TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at             TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_proyecto_supervision_cv (id_cotizacion_venta),
  KEY fk_proyecto_supervision_oferta (id_oferta),
  KEY fk_proyecto_supervision_responsable (id_responsable),
  KEY fk_proyecto_supervision_creo (id_usuario_creo),
  CONSTRAINT fk_proyecto_supervision_cv FOREIGN KEY (id_cotizacion_venta) REFERENCES cotizacion_venta (id) ON UPDATE CASCADE,
  CONSTRAINT fk_proyecto_supervision_oferta FOREIGN KEY (id_oferta) REFERENCES cotizacion_venta_oferta (id) ON UPDATE CASCADE,
  CONSTRAINT fk_proyecto_supervision_responsable FOREIGN KEY (id_responsable) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_proyecto_supervision_creo FOREIGN KEY (id_usuario_creo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_proyecto_supervision_ppto CHECK (presupuesto_mo >= 0 AND presupuesto_mo_inicial >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Pactos de mano de obra ─────────────────────────────────────────────
CREATE TABLE pacto_mano_obra (
  id               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  numero           VARCHAR(20) NOT NULL COMMENT 'PMO-AAAA-NNNN',
  id_proyecto      INT UNSIGNED NOT NULL,
  id_personal      INT UNSIGNED NOT NULL,
  fecha            DATE NOT NULL,
  condiciones      TEXT DEFAULT NULL COMMENT 'lo acordado: forma de trabajo, plazos, materiales a cargo…',
  estado           ENUM('vigente','anulado') NOT NULL DEFAULT 'vigente',
  motivo_anulacion VARCHAR(255) DEFAULT NULL,
  id_usuario_creo  INT UNSIGNED DEFAULT NULL,
  created_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_pacto_numero (numero),
  KEY fk_pacto_proyecto (id_proyecto),
  KEY fk_pacto_personal (id_personal),
  KEY fk_pacto_usuario (id_usuario_creo),
  CONSTRAINT fk_pacto_proyecto FOREIGN KEY (id_proyecto) REFERENCES proyecto_supervision (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_pacto_personal FOREIGN KEY (id_personal) REFERENCES personal_obra (id) ON UPDATE CASCADE,
  CONSTRAINT fk_pacto_usuario FOREIGN KEY (id_usuario_creo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Pagos de mano de obra (uno cubre una o varias tareas finalizadas de un pacto) ──
CREATE TABLE pago_mano_obra (
  id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
  numero              VARCHAR(20) NOT NULL COMMENT 'PMO-P-AAAA-NNNN',
  id_pacto            INT UNSIGNED NOT NULL,
  monto               DECIMAL(12,2) NOT NULL,
  estado              ENUM('pendiente','pagado') NOT NULL DEFAULT 'pendiente',
  observaciones       VARCHAR(255) DEFAULT NULL,
  id_usuario_solicito INT UNSIGNED DEFAULT NULL,
  fecha_solicitud     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  fecha_pago          DATE DEFAULT NULL,
  referencia          VARCHAR(100) DEFAULT NULL,
  id_usuario_pago     INT UNSIGNED DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uq_pago_mano_obra_numero (numero),
  KEY fk_pago_mo_pacto (id_pacto),
  KEY idx_pago_mo_estado (estado),
  KEY fk_pago_mo_solicito (id_usuario_solicito),
  KEY fk_pago_mo_pago (id_usuario_pago),
  CONSTRAINT fk_pago_mo_pacto FOREIGN KEY (id_pacto) REFERENCES pacto_mano_obra (id) ON UPDATE CASCADE,
  CONSTRAINT fk_pago_mo_solicito FOREIGN KEY (id_usuario_solicito) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_pago_mo_pago FOREIGN KEY (id_usuario_pago) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_pago_mo_monto CHECK (monto > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Plan de tareas ─────────────────────────────────────────────────────
CREATE TABLE proyecto_tarea (
  id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_proyecto         INT UNSIGNED NOT NULL,
  id_oferta_item      INT UNSIGNED DEFAULT NULL COMMENT 'ítem de la oferta del que salió',
  titulo              VARCHAR(200) NOT NULL,
  descripcion         TEXT DEFAULT NULL,
  orden               INT NOT NULL DEFAULT 0,
  fecha_inicio        DATE DEFAULT NULL,
  fecha_fin           DATE DEFAULT NULL,
  estado              ENUM('pendiente','en_proceso','finalizada') NOT NULL DEFAULT 'pendiente',
  fecha_finalizada    DATETIME DEFAULT NULL,
  id_usuario_finalizo INT UNSIGNED DEFAULT NULL,
  id_pacto            INT UNSIGNED DEFAULT NULL COMMENT 'pacto que la cubre',
  monto_pacto         DECIMAL(12,2) DEFAULT NULL COMMENT 'valor de la tarea en el pacto',
  id_pago             INT UNSIGNED DEFAULT NULL COMMENT 'pago de mano de obra que la incluye',
  created_at          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY fk_tarea_proyecto (id_proyecto),
  KEY fk_tarea_item (id_oferta_item),
  KEY fk_tarea_pacto (id_pacto),
  KEY fk_tarea_pago (id_pago),
  KEY fk_tarea_finalizo (id_usuario_finalizo),
  CONSTRAINT fk_tarea_proyecto FOREIGN KEY (id_proyecto) REFERENCES proyecto_supervision (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_tarea_item FOREIGN KEY (id_oferta_item) REFERENCES cotizacion_venta_oferta_item (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_tarea_pacto FOREIGN KEY (id_pacto) REFERENCES pacto_mano_obra (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_tarea_pago FOREIGN KEY (id_pago) REFERENCES pago_mano_obra (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_tarea_finalizo FOREIGN KEY (id_usuario_finalizo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_tarea_monto CHECK (monto_pacto IS NULL OR monto_pacto > 0),
  CONSTRAINT chk_tarea_fechas CHECK (fecha_fin IS NULL OR fecha_inicio IS NULL OR fecha_fin >= fecha_inicio)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Ampliaciones del presupuesto de mano de obra ───────────────────────
CREATE TABLE proyecto_ampliacion (
  id                   INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_proyecto          INT UNSIGNED NOT NULL,
  monto_solicitado     DECIMAL(12,2) NOT NULL COMMENT 'nuevo tope que se pide',
  motivo               VARCHAR(500) NOT NULL,
  estado               ENUM('pendiente','aprobada','rechazada') NOT NULL DEFAULT 'pendiente',
  monto_anterior       DECIMAL(12,2) DEFAULT NULL,
  monto_nuevo          DECIMAL(12,2) DEFAULT NULL COMMENT 'el que quedó (puede diferir del solicitado)',
  comentario           VARCHAR(500) DEFAULT NULL,
  id_usuario_solicito  INT UNSIGNED DEFAULT NULL,
  fecha_solicitud      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  id_usuario_resolvio  INT UNSIGNED DEFAULT NULL,
  fecha_resolucion     DATETIME DEFAULT NULL,
  PRIMARY KEY (id),
  KEY fk_ampliacion_proyecto (id_proyecto),
  KEY fk_ampliacion_solicito (id_usuario_solicito),
  KEY fk_ampliacion_resolvio (id_usuario_resolvio),
  CONSTRAINT fk_ampliacion_proyecto FOREIGN KEY (id_proyecto) REFERENCES proyecto_supervision (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_ampliacion_solicito FOREIGN KEY (id_usuario_solicito) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_ampliacion_resolvio FOREIGN KEY (id_usuario_resolvio) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_ampliacion_monto CHECK (monto_solicitado > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Cuentas de fondos: el pago de mano de obra sale de una cuenta ──────
ALTER TABLE cuenta_movimiento
  DROP CONSTRAINT chk_movimiento_signo,
  MODIFY tipo ENUM('cobro','reposicion','pago_proveedor','pago_mano_obra','transferencia','ingreso','egreso') NOT NULL,
  ADD COLUMN id_pago_mano_obra INT UNSIGNED DEFAULT NULL AFTER id_recepcion,
  ADD UNIQUE KEY uq_movimiento_pago_mo (id_pago_mano_obra),
  ADD CONSTRAINT fk_movimiento_pago_mo FOREIGN KEY (id_pago_mano_obra) REFERENCES pago_mano_obra (id) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT chk_movimiento_signo CHECK ((tipo IN ('cobro','ingreso') AND monto > 0) OR (tipo IN ('reposicion','pago_proveedor','pago_mano_obra','egreso') AND monto < 0) OR tipo = 'transferencia');
