-- 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].[Inv_P_TransferSetStatus] @Id uniqueidentifier, @Action nvarchar(16), @UserId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; DECLARE @Status nvarchar(16), @Kind nvarchar(32), @Approval nvarchar(50), @Src uniqueidentifier, @Dst uniqueidentifier, @New uniqueidentifier; SELECT @Status = Status, @Kind = OperationKind, @Approval = ApprovalStatus, @Src = SourceLocationId, @Dst = DestinationLocationId FROM Inv_T_Transfer WHERE Id = @Id; UPDATE Inv_T_Transfer SET PendingAction = NULL WHERE Id = @Id; -- İç transfer depo içinde taşımadır: iki uç da stok tutan iç konum ve birbirinden farklı olmalı (dış konuma giden mal stoktan düşer, hiçbir yere girmez). -- İ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 Inv_T_Transfer WHERE Id = @Id AND ReturnOfId IS NOT NULL) BEGIN IF @Src = @Dst THROW 50325, N'Kaynak ve hedef konum aynı olamaz.', 1; IF EXISTS (SELECT 1 FROM Inv_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 Inv_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; IF @Kind = 'InternalTransfer' AND ISNULL(@Approval, N'') NOT IN (N'Onaylandı', N'Onay Gerekmez') THROW 50304, N'Kaynak depo onayı tamamlanmadan iç transfer hazırlanamaz.', 1; EXEC Inv_P_TransferCheckAvailability @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 Inv_P_TransferCheckAvailability @Id; END ELSE IF @Action = 'Validate' BEGIN IF @Status <> 'Ready' THROW 50306, N'Yalnız hazır belge tamamlanabilir.', 1; EXEC Inv_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 Inv_T_Transfer SET Status = 'Cancelled' WHERE Id = @Id; END ELSE IF @Action = 'Return' BEGIN IF @Status <> 'Done' THROW 50308, N'Yalnız tamamlanmış belge iade edilebilir.', 1; EXEC Inv_P_TransferCopy @Id, 'Return', @UserId, @New OUTPUT; END END