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

55 lines
4.2 KiB
MySQL
Raw Normal View History

-- Onaylanan talebin durumu satınalmada ilerledikçe iş akışının durum alanında devam eder: iptal olmayan bütün kalemleri
-- teslim edildiyse (teslim edilen ≥ istenen: iç transfer, Stoktan ya da alım Doğrula'sıyla) Tamamlandı; değilse kalemlerinden biri
2026-10-12 10:27:54 +00:00
-- iptal olmayan bir siparişteyse Satınalma Siparişi, gönderilmiş teklif talebindeyse Teklif Talebi Gönderildi,
-- taslak teklif talebindeyse Teklif Talebi; hiçbirinde değilse Onaylandı'ya döner (iade teslimi geri alırsa Tamamlandı da geri döner).
-- Akış "Onaylandı"da bittiği için bu değerler hiçbir onay düğümüyle eşleşmez ve akış butonları kapalı kalır. @DocId verilirse yalnız o
-- belgenin (teklifte bütün ihalenin; transferde satırlarının) kalemlerine bağlı talepler; boşsa onaylanmış bütün talepler yeniden hesaplanır.
2026-10-12 10:27:54 +00:00
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestSyncStatus]
@DocId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Group uniqueidentifier = (SELECT ISNULL(TenderGroupId, Id) FROM Prc_T_PurchaseRfq WHERE Id = @DocId);
IF @Group IS NULL
SELECT @Group = ISNULL(q.TenderGroupId, q.Id)
FROM Prc_T_PurchaseOrder o
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = o.PurchaseRfqId
WHERE o.Id = @DocId;
UPDATE m SET ApprovalStatus = s.Stage
FROM Prc_T_MaterialRequest m
CROSS APPLY (SELECT CASE
WHEN NOT EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i
WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0 AND i.LineStatus <> 'Cancelled'
AND i.DeliveredQuantity < i.Quantity)
AND EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i
WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0 AND i.LineStatus <> 'Cancelled') THEN N'Tamamlandı'
2026-10-12 10:27:54 +00:00
WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i
INNER JOIN Prc_T_PurchaseOrderLine ol ON ol.MaterialRequestItemId = i.Id AND ol.IsDeleted = 0
INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId AND o.IsDeleted = 0 AND o.Status <> 'Cancelled'
WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Satınalma Siparişi'
WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i
INNER JOIN Prc_T_PurchaseRfqLine rl ON rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId AND q.IsDeleted = 0 AND q.Status IN ('Sent', 'Purchase')
WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Teklif Talebi Gönderildi'
WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i
INNER JOIN Prc_T_PurchaseRfqLine rl ON rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId AND q.IsDeleted = 0 AND q.Status = 'Draft'
WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Teklif Talebi'
ELSE N'Onaylandı' END AS Stage) s
WHERE m.IsDeleted = 0
AND m.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi', N'Tamamlandı')
2026-10-12 10:27:54 +00:00
AND m.ApprovalStatus <> s.Stage
-- Silinen satır da kapsamda kalır: kalemi belgeden çıkarılan talep geri dönmelidir.
AND (@DocId IS NULL OR EXISTS (
SELECT 1 FROM Prc_T_MaterialRequestItem i
WHERE i.MaterialRequestId = m.Id
AND (EXISTS (SELECT 1 FROM Prc_T_PurchaseRfqLine rl
INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId
WHERE rl.MaterialRequestItemId = i.Id AND ISNULL(q.TenderGroupId, q.Id) = @Group)
OR EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine ol
WHERE ol.MaterialRequestItemId = i.Id AND ol.PurchaseOrderId = @DocId)
OR EXISTS (SELECT 1 FROM Inv_T_TransferLine tl
WHERE tl.MaterialRequestItemId = i.Id AND tl.TransferId = @DocId))));
2026-10-12 10:27:54 +00:00
END