sozsoft-platform/configs/seeds/postgres/object/Mnt_P_WorkOrderMaterialAfterSave.sql
2026-10-19 17:35:08 +03:00

52 lines
2.5 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Malzeme satırı ekipmanın departmanına bağlı bir iç konumdaki stok satırından (ürün + lot/seri) seçilir. Lookup bunu
-- süzer, kayıt burada doğrulanır: ürün, lot ve birim stok satırından yazılır (formdaki kopya değil stok esastır), miktar
-- eldeki miktarı aşamaz. İş emri departman onayını almışsa satır hemen Bakım Sarf Tüketimi teslimatına eklenir.
CREATE OR REPLACE PROCEDURE public."Mnt_P_WorkOrderMaterialAfterSave"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql
AS $$
DECLARE
v_order uuid;
v_loc uuid;
v_stock uuid;
v_qty numeric(18, 4);
v_dept uuid;
v_approved boolean;
v_stock_loc uuid;
v_on_hand numeric(18, 4);
BEGIN
IF p_id IS NULL THEN RETURN; END IF;
SELECT m."WorkOrderId", m."LocationId", m."StockId", m."Quantity", p."EquipmentDepartmentId",
COALESCE(o."ApprovalStatus", '') = 'Onaylandı'
INTO v_order, v_loc, v_stock, v_qty, v_dept, v_approved
FROM "Mnt_T_WorkOrderMaterial" m
INNER JOIN "Mnt_T_WorkOrder" o ON o."Id" = m."WorkOrderId"
LEFT JOIN "Stk_T_Product" p ON p."Id" = o."EquipmentId"
WHERE m."Id" = p_id AND m."IsDeleted" = false AND m."ConsumptionTransferId" IS NULL;
IF v_order IS NULL THEN RETURN; END IF;
IF v_loc IS NOT NULL AND NOT EXISTS (SELECT 1 FROM "Stk_T_Location"
WHERE "Id" = v_loc AND "LocationType" = 'Internal' AND "DepartmentId" = v_dept) THEN
RAISE EXCEPTION 'Depo/konum ekipmanın departmanına ait bir iç konum olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50409';
END IF;
IF v_stock IS NOT NULL THEN
SELECT "LocationId", "Quantity" INTO v_stock_loc, v_on_hand FROM "Stk_T_Stock" WHERE "Id" = v_stock AND "IsDeleted" = false;
IF v_stock_loc IS NULL OR v_stock_loc IS DISTINCT FROM v_loc THEN
RAISE EXCEPTION 'Seçilen ürün - lot/seri satırı seçilen depo/konumda değil.' USING ERRCODE = 'P0001', DETAIL = '50410';
END IF;
IF v_qty > v_on_hand THEN
RAISE EXCEPTION 'Miktar seçilen lot/serinin eldeki miktarını aşamaz.' USING ERRCODE = 'P0001', DETAIL = '50411';
END IF;
UPDATE "Mnt_T_WorkOrderMaterial" m SET "ProductId" = s."ProductId", "LotNo" = NULLIF(s."LotNo", ''), "UomId" = s."UomId"
FROM "Stk_T_Stock" s
WHERE s."Id" = m."StockId" AND m."Id" = p_id;
END IF;
IF v_approved THEN
CALL public."Mnt_P_WorkOrderConsume"(v_order, p_user_id);
END IF;
END;
$$;