// MHL : Let op, als er ergens in deze functie iets mis gaat staat er een halve order in de database, zorg dat alle acties om een order aan te maken binnen een transactie vallen // gebruik hiervoor de transactionscope uit het package Actemium.Data (nuGet) private bool CreateOrModifyOrderInDatabase(Order order, OrderMessage orderMessage, List <BomItem> bomItems) { List <Order> existingOrders = new Orders().GetByCode(order.Code); TransactionScope transaction = new TransactionScope(); if (existingOrders.Count > 0) { OrderMessage existingOrderMessage = new OrderMessages().GetById(existingOrders[0].OrderMessageId); if (DateTime.Compare(existingOrderMessage.SentDate, orderMessage.SentDate) < 0) { if (existingOrders[0].StartDate is null) { using (transaction) { order.Id = existingOrders[0].Id; order.OrderMessageId = new OrderMessages().Add(orderMessage); List <BomItem> existingBomItems = new BomItems().GetByOrderId(order.Id); SetOrderIdToBomItems(bomItems, order.Id); DeleteExistingBomItems(existingBomItems); AddBomItems(bomItems); new Orders().Modify(order); transaction.Complete(); return(true); } } else { Trace.WriteError($"Order with code {order.Code} is already exists and started", Trace.GetMethodName(), CLASSNAME); } } else { // MHL : newer senddate? Trace.WriteError($"Order with code {order.Code} is already exists and has an newer senddate", Trace.GetMethodName(), CLASSNAME); } } else { // MHL : voor ieder business class is een singleton gemaakt die je kunt gebruiken bijv: OrderMessages.Instance Dat scheelt de hele tijd classes initialiseren // dit geldt ook al zo in de GUI maar toen is het me niet opgevallen. Onderstaande is overigens ook niet fout. using (transaction) { order.OrderMessageId = new OrderMessages().Add(orderMessage); order.Id = new Orders().Add(order); SetOrderIdToBomItems(bomItems, order.Id); AddBomItems(bomItems); transaction.Complete(); return(true); } } return(false); }
public static BomItemView Create(BomItems bomItems) { return(Projection.Compile().Invoke(bomItems)); }
private bool CheckMaterialInBomItems(Material material) { List <BomItem> items = new BomItems().GetByMaterialId(material.Id); return(items.Count != 0); }
public async Task <Unit> Handle(UpdatedBomDto request, CancellationToken cancellationToken) { var item = await _database.Item.AsNoTracking() .FirstOrDefaultAsync(i => i.Id == request.ItemId); var updatedBom = await _database.Bom .Include(b => b.BomItems) .FirstOrDefaultAsync(b => b.Id == request.Id); if (updatedBom == null) { throw new NotFoundException(nameof(Bom), request.Id); } if (item == null) { throw new NotFoundException(nameof(Item), request.ItemId); } updatedBom.ItemId = request.ItemId; updatedBom.Active = request.Active; updatedBom.Name = request.Name; if (request.BomItems.Count < 1) { throw new BelowRequiredMinimumItemException(nameof(BomItems), 1, nameof(Item)); } updatedBom.BomItems = new List <BomItems> (); foreach (var data in request.BomItems) { BomItems bo = new BomItems(); if (data.Id != 0) { bo = await _database.BomItems.FirstOrDefaultAsync(b => b.Id == data.Id); if (bo == null) { throw new NotFoundException(nameof(BomItems), data.Id); } } else { var bomItem = await _database.Item.AsNoTracking() .FirstOrDefaultAsync(i => i.Id == data.ItemId); if (bomItem == null) { throw new NotFoundException(nameof(Item), data.ItemId); } } var uomId = await _database.UnitsOfMeasurment.AsNoTracking() .FirstOrDefaultAsync(i => i.Id == data.UomId); if (uomId == null) { throw new NotFoundException(nameof(UnitOfMeasurment), data.UomId); } bo.ItemId = data.ItemId; bo.Quantity = data.Quantity; bo.UomId = data.UomId; bo.Note = data.Note; bo.BomId = request.Id; updatedBom.BomItems.Add(bo); } _database.Bom.Update(updatedBom); await _database.SaveAsync(); return(Unit.Value); }