sozsoft-platform/configs/seeds/sql/object/Prc_P_MaterialRequestPlanLineSave.sql
2026-10-14 12:07:11 +03:00

103 lines
5.1 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.

-- Planla diyaloğunun İç Transfer (App.Prc.MaterialRequestPlanSource) ve Satınalma (App.Prc.MaterialRequestPlanVendor) ızgaralarının satır kaydı:
-- girilen Plan Miktarı kalemin taslak planına (Prc_T_MaterialRequestPlanLine) yazılır, 0 ya da boş satırı plandan çıkarır. @Id ızgara
-- satırının anahtarıdır: kalem + ':' + hedef (Transfer'de kaynak konum, Purchase'da tedarikçi). Kaynak talebin teslim konumuysa karar
-- Stock'tur (transfer açılmaz, stoktan karşılanır). Belge açılmaz; onay
-- Prc_P_MaterialRequestPlanConfirm'dedir. Taslak toplamı planlanacak kalanı, konumun satırı serbest stoğu aşamaz. Batch kaydı satırları
-- eşzamanlı gönderdiği için kalem kilitlenir. Eksi miktar "alabileceği en fazla"dır (Seçilenleri Planla): kalanın diğer taslak satırlardan
-- arta kalanı, konumda serbest stokla sınırlı; alınacak bir şey yoksa satır değişmez.
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlanLineSave]
@Id nvarchar(80),
@PlanMethod nvarchar(16),
@PlanQuantity decimal(18, 4),
@TenantId uniqueidentifier,
@LastModifierId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ItemId uniqueidentifier = TRY_CAST(LEFT(@Id, 36) AS uniqueidentifier),
@Target uniqueidentifier = TRY_CAST(SUBSTRING(@Id, 38, 36) AS uniqueidentifier),
@UomId nvarchar(64), @Location uniqueidentifier, @Remaining decimal(18, 4), @Other decimal(18, 4), @Free decimal(18, 4), @Line uniqueidentifier,
@Qty decimal(18, 4) = ISNULL(@PlanQuantity, 0), @Msg nvarchar(400);
BEGIN TRANSACTION;
SELECT @UomId = i.UomId, @Location = r.LocationId
FROM Prc_T_MaterialRequestItem i WITH (UPDLOCK, HOLDLOCK)
INNER JOIN Prc_T_MaterialRequest r ON r.Id = i.MaterialRequestId
WHERE i.Id = @ItemId AND i.IsDeleted = 0 AND i.LineStatus = 'Waiting' AND r.IsDeleted = 0
AND (i.TenantId = @TenantId OR (i.TenantId IS NULL AND @TenantId IS NULL))
AND r.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi');
IF @UomId IS NULL
THROW 50191, N'Kalem planlanamaz: talep onaylı değil ya da kalem kapalı.', 1;
IF @PlanMethod = 'Transfer' AND @Target = @Location
SET @PlanMethod = 'Stock';
SELECT @Line = Id
FROM Prc_T_MaterialRequestPlanLine
WHERE MaterialRequestItemId = @ItemId AND PlanMethod = @PlanMethod AND IsDeleted = 0
AND @Target = CASE WHEN @PlanMethod = 'Purchase' THEN SupplierId ELSE SourceLocationId END;
IF @Qty = 0
BEGIN
DELETE FROM Prc_T_MaterialRequestPlanLine WHERE Id = @Line;
COMMIT TRANSACTION;
RETURN;
END
SELECT @Remaining = RemainingQuantity FROM Prc_V_MaterialRequestItemPlan WHERE Id = @ItemId;
SELECT @Other = ISNULL(SUM(Quantity), 0)
FROM Prc_T_MaterialRequestPlanLine
WHERE MaterialRequestItemId = @ItemId AND IsDeleted = 0 AND (@Line IS NULL OR Id <> @Line);
IF @Qty < 0
BEGIN
SET @Qty = @Remaining - @Other;
IF @PlanMethod IN ('Transfer', 'Stock')
BEGIN
SELECT @Free = FreeQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ItemId AND LocationId = @Target;
IF @Free < @Qty SET @Qty = @Free;
END
IF ISNULL(@Qty, 0) <= 0
BEGIN
COMMIT TRANSACTION;
RETURN;
END
END
IF @Other + @Qty > @Remaining
BEGIN
SET @Msg = CONCAT(N'Taslak plan toplamı planlanacak kalanı aşamaz (kalan: ', FORMAT(@Remaining - @Other, '0.####'), N' ', @UomId, N').');
THROW 50200, @Msg, 1;
END
IF @PlanMethod IN ('Transfer', 'Stock')
BEGIN
SELECT @Free = FreeQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ItemId AND LocationId = @Target;
IF @Free IS NULL
THROW 50197, N'Kaynak konum ürünün stoğu olan bir iç konum olmalıdır.', 1;
IF @Qty > @Free
BEGIN
SET @Msg = CONCAT(N'Kaynak konumda yeterli serbest stok yok (serbest: ', FORMAT(CASE WHEN @Free > 0 THEN @Free ELSE 0 END, '0.####'), N' ', @UomId, N').');
THROW 50198, @Msg, 1;
END
END
ELSE IF @PlanMethod = 'Purchase'
BEGIN
IF NOT EXISTS (SELECT 1 FROM Prc_V_MaterialRequestPlanVendor WHERE BaseId = @ItemId AND ContactId = @Target)
THROW 50194, N'Satınalma kararında aktif bir tedarikçi seçilmelidir.', 1;
END
ELSE
THROW 50192, N'Karar Satınalma ya da İç Transfer olmalıdır.', 1;
IF @Line IS NOT NULL
UPDATE Prc_T_MaterialRequestPlanLine
SET Quantity = @Qty, LastModificationTime = GETUTCDATE(), LastModifierId = @LastModifierId
WHERE Id = @Line;
ELSE
INSERT INTO Prc_T_MaterialRequestPlanLine (Id, TenantId, MaterialRequestItemId, PlanMethod, SupplierId, SourceLocationId, Quantity,
CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @TenantId, @ItemId, @PlanMethod, CASE WHEN @PlanMethod = 'Purchase' THEN @Target END,
CASE WHEN @PlanMethod <> 'Purchase' THEN @Target END, @Qty, GETUTCDATE(), @LastModifierId, 0);
COMMIT TRANSACTION;
END
GO