-- Transfer belgesinin durum butonları: Confirm (Hazırla, taslakta), Check (Hazırla, bekleyende), Validate (Tamamla), Cancel (İptal Et), Return (İade Et). CREATE OR ALTER PROCEDURE [dbo].[Stk_P_TransferSetStatus] @Id uniqueidentifier, @Action nvarchar(16), @UserId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; DECLARE @Status nvarchar(16), @Kind nvarchar(32), @Src uniqueidentifier, @Dst uniqueidentifier, @New uniqueidentifier; SELECT @Status = Status, @Kind = OperationKind, @Src = SourceLocationId, @Dst = DestinationLocationId FROM Stk_T_Transfer WHERE Id = @Id; UPDATE Stk_T_Transfer SET PendingAction = NULL WHERE Id = @Id; -- İç transfer depo içinde taşımadır: iki uç da stok tutan iç konum olmalı (dış konuma giden mal stoktan düşer, hiçbir yere girmez). -- Kaynak ve hedef aynı olabilir: stok zaten teslim konumundaki talebin teslimidir (Planlama'nın Stoktan kararı), Doğrula stoğa dokunmaz. -- İade belgesi muaftır: yanlışlıkla dış konuma yapılmış transfer İade Et ile geri alınabilmeli. IF @Kind = 'InternalTransfer' AND @Action IN ('Confirm', 'Check', 'Validate') AND NOT EXISTS (SELECT 1 FROM Stk_T_Transfer WHERE Id = @Id AND ReturnOfId IS NOT NULL) BEGIN IF EXISTS (SELECT 1 FROM Stk_T_Location WHERE Id IN (@Src, @Dst) AND LocationType <> 'Internal') THROW 50326, N'İç transferde kaynak ve hedef konum iç konum olmalıdır.', 1; END IF @Action = 'Confirm' BEGIN IF @Status <> 'Draft' THROW 50301, N'Yalnız taslak belge hazırlanabilir.', 1; IF NOT EXISTS (SELECT 1 FROM Stk_T_TransferLine WHERE TransferId = @Id AND IsDeleted = 0) THROW 50302, N'Ürün satırı olmayan belge hazırlanamaz.', 1; IF @Src IS NULL OR @Dst IS NULL THROW 50303, N'Kaynak ve hedef konum seçilmelidir.', 1; EXEC Stk_P_TransferCheckAvailability @Id; EXEC Stk_P_TransferRecalc @Id; END ELSE IF @Action = 'Check' BEGIN IF @Status NOT IN ('Waiting', 'Ready') THROW 50305, N'Stok kontrolü yalnız bekleyen ya da hazır belgede yapılır.', 1; EXEC Stk_P_TransferCheckAvailability @Id; EXEC Stk_P_TransferRecalc @Id; END ELSE IF @Action = 'Validate' BEGIN IF @Status <> 'Ready' THROW 50306, N'Yalnız hazır belge tamamlanabilir.', 1; EXEC Stk_P_TransferValidate @Id, @UserId; END ELSE IF @Action = 'Cancel' BEGIN IF @Status IN ('Done', 'Cancelled') THROW 50307, N'Tamamlanmış ya da iptal edilmiş belge iptal edilemez.', 1; UPDATE Stk_T_Transfer SET Status = 'Cancelled' WHERE Id = @Id; -- İptal edilen transferin payı talep kalemine geri döner. EXEC Prc_P_MaterialRequestItemSync @Id; END ELSE IF @Action = 'Return' BEGIN IF @Status <> 'Done' THROW 50308, N'Yalnız tamamlanmış belge iade edilebilir.', 1; IF EXISTS (SELECT 1 FROM Stk_T_Transfer WHERE Id = @Id AND ReturnOfId IS NOT NULL) THROW 50327, N'İade belgesi yeniden iade edilemez; asıl belgeden yeni bir hareket açın.', 1; EXEC Stk_P_TransferCopy @Id, 'Return', @UserId, @New OUTPUT; END END