sozsoft-platform/configs/seeds/sql/object/Inv_P_TransferSetStatus.sql
2026-10-14 22:26:03 +03:00

59 lines
3.1 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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), @Src uniqueidentifier, @Dst uniqueidentifier, @New uniqueidentifier;
SELECT @Status = Status, @Kind = OperationKind, @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 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 Inv_T_Transfer WHERE Id = @Id AND ReturnOfId IS NOT NULL)
BEGIN
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;
EXEC Inv_P_TransferCheckAvailability @Id;
EXEC Inv_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 Inv_P_TransferCheckAvailability @Id;
EXEC Inv_P_TransferRecalc @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;
-- İ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 Inv_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 Inv_P_TransferCopy @Id, 'Return', @UserId, @New OUTPUT;
END
END