40 lines
2.4 KiB
MySQL
40 lines
2.4 KiB
MySQL
|
|
-- Otomatik Ata: stoktan çıkan satırın lot dağılımını kaynak konumun stoğundan ilk giren ilk çıkar (InDate) sırasıyla yeniden kurar.
|
|||
|
|
-- Stok yetmezse karşılanabilen kadar atanır; eksik Tamamla'da bildirilir.
|
|||
|
|
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineLotAssign"(p_id uuid, p_user_id uuid DEFAULT NULL)
|
|||
|
|
LANGUAGE plpgsql AS $$
|
|||
|
|
DECLARE v_tenant uuid; v_method varchar(16); v_src uuid; v_src_internal boolean; v_product uuid;
|
|||
|
|
v_line_uom varchar(64); v_product_uom varchar(64); v_need numeric(18, 4);
|
|||
|
|
BEGIN
|
|||
|
|
SELECT l."TenantId", CASE WHEN p."TrackInventory" THEN p."TrackingMethod" END, t."SourceLocationId",
|
|||
|
|
COALESCE(src."LocationType" = 'Internal', false), l."ProductId", l."UomId", p."UomId",
|
|||
|
|
public."Inv_F_UomConvert"(CASE WHEN l."Quantity" > 0 THEN l."Quantity" ELSE l."DemandQuantity" END, l."UomId", p."UomId")
|
|||
|
|
INTO v_tenant, v_method, v_src, v_src_internal, v_product, v_line_uom, v_product_uom, v_need
|
|||
|
|
FROM "Inv_T_TransferLine" l
|
|||
|
|
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
|
|||
|
|
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
|
|||
|
|
LEFT JOIN "Inv_T_Location" src ON src."Id" = t."SourceLocationId"
|
|||
|
|
WHERE l."Id" = p_id;
|
|||
|
|
|
|||
|
|
IF COALESCE(v_method, '') NOT IN ('Lot', 'Serial') THEN
|
|||
|
|
RAISE EXCEPTION 'Ürün lot/seri numarasıyla takip edilmiyor.' USING ERRCODE = 'P0001', DETAIL = '50314';
|
|||
|
|
END IF;
|
|||
|
|
IF NOT COALESCE(v_src_internal, false) THEN
|
|||
|
|
RAISE EXCEPTION 'Otomatik atama yalnız stoktan çıkan satırda yapılır.' USING ERRCODE = 'P0001', DETAIL = '50317';
|
|||
|
|
END IF;
|
|||
|
|
|
|||
|
|
UPDATE "Inv_T_TransferLineLot" SET "IsDeleted" = true, "DeletionTime" = NOW() AT TIME ZONE 'UTC', "DeleterId" = p_user_id
|
|||
|
|
WHERE "TransferLineId" = p_id AND "IsDeleted" = false;
|
|||
|
|
|
|||
|
|
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
|
|||
|
|
SELECT gen_random_uuid(), v_tenant, p_id, s."LotNo",
|
|||
|
|
public."Inv_F_UomConvert"(LEAST(s."Quantity", v_need - s."Before"), v_product_uom, v_line_uom),
|
|||
|
|
NOW() AT TIME ZONE 'UTC', p_user_id, false
|
|||
|
|
FROM (SELECT "LotNo", "Quantity",
|
|||
|
|
SUM("Quantity") OVER (ORDER BY "InDate", "LotNo" ROWS UNBOUNDED PRECEDING) - "Quantity" AS "Before"
|
|||
|
|
FROM "Inv_T_Stock"
|
|||
|
|
WHERE "LocationId" = v_src AND "ProductId" = v_product AND "LotNo" <> '' AND "Quantity" > 0
|
|||
|
|
AND "TenantId" IS NOT DISTINCT FROM v_tenant) s
|
|||
|
|
WHERE s."Before" < v_need;
|
|||
|
|
END;
|
|||
|
|
$$;
|