sozsoft-platform/configs/seeds/sql/object/Mnt_P_WorkOrderConsume.sql

90 lines
4.8 KiB
MySQL
Raw Normal View History

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