CREATE TABLE IF NOT EXISTS metricas_mensuales (
  id                      uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  contribuyente_id        uuid NOT NULL REFERENCES contribuyentes(entidad_id) ON DELETE CASCADE,
  anio                    smallint NOT NULL,
  mes                     smallint NOT NULL,
  regimen_fiscal          varchar(3),
  formula_version         smallint DEFAULT 1,
  iva_trasladado_16       numeric(18,2) DEFAULT 0,
  iva_trasladado_8        numeric(18,2) DEFAULT 0,
  iva_trasladado_0        numeric(18,2) DEFAULT 0,
  iva_trasladado_exento   numeric(18,2) DEFAULT 0,
  iva_trasladado_total    numeric(18,2) DEFAULT 0,
  iva_acreditable         numeric(18,2) DEFAULT 0,
  iva_retenido_cobrado    numeric(18,2) DEFAULT 0,
  iva_retenido_pagado     numeric(18,2) DEFAULT 0,
  iva_resultado           numeric(18,2) DEFAULT 0,
  iva_a_favor_mes         numeric(18,2) DEFAULT 0,
  isr_ingresos_brutos     numeric(18,2) DEFAULT 0,
  isr_deducciones_autoriz numeric(18,2) DEFAULT 0,
  isr_base                numeric(18,2) DEFAULT 0,
  isr_causado             numeric(18,2) DEFAULT 0,
  isr_retenido            numeric(18,2) DEFAULT 0,
  isr_a_pagar             numeric(18,2) DEFAULT 0,
  ieps_trasladado         numeric(18,2) DEFAULT 0,
  ieps_acreditable        numeric(18,2) DEFAULT 0,
  cfdis_emitidos_count    int DEFAULT 0,
  cfdis_recibidos_count   int DEFAULT 0,
  cfdis_cancelados_count  int DEFAULT 0,
  ingresos_devengados     numeric(18,2) DEFAULT 0,
  ingresos_cobrados       numeric(18,2) DEFAULT 0,
  egresos_devengados      numeric(18,2) DEFAULT 0,
  egresos_pagados         numeric(18,2) DEFAULT 0,
  utilidad_devengada      numeric(18,2) DEFAULT 0,
  utilidad_realizada      numeric(18,2) DEFAULT 0,
  flujo_entradas          numeric(18,2) DEFAULT 0,
  flujo_salidas           numeric(18,2) DEFAULT 0,
  flujo_neto              numeric(18,2) DEFAULT 0,
  cxc_saldo_final         numeric(18,2) DEFAULT 0,
  cxp_saldo_final         numeric(18,2) DEFAULT 0,
  cxc_cfdis_count         int DEFAULT 0,
  cxp_cfdis_count         int DEFAULT 0,
  cerrado                 boolean DEFAULT false,
  computed_at             timestamptz DEFAULT now(),
  source_max_cfdi_at      timestamptz,
  UNIQUE (contribuyente_id, anio, mes, regimen_fiscal)
);
CREATE INDEX IF NOT EXISTS ix_metricas_contrib_anio ON metricas_mensuales(contribuyente_id, anio DESC, mes DESC);
CREATE INDEX IF NOT EXISTS ix_metricas_cerrado ON metricas_mensuales(cerrado, computed_at);

INSERT INTO tenant_migrations (scope, version, name)
VALUES ('vertical-contable', 14, '014_metricas_mensuales')
ON CONFLICT (scope, version) DO NOTHING;
