-- ============================================
-- MIGRACION 009: Relacion bidireccional transacciones <-> planes_pago
-- Fecha: 2026-01-26
-- Proyecto: Integracion Modelos en Agregar Venta
-- Plan: /home/bitnami/opalit-ia/documentation/planes/INTEGRACION_MODELOS_AGREGAR_VENTA/
--
-- PROPOSITO:
-- Agregar columnas para enlazar ventas con planes de pago de forma bidireccional.
-- - transacciones.id_plan_pago -> planes_pago.id_plan
-- - planes_pago.id_transaccion_origen -> transacciones.id_transaccion
--
-- EJECUTAR CON:
-- php /home/bitnami/secure-database/backend-agent/migrations/run_migration.php 009_add_bidirectional_transacciones_planes.sql
-- ============================================

BEGIN;

-- ============================================
-- 1. COLUMNA EN TRANSACCIONES
-- ============================================

-- Paso 1.1: Agregar columna
ALTER TABLE transacciones
ADD COLUMN IF NOT EXISTS id_plan_pago INTEGER NULL;

-- Paso 1.2: Eliminar FK anterior si existe (idempotencia)
ALTER TABLE transacciones
DROP CONSTRAINT IF EXISTS fk_transacciones_plan_pago;

-- Paso 1.3: Agregar constraint FK
ALTER TABLE transacciones
ADD CONSTRAINT fk_transacciones_plan_pago
FOREIGN KEY (id_plan_pago)
REFERENCES planes_pago(id_plan)
ON DELETE SET NULL;

-- Paso 1.4: Eliminar indice anterior si existe
DROP INDEX IF EXISTS idx_transacciones_plan_pago;

-- Paso 1.5: Crear indice parcial para performance
CREATE INDEX idx_transacciones_plan_pago
ON transacciones(id_plan_pago)
WHERE id_plan_pago IS NOT NULL;

-- Paso 1.6: Agregar comentario explicativo
COMMENT ON COLUMN transacciones.id_plan_pago IS 'FK a planes_pago: Si no es NULL, esta transaccion es parte de un plan de pago. NULL = venta simple (pago unico).';

-- ============================================
-- 2. COLUMNA EN PLANES_PAGO
-- ============================================

-- Paso 2.1: Agregar columna
ALTER TABLE planes_pago
ADD COLUMN IF NOT EXISTS id_transaccion_origen INTEGER NULL;

-- Paso 2.2: Eliminar FK anterior si existe (idempotencia)
ALTER TABLE planes_pago
DROP CONSTRAINT IF EXISTS fk_planes_pago_transaccion;

-- Paso 2.3: Agregar constraint FK
ALTER TABLE planes_pago
ADD CONSTRAINT fk_planes_pago_transaccion
FOREIGN KEY (id_transaccion_origen)
REFERENCES transacciones(id_transaccion)
ON DELETE SET NULL;

-- Paso 2.4: Eliminar indice anterior si existe
DROP INDEX IF EXISTS idx_planes_pago_transaccion;

-- Paso 2.5: Crear indice parcial
CREATE INDEX idx_planes_pago_transaccion
ON planes_pago(id_transaccion_origen)
WHERE id_transaccion_origen IS NOT NULL;

-- Paso 2.6: Agregar comentario explicativo
COMMENT ON COLUMN planes_pago.id_transaccion_origen IS 'FK a transacciones: La transaccion de venta que origino este plan. NULL si el plan fue creado desde crear-plan.html sin transaccion.';

COMMIT;

-- ============================================
-- VERIFICACION POST-MIGRACION
-- ============================================

-- Ejecutar despues de la migracion para verificar:
--
-- SELECT column_name, data_type, is_nullable
-- FROM information_schema.columns
-- WHERE table_name IN ('transacciones', 'planes_pago')
--   AND column_name IN ('id_plan_pago', 'id_transaccion_origen');
--
-- Debe retornar 2 filas con:
-- - id_plan_pago | integer | YES
-- - id_transaccion_origen | integer | YES

-- ============================================
-- INTERPRETACION DE VALORES
-- ============================================
--
-- transacciones.id_plan_pago:
--   NULL    = Venta simple (pago unico, sin financiamiento)
--   INTEGER = Venta con plan de pago (el cliente financia)
--
-- planes_pago.id_transaccion_origen:
--   NULL    = Plan creado desde crear-plan.html (sin transaccion asociada)
--   INTEGER = Plan creado desde agregar-venta.html (tiene transaccion)
--
-- ============================================
