53 lines
3.2 KiB
PL/PgSQL
53 lines
3.2 KiB
PL/PgSQL
-- Belgeden yeni belge açar. Backorder: talepten az yapılan satırların kalanı, aynı konumlarla; stok kontrolüyle Hazır/Bekleyen olur.
|
||
-- Return (İade): yapılan miktarlar lotlarıyla, kaynak ve hedef yer değiştirerek Taslak açılır. İkisi de bağları taşır.
|
||
CREATE OR REPLACE PROCEDURE public."Inv_P_TransferCopy"(p_source_id uuid, p_mode varchar, p_user_id uuid, INOUT p_new_id uuid DEFAULT NULL)
|
||
LANGUAGE plpgsql AS $$
|
||
DECLARE v_is_return boolean := p_mode = 'Return';
|
||
BEGIN
|
||
p_new_id := gen_random_uuid();
|
||
|
||
INSERT INTO "Inv_T_Transfer" ("Id", "TenantId", "BranchId", "WarehouseId", "OperationTypeId", "OperationKind", "PartnerId", "SourceLocationId", "DestinationLocationId",
|
||
"ScheduledDate", "SourceDocument", "PurchaseOrderId", "BackorderOfId", "ReturnOfId", "CarrierId", "ResponsibleUserId", "ProjectId", "DeliveryPolicy",
|
||
"Status", "CreationTime", "CreatorId", "IsDeleted")
|
||
SELECT p_new_id, t."TenantId", t."BranchId", t."WarehouseId", t."OperationTypeId", t."OperationKind", t."PartnerId",
|
||
CASE WHEN v_is_return THEN t."DestinationLocationId" ELSE t."SourceLocationId" END,
|
||
CASE WHEN v_is_return THEN t."SourceLocationId" ELSE t."DestinationLocationId" END,
|
||
CASE WHEN v_is_return THEN NOW() AT TIME ZONE 'UTC' ELSE t."ScheduledDate" END,
|
||
CASE WHEN v_is_return THEN t."TransferNo" ELSE t."SourceDocument" END, t."PurchaseOrderId",
|
||
CASE WHEN v_is_return THEN NULL ELSE p_source_id END, CASE WHEN v_is_return THEN p_source_id END,
|
||
t."CarrierId", t."ResponsibleUserId", t."ProjectId", t."DeliveryPolicy",
|
||
'Draft', NOW() AT TIME ZONE 'UTC', p_user_id, false
|
||
FROM "Inv_T_Transfer" t
|
||
WHERE t."Id" = p_source_id;
|
||
|
||
DROP TABLE IF EXISTS tmp_inv_map;
|
||
CREATE TEMP TABLE tmp_inv_map AS
|
||
SELECT "Id" AS "OldId", gen_random_uuid() AS "NewId"
|
||
FROM "Inv_T_TransferLine"
|
||
WHERE "TransferId" = p_source_id AND "IsDeleted" = false
|
||
AND ((v_is_return AND "Quantity" > 0) OR (NOT v_is_return AND "Quantity" < "DemandQuantity"));
|
||
|
||
INSERT INTO "Inv_T_TransferLine" ("Id", "TenantId", "TransferId", "ProductId", "Description", "DemandQuantity", "Quantity", "UomId",
|
||
"PurchaseOrderLineId", "MaterialRequestItemId", "CreationTime", "CreatorId", "IsDeleted")
|
||
SELECT m."NewId", l."TenantId", p_new_id, l."ProductId", l."Description",
|
||
CASE WHEN v_is_return THEN l."Quantity" ELSE l."DemandQuantity" - l."Quantity" END, 0, l."UomId",
|
||
l."PurchaseOrderLineId", l."MaterialRequestItemId", NOW() AT TIME ZONE 'UTC', p_user_id, false
|
||
FROM "Inv_T_TransferLine" l
|
||
INNER JOIN tmp_inv_map m ON m."OldId" = l."Id";
|
||
|
||
IF v_is_return THEN
|
||
INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
|
||
SELECT gen_random_uuid(), z."TenantId", m."NewId", z."LotNo", z."Quantity", NOW() AT TIME ZONE 'UTC', p_user_id, false
|
||
FROM "Inv_T_TransferLineLot" z
|
||
INNER JOIN tmp_inv_map m ON m."OldId" = z."TransferLineId"
|
||
WHERE z."IsDeleted" = false;
|
||
END IF;
|
||
DROP TABLE tmp_inv_map;
|
||
|
||
CALL public."Inv_P_TransferNumber"(p_new_id);
|
||
IF NOT v_is_return THEN
|
||
CALL public."Inv_P_TransferCheckAvailability"(p_new_id);
|
||
END IF;
|
||
CALL public."Inv_P_TransferRecalc"(p_new_id);
|
||
END;
|
||
$$;
|