Esempio n. 1
0
        /// <summary>
        /// Specifies a new route for this cargo.
        /// </summary>
        /// <param name="routeSpec">route specification.</param>
        public virtual void SpecifyNewRoute(RouteSpecification routeSpec)
        {
            Validate.NotNull(routeSpec, "Route specification is required");

            routeSpecification = routeSpec;
            // Handling consistency within the Cargo aggregate synchronously
            delivery = delivery.UpdateOnRouting(routeSpecification, itinerary);
        }
Esempio n. 2
0
 public bool SameValueAs(RouteSpecification other)
 {
     return(other != null && new EqualsBuilder().
            Append(origin, other.origin).
            Append(destination, other.destination).
            Append(arrivalDeadline, other.arrivalDeadline).
            IsEquals());
 }
Esempio n. 3
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));
        }
Esempio n. 4
0
        public Cargo(TrackingId trackingId, RouteSpecification routeSpecification)
        {
            Validate.NotNull(trackingId, "Tracking ID is required");
            Validate.NotNull(routeSpecification, "Route specification is required");

            this.trackingId = trackingId;
            // Cargo origin never changes, even if the route specification changes.
            // However, at creation, cargo orgin can be derived from the initial route specification.
            origin = routeSpecification.Origin;
            this.routeSpecification = routeSpecification;

            delivery = Delivery.DerivedFrom(this.routeSpecification, itinerary, HandlingHistory.EMPTY);
        }
Esempio n. 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);
        }
Esempio n. 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);
        }
Esempio n. 7
0
 private bool CalculateUnloadedAtDestination(RouteSpecification routeSpecification)
 {
     return(lastEvent != null &&
            HandlingType.UNLOAD.SameValueAs(lastEvent.Type) &&
            routeSpecification.Destination.SameIdentityAs(lastEvent.Location));
 }
Esempio n. 8
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);
        }
Esempio n. 9
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));
        }