89 lines
4.8 KiB
Transact-SQL
89 lines
4.8 KiB
Transact-SQL
CREATE OR ALTER PROCEDURE [dbo].[Mnt_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 Mnt_T_WorkOrder WHERE Id = @Id;
|
||
|
||
IF EXISTS (SELECT 1 FROM Mnt_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 Mnt_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 Stk_T_OperationType ot
|
||
INNER JOIN Stk_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 Stk_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 Stk_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 Stk_T_OperationType ot
|
||
WHERE ot.Id = @OpType;
|
||
END
|
||
|
||
DELETE FROM @Lines;
|
||
INSERT INTO @Lines (MaterialId, LineId)
|
||
SELECT Id, NEWID() FROM Mnt_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 (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,
|
||
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 Mnt_T_WorkOrderMaterial m ON m.Id = x.MaterialId
|
||
INNER JOIN Stk_T_Product p ON p.Id = m.ProductId;
|
||
|
||
INSERT INTO Stk_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 Mnt_T_WorkOrderMaterial m ON m.Id = x.MaterialId
|
||
INNER JOIN Stk_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 Mnt_T_WorkOrderMaterial m
|
||
INNER JOIN @Lines x ON x.MaterialId = m.Id;
|
||
|
||
EXEC dbo.Stk_P_TransferAfterSave @Doc, @UserId;
|
||
|
||
FETCH NEXT FROM loc_cursor INTO @Loc;
|
||
END
|
||
CLOSE loc_cursor;
|
||
DEALLOCATE loc_cursor;
|
||
END
|
||
GO
|