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

52 lines
2.9 KiB
MySQL
Raw Normal View History

2026-10-12 21:43:05 +00:00
-- Yapılacak miktarı doldurur ve belgeyi Hazır ya da Bekleyen yapar. Rezervasyon yoktur; Tamamla stoğu yeniden kontrol eder.
-- Kaynak konum stok tutmuyorsa (dış konum) yapılacak miktar talep kadardır. İç konumdan çıkışta satırlar ürün bazında sırayla
-- karşılanır; tümü karşılanırsa Hazır olur. Teslimatta "Mümkün olduğunca kısa sürede" politikası kısmi karşılamada da Hazır yapar.
2026-10-19 14:35:08 +00:00
CREATE OR REPLACE PROCEDURE public."Stk_P_TransferCheckAvailability"(p_id uuid)
2026-10-12 21:43:05 +00:00
LANGUAGE plpgsql AS $$
DECLARE v_src uuid; v_kind varchar(32); v_policy varchar(16); v_tenant uuid; v_all boolean; v_any boolean;
BEGIN
SELECT "SourceLocationId", "OperationKind", "DeliveryPolicy", "TenantId" INTO v_src, v_kind, v_policy, v_tenant
2026-10-19 14:35:08 +00:00
FROM "Stk_T_Transfer" WHERE "Id" = p_id;
2026-10-12 21:43:05 +00:00
2026-10-19 14:35:08 +00:00
IF NOT EXISTS (SELECT 1 FROM "Stk_T_Location" WHERE "Id" = v_src AND "LocationType" = 'Internal') THEN
UPDATE "Stk_T_TransferLine" SET "Quantity" = "DemandQuantity" WHERE "TransferId" = p_id AND "IsDeleted" = false AND "Quantity" = 0;
UPDATE "Stk_T_Transfer" SET "Status" = 'Ready' WHERE "Id" = p_id;
2026-10-12 21:43:05 +00:00
RETURN;
END IF;
DROP TABLE IF EXISTS tmp_inv_fill;
CREATE TEMP TABLE tmp_inv_fill AS
WITH d AS (
SELECT l."Id", l."ProductId", l."UomId", p."UomId" AS "ProductUomId", p."TrackInventory", l."DemandQuantity",
2026-10-19 14:35:08 +00:00
public."Stk_F_UomConvert"(l."DemandQuantity", l."UomId", p."UomId") AS "DemandBase",
SUM(public."Stk_F_UomConvert"(l."DemandQuantity", l."UomId", p."UomId"))
2026-10-12 21:43:05 +00:00
OVER (PARTITION BY l."ProductId" ORDER BY l."CreationTime", l."Id" ROWS UNBOUNDED PRECEDING) AS "CumBase"
2026-10-19 14:35:08 +00:00
FROM "Stk_T_TransferLine" l
INNER JOIN "Stk_T_Product" p ON p."Id" = l."ProductId"
2026-10-12 21:43:05 +00:00
WHERE l."TransferId" = p_id AND l."IsDeleted" = false),
s AS (
SELECT "ProductId", SUM("Quantity") AS "OnHand"
2026-10-19 14:35:08 +00:00
FROM "Stk_T_Stock"
2026-10-12 21:43:05 +00:00
WHERE "LocationId" = v_src AND "TenantId" IS NOT DISTINCT FROM v_tenant
GROUP BY "ProductId")
SELECT d."Id",
CASE WHEN d."TrackInventory" = false OR COALESCE(s."OnHand", 0) >= d."CumBase" THEN d."DemandQuantity"
WHEN COALESCE(s."OnHand", 0) > d."CumBase" - d."DemandBase"
2026-10-19 14:35:08 +00:00
THEN public."Stk_F_UomConvert"(COALESCE(s."OnHand", 0) - (d."CumBase" - d."DemandBase"), d."ProductUomId", d."UomId")
2026-10-12 21:43:05 +00:00
ELSE 0 END AS "Fill",
d."DemandQuantity" AS "Demand"
FROM d
LEFT JOIN s ON s."ProductId" = d."ProductId";
2026-10-19 14:35:08 +00:00
UPDATE "Stk_T_TransferLine" l SET "Quantity" = f."Fill" FROM tmp_inv_fill f WHERE f."Id" = l."Id";
2026-10-12 21:43:05 +00:00
v_all := NOT EXISTS (SELECT 1 FROM tmp_inv_fill WHERE "Fill" < "Demand");
v_any := EXISTS (SELECT 1 FROM tmp_inv_fill WHERE "Fill" > 0);
DROP TABLE tmp_inv_fill;
2026-10-19 14:35:08 +00:00
UPDATE "Stk_T_Transfer"
2026-10-12 21:43:05 +00:00
SET "Status" = CASE WHEN v_all OR (v_kind = 'Delivery' AND COALESCE(v_policy, 'Direct') = 'Direct' AND v_any) THEN 'Ready' ELSE 'Waiting' END
WHERE "Id" = p_id;
END;
$$;