sozsoft-platform/configs/seeds/sql/object/Inv_P_TransferSetStatus.sql

60 lines
3.1 KiB
MySQL
Raw Normal View History

2026-10-12 21:43:05 +00:00
-- 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;
2026-10-12 21:43:05 +00:00
SELECT @Status = Status, @Kind = OperationKind, @Src = SourceLocationId, @Dst = DestinationLocationId
2026-10-12 21:43:05 +00:00
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.
2026-10-12 21:43:05 +00:00
-- İ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;
2026-10-12 21:43:05 +00:00
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;
2026-10-12 21:43:05 +00:00
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;
2026-10-14 09:07:11 +00:00
-- İptal edilen transferin payı talep kalemine geri döner.
EXEC Prc_P_MaterialRequestItemSync @Id;
2026-10-12 21:43:05 +00:00
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;
2026-10-12 21:43:05 +00:00
EXEC Inv_P_TransferCopy @Id, 'Return', @UserId, @New OUTPUT;
END
END