-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-19_01 · Contabilidad → Caja chica
--
-- Pedido del usuario: "necesito crear la caja chica". Decisiones del usuario:
--   * fondo FIJO con reposición (cada caja tiene un monto asignado; los gastos
--     lo bajan y una reposición aprobada lo devuelve a su monto); con arqueos;
--   * varias cajas, cada una con su custodio (que solo ve la suya);
--   * los gastos se revisan AL LIQUIDAR: el aprobador revisa la reposición
--     completa, puede rechazar gastos y autoriza el reembolso;
--   * va en un módulo nuevo "Contabilidad".
--
-- Gasto: registrado → en_revision (en una reposición pendiente) →
--        aprobado → repuesto (reposición pagada) | rechazado.
-- Reposición: pendiente → aprobada → pagada | rechazada (sus gastos vuelven a registrado).
-- Saldo en efectivo = fondo − gastos registrados / en revisión / aprobados
-- (los rechazados los repone el custodio).
--
-- Respaldo previo: backups/tinsa_db_pre-caja-chica_2026-10-19.sql
-- Reversa: database/rollback/2026-10-19_01_caja_chica.sql
-- ═══════════════════════════════════════════════════════════════════════

INSERT INTO modulos (id, nombre, icono, orden, estado) VALUES (8, 'Contabilidad', 'fa-scale-balanced', 8, 1);
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (8, 'Caja chica',   '/contabilidad/caja-chica',   'fa-cash-register', 1, 1),
  (8, 'Reposiciones', '/contabilidad/reposiciones', 'fa-file-circle-check', 2, 1),
  (8, 'Cajas',        '/contabilidad/cajas',        'fa-sliders', 3, 1);
INSERT INTO permisos_roles (id_rol, id_pestana, puede_leer, puede_escribir, puede_eliminar)
SELECT 1, p.id, 1, 1, 1 FROM pestanas p WHERE p.ruta LIKE '/contabilidad/%';

CREATE TABLE caja_chica (
  id                 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  nombre             VARCHAR(120) NOT NULL,
  id_sucursal        INT(10) UNSIGNED DEFAULT NULL,
  id_custodio        INT(10) UNSIGNED NOT NULL,
  monto_fondo        DECIMAL(12,2) NOT NULL,
  limite_por_gasto   DECIMAL(12,2) DEFAULT NULL COMMENT 'monto máximo de un gasto (null = sin límite)',
  umbral_reposicion  TINYINT UNSIGNED NOT NULL DEFAULT 25 COMMENT '% del fondo bajo el cual se sugiere reponer',
  activo             TINYINT(1) NOT NULL DEFAULT 1,
  usuario_modifico   INT(10) UNSIGNED DEFAULT NULL,
  created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uq_caja_chica_nombre (nombre),
  KEY fk_caja_sucursal (id_sucursal),
  KEY fk_caja_custodio (id_custodio),
  CONSTRAINT chk_caja_fondo CHECK (monto_fondo > 0),
  CONSTRAINT fk_caja_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursal (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_caja_custodio FOREIGN KEY (id_custodio) REFERENCES usuarios (id_usuario) ON UPDATE CASCADE,
  CONSTRAINT fk_caja_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;

-- Cambios del fondo (apertura, aumento, disminución, cambio de custodio, cierre)
CREATE TABLE caja_chica_fondo_historial (
  id          INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_caja     INT(10) UNSIGNED NOT NULL,
  evento      VARCHAR(30) NOT NULL,
  monto_antes DECIMAL(12,2) DEFAULT NULL,
  monto_despues DECIMAL(12,2) DEFAULT NULL,
  detalle     VARCHAR(255) DEFAULT NULL,
  id_usuario  INT(10) UNSIGNED DEFAULT NULL,
  created_at  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY fk_cc_fondo_caja (id_caja),
  CONSTRAINT fk_cc_fondo_caja FOREIGN KEY (id_caja) REFERENCES caja_chica (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_cc_fondo_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE caja_chica_categoria (
  id      INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  nombre  VARCHAR(80) NOT NULL,
  activo  TINYINT(1) NOT NULL DEFAULT 1,
  UNIQUE KEY uq_cc_categoria (nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO caja_chica_categoria (nombre) VALUES
  ('Combustible y transporte'), ('Alimentación'), ('Papelería y oficina'), ('Materiales menores'),
  ('Herramientas'), ('Mensajería y envíos'), ('Limpieza'), ('Mantenimiento'), ('Trámites y viáticos'), ('Otros');

CREATE TABLE caja_chica_reposicion (
  id                  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_caja             INT(10) UNSIGNED NOT NULL,
  numero              VARCHAR(20) NOT NULL,
  estado              ENUM('pendiente','aprobada','rechazada','pagada') NOT NULL DEFAULT 'pendiente',
  total_gastos        DECIMAL(12,2) NOT NULL DEFAULT 0,
  total_aprobado      DECIMAL(12,2) NOT NULL DEFAULT 0,
  observaciones       VARCHAR(500) DEFAULT NULL,
  id_usuario_solicito INT(10) UNSIGNED DEFAULT NULL,
  fecha_solicitud     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  id_usuario_aprobo   INT(10) UNSIGNED DEFAULT NULL,
  fecha_aprobacion    DATETIME DEFAULT NULL,
  comentario_aprobacion VARCHAR(500) DEFAULT NULL,
  forma_reembolso     ENUM('efectivo','cheque','transferencia') DEFAULT NULL,
  referencia_reembolso VARCHAR(100) DEFAULT NULL,
  id_usuario_pago     INT(10) UNSIGNED DEFAULT NULL,
  fecha_pago          DATETIME DEFAULT NULL,
  UNIQUE KEY uq_cc_repo_numero (numero),
  KEY fk_cc_repo_caja (id_caja),
  CONSTRAINT fk_cc_repo_caja FOREIGN KEY (id_caja) REFERENCES caja_chica (id) ON UPDATE CASCADE,
  CONSTRAINT fk_cc_repo_solicito FOREIGN KEY (id_usuario_solicito) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_repo_aprobo FOREIGN KEY (id_usuario_aprobo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_repo_pago FOREIGN KEY (id_usuario_pago) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE caja_chica_gasto (
  id                  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_caja             INT(10) UNSIGNED NOT NULL,
  id_reposicion       INT(10) UNSIGNED DEFAULT NULL,
  fecha               DATE NOT NULL,
  monto               DECIMAL(12,2) NOT NULL,
  id_categoria        INT(10) UNSIGNED DEFAULT NULL,
  descripcion         VARCHAR(255) NOT NULL,
  proveedor           VARCHAR(150) DEFAULT NULL,
  tipo_comprobante    ENUM('factura','ccf','ticket','recibo','sujeto_excluido','sin_comprobante') NOT NULL DEFAULT 'factura',
  numero_comprobante  VARCHAR(60) DEFAULT NULL,
  id_factura          INT(10) UNSIGNED DEFAULT NULL COMMENT 'factura de sujeto excluido (14) emitida en Facturación',
  id_cotizacion_venta INT(10) UNSIGNED DEFAULT NULL COMMENT 'proyecto al que se carga',
  archivo             VARCHAR(80) DEFAULT NULL,
  archivo_nombre      VARCHAR(255) DEFAULT NULL,
  estado              ENUM('registrado','en_revision','aprobado','repuesto','rechazado') NOT NULL DEFAULT 'registrado',
  motivo_rechazo      VARCHAR(255) DEFAULT NULL,
  id_usuario          INT(10) UNSIGNED DEFAULT NULL,
  created_at          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  KEY fk_cc_gasto_caja (id_caja),
  KEY fk_cc_gasto_repo (id_reposicion),
  CONSTRAINT chk_cc_gasto_monto CHECK (monto > 0),
  CONSTRAINT fk_cc_gasto_caja FOREIGN KEY (id_caja) REFERENCES caja_chica (id) ON UPDATE CASCADE,
  CONSTRAINT fk_cc_gasto_repo FOREIGN KEY (id_reposicion) REFERENCES caja_chica_reposicion (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_gasto_categoria FOREIGN KEY (id_categoria) REFERENCES caja_chica_categoria (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_gasto_factura FOREIGN KEY (id_factura) REFERENCES factura (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_gasto_proyecto FOREIGN KEY (id_cotizacion_venta) REFERENCES cotizacion_venta (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_cc_gasto_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE caja_chica_arqueo (
  id              INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_caja         INT(10) UNSIGNED NOT NULL,
  fecha           DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  saldo_sistema   DECIMAL(12,2) NOT NULL,
  efectivo_contado DECIMAL(12,2) NOT NULL,
  diferencia      DECIMAL(12,2) NOT NULL,
  denominaciones  TEXT DEFAULT NULL COMMENT 'JSON {denominación: cantidad}',
  observaciones   VARCHAR(500) DEFAULT NULL,
  id_usuario      INT(10) UNSIGNED DEFAULT NULL,
  KEY fk_cc_arqueo_caja (id_caja),
  CONSTRAINT fk_cc_arqueo_caja FOREIGN KEY (id_caja) REFERENCES caja_chica (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_cc_arqueo_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
