59 lines
3.1 KiB
Transact-SQL
59 lines
3.1 KiB
Transact-SQL
-- 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
|