sozsoft-platform/configs/seeds/postgres/object/Mnt_P_WorkOrderConsume.sql

86 lines
4.8 KiB
MySQL
Raw Permalink Normal View History

2026-10-18 21:22:40 +00:00
-- 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.
2026-10-19 14:35:08 +00:00
CREATE OR REPLACE PROCEDURE public."Mnt_P_WorkOrderConsume"(p_id uuid, p_user_id uuid DEFAULT NULL)
2026-10-18 21:22:40 +00:00
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
2026-10-19 14:35:08 +00:00
SELECT "TenantId", "WorkOrderNo" INTO v_tenant, v_no FROM "Mnt_T_WorkOrder" WHERE "Id" = p_id;
2026-10-18 21:22:40 +00:00
2026-10-19 14:35:08 +00:00
IF EXISTS (SELECT 1 FROM "Mnt_T_WorkOrderMaterial"
2026-10-18 21:22:40 +00:00
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
2026-10-19 14:35:08 +00:00
SELECT DISTINCT "LocationId" FROM "Mnt_T_WorkOrderMaterial"
2026-10-18 21:22:40 +00:00
WHERE "WorkOrderId" = p_id AND "IsDeleted" = false AND "ConsumptionTransferId" IS NULL
LOOP
v_op_type := NULL;
SELECT ot."Id" INTO v_op_type
2026-10-19 14:35:08 +00:00
FROM "Stk_T_OperationType" ot
INNER JOIN "Stk_T_Location" l ON l."WarehouseId" = ot."WarehouseId"
2026-10-18 21:22:40 +00:00
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
2026-10-19 14:35:08 +00:00
FROM "Stk_T_Transfer"
2026-10-18 21:22:40 +00:00
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();
2026-10-19 14:35:08 +00:00
INSERT INTO "Stk_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "SourceLocationId",
2026-10-18 21:22:40 +00:00
"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
2026-10-19 14:35:08 +00:00
FROM "Stk_T_OperationType" ot
2026-10-18 21:22:40 +00:00
WHERE ot."Id" = v_op_type;
END IF;
2026-10-19 14:35:08 +00:00
-- 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.
2026-10-18 21:22:40 +00:00
FOR v_mat IN
SELECT m."Id", m."ProductId", m."Description", m."Quantity", m."UomId", m."LotNo",
p."TrackingMethod" IN ('Lot', 'Serial') AS "Tracked"
2026-10-19 14:35:08 +00:00
FROM "Mnt_T_WorkOrderMaterial" m
INNER JOIN "Stk_T_Product" p ON p."Id" = m."ProductId"
2026-10-18 21:22:40 +00:00
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();
2026-10-19 14:35:08 +00:00
INSERT INTO "Stk_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId",
2026-10-18 21:22:40 +00:00
"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
2026-10-19 14:35:08 +00:00
INSERT INTO "Stk_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
2026-10-18 21:22:40 +00:00
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;
2026-10-19 14:35:08 +00:00
UPDATE "Mnt_T_WorkOrderMaterial" SET "ConsumptionTransferId" = v_doc WHERE "Id" = v_mat."Id";
2026-10-18 21:22:40 +00:00
END LOOP;
2026-10-19 14:35:08 +00:00
CALL public."Stk_P_TransferAfterSave"(v_doc, p_user_id);
2026-10-18 21:22:40 +00:00
END LOOP;
END;
$$;