-- 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."Mnt_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 "Mnt_T_WorkOrder" WHERE "Id" = p_id; IF EXISTS (SELECT 1 FROM "Mnt_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 "Mnt_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 "Stk_T_OperationType" ot INNER JOIN "Stk_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 "Stk_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 "Stk_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 "Stk_T_OperationType" ot WHERE ot."Id" = v_op_type; END IF; -- Lot/seri takipli üründe yapılacak miktar lot toplamıdır (Stk_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 "Mnt_T_WorkOrderMaterial" m INNER JOIN "Stk_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 "Stk_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 "Stk_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 "Mnt_T_WorkOrderMaterial" SET "ConsumptionTransferId" = v_doc WHERE "Id" = v_mat."Id"; END LOOP; CALL public."Stk_P_TransferAfterSave"(v_doc, p_user_id); END LOOP; END; $$;