SET NAMES utf8mb4;
SET time_zone = '-06:00';

CREATE TABLE IF NOT EXISTS terminales_fiscales (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  sucursal_id BIGINT UNSIGNED NOT NULL,
  caja_id BIGINT UNSIGNED NOT NULL,
  cod_sucursal CHAR(3) NOT NULL,
  cod_terminal CHAR(5) NOT NULL,
  ambiente ENUM('sandbox','production') NOT NULL DEFAULT 'sandbox',
  estado ENUM('activa','inactiva','suspendida') NOT NULL DEFAULT 'activa',
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_terminal_fiscal (negocio_id, cod_sucursal, cod_terminal, ambiente),
  KEY idx_tf_caja (negocio_id, sucursal_id, caja_id, estado),
  CONSTRAINT fk_tf_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id),
  CONSTRAINT fk_tf_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
  CONSTRAINT fk_tf_caja FOREIGN KEY (caja_id) REFERENCES cajas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS api_keys (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  sucursal_id BIGINT UNSIGNED NOT NULL,
  caja_id BIGINT UNSIGNED NOT NULL,
  terminal_fiscal_id BIGINT UNSIGNED NULL,
  key_hash CHAR(64) NOT NULL,
  key_prefix VARCHAR(16) NOT NULL,
  permisos_json LONGTEXT NULL,
  rate_limit_minuto INT UNSIGNED NOT NULL DEFAULT 120,
  ultimo_uso_at DATETIME NULL,
  estado ENUM('activa','suspendida','revocada') NOT NULL DEFAULT 'activa',
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_api_key_hash (key_hash),
  KEY idx_api_keys_terminal (terminal_fiscal_id, estado),
  KEY idx_api_keys_contexto (negocio_id, sucursal_id, caja_id, estado),
  CONSTRAINT fk_ak_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id),
  CONSTRAINT fk_ak_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
  CONSTRAINT fk_ak_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
  CONSTRAINT fk_ak_tf FOREIGN KEY (terminal_fiscal_id) REFERENCES terminales_fiscales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS mh_credenciales (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  ambiente ENUM('sandbox','production') NOT NULL DEFAULT 'sandbox',
  mh_username VARCHAR(120) NOT NULL,
  mh_password_cipher TEXT NOT NULL,
  cert_path VARCHAR(255) NOT NULL,
  cert_pin_cipher TEXT NOT NULL,
  cert_vigente_hasta DATETIME NULL,
  estado ENUM('activa','inactiva','vencida') NOT NULL DEFAULT 'activa',
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_mh_cred_negocio_ambiente (negocio_id, ambiente),
  CONSTRAINT fk_mh_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS consecutivos_fiscales (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  sucursal_id BIGINT UNSIGNED NOT NULL,
  terminal_fiscal_id BIGINT UNSIGNED NOT NULL,
  cod_sucursal CHAR(3) NOT NULL,
  cod_terminal CHAR(5) NOT NULL,
  tipo_documento CHAR(2) NOT NULL,
  ambiente ENUM('sandbox','production') NOT NULL DEFAULT 'sandbox',
  ultimo_numero BIGINT UNSIGNED NOT NULL DEFAULT 0,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_consecutivo_fiscal (negocio_id, cod_sucursal, cod_terminal, tipo_documento, ambiente),
  KEY idx_consecutivo_terminal (terminal_fiscal_id, tipo_documento),
  CONSTRAINT fk_cf_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id),
  CONSTRAINT fk_cf_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
  CONSTRAINT fk_cf_tf FOREIGN KEY (terminal_fiscal_id) REFERENCES terminales_fiscales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_electronicos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  sucursal_id BIGINT UNSIGNED NOT NULL,
  caja_id BIGINT UNSIGNED NULL,
  terminal_fiscal_id BIGINT UNSIGNED NULL,
  venta_id BIGINT UNSIGNED NULL,
  usuario_id BIGINT UNSIGNED NULL,
  tipo_documento CHAR(2) NOT NULL,
  xml_schema_version VARCHAR(10) NOT NULL DEFAULT '4.4',
  ambiente ENUM('sandbox','production') NOT NULL DEFAULT 'sandbox',
  clave CHAR(50) NULL,
  consecutivo CHAR(20) NULL,
  proveedor_sistemas VARCHAR(20) NULL,
  situacion CHAR(2) NOT NULL DEFAULT '1',
  fecha_emision VARCHAR(35) NULL,
  condicion_venta CHAR(2) NOT NULL DEFAULT '01',
  condicion_venta_otros VARCHAR(100) NULL,
  plazo_credito INT UNSIGNED NULL,
  moneda CHAR(3) NOT NULL DEFAULT 'CRC',
  tipo_cambio DECIMAL(18,5) NOT NULL DEFAULT 1,
  receptor_nombre VARCHAR(100) NULL,
  receptor_nombre_comercial VARCHAR(80) NULL,
  receptor_tipo_identificacion CHAR(2) NULL,
  receptor_identificacion VARCHAR(20) NULL,
  receptor_codigo_actividad VARCHAR(6) NULL,
  receptor_correo VARCHAR(160) NULL,
  receptor_provincia CHAR(1) NULL,
  receptor_canton CHAR(2) NULL,
  receptor_distrito CHAR(2) NULL,
  receptor_barrio VARCHAR(50) NULL,
  receptor_otras_sennas VARCHAR(160) NULL,
  total_serv_gravados DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_serv_exentos DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_serv_exonerados DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_serv_no_sujetos DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_merc_gravadas DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_merc_exentas DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_merc_exoneradas DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_merc_no_sujetas DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_gravado DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_exento DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_exonerado DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_no_sujeto DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_venta DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_descuentos DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_venta_neta DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_impuesto DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_imp_asum_emi DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_iva_devuelto DECIMAL(18,5) NOT NULL DEFAULT 0,
  servicio_10 DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_comprobante DECIMAL(18,5) NOT NULL DEFAULT 0,
  total_desglose_impuestos_json LONGTEXT NULL,
  idempotency_key VARCHAR(120) NULL,
  estado ENUM('BORRADOR','GENERADO','FIRMADO','ENVIADO','ACEPTADO','RECHAZADO','PENDIENTE','ERROR','ANULADO_POR_NC') NOT NULL DEFAULT 'BORRADOR',
  respuesta_hacienda VARCHAR(30) NULL,
  respuesta_error_hacienda TEXT NULL,
  xml_firmado_path VARCHAR(255) NULL,
  xml_respuesta_path VARCHAR(255) NULL,
  pdf_path VARCHAR(255) NULL,
  xml_firmado LONGTEXT NULL,
  xml_respuesta LONGTEXT NULL,
  webhook_url VARCHAR(500) NULL,
  webhook_token VARCHAR(180) NULL,
  correo_enviado_at DATETIME NULL,
  correo_error VARCHAR(255) NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_documento_clave (clave),
  UNIQUE KEY uq_documento_consecutivo (negocio_id, sucursal_id, caja_id, tipo_documento, consecutivo),
  UNIQUE KEY uq_documento_idempotency (negocio_id, idempotency_key),
  KEY idx_documentos_estado (negocio_id, estado, creado_at),
  KEY idx_documentos_venta (venta_id),
  KEY idx_documentos_fecha (negocio_id, sucursal_id, creado_at),
  KEY idx_documentos_receptor (negocio_id, receptor_identificacion),
  CONSTRAINT fk_de_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id),
  CONSTRAINT fk_de_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
  CONSTRAINT fk_de_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
  CONSTRAINT fk_de_tf FOREIGN KEY (terminal_fiscal_id) REFERENCES terminales_fiscales(id),
  CONSTRAINT fk_de_venta FOREIGN KEY (venta_id) REFERENCES ventas(id),
  CONSTRAINT fk_de_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_detalle (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NOT NULL,
  numero_linea INT UNSIGNED NOT NULL,
  producto_id BIGINT UNSIGNED NULL,
  codigo_cabys VARCHAR(13) NOT NULL,
  codigo_comercial_tipo CHAR(2) NULL,
  codigo_comercial VARCHAR(20) NULL,
  unidad_medida VARCHAR(15) NOT NULL,
  unidad_medida_comercial VARCHAR(20) NULL,
  partida_arancelaria VARCHAR(12) NULL,
  tipo_transaccion CHAR(2) NULL,
  detalle VARCHAR(200) NOT NULL,
  registro_medicamento VARCHAR(100) NULL,
  forma_farmaceutica VARCHAR(3) NULL,
  numero_vin_serie VARCHAR(17) NULL,
  cantidad DECIMAL(18,3) NOT NULL,
  precio_unitario DECIMAL(18,5) NOT NULL,
  monto_total DECIMAL(18,5) NOT NULL,
  sub_total DECIMAL(18,5) NOT NULL,
  base_imponible DECIMAL(18,5) NOT NULL DEFAULT 0,
  monto_total_linea DECIMAL(18,5) NOT NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_doc_detalle_documento (documento_id),
  KEY idx_doc_detalle_cabys (codigo_cabys),
  CONSTRAINT fk_dd_documento FOREIGN KEY (documento_id) REFERENCES documentos_electronicos(id),
  CONSTRAINT fk_dd_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_detalle_descuentos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_detalle_id BIGINT UNSIGNED NOT NULL,
  codigo_descuento CHAR(2) NOT NULL,
  codigo_descuento_otros VARCHAR(100) NULL,
  naturaleza_descuento VARCHAR(80) NULL,
  monto_descuento DECIMAL(18,5) NOT NULL DEFAULT 0,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_doc_desc_detalle (documento_detalle_id),
  CONSTRAINT fk_ddd_detalle FOREIGN KEY (documento_detalle_id) REFERENCES documentos_detalle(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_detalle_impuestos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_detalle_id BIGINT UNSIGNED NOT NULL,
  codigo CHAR(2) NOT NULL,
  codigo_otros VARCHAR(100) NULL,
  codigo_tarifa_iva CHAR(2) NULL,
  tarifa DECIMAL(5,2) NULL,
  factor_calculo_iva DECIMAL(10,5) NULL,
  monto DECIMAL(18,5) NOT NULL DEFAULT 0,
  monto_exoneracion DECIMAL(18,5) NOT NULL DEFAULT 0,
  impuesto_asumido_emisor_fabrica DECIMAL(18,5) NOT NULL DEFAULT 0,
  impuesto_neto DECIMAL(18,5) NOT NULL DEFAULT 0,
  exoneracion_tipo_documento_ex VARCHAR(4) NULL,
  exoneracion_tipo_documento_ex_otros VARCHAR(100) NULL,
  exoneracion_numero_documento VARCHAR(40) NULL,
  exoneracion_articulo VARCHAR(6) NULL,
  exoneracion_inciso VARCHAR(6) NULL,
  exoneracion_nombre_institucion VARCHAR(4) NULL,
  exoneracion_nombre_institucion_otros VARCHAR(160) NULL,
  exoneracion_fecha_emision VARCHAR(35) NULL,
  exoneracion_tarifa DECIMAL(8,5) NOT NULL DEFAULT 0,
  exoneracion_json LONGTEXT NULL,
  datos_especificos_json LONGTEXT NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_doc_imp_detalle (documento_detalle_id),
  KEY idx_doc_imp_codigo (codigo, codigo_tarifa_iva),
  CONSTRAINT fk_ddi_detalle FOREIGN KEY (documento_detalle_id) REFERENCES documentos_detalle(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_medios_pago (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NOT NULL,
  tipo_medio_pago CHAR(2) NOT NULL,
  medio_pago_otro VARCHAR(100) NULL,
  total_medio_pago DECIMAL(18,5) NULL,
  orden SMALLINT UNSIGNED NOT NULL DEFAULT 1,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_dmp_documento (documento_id),
  KEY idx_dmp_tipo (tipo_medio_pago),
  CONSTRAINT fk_dmp_documento FOREIGN KEY (documento_id) REFERENCES documentos_electronicos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_referencias (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NOT NULL,
  tipo_doc_ir CHAR(2) NOT NULL,
  tipo_doc_ref_otro VARCHAR(100) NULL,
  numero VARCHAR(50) NOT NULL,
  fecha_emision_ir VARCHAR(35) NOT NULL,
  codigo CHAR(2) NOT NULL,
  codigo_referencia_otro VARCHAR(100) NULL,
  razon VARCHAR(180) NOT NULL,
  orden SMALLINT UNSIGNED NOT NULL DEFAULT 1,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_doc_ref_documento (documento_id),
  KEY idx_doc_ref_numero (numero),
  CONSTRAINT fk_dr_documento FOREIGN KEY (documento_id) REFERENCES documentos_electronicos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS documentos_xml (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  documento_id BIGINT UNSIGNED NOT NULL,
  tipo ENUM('generado','firmado','respuesta','mensaje_receptor') NOT NULL,
  path VARCHAR(255) NULL,
  contenido LONGTEXT NULL,
  hash_sha256 CHAR(64) NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_doc_xml_documento (documento_id, tipo),
  KEY idx_doc_xml_hash (hash_sha256),
  CONSTRAINT fk_dx_documento FOREIGN KEY (documento_id) REFERENCES documentos_electronicos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS mensajes_receptor (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  negocio_id BIGINT UNSIGNED NOT NULL,
  sucursal_id BIGINT UNSIGNED NOT NULL,
  terminal_fiscal_id BIGINT UNSIGNED NULL,
  tipo_documento CHAR(2) NOT NULL DEFAULT '05',
  clave CHAR(50) NOT NULL,
  numero_consecutivo_receptor CHAR(20) NOT NULL,
  fecha_emision_doc VARCHAR(35) NOT NULL,
  mensaje CHAR(1) NOT NULL,
  detalle_mensaje VARCHAR(160) NULL,
  numero_cedula_emisor VARCHAR(20) NOT NULL,
  tipo_identificacion_emisor CHAR(2) NOT NULL,
  numero_cedula_receptor VARCHAR(20) NOT NULL,
  tipo_identificacion_receptor CHAR(2) NOT NULL,
  monto_total_impuesto DECIMAL(18,5) NULL,
  total_factura DECIMAL(18,5) NOT NULL,
  codigo_actividad VARCHAR(6) NULL,
  condicion_impuesto CHAR(2) NULL,
  monto_total_impuesto_acreditar DECIMAL(18,5) NULL,
  monto_total_de_gasto_aplicable DECIMAL(18,5) NULL,
  estado ENUM('BORRADOR','FIRMADO','ENVIADO','ACEPTADO','RECHAZADO','ERROR') NOT NULL DEFAULT 'BORRADOR',
  xml_firmado LONGTEXT NULL,
  xml_respuesta LONGTEXT NULL,
  respuesta_hacienda VARCHAR(30) NULL,
  respuesta_error_hacienda TEXT NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_mr_clave_consecutivo (clave, numero_consecutivo_receptor),
  KEY idx_mr_negocio_fecha (negocio_id, creado_at),
  KEY idx_mr_estado (negocio_id, estado, creado_at),
  CONSTRAINT fk_mr_negocio FOREIGN KEY (negocio_id) REFERENCES negocios(id),
  CONSTRAINT fk_mr_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
  CONSTRAINT fk_mr_tf FOREIGN KEY (terminal_fiscal_id) REFERENCES terminales_fiscales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS tipo_cambio_cache (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  moneda CHAR(3) NOT NULL DEFAULT 'USD',
  fecha DATE NOT NULL,
  compra DECIMAL(18,5) NULL,
  venta DECIMAL(18,5) NULL,
  fuente VARCHAR(60) NOT NULL DEFAULT 'hacienda',
  raw_response LONGTEXT NULL,
  actualizado_at DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_tc_moneda_fecha (moneda, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
