sozsoft-platform/configs/seeds/postgres/object/Mm_P_WorkOrderConsume.sql
2026-10-19 00:22:40 +03:00

85 lines
4.8 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.

-- Departman onayı alan bakım iş emrinin malzemeleri için sarf çıkışı (Envanter › Teslimatlar): sarfı açılmamış satırlar
-- depo/konuma göre gruplanır, her konum için o konumun deposundaki Bakım Sarf Tüketimi operasyon türünde (numaratörü
-- '.MaintenanceConsumption' ile biter) taslak teslimat açılır; aynı emrin aynı konumdaki taslağı varsa satır ona eklenir.
-- Hedef konum ve tür operasyon türünden gelir; stoktan düşmesi için tür Teslimat ve hedefi dış konum olmalıdır. Satırda
-- seçilen lot/seri teslimat satırının lotu olarak yazılır; depo belgeyi Hazırla › Doğrula ile işler. Satır sarfa
-- bağlandıktan sonra değişmez; yordam tekrar çağrılırsa yalnız yeni satırları işler.
CREATE OR REPLACE PROCEDURE public."Mm_P_WorkOrderConsume"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql
AS $$
DECLARE
v_tenant uuid;
v_no varchar(32);
v_loc uuid;
v_op_type uuid;
v_doc uuid;
v_mat record;
v_line uuid;
BEGIN
SELECT "TenantId", "WorkOrderNo" INTO v_tenant, v_no FROM "Mm_T_WorkOrder" WHERE "Id" = p_id;
IF EXISTS (SELECT 1 FROM "Mm_T_WorkOrderMaterial"
WHERE "WorkOrderId" = p_id AND "IsDeleted" = false AND "ConsumptionTransferId" IS NULL AND "LocationId" IS NULL) THEN
RAISE EXCEPTION 'Depo/konumu seçilmemiş malzeme satırı var; sarf çıkışı açılamaz.' USING ERRCODE = 'P0001', DETAIL = '50401';
END IF;
FOR v_loc IN
SELECT DISTINCT "LocationId" FROM "Mm_T_WorkOrderMaterial"
WHERE "WorkOrderId" = p_id AND "IsDeleted" = false AND "ConsumptionTransferId" IS NULL
LOOP
v_op_type := NULL;
SELECT ot."Id" INTO v_op_type
FROM "Inv_T_OperationType" ot
INNER JOIN "Inv_T_Location" l ON l."WarehouseId" = ot."WarehouseId"
WHERE l."Id" = v_loc AND ot."IsDeleted" = false AND ot."IsActive" = true AND ot."SequenceName" LIKE '%.MaintenanceConsumption'
AND ot."TenantId" IS NOT DISTINCT FROM v_tenant
ORDER BY ot."Name"
LIMIT 1;
IF v_op_type IS NULL THEN
RAISE EXCEPTION 'Depo/konumun deposunda aktif Bakım Sarf Tüketimi operasyon türü tanımlı değil.' USING ERRCODE = 'P0001', DETAIL = '50402';
END IF;
v_doc := NULL;
SELECT "Id" INTO v_doc
FROM "Inv_T_Transfer"
WHERE "OperationTypeId" = v_op_type AND "SourceLocationId" = v_loc AND "SourceDocument" = v_no AND "Status" = 'Draft'
AND "IsDeleted" = false
LIMIT 1;
IF v_doc IS NULL THEN
v_doc := gen_random_uuid();
INSERT INTO "Inv_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "SourceLocationId",
"DestinationLocationId", "SourceDocument", "ResponsibleUserId", "Status", "CreationTime", "CreatorId", "IsDeleted")
SELECT v_doc, v_tenant, ot."BranchId", ot."WarehouseId", ot."Id", ot."OperationKind", v_loc, ot."DestinationLocationId",
v_no, p_user_id, 'Draft', NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Inv_T_OperationType" ot
WHERE ot."Id" = v_op_type;
END IF;
-- Lot/seri takipli üründe yapılacak miktar lot toplamıdır (Inv_P_TransferRecalc); lotu seçilmemiş satırın lotunu depo seçer.
FOR v_mat IN
SELECT m."Id", m."ProductId", m."Description", m."Quantity", m."UomId", m."LotNo",
p."TrackingMethod" IN ('Lot', 'Serial') AS "Tracked"
FROM "Mm_T_WorkOrderMaterial" m
INNER JOIN "Inv_T_Product" p ON p."Id" = m."ProductId"
WHERE m."WorkOrderId" = p_id AND m."IsDeleted" = false AND m."ConsumptionTransferId" IS NULL AND m."LocationId" = v_loc
LOOP
v_line := gen_random_uuid();
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId",
"CreationTime", "CreatorId", "IsDeleted")
VALUES (v_line, v_tenant, v_doc, v_mat."ProductId", v_mat."Description", v_mat."Quantity",
CASE WHEN v_mat."Tracked" THEN 0 ELSE v_mat."Quantity" END, v_mat."UomId", NOW() AT TIME ZONE 'UTC', p_user_id, false);
IF v_mat."Tracked" AND v_mat."LotNo" IS NOT NULL THEN
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, v_line, v_mat."LotNo", v_mat."Quantity", NOW() AT TIME ZONE 'UTC', p_user_id, false);
END IF;
UPDATE "Mm_T_WorkOrderMaterial" SET "ConsumptionTransferId" = v_doc WHERE "Id" = v_mat."Id";
END LOOP;
CALL public."Inv_P_TransferAfterSave"(v_doc, p_user_id);
END LOOP;
END;
$$;