-- ============================================================
-- FIX TEMPORAL: Comentar duplicacion de stock en pagos
-- Fecha: 2026-06-09
-- Autor: Analisis automatico del sistema
-- ============================================================
-- PROBLEMA IDENTIFICADO:
-- La funcion setpaymentstatusv2 estaba sumando de nuevo al stock
-- cuando un expense se marcaba como pagado (status = 1).
-- Esto causaba duplicacion porque purchaseentry() YA actualiza
-- el stock correctamente al registrar la recepcion fisica.
--
-- SOLUCION APLICADA:
-- Se comenta el bloque FOR ... LOOP que suma stock duplicado.
-- Se mantiene la actualizacion de fechas en stock_movements y
-- stock_adjusments por compatibilidad historica (legacy).
--
-- NOTA: Este cambio es reversible. Si algo falla, ejecutar
--       rollback_setpaymentstatusv2.sql para restaurar.
-- ============================================================

CREATE OR REPLACE FUNCTION public.setpaymentstatusv2(
    expense integer,
    status integer)
    RETURNS integer
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
    rows_updated INT := 0;
    details RECORD;
    approval int :=0;
BEGIN
    SELECT id_approval_stat INTO approval FROM expenses where id_expense = expense;
    IF(approval = 1 ) --si el gasto esta aprobado se procede al pago
    THEN
      -- Validar estados permitidos
    IF status = 1 THEN
        UPDATE payments
        SET id_payment_status = status,
            payment_date = CURRENT_DATE
        WHERE id_expense = expense;
        GET DIAGNOSTICS rows_updated = ROW_COUNT;

        IF rows_updated = 0 THEN
            RETURN -1;
        END IF;

        -- Procesar solo si existen movimientos de stock
        IF EXISTS (
            SELECT 1
            FROM stock_movements st
            INNER JOIN purchase_detail pd ON st.id_expense = pd.id_expense
            WHERE pd.id_expense = expense
        ) THEN

            -- se obtiene el id del detalle de la compra
            --Ya no se necesita con el cambio nuevo
            /*SELECT id_expense
            INTO id_purchase_detail
            FROM purchase_detail
            WHERE id_expense = expense
            LIMIT 1;*/
            -- Actualizar movimiento
            UPDATE stock_movements 
            SET date_st_mov = CURRENT_DATE
            WHERE id_expense = expense;

            -- Obtener id movimiento
            --Ya no se necesita con el cambio nuevo
            /*SELECT id_sto_mov
            INTO id_stock_movement
            FROM stock_movements
            WHERE id_purchase_dt = id_purchase_detail
            LIMIT 1;*/

            -- Actualizar ajuste
            UPDATE stock_adjusments
            SET date_adjusment = CURRENT_DATE
            WHERE id_expense = expense;

            -- ============================================================
            -- BLOQUE COMENTADO POR DUPLICACION DE STOCK
            -- ============================================================
            -- Motivo: purchaseentry() YA actualiza el stock correctamente
            -- al registrar la recepcion fisica de la compra. Este bloque
            -- sumaba las mismas cantidades por segunda vez al pagar el
            -- expense, generando stock inflado (fantasma).
            --
            -- Fecha de comentario: 2026-06-09
            -- Ticket/Referencia: Duplicacion de entradas de inventario
            -- ============================================================
            /*
            FOR details IN
                SELECT id_product, quantity
                FROM purchase_detail
                WHERE id_expense = expense
            LOOP
                UPDATE stock
                SET stock = stock + details.quantity
                WHERE id_product = details.id_product;
            END LOOP;
            */
            /*Cambio viejo
            UPDATE stock
            SET stock = stock + (
                SELECT *
                FROM purchase_detail
                WHERE id_purchase_dt = id_purchase_detail
            )
            WHERE id_product = (
                SELECT id_product
                FROM purchase_detail
                WHERE id_purchase_dt = id_purchase_detail
            );*/
        END IF;
        RETURN status;

    ELSIF status = 3 THEN
        -- Actualizar pago
        UPDATE payments
        SET id_payment_status = status,
            payment_date = CURRENT_DATE
        WHERE id_expense = expense;
        GET DIAGNOSTICS rows_updated = ROW_COUNT;

        IF rows_updated = 0 THEN
            RETURN -1;
        END IF;

        RETURN status;

    ELSE
        -- Status invalido
        RETURN -2;
    END IF;
    ELSE
    return -3; --si no esta aprobado o rechazado no se puede actualizar el pago
    END IF;
END;
$BODY$;

-- Confirmacion
SELECT 'Funcion setpaymentstatusv2 actualizada correctamente (bloque de stock comentado)' AS resultado;
