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

47 lines
3.3 KiB
MySQL
Raw Normal View History

2026-10-12 10:27:54 +00:00
-- Onaylanan talebin durumu satınalmada ilerledikçe iş akışının durum alanında devam eder: 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. 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) 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 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')
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))));
END