ALTER TABLE commerce.transacciones
  ADD COLUMN monto_base numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_base numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_iva numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_total numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN monto_cobrado_cliente numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN porcentaje_tarjeta_aplicado numeric(5,2) NOT NULL DEFAULT 0,
  ADD COLUMN aplicar_iva_porcentaje_tarjeta boolean NOT NULL DEFAULT false;

ALTER TABLE commerce.ventas
  ADD COLUMN monto_total_base numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_base_total numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_iva_total numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_total numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN monto_total_cobrado_cliente numeric(14,2) NOT NULL DEFAULT 0;

ALTER TABLE commerce.pagos_planes
  ADD COLUMN monto_base numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_base numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_iva numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN recargo_tarjeta_total numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN monto_cobrado_cliente numeric(14,2) NOT NULL DEFAULT 0,
  ADD COLUMN porcentaje_tarjeta_aplicado numeric(5,2) NOT NULL DEFAULT 0,
  ADD COLUMN aplicar_iva_porcentaje_tarjeta boolean NOT NULL DEFAULT false;

UPDATE commerce.transacciones
SET
  monto_base = ROUND(COALESCE(cobrado, 0)::numeric, 2),
  recargo_tarjeta_base = 0,
  recargo_tarjeta_iva = 0,
  recargo_tarjeta_total = 0,
  monto_cobrado_cliente = ROUND(COALESCE(cobrado, 0)::numeric, 2),
  porcentaje_tarjeta_aplicado = 0,
  aplicar_iva_porcentaje_tarjeta = false;

UPDATE commerce.ventas
SET
  monto_total_base = ROUND(COALESCE(monto_total, 0)::numeric, 2),
  recargo_tarjeta_base_total = 0,
  recargo_tarjeta_iva_total = 0,
  recargo_tarjeta_total = 0,
  monto_total_cobrado_cliente = ROUND(COALESCE(monto_total, 0)::numeric, 2);

UPDATE commerce.pagos_planes
SET
  monto_base = ROUND(COALESCE(monto, 0)::numeric, 2),
  recargo_tarjeta_base = 0,
  recargo_tarjeta_iva = 0,
  recargo_tarjeta_total = 0,
  monto_cobrado_cliente = ROUND(COALESCE(monto, 0)::numeric, 2),
  porcentaje_tarjeta_aplicado = 0,
  aplicar_iva_porcentaje_tarjeta = false;

ALTER TABLE commerce.transacciones
  ADD CONSTRAINT ck_transacciones_monto_base_nonneg CHECK (monto_base >= 0),
  ADD CONSTRAINT ck_transacciones_recargo_base_nonneg CHECK (recargo_tarjeta_base >= 0),
  ADD CONSTRAINT ck_transacciones_recargo_iva_nonneg CHECK (recargo_tarjeta_iva >= 0),
  ADD CONSTRAINT ck_transacciones_recargo_total_nonneg CHECK (recargo_tarjeta_total >= 0),
  ADD CONSTRAINT ck_transacciones_cobrado_ge_base CHECK (monto_cobrado_cliente >= monto_base),
  ADD CONSTRAINT ck_transacciones_porcentaje_tarjeta_rango CHECK (porcentaje_tarjeta_aplicado >= 0 AND porcentaje_tarjeta_aplicado <= 100),
  ADD CONSTRAINT ck_transacciones_recargo_total_coherencia CHECK (ABS(recargo_tarjeta_total - (recargo_tarjeta_base + recargo_tarjeta_iva)) <= 0.01),
  ADD CONSTRAINT ck_transacciones_cobrado_total_coherencia CHECK (ABS(monto_cobrado_cliente - (monto_base + recargo_tarjeta_total)) <= 0.01);

ALTER TABLE commerce.ventas
  ADD CONSTRAINT ck_ventas_monto_total_base_nonneg CHECK (monto_total_base >= 0),
  ADD CONSTRAINT ck_ventas_recargo_base_total_nonneg CHECK (recargo_tarjeta_base_total >= 0),
  ADD CONSTRAINT ck_ventas_recargo_iva_total_nonneg CHECK (recargo_tarjeta_iva_total >= 0),
  ADD CONSTRAINT ck_ventas_recargo_total_nonneg CHECK (recargo_tarjeta_total >= 0),
  ADD CONSTRAINT ck_ventas_cobrado_ge_base CHECK (monto_total_cobrado_cliente >= monto_total_base),
  ADD CONSTRAINT ck_ventas_recargo_total_coherencia CHECK (ABS(recargo_tarjeta_total - (recargo_tarjeta_base_total + recargo_tarjeta_iva_total)) <= 0.01),
  ADD CONSTRAINT ck_ventas_cobrado_total_coherencia CHECK (ABS(monto_total_cobrado_cliente - (monto_total_base + recargo_tarjeta_total)) <= 0.01);

ALTER TABLE commerce.pagos_planes
  ADD CONSTRAINT ck_pagos_planes_monto_base_nonneg CHECK (monto_base >= 0),
  ADD CONSTRAINT ck_pagos_planes_recargo_base_nonneg CHECK (recargo_tarjeta_base >= 0),
  ADD CONSTRAINT ck_pagos_planes_recargo_iva_nonneg CHECK (recargo_tarjeta_iva >= 0),
  ADD CONSTRAINT ck_pagos_planes_recargo_total_nonneg CHECK (recargo_tarjeta_total >= 0),
  ADD CONSTRAINT ck_pagos_planes_cobrado_ge_base CHECK (monto_cobrado_cliente >= monto_base),
  ADD CONSTRAINT ck_pagos_planes_porcentaje_tarjeta_rango CHECK (porcentaje_tarjeta_aplicado >= 0 AND porcentaje_tarjeta_aplicado <= 100),
  ADD CONSTRAINT ck_pagos_planes_recargo_total_coherencia CHECK (ABS(recargo_tarjeta_total - (recargo_tarjeta_base + recargo_tarjeta_iva)) <= 0.01),
  ADD CONSTRAINT ck_pagos_planes_cobrado_total_coherencia CHECK (ABS(monto_cobrado_cliente - (monto_base + recargo_tarjeta_total)) <= 0.01);
