-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-17_02 · Facturación de proyectos aprobados
--
-- Pedido del usuario: facturar los proyectos aprobados con consumidor final,
-- comprobante de crédito fiscal, nota de remisión, factura de exportación y
-- sujeto excluido. Decisiones del usuario:
--   * documentos INTERNOS pero listos para DTE (código de generación UUID y
--     número de control DTE-TT-EEEEPPPP-NNNNNNNNNNNNNNN); la transmisión a
--     Hacienda (firma/sello) se conecta después;
--   * un proyecto se factura en partes (anticipo, avances, saldo) hasta su total;
--   * sujeto excluido = COMPRAS a personas no inscritas (retención 10 % renta),
--     opcionalmente cargadas a un proyecto.
--
-- Tipos (códigos DTE): 01 Factura (consumidor final), 03 Comprobante de
-- crédito fiscal, 04 Nota de remisión, 11 Factura de exportación,
-- 14 Factura de sujeto excluido.
--
-- Respaldo previo: backups/tinsa_db_pre-facturacion_2026-10-17.sql
-- Reversa: database/rollback/2026-10-17_02_facturacion.sql
-- ═══════════════════════════════════════════════════════════════════════

-- Datos del emisor (una sola fila, id = 1)
CREATE TABLE facturacion_emisor (
  id                 TINYINT UNSIGNED NOT NULL PRIMARY KEY,
  nombre             VARCHAR(250) NOT NULL DEFAULT '',
  nombre_comercial   VARCHAR(250) DEFAULT NULL,
  nit                VARCHAR(20)  NOT NULL DEFAULT '',
  nrc                VARCHAR(20)  NOT NULL DEFAULT '',
  cod_actividad      VARCHAR(10)  DEFAULT NULL,
  desc_actividad     VARCHAR(250) DEFAULT NULL,
  tipo_contribuyente ENUM('pequeno','mediano','grande') NOT NULL DEFAULT 'mediano',
  direccion          VARCHAR(250) DEFAULT NULL,
  telefono           VARCHAR(30)  DEFAULT NULL,
  correo             VARCHAR(120) DEFAULT NULL,
  cod_establecimiento CHAR(4) NOT NULL DEFAULT 'M001',
  cod_punto_venta    CHAR(4) NOT NULL DEFAULT 'P001',
  ambiente           CHAR(2) NOT NULL DEFAULT '00' COMMENT '00 pruebas, 01 producción (DTE)',
  usuario_modifico   INT(10) UNSIGNED DEFAULT NULL,
  updated_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_fact_emisor_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;
INSERT INTO facturacion_emisor (id) VALUES (1);

-- Siguiente correlativo por tipo de documento
CREATE TABLE facturacion_correlativo (
  tipo_dte  CHAR(2) NOT NULL PRIMARY KEY,
  siguiente INT(10) UNSIGNED NOT NULL DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO facturacion_correlativo (tipo_dte) VALUES ('01'), ('03'), ('04'), ('11'), ('14');

CREATE TABLE factura (
  id                  INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  tipo_dte            CHAR(2) NOT NULL,
  correlativo         INT(10) UNSIGNED NOT NULL,
  numero_control      VARCHAR(31) NOT NULL,
  codigo_generacion   CHAR(36) NOT NULL,
  fecha_emision       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  id_cotizacion_venta INT(10) UNSIGNED DEFAULT NULL COMMENT 'proyecto (solicitud)',
  id_oferta           INT(10) UNSIGNED DEFAULT NULL,
  id_cliente          INT(10) UNSIGNED DEFAULT NULL,
  -- Receptor tal como se emitió (en sujeto excluido: la persona a quien se compra)
  receptor_nombre     VARCHAR(250) NOT NULL,
  receptor_tipo_doc   VARCHAR(10)  DEFAULT NULL COMMENT 'NIT, DUI, PASAPORTE, OTRO',
  receptor_num_doc    VARCHAR(30)  DEFAULT NULL,
  receptor_nrc        VARCHAR(20)  DEFAULT NULL,
  receptor_giro       VARCHAR(250) DEFAULT NULL,
  receptor_direccion  VARCHAR(250) DEFAULT NULL,
  receptor_correo     VARCHAR(120) DEFAULT NULL,
  receptor_telefono   VARCHAR(30)  DEFAULT NULL,
  receptor_pais       VARCHAR(80)  DEFAULT NULL,
  receptor_grande     TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'gran contribuyente (retención 1 %)',
  condicion_operacion ENUM('contado','credito','otro') NOT NULL DEFAULT 'contado',
  modo_cobro          VARCHAR(20) DEFAULT NULL COMMENT 'items, porcentaje, saldo, libre',
  gravado             DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 'suma de líneas (01: con IVA)',
  iva                 DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT '01: IVA incluido (informativo)',
  retencion_iva       DECIMAL(14,2) NOT NULL DEFAULT 0,
  percepcion_iva      DECIMAL(14,2) NOT NULL DEFAULT 0,
  retencion_renta     DECIMAL(14,2) NOT NULL DEFAULT 0,
  total               DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 'monto total de la operación',
  total_pagar         DECIMAL(14,2) NOT NULL DEFAULT 0,
  monto_base          DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 'lo que avanza la facturación del proyecto, sin IVA (0 en 04 y 14)',
  observaciones       TEXT DEFAULT NULL,
  estado              ENUM('emitida','anulada') NOT NULL DEFAULT 'emitida',
  motivo_anulacion    VARCHAR(255) DEFAULT NULL,
  fecha_anulacion     DATETIME DEFAULT NULL,
  id_usuario_emitio   INT(10) UNSIGNED DEFAULT NULL,
  id_usuario_anulo    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_factura_control (numero_control),
  UNIQUE KEY uq_factura_codigo (codigo_generacion),
  UNIQUE KEY uq_factura_tipo_corr (tipo_dte, correlativo),
  KEY fk_factura_solicitud (id_cotizacion_venta),
  KEY fk_factura_oferta (id_oferta),
  KEY fk_factura_cliente (id_cliente),
  CONSTRAINT chk_factura_tipo CHECK (tipo_dte IN ('01','03','04','11','14')),
  CONSTRAINT fk_factura_solicitud FOREIGN KEY (id_cotizacion_venta) REFERENCES cotizacion_venta (id) ON UPDATE CASCADE,
  CONSTRAINT fk_factura_oferta FOREIGN KEY (id_oferta) REFERENCES cotizacion_venta_oferta (id) ON UPDATE CASCADE,
  CONSTRAINT fk_factura_cliente FOREIGN KEY (id_cliente) REFERENCES cliente (id) ON UPDATE CASCADE,
  CONSTRAINT fk_factura_emitio FOREIGN KEY (id_usuario_emitio) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_factura_anulo FOREIGN KEY (id_usuario_anulo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE factura_linea (
  id              INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_factura      INT(10) UNSIGNED NOT NULL,
  num_item        SMALLINT UNSIGNED NOT NULL,
  id_item_oferta  INT(10) UNSIGNED DEFAULT NULL,
  descripcion     VARCHAR(1000) NOT NULL,
  cantidad        DECIMAL(14,4) NOT NULL DEFAULT 1,
  unidad          VARCHAR(30) DEFAULT NULL,
  precio_unitario DECIMAL(14,4) NOT NULL DEFAULT 0 COMMENT '01: con IVA; demás: sin IVA',
  monto           DECIMAL(14,2) NOT NULL DEFAULT 0,
  KEY fk_factura_linea_factura (id_factura),
  CONSTRAINT fk_factura_linea_factura FOREIGN KEY (id_factura) REFERENCES factura (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_factura_linea_item FOREIGN KEY (id_item_oferta) REFERENCES cotizacion_venta_oferta_item (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Pestaña nueva en Ventas, de entrada solo para Administrador
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (4, 'Facturación', '/ventas/facturacion', 'fa-file-invoice-dollar', 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 = '/ventas/facturacion';
