sozsoft-platform/configs/seeds/sql/object/Mm_P_WorkOrderConsume.sql
2026-10-19 00:22:40 +03:00

89 lines
4.8 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.

CREATE OR ALTER PROCEDURE [dbo].[Mm_P_WorkOrderConsume]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
-- Departman onayı alan bakım iş emrinin malzemeleri için sarf çıkışı (Envanter › Teslimatlar): sarfı açılmamış satırlar
-- depo/konuma göre gruplanır, her konum için o konumun deposundaki Bakım Sarf Tüketimi operasyon türünde (numaratörü
-- '.MaintenanceConsumption' ile biter) taslak teslimat açılır; aynı emrin aynı konumdaki taslağı varsa satır ona eklenir.
-- Hedef konum ve tür operasyon türünden gelir; stoktan düşmesi için tür Teslimat ve hedefi dış konum olmalıdır. Satırda
-- seçilen lot/seri teslimat satırının lotu olarak yazılır; depo belgeyi Hazırla › Doğrula ile işler. Satır sarfa
-- bağlandıktan sonra değişmez; yordam tekrar çağrılırsa yalnız yeni satırları işler.
DECLARE @Tenant uniqueidentifier, @No nvarchar(32), @Loc uniqueidentifier, @OpType uniqueidentifier, @Doc uniqueidentifier;
DECLARE @Lines TABLE (MaterialId uniqueidentifier NOT NULL, LineId uniqueidentifier NOT NULL);
SELECT @Tenant = TenantId, @No = WorkOrderNo FROM Mm_T_WorkOrder WHERE Id = @Id;
IF EXISTS (SELECT 1 FROM Mm_T_WorkOrderMaterial
WHERE WorkOrderId = @Id AND IsDeleted = 0 AND ConsumptionTransferId IS NULL AND LocationId IS NULL)
THROW 50401, N'Depo/konumu seçilmemiş malzeme satırı var; sarf çıkışı açılamaz.', 1;
DECLARE loc_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT DISTINCT LocationId FROM Mm_T_WorkOrderMaterial
WHERE WorkOrderId = @Id AND IsDeleted = 0 AND ConsumptionTransferId IS NULL;
OPEN loc_cursor;
FETCH NEXT FROM loc_cursor INTO @Loc;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @OpType = NULL;
SELECT TOP 1 @OpType = ot.Id
FROM Inv_T_OperationType ot
INNER JOIN Inv_T_Location l ON l.WarehouseId = ot.WarehouseId
WHERE l.Id = @Loc AND ot.IsDeleted = 0 AND ot.IsActive = 1 AND ot.SequenceName LIKE '%.MaintenanceConsumption'
AND ((ot.TenantId IS NULL AND @Tenant IS NULL) OR ot.TenantId = @Tenant)
ORDER BY ot.Name;
IF @OpType IS NULL
THROW 50402, N'Depo/konumun deposunda aktif Bakım Sarf Tüketimi operasyon türü tanımlı değil.', 1;
SET @Doc = NULL;
SELECT TOP 1 @Doc = Id
FROM Inv_T_Transfer
WHERE OperationTypeId = @OpType AND SourceLocationId = @Loc AND SourceDocument = @No AND Status = 'Draft' AND IsDeleted = 0;
IF @Doc IS NULL
BEGIN
SET @Doc = NEWID();
INSERT INTO Inv_T_Transfer (Id, TenantId, BranchId, WarehouseId, OperationTypeId, OperationKind, SourceLocationId,
DestinationLocationId, SourceDocument, ResponsibleUserId, Status, CreationTime, CreatorId, IsDeleted)
SELECT @Doc, @Tenant, ot.BranchId, ot.WarehouseId, ot.Id, ot.OperationKind, @Loc, ot.DestinationLocationId,
@No, @UserId, 'Draft', GETUTCDATE(), @UserId, 0
FROM Inv_T_OperationType ot
WHERE ot.Id = @OpType;
END
DELETE FROM @Lines;
INSERT INTO @Lines (MaterialId, LineId)
SELECT Id, NEWID() FROM Mm_T_WorkOrderMaterial
WHERE WorkOrderId = @Id AND IsDeleted = 0 AND ConsumptionTransferId IS NULL AND LocationId = @Loc;
-- Lot/seri takipli üründe yapılacak miktar lot toplamıdır (Inv_P_TransferRecalc); lotu seçilmemiş satırın lotunu depo seçer.
INSERT INTO Inv_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId,
CreationTime, CreatorId, IsDeleted)
SELECT x.LineId, @Tenant, @Doc, m.ProductId, m.Description, m.Quantity,
CASE WHEN p.TrackingMethod IN ('Lot', 'Serial') THEN 0 ELSE m.Quantity END, m.UomId, GETUTCDATE(), @UserId, 0
FROM @Lines x
INNER JOIN Mm_T_WorkOrderMaterial m ON m.Id = x.MaterialId
INNER JOIN Inv_T_Product p ON p.Id = m.ProductId;
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @Tenant, x.LineId, m.LotNo, m.Quantity, GETUTCDATE(), @UserId, 0
FROM @Lines x
INNER JOIN Mm_T_WorkOrderMaterial m ON m.Id = x.MaterialId
INNER JOIN Inv_T_Product p ON p.Id = m.ProductId
WHERE m.LotNo IS NOT NULL AND p.TrackingMethod IN ('Lot', 'Serial');
UPDATE m SET ConsumptionTransferId = @Doc
FROM Mm_T_WorkOrderMaterial m
INNER JOIN @Lines x ON x.MaterialId = m.Id;
EXEC dbo.Inv_P_TransferAfterSave @Doc, @UserId;
FETCH NEXT FROM loc_cursor INTO @Loc;
END
CLOSE loc_cursor;
DEALLOCATE loc_cursor;
END
GO