2026-10-19 14:35:08 +00:00
|
|
|
|
CREATE OR ALTER PROCEDURE [dbo].[Mnt_P_WorkOrderConsume]
|
2026-10-18 21:22:40 +00:00
|
|
|
|
@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);
|
|
|
|
|
|
|
2026-10-19 14:35:08 +00:00
|
|
|
|
SELECT @Tenant = TenantId, @No = WorkOrderNo FROM Mnt_T_WorkOrder WHERE Id = @Id;
|
2026-10-18 21:22:40 +00:00
|
|
|
|
|
2026-10-19 14:35:08 +00:00
|
|
|
|
IF EXISTS (SELECT 1 FROM Mnt_T_WorkOrderMaterial
|
2026-10-18 21:22:40 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
SELECT DISTINCT LocationId FROM Mnt_T_WorkOrderMaterial
|
2026-10-18 21:22:40 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
FROM Stk_T_OperationType ot
|
|
|
|
|
|
INNER JOIN Stk_T_Location l ON l.WarehouseId = ot.WarehouseId
|
2026-10-18 21:22:40 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
FROM Stk_T_Transfer
|
2026-10-18 21:22:40 +00:00
|
|
|
|
WHERE OperationTypeId = @OpType AND SourceLocationId = @Loc AND SourceDocument = @No AND Status = 'Draft' AND IsDeleted = 0;
|
|
|
|
|
|
|
|
|
|
|
|
IF @Doc IS NULL
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
SET @Doc = NEWID();
|
2026-10-19 14:35:08 +00:00
|
|
|
|
INSERT INTO Stk_T_Transfer (Id, TenantId, BranchId, WarehouseId, OperationTypeId, OperationKind, SourceLocationId,
|
2026-10-18 21:22:40 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
FROM Stk_T_OperationType ot
|
2026-10-18 21:22:40 +00:00
|
|
|
|
WHERE ot.Id = @OpType;
|
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
|
|
DELETE FROM @Lines;
|
|
|
|
|
|
INSERT INTO @Lines (MaterialId, LineId)
|
2026-10-19 14:35:08 +00:00
|
|
|
|
SELECT Id, NEWID() FROM Mnt_T_WorkOrderMaterial
|
2026-10-18 21:22:40 +00:00
|
|
|
|
WHERE WorkOrderId = @Id AND IsDeleted = 0 AND ConsumptionTransferId IS NULL AND LocationId = @Loc;
|
|
|
|
|
|
|
2026-10-19 14:35:08 +00:00
|
|
|
|
-- Lot/seri takipli üründe yapılacak miktar lot toplamıdır (Stk_P_TransferRecalc); lotu seçilmemiş satırın lotunu depo seçer.
|
|
|
|
|
|
INSERT INTO Stk_T_TransferLine (Id, TenantId, TransferId, ProductId, Description, DemandQuantity, Quantity, UomId,
|
2026-10-18 21:22:40 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
INNER JOIN Mnt_T_WorkOrderMaterial m ON m.Id = x.MaterialId
|
|
|
|
|
|
INNER JOIN Stk_T_Product p ON p.Id = m.ProductId;
|
2026-10-18 21:22:40 +00:00
|
|
|
|
|
2026-10-19 14:35:08 +00:00
|
|
|
|
INSERT INTO Stk_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
|
2026-10-18 21:22:40 +00:00
|
|
|
|
SELECT NEWID(), @Tenant, x.LineId, m.LotNo, m.Quantity, GETUTCDATE(), @UserId, 0
|
|
|
|
|
|
FROM @Lines x
|
2026-10-19 14:35:08 +00:00
|
|
|
|
INNER JOIN Mnt_T_WorkOrderMaterial m ON m.Id = x.MaterialId
|
|
|
|
|
|
INNER JOIN Stk_T_Product p ON p.Id = m.ProductId
|
2026-10-18 21:22:40 +00:00
|
|
|
|
WHERE m.LotNo IS NOT NULL AND p.TrackingMethod IN ('Lot', 'Serial');
|
|
|
|
|
|
|
|
|
|
|
|
UPDATE m SET ConsumptionTransferId = @Doc
|
2026-10-19 14:35:08 +00:00
|
|
|
|
FROM Mnt_T_WorkOrderMaterial m
|
2026-10-18 21:22:40 +00:00
|
|
|
|
INNER JOIN @Lines x ON x.MaterialId = m.Id;
|
|
|
|
|
|
|
2026-10-19 14:35:08 +00:00
|
|
|
|
EXEC dbo.Stk_P_TransferAfterSave @Doc, @UserId;
|
2026-10-18 21:22:40 +00:00
|
|
|
|
|
|
|
|
|
|
FETCH NEXT FROM loc_cursor INTO @Loc;
|
|
|
|
|
|
END
|
|
|
|
|
|
CLOSE loc_cursor;
|
|
|
|
|
|
DEALLOCATE loc_cursor;
|
|
|
|
|
|
END
|
|
|
|
|
|
GO
|