-- ============================================================ -- 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;