internal FStockReservation MakeReservationFor(FArticle request) { var inStock = false; var quantity = 0; var time = request.DueTime; var withdraw = _stockManager.StockExchanges .Where(predicate: x => x.RequiredOnTime <= request.DueTime && x.State != State.Finished && x.ExchangeType == ExchangeType.Withdrawal) .Sum(selector: x => x.Quantity); // Element is NOT in Stock // Create Purchase if Required. var purchaseOpen = _stockManager.StockExchanges .Any(predicate: x => x.State != State.Finished && x.ExchangeType == ExchangeType.Insert); var required = ((_stockManager.Current - withdraw - request.Quantity)); if (required < _stockManager.Stock.Min && _stockManager.Article.ToPurchase && !purchaseOpen) { var timeToDelivery = CreatePurchase(stockElement: _stockManager.Stock); time = Agent.CurrentTime + timeToDelivery; purchaseOpen = true; Agent.DebugMessage(msg: $"Created purchase for {_stockManager.Article.Name}"); } // Create Reservation Item if (required > 0) { inStock = true; quantity = request.Quantity; //TODO Check Correctness _stockManager.GetProviderGuidsFor(new Quantity(request.Quantity)); } var stockReservation = new FStockReservation(quantity: quantity, isPurchased: purchaseOpen, isInStock: inStock, dueTime: time, trackingId: request.StockExchangeId); //Create Stockexchange for Reservation _stockManager.StockExchanges.Add( item: new T_StockExchange { TrackingGuid = request.StockExchangeId, StockId = _stockManager.Id, ExchangeType = ExchangeType.Withdrawal, Quantity = request.Quantity, Time = (int)(Agent.CurrentTime), State = stockReservation.IsInStock ? State.Finished : State.Created, RequiredOnTime = (int)request.DueTime, } ); return(stockReservation); }
internal void ResponseFromStock(FStockReservation reservation) { _fArticle = _fArticle.UpdateStockExchangeId(i: reservation.TrackingId); _quantityToProduce = _fArticle.Quantity - reservation.Quantity; Agent.DebugMessage(msg: reservation.Quantity + " " + _fArticle.Article.Name + " are reserved and " + _quantityToProduce + " " + _fArticle.Article.Name + " need to be produced!", CustomLogger.STOCK, LogLevel.Warn); if (reservation.IsInStock && !_fArticle.Article.ToBuild) { Agent.DebugMessage(msg: $"Start forward scheduling for article: {_fArticle.Article.Name} {_fArticle.Key} at: {Agent.CurrentTime}", CustomLogger.SCHEDULING, LogLevel.Warn); PushForwardTimeToParent(earliestStartForForwardScheduling: Agent.CurrentTime); } if (reservation.IsInStock && IsNot(_fArticle.IsHeadDemand)) { ProvideRequest(new FArticleProvider(articleKey: _fArticle.Key , articleName: _fArticle.Article.Name , stockExchangeId: reservation.TrackingId , articleFinishedAt: Agent.CurrentTime , customerDue: _fArticle.CustomerDue , provider: new List <FStockProvider>(new[] { new FStockProvider(reservation.TrackingId, "In Stock") }))); } // else create Production Agents if ToBuild if (_fArticle.Article.ToBuild) { Agent.Send(instruction: RequestArticleBom.Create(message: _fArticle.Article.Id, target: Agent.ActorPaths.SystemAgent.Ref)); // and request the Article from stock at Due Time if (_fArticle.IsHeadDemand) { var nextRequestAt = _fArticle.DueTime - Agent.CurrentTime; Agent.DebugMessage(msg: $"Ask storage for Article {_fArticle.Key} in + {nextRequestAt}", CustomLogger.STOCK, LogLevel.Warn); Agent.Send(instruction: ProvideArticleAtDue.Create(message: _fArticle.Key, target: _fArticle.StorageAgent) , waitFor: nextRequestAt); } } // Not in Stock and Not ToBuild Agent has to Wait for stock to provide materials }
public static ResponseFromStock Create(FStockReservation message, IActorRef target) { return(new ResponseFromStock(message: message, target: target)); }