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