Files
hotel-hacienda/scripts_sql/fix_setpaymentstatusv2_commented.sql
Consultoria AS 1882fcab3d fix(sql): scripts temporales para prueba de duplicacion de stock
- 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
2026-06-10 09:03:24 -07:00

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;