-- Transfer belgesi kaydı (ve iş akışı adımları) sonrası: tür, şube, depo ve boş konumlar operasyon türünden gelir (formda olmayan alımın -- kaynağı ve teslimatın hedefi her zaman, iade belgesi hariç); teslimat politikası -- yalnız teslimatta tutulur; iç transferin onaycısı kaynak konumun depo sorumlusudur (kullanıcı adı; iş akışı onaycıyı adla eşler), -- sorumlusu olmayan konumdan transfer onay beklemez. -- Numara, özet ve durum butonunun işlemi (PendingAction) buradan çalışır. CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferAfterSave] @Id uniqueidentifier, @UserId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; DECLARE @Act nvarchar(16) = (SELECT PendingAction FROM Inv_T_Transfer WHERE Id = @Id); UPDATE t SET OperationKind = ot.OperationKind, BranchId = ot.BranchId, WarehouseId = ot.WarehouseId, SourceLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Receipt' OR t.SourceLocationId IS NULL) THEN COALESCE(ot.SourceLocationId, t.SourceLocationId) ELSE t.SourceLocationId END, DestinationLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Delivery' OR t.DestinationLocationId IS NULL) THEN COALESCE(ot.DestinationLocationId, t.DestinationLocationId) ELSE t.DestinationLocationId END, DeliveryPolicy = CASE WHEN ot.OperationKind = 'Delivery' THEN COALESCE(t.DeliveryPolicy, 'Direct') END FROM Inv_T_Transfer t INNER JOIN Inv_T_OperationType ot ON ot.Id = t.OperationTypeId WHERE t.Id = @Id; UPDATE t SET SourceApproverUserNames = NULLIF(l.ResponsibleUserName, ''), ApprovalStatus = CASE WHEN NULLIF(l.ResponsibleUserName, '') IS NULL AND t.ApprovalStatus IS NULL THEN N'Onay Gerekmez' WHEN NULLIF(l.ResponsibleUserName, '') IS NOT NULL AND t.ApprovalStatus = N'Onay Gerekmez' THEN NULL ELSE t.ApprovalStatus END FROM Inv_T_Transfer t LEFT JOIN Inv_T_Location l ON l.Id = t.SourceLocationId WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft'; EXEC Inv_P_TransferNumber @Id; EXEC Inv_P_TransferRecalc @Id; -- Durum butonları işlemi PendingAction alanına yazıp ekranın güncelleme ucuyla kaydeder. IF @Act IS NOT NULL EXEC Inv_P_TransferSetStatus @Id, @Act, @UserId; -- Kaynak depo onayı verilen taslak iç transfer kendiliğinden hazırlanır (kullanıcı kararı: onay → Hazırla tek adım). -- Hazırla'nın şartları (satır, farklı iki iç konum) sağlanmıyorsa denenmez: onay kaydı bozulmaz, belge taslak kalır ve -- Hazırla elle basılınca hatayı gösterir. ELSE IF EXISTS (SELECT 1 FROM Inv_T_Transfer t INNER JOIN Inv_T_Location s ON s.Id = t.SourceLocationId AND s.LocationType = 'Internal' INNER JOIN Inv_T_Location d ON d.Id = t.DestinationLocationId AND d.LocationType = 'Internal' WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft' AND t.ApprovalStatus = N'Onaylandı' AND s.Id <> d.Id AND EXISTS (SELECT 1 FROM Inv_T_TransferLine l WHERE l.TransferId = t.Id AND l.IsDeleted = 0)) EXEC Inv_P_TransferSetStatus @Id, 'Confirm', @UserId; END