Documentation ¶
Overview ¶
Package cargo contains the heart of the domain model.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrUnknown = errors.New("unknown cargo")
ErrUnknown is used when a cargo could not be found.
Functions ¶
This section is empty.
Types ¶
type Cargo ¶
type Cargo struct { TrackingID TrackingID Origin location.UNLocode RouteSpecification RouteSpecification Itinerary Itinerary Delivery Delivery }
Cargo is the central class in the domain model.
func (*Cargo) AssignToRoute ¶
AssignToRoute attaches a new itinerary to this cargo.
func (*Cargo) DeriveDeliveryProgress ¶
func (c *Cargo) DeriveDeliveryProgress(history HandlingHistory)
DeriveDeliveryProgress updates all aspects of the cargo aggregate status based on the current route specification, itinerary and handling of the cargo.
func (*Cargo) SpecifyNewRoute ¶
func (c *Cargo) SpecifyNewRoute(rs RouteSpecification)
SpecifyNewRoute specifies a new route for this cargo.
type Delivery ¶
type Delivery struct { Itinerary Itinerary RouteSpecification RouteSpecification RoutingStatus RoutingStatus TransportStatus TransportStatus NextExpectedActivity HandlingActivity LastEvent HandlingEvent LastKnownLocation location.UNLocode CurrentVoyage voyage.Number ETA time.Time IsMisdirected bool IsUnloadedAtDestination bool }
Delivery is the actual transportation of the cargo, as opposed to the customer requirement (RouteSpecification) and the plan (Itinerary).
func DeriveDeliveryFrom ¶
func DeriveDeliveryFrom(rs RouteSpecification, itinerary Itinerary, history HandlingHistory) Delivery
DeriveDeliveryFrom creates a new delivery snapshot based on the complete handling history of a cargo, as well as its route specification and itinerary.
func (Delivery) UpdateOnRouting ¶
func (d Delivery) UpdateOnRouting(rs RouteSpecification, itinerary Itinerary) Delivery
UpdateOnRouting 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.
type HandlingActivity ¶
type HandlingActivity struct { Type HandlingEventType Location location.UNLocode VoyageNumber voyage.Number }
HandlingActivity represents how and where a cargo can be handled, and can be used to express predictions about what is expected to happen to a cargo in the future.
type HandlingEvent ¶
type HandlingEvent struct { TrackingID TrackingID Activity HandlingActivity }
HandlingEvent is used to register the event when, for instance, a cargo is unloaded from a carrier at a some location at a given time.
type HandlingEventFactory ¶
type HandlingEventFactory struct { CargoRepository Repository VoyageRepository voyage.Repository LocationRepository location.Repository }
HandlingEventFactory creates handling events.
func (*HandlingEventFactory) CreateHandlingEvent ¶
func (f *HandlingEventFactory) CreateHandlingEvent(registrationTime time.Time, completionTime time.Time, trackingID TrackingID, voyageNumber voyage.Number, unLocode location.UNLocode, eventType HandlingEventType) (HandlingEvent, error)
CreateHandlingEvent creates a validated handling event.
type HandlingEventRepository ¶
type HandlingEventRepository interface { Store(e HandlingEvent) QueryHandlingHistory(TrackingID) HandlingHistory }
HandlingEventRepository provides access a handling event store.
type HandlingEventType ¶
type HandlingEventType int
HandlingEventType describes type of a handling event.
const ( NotHandled HandlingEventType = iota Load Unload Receive Claim Customs )
Valid handling event types.
func (HandlingEventType) String ¶
func (t HandlingEventType) String() string
type HandlingHistory ¶
type HandlingHistory struct {
HandlingEvents []HandlingEvent
}
HandlingHistory is the handling history of a cargo.
func (HandlingHistory) MostRecentlyCompletedEvent ¶
func (h HandlingHistory) MostRecentlyCompletedEvent() (HandlingEvent, error)
MostRecentlyCompletedEvent returns most recently completed handling event.
type Itinerary ¶
type Itinerary struct {
Legs []Leg `json:"legs"`
}
Itinerary specifies steps required to transport a cargo from its origin to destination.
func (Itinerary) FinalArrivalLocation ¶
FinalArrivalLocation returns the end of the itinerary.
func (Itinerary) FinalArrivalTime ¶
FinalArrivalTime returns the expected arrival time at final destination.
func (Itinerary) InitialDepartureLocation ¶
InitialDepartureLocation returns the start of the itinerary.
func (Itinerary) IsExpected ¶
func (i Itinerary) IsExpected(event HandlingEvent) bool
IsExpected checks if the given handling event is expected when executing this itinerary.
type Leg ¶
type Leg struct { VoyageNumber voyage.Number `json:"voyage_number"` LoadLocation location.UNLocode `json:"from"` UnloadLocation location.UNLocode `json:"to"` LoadTime time.Time `json:"load_time"` UnloadTime time.Time `json:"unload_time"` }
Leg describes the transportation between two locations on a voyage.
type Repository ¶
type Repository interface { Store(cargo *Cargo) error Find(trackingID TrackingID) (*Cargo, error) FindAll() []*Cargo }
Repository provides access a cargo store.
type RouteSpecification ¶
type RouteSpecification struct { Origin location.UNLocode Destination location.UNLocode ArrivalDeadline time.Time }
RouteSpecification Contains information about a route: its origin, destination and arrival deadline.
func (RouteSpecification) IsSatisfiedBy ¶
func (s RouteSpecification) IsSatisfiedBy(itinerary Itinerary) bool
IsSatisfiedBy checks whether provided itinerary satisfies this specification.
type RoutingStatus ¶
type RoutingStatus int
RoutingStatus describes status of cargo routing.
const ( NotRouted RoutingStatus = iota Misrouted Routed )
Valid routing statuses.
func (RoutingStatus) String ¶
func (s RoutingStatus) String() string
type TrackingID ¶
type TrackingID string
TrackingID uniquely identifies a particular cargo.
func NextTrackingID ¶
func NextTrackingID() TrackingID
NextTrackingID generates a new tracking ID. TODO: Move to infrastructure(?)
type TransportStatus ¶
type TransportStatus int
TransportStatus describes status of cargo transportation.
const ( NotReceived TransportStatus = iota InPort OnboardCarrier Claimed Unknown )
Valid transport statuses.
func (TransportStatus) String ¶
func (s TransportStatus) String() string