-- 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 ALTER PROCEDURE [dbo].[Inv_P_TransferCopy] @SourceId uniqueidentifier, @Mode nvarchar(16), @UserId uniqueidentifier = NULL, @NewId uniqueidentifier OUTPUT AS BEGIN SET NOCOUNT ON; DECLARE @IsReturn bit = CASE WHEN @Mode = 'Return' THEN 1 ELSE 0 END; DECLARE @Map TABLE (OldId uniqueidentifier PRIMARY KEY, NewId uniqueidentifier NOT NULL); SET @NewId = NEWID(); 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 @NewId, t.TenantId, t.BranchId, t.WarehouseId, t.OperationTypeId, t.OperationKind, t.PartnerId, CASE WHEN @IsReturn = 1 THEN t.DestinationLocationId ELSE t.SourceLocationId END, CASE WHEN @IsReturn = 1 THEN t.SourceLocationId ELSE t.DestinationLocationId END, CASE WHEN @IsReturn = 1 THEN GETUTCDATE() ELSE t.ScheduledDate END, CASE WHEN @IsReturn = 1 THEN t.TransferNo ELSE t.SourceDocument END, t.PurchaseOrderId, CASE WHEN @IsReturn = 1 THEN NULL ELSE @SourceId END, CASE WHEN @IsReturn = 1 THEN @SourceId END, t.CarrierId, t.ResponsibleUserId, t.ProjectId, t.DeliveryPolicy, 'Draft', GETUTCDATE(), @UserId, 0 FROM Inv_T_Transfer t WHERE t.Id = @SourceId; INSERT INTO @Map (OldId, NewId) SELECT Id, NEWID() FROM Inv_T_TransferLine WHERE TransferId = @SourceId AND IsDeleted = 0 AND ((@IsReturn = 1 AND Quantity > 0) OR (@IsReturn = 0 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, @NewId, l.ProductId, l.Description, CASE WHEN @IsReturn = 1 THEN l.Quantity ELSE l.DemandQuantity - l.Quantity END, 0, l.UomId, l.PurchaseOrderLineId, l.MaterialRequestItemId, GETUTCDATE(), @UserId, 0 FROM Inv_T_TransferLine l INNER JOIN @Map m ON m.OldId = l.Id; IF @IsReturn = 1 INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted) SELECT NEWID(), z.TenantId, m.NewId, z.LotNo, z.Quantity, GETUTCDATE(), @UserId, 0 FROM Inv_T_TransferLineLot z INNER JOIN @Map m ON m.OldId = z.TransferLineId WHERE z.IsDeleted = 0; EXEC Inv_P_TransferNumber @NewId; IF @IsReturn = 0 EXEC Inv_P_TransferCheckAvailability @NewId; EXEC Inv_P_TransferRecalc @NewId; END