private bool CalculateMisdirectionStatus(Itinerary itinerary) { if (lastEvent == null) { return(false); } return(!itinerary.IsExpected(lastEvent)); }
/// <summary> /// Attach a new itinerary to this cargo. /// </summary> /// <param name="itineraryPrm">an itinerary. May not be null.</param> public virtual void AssignToRoute(Itinerary itineraryPrm) { Validate.NotNull(itineraryPrm, "Itinerary is required for assignment"); itinerary = itineraryPrm; // Handling consistency within the Cargo aggregate synchronously delivery = delivery.UpdateOnRouting(routeSpecification, itinerary); }
private DateTime CalculateEta(Itinerary itinerary) { if (IsOnTrack()) { return(itinerary.FinalArrivalDate); } return(ETA_UNKOWN); }
internal static Delivery DerivedFrom(RouteSpecification routeSpecification, Itinerary itinerary, HandlingHistory handlingHistory) { Validate.NotNull(routeSpecification, "Route specification is required"); Validate.NotNull(handlingHistory, "Delivery history is required"); HandlingEvent lastEvent = handlingHistory.MostRecentlyCompletedEvent(); return(new Delivery(lastEvent, itinerary, routeSpecification)); }
private RoutingStatus CalculateRoutingStatus(Itinerary itinerary, RouteSpecification routeSpecification) { if (itinerary == null) { return(RoutingStatus.NOT_ROUTED); } if (routeSpecification.IsSatisfiedBy(itinerary)) { return(RoutingStatus.ROUTED); } return(RoutingStatus.MISROUTED); }
/// <summary> /// Internal constructor. /// </summary> /// <param name="lastEvent">last event</param> /// <param name="itinerary">itinerary</param> /// <param name="routeSpecification">route specification</param> private Delivery(HandlingEvent lastEvent, Itinerary itinerary, RouteSpecification routeSpecification) { NO_ACTIVITY = null; calculatedAt = DateTime.Now; this.lastEvent = lastEvent; misdirected = CalculateMisdirectionStatus(itinerary); routingStatus = CalculateRoutingStatus(itinerary, routeSpecification); transportStatus = CalculateTransportStatus(); lastKnownLocation = CalculateLastKnownLocation(); currentVoyage = CalculateCurrentVoyage(); eta = CalculateEta(itinerary); nextExpectedActivity = CalculateNextExpectedActivity(routeSpecification, itinerary); isUnloadedAtDestination = CalculateUnloadedAtDestination(routeSpecification); }
private HandlingActivity CalculateNextExpectedActivity(RouteSpecification routeSpecification, Itinerary itinerary) { if (!IsOnTrack()) { return(NO_ACTIVITY); } if (lastEvent == null) { return(new HandlingActivity(HandlingType.RECEIVE, routeSpecification.Origin)); } if (lastEvent.Type == HandlingType.LOAD) { foreach (Leg leg in itinerary.Legs) { if (leg.LoadLocation.SameIdentityAs(lastEvent.Location)) { return(new HandlingActivity(HandlingType.UNLOAD, leg.UnloadLocation, leg.Voyage)); } } return(NO_ACTIVITY); } if (lastEvent.Type == HandlingType.UNLOAD) { for (IEnumerator <Leg> it = itinerary.Legs.GetEnumerator(); it.MoveNext();) { Leg leg = it.Current; if (leg.UnloadLocation.SameIdentityAs(lastEvent.Location)) { if (it.MoveNext()) { Leg nextLeg = it.Current; return(new HandlingActivity(HandlingType.LOAD, nextLeg.LoadLocation, nextLeg.Voyage)); } return(new HandlingActivity(HandlingType.CLAIM, leg.UnloadLocation)); } } return(NO_ACTIVITY); } if (lastEvent.Type == HandlingType.RECEIVE) { IEnumerator <Leg> enumerator = itinerary.Legs.GetEnumerator(); enumerator.MoveNext(); var firstLeg = enumerator.Current; return(new HandlingActivity(HandlingType.LOAD, firstLeg.LoadLocation, firstLeg.Voyage)); } if (lastEvent.Type == HandlingType.CLAIM) { //DO nothing } return(NO_ACTIVITY); }
/// <summary> /// Creates a new delivery snapshot to reflect changes in routing, i.e. /// when the route specification or the itinerary has changed /// but no additional handling of the cargo has been performed. /// </summary> /// <param name="routeSpecification">route specification</param> /// <param name="itinerary">itinerary itinerary</param> /// <returns>An up to date delivery</returns> internal Delivery UpdateOnRouting(RouteSpecification routeSpecification, Itinerary itinerary) { Validate.NotNull(routeSpecification, "Route specification is required"); return(new Delivery(lastEvent, itinerary, routeSpecification)); }