- fix_setpaymentstatusv2_commented.sql: bloque de stock duplicado comentado - rollback_setpaymentstatusv2.sql: restaura funcion a estado original - Nota explicativa incluida en el codigo de la funcion
145 lines
4.8 KiB
PL/PgSQL
145 lines
4.8 KiB
PL/PgSQL
-- ============================================================
|
|
-- 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;
|