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

53 lines
3.4 KiB
MySQL
Raw Normal View History

2026-10-12 21:43:05 +00:00
-- Transfer belgesi kaydı (ve iş akışı adımları) sonrası: tür, şube, depo ve boş konumlar operasyon türünden gelir (formda olmayan alımın
-- kaynağı ve teslimatın hedefi her zaman, iade belgesi hariç); teslimat politikası
-- yalnız teslimatta tutulur; iç transferin onaycısı kaynak konumun depo sorumlusudur (kullanıcı adı; iş akışı onaycıyı adla eşler),
-- sorumlusu olmayan konumdan transfer onay beklemez.
-- Numara, özet ve durum butonunun işlemi (PendingAction) buradan çalışır.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferAfterSave]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Act nvarchar(16) = (SELECT PendingAction FROM Inv_T_Transfer WHERE Id = @Id);
UPDATE t SET
OperationKind = ot.OperationKind,
BranchId = ot.BranchId,
WarehouseId = ot.WarehouseId,
SourceLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Receipt' OR t.SourceLocationId IS NULL)
THEN COALESCE(ot.SourceLocationId, t.SourceLocationId) ELSE t.SourceLocationId END,
DestinationLocationId = CASE WHEN t.ReturnOfId IS NULL AND (ot.OperationKind = 'Delivery' OR t.DestinationLocationId IS NULL)
THEN COALESCE(ot.DestinationLocationId, t.DestinationLocationId) ELSE t.DestinationLocationId END,
DeliveryPolicy = CASE WHEN ot.OperationKind = 'Delivery' THEN COALESCE(t.DeliveryPolicy, 'Direct') END
FROM Inv_T_Transfer t
INNER JOIN Inv_T_OperationType ot ON ot.Id = t.OperationTypeId
WHERE t.Id = @Id;
UPDATE t SET
SourceApproverUserNames = NULLIF(l.ResponsibleUserName, ''),
ApprovalStatus = CASE WHEN NULLIF(l.ResponsibleUserName, '') IS NULL AND t.ApprovalStatus IS NULL THEN N'Onay Gerekmez'
WHEN NULLIF(l.ResponsibleUserName, '') IS NOT NULL AND t.ApprovalStatus = N'Onay Gerekmez' THEN NULL
ELSE t.ApprovalStatus END
FROM Inv_T_Transfer t
LEFT JOIN Inv_T_Location l ON l.Id = t.SourceLocationId
WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft';
EXEC Inv_P_TransferNumber @Id;
EXEC Inv_P_TransferRecalc @Id;
-- Durum butonları işlemi PendingAction alanına yazıp ekranın güncelleme ucuyla kaydeder.
IF @Act IS NOT NULL
EXEC Inv_P_TransferSetStatus @Id, @Act, @UserId;
-- Kaynak depo onayı verilen taslak iç transfer kendiliğinden hazırlanır (kullanıcı kararı: onay → Hazırla tek adım).
-- Hazırla'nın şartları (satır, farklı iki iç konum) sağlanmıyorsa denenmez: onay kaydı bozulmaz, belge taslak kalır ve
-- Hazırla elle basılınca hatayı gösterir.
ELSE IF EXISTS (SELECT 1
FROM Inv_T_Transfer t
INNER JOIN Inv_T_Location s ON s.Id = t.SourceLocationId AND s.LocationType = 'Internal'
INNER JOIN Inv_T_Location d ON d.Id = t.DestinationLocationId AND d.LocationType = 'Internal'
WHERE t.Id = @Id AND t.OperationKind = 'InternalTransfer' AND t.Status = 'Draft' AND t.ApprovalStatus = N'Onaylandı'
AND s.Id <> d.Id
AND EXISTS (SELECT 1 FROM Inv_T_TransferLine l WHERE l.TransferId = t.Id AND l.IsDeleted = 0))
EXEC Inv_P_TransferSetStatus @Id, 'Confirm', @UserId;
END