sozsoft-platform/configs/seeds/sql/object/Prc_P_MaterialRequestSyncStatus.sql
2026-10-19 17:35:08 +03:00

54 lines
4.2 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.

-- 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
-- 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.
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ı'
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ı')
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 Stk_T_TransferLine tl
WHERE tl.MaterialRequestItemId = i.Id AND tl.TransferId = @DocId))));
END