-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-17_03 · Facturación como módulo propio
--
-- Pedido del usuario: Facturación es un módulo nuevo con Resumen, Nueva
-- factura, Documentos emitidos, Cuentas por cobrar y Configuración fiscal.
--   * módulo 7 y sus pestañas (la de /ventas/facturacion pasa a ser
--     /facturacion/documentos y conserva sus permisos);
--   * establecimientos y puntos de venta; el correlativo es por punto de
--     venta y tipo de documento;
--   * emisor: tipos habilitados, códigos de departamento/municipio e
--     integración DTE (credenciales; la transmisión se conecta después);
--   * factura: punto de venta, estado fiscal (pendiente de transmisión /
--     procesado / rechazado), sello, vencimiento, estado de pago, descuento;
--   * factura_linea: descuento, producto de inventario y tipo de ítem;
--   * pagos (abonos) e historial por documento.
--
-- Respaldo previo: backups/tinsa_db_pre-modulo-facturacion_2026-10-17.sql
-- Reversa: database/rollback/2026-10-17_03_modulo_facturacion.sql
-- ═══════════════════════════════════════════════════════════════════════

INSERT INTO modulos (id, nombre, icono, orden, estado) VALUES (7, 'Facturación', 'fa-file-invoice-dollar', 7, 1);

UPDATE pestanas SET id_modulo = 7, nombre = 'Documentos emitidos', ruta = '/facturacion/documentos', icono = 'fa-folder-open', orden = 3
 WHERE ruta = '/ventas/facturacion';
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (7, 'Resumen de facturación', '/facturacion',                    'fa-chart-pie',             1, 1),
  (7, 'Nueva factura',          '/facturacion/nueva',              'fa-file-circle-plus',      2, 1),
  (7, 'Cuentas por cobrar',     '/facturacion/cuentas-por-cobrar', 'fa-hand-holding-dollar',   4, 1),
  (7, 'Configuración fiscal',   '/facturacion/configuracion',      'fa-sliders',               5, 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 IN ('/facturacion', '/facturacion/nueva', '/facturacion/cuentas-por-cobrar', '/facturacion/configuracion');

-- ── Establecimientos y puntos de venta ─────────────────────────────────
CREATE TABLE facturacion_establecimiento (
  id         INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  codigo     CHAR(4) NOT NULL COMMENT 'código asignado por Hacienda (codEstableMH)',
  nombre     VARCHAR(120) NOT NULL,
  tipo       CHAR(2) NOT NULL DEFAULT '02' COMMENT '01 sucursal, 02 casa matriz, 04 bodega, 07 predio, 20 otro',
  direccion  VARCHAR(250) DEFAULT NULL,
  cod_departamento CHAR(2) DEFAULT NULL,
  cod_municipio    CHAR(2) DEFAULT NULL,
  telefono   VARCHAR(30) DEFAULT NULL,
  activo     TINYINT(1) NOT NULL DEFAULT 1,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_fact_estab_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE facturacion_punto_venta (
  id                 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_establecimiento INT(10) UNSIGNED NOT NULL,
  codigo             CHAR(4) NOT NULL COMMENT 'codPuntoVentaMH',
  nombre             VARCHAR(120) NOT NULL,
  activo             TINYINT(1) NOT NULL DEFAULT 1,
  created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_fact_punto (id_establecimiento, codigo),
  CONSTRAINT fk_fact_punto_estab FOREIGN KEY (id_establecimiento) REFERENCES facturacion_establecimiento (id) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO facturacion_establecimiento (id, codigo, nombre, tipo) VALUES (1, 'M001', 'Casa matriz', '02');
INSERT INTO facturacion_punto_venta (id, id_establecimiento, codigo, nombre) VALUES (1, 1, 'P001', 'Punto de venta principal');

-- Correlativo por punto de venta y tipo (antes solo por tipo; no hay documentos emitidos)
DROP TABLE facturacion_correlativo;
CREATE TABLE facturacion_correlativo (
  id_punto_venta INT(10) UNSIGNED NOT NULL,
  tipo_dte       CHAR(2) NOT NULL,
  siguiente      INT(10) UNSIGNED NOT NULL DEFAULT 1,
  PRIMARY KEY (id_punto_venta, tipo_dte),
  CONSTRAINT fk_fact_corr_punto FOREIGN KEY (id_punto_venta) REFERENCES facturacion_punto_venta (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Emisor: tipos habilitados, ubicación e integración ─────────────────
ALTER TABLE facturacion_emisor
  DROP COLUMN cod_establecimiento,
  DROP COLUMN cod_punto_venta,
  ADD COLUMN cod_departamento CHAR(2) DEFAULT NULL AFTER direccion,
  ADD COLUMN cod_municipio    CHAR(2) DEFAULT NULL AFTER cod_departamento,
  ADD COLUMN tipos_habilitados VARCHAR(40) NOT NULL DEFAULT '01,03,04,11,14' AFTER ambiente,
  ADD COLUMN dte_habilitado   TINYINT(1) NOT NULL DEFAULT 0 AFTER tipos_habilitados,
  ADD COLUMN api_usuario      VARCHAR(30)  DEFAULT NULL AFTER dte_habilitado,
  ADD COLUMN api_password     VARCHAR(255) DEFAULT NULL AFTER api_usuario,
  ADD COLUMN firmador_url     VARCHAR(250) NOT NULL DEFAULT 'http://localhost:8113/firmardocumento/' AFTER api_password,
  ADD COLUMN clave_privada    VARCHAR(255) DEFAULT NULL COMMENT 'contraseña de la llave privada del certificado' AFTER firmador_url,
  ADD COLUMN url_api_pruebas    VARCHAR(250) NOT NULL DEFAULT 'https://apitest.dtes.mh.gob.sv' AFTER clave_privada,
  ADD COLUMN url_api_produccion VARCHAR(250) NOT NULL DEFAULT 'https://api.dtes.mh.gob.sv' AFTER url_api_pruebas;

-- ── Documento: punto de venta, estado fiscal y de pago ─────────────────
ALTER TABLE factura
  ADD COLUMN id_punto_venta INT(10) UNSIGNED DEFAULT NULL AFTER tipo_dte,
  ADD COLUMN estado_fiscal ENUM('pendiente','procesado','rechazado') NOT NULL DEFAULT 'pendiente' AFTER estado,
  ADD COLUMN sello_recepcion VARCHAR(100) DEFAULT NULL AFTER estado_fiscal,
  ADD COLUMN fecha_procesamiento DATETIME DEFAULT NULL AFTER sello_recepcion,
  ADD COLUMN observaciones_mh TEXT DEFAULT NULL AFTER fecha_procesamiento,
  ADD COLUMN plazo_dias SMALLINT UNSIGNED DEFAULT NULL AFTER condicion_operacion,
  ADD COLUMN fecha_vencimiento DATE DEFAULT NULL AFTER plazo_dias,
  ADD COLUMN estado_pago ENUM('no_aplica','pendiente','parcial','pagado') NOT NULL DEFAULT 'no_aplica' AFTER fecha_vencimiento,
  ADD COLUMN monto_pagado DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER estado_pago,
  ADD COLUMN descuento DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER gravado,
  ADD KEY fk_factura_punto (id_punto_venta),
  ADD KEY idx_factura_fecha (fecha_emision),
  ADD CONSTRAINT fk_factura_punto FOREIGN KEY (id_punto_venta) REFERENCES facturacion_punto_venta (id) ON UPDATE CASCADE;

ALTER TABLE factura
  DROP KEY uq_factura_tipo_corr,
  ADD UNIQUE KEY uq_factura_punto_tipo_corr (id_punto_venta, tipo_dte, correlativo);

ALTER TABLE factura_linea
  ADD COLUMN tipo_item TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1 bienes, 2 servicios, 3 ambos' AFTER num_item,
  ADD COLUMN id_producto INT(10) UNSIGNED DEFAULT NULL AFTER id_item_oferta,
  ADD COLUMN descuento DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER precio_unitario,
  ADD CONSTRAINT fk_factura_linea_producto FOREIGN KEY (id_producto) REFERENCES producto (id) ON DELETE SET NULL ON UPDATE CASCADE;

-- ── Pagos (abonos) e historial ─────────────────────────────────────────
CREATE TABLE factura_pago (
  id          INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_factura  INT(10) UNSIGNED NOT NULL,
  fecha       DATE NOT NULL,
  monto       DECIMAL(14,2) NOT NULL,
  forma_pago  ENUM('efectivo','transferencia','cheque','tarjeta','otro') NOT NULL DEFAULT 'transferencia',
  referencia  VARCHAR(100) DEFAULT NULL,
  nota        VARCHAR(255) DEFAULT NULL,
  id_usuario  INT(10) UNSIGNED DEFAULT NULL,
  created_at  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY fk_factura_pago_factura (id_factura),
  CONSTRAINT chk_factura_pago_monto CHECK (monto > 0),
  CONSTRAINT fk_factura_pago_factura FOREIGN KEY (id_factura) REFERENCES factura (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_factura_pago_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 factura_historial (
  id          INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_factura  INT(10) UNSIGNED NOT NULL,
  evento      VARCHAR(40) NOT NULL,
  detalle     VARCHAR(500) DEFAULT NULL,
  id_usuario  INT(10) UNSIGNED DEFAULT NULL,
  created_at  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY fk_factura_hist_factura (id_factura),
  CONSTRAINT fk_factura_hist_factura FOREIGN KEY (id_factura) REFERENCES factura (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_factura_hist_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;
