54 lines
4.2 KiB
Transact-SQL
54 lines
4.2 KiB
Transact-SQL
-- 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
|