Exemple #1
0
 private bool CalculateMisdirectionStatus(Itinerary itinerary)
 {
     if (lastEvent == null)
     {
         return(false);
     }
     return(!itinerary.IsExpected(lastEvent));
 }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        private DateTime CalculateEta(Itinerary itinerary)
        {
            if (IsOnTrack())
            {
                return(itinerary.FinalArrivalDate);
            }

            return(ETA_UNKOWN);
        }
Exemple #4
0
        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));
        }
Exemple #5
0
        private RoutingStatus CalculateRoutingStatus(Itinerary itinerary, RouteSpecification routeSpecification)
        {
            if (itinerary == null)
            {
                return(RoutingStatus.NOT_ROUTED);
            }

            if (routeSpecification.IsSatisfiedBy(itinerary))
            {
                return(RoutingStatus.ROUTED);
            }

            return(RoutingStatus.MISROUTED);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        /// <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));
        }