86 lines
4.8 KiB
MySQL
86 lines
4.8 KiB
MySQL
|
|
-- 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;
|
|||
|
|
$$;
|