-- 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; $$;