blob: 4d46fbe04ba8a6c5ca58c79a8db651b803ae6ab9 [file] [log] [blame]
/*
* Copyright 2011 Marc Grue.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.qi4j.sample.dcicargo.sample_a.data.shipping.delivery;
import java.util.Date;
import org.qi4j.api.association.Association;
import org.qi4j.api.common.Optional;
import org.qi4j.api.common.UseDefaults;
import org.qi4j.api.property.Property;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.sample.dcicargo.sample_a.context.support.ApplicationEvents;
import org.qi4j.sample.dcicargo.sample_a.data.shipping.cargo.RouteSpecification;
import org.qi4j.sample.dcicargo.sample_a.data.shipping.handling.HandlingEvent;
import org.qi4j.sample.dcicargo.sample_a.data.shipping.itinerary.Itinerary;
import org.qi4j.sample.dcicargo.sample_a.data.shipping.location.Location;
import org.qi4j.sample.dcicargo.sample_a.data.shipping.voyage.Voyage;
/**
* The Delivery describes the actual transportation of the cargo, as opposed to
* the customer requirement {@link RouteSpecification} and the plan {@link Itinerary}.
*
* Complex data of the shipping domain is captured here in a value object that is
* re-created each time some delivery status changes.
*
* Booking
* The life cycle of a cargo begins with the booking procedure. During a (short) period
* of time, between booking and initial routing, the cargo has no itinerary and is therefore
* not_routed.
*
* Routing
* The booking clerk requests a list of possible routes, matching the route specification,
* and assigns the cargo to one route. The route to which a cargo is assigned is described
* by an itinerary. The cargo is now routed.
*
* Handling
* Receipt of the cargo in the origin location marks the beginning of a series of handling
* events that will eventually deliver the cargo at the destination. Handling events are
* supposed to be registered by local authorities and sent asynchronously to the cargo system
* which then re-calculate and replaces the delivery value object of the cargo.
* (In this implementation the trigger is synchronous in {@link ApplicationEvents}
* and the registration-ui is close to the booking and tracking interfaces for simplicity).
*
* Change of destination
* It may also happen that a cargo is accidentally misrouted when a new destination is
* selected in the middle of the voyage of the cargo. The cargo then becomes misrouted,
* which should notify the proper personnel and also trigger a re-routing procedure.
* In this implementation a synchronous message is sent to system output.
*
* Re-routing
* A cargo can be re-routed during transport, on demand of the customer, in which case
* a new route is specified for the cargo and a new route is requested. The old itinerary,
* being a value object, is discarded and a new one is attached to the cargo.
*
* Customs
* The cargo can be checked by the custom authorities anytime during the delivery. In that
* case it's unknown what happens next so the cargo is then considered misdirected.
*
* Claim
* The life cycle of a cargo ends when the cargo is claimed by the customer.
*/
public interface Delivery
extends ValueComposite
{
Property<Date> timestamp();
/*
* NOT_ROUTED
* ROUTED
* MISROUTED
* */
Property<RoutingStatus> routingStatus();
/*
* NOT_RECEIVED
* IN_PORT
* ONBOARD_CARRIER
* CLAIMED
* UNKNOWN
* */
Property<TransportStatus> transportStatus();
// Unexpected location of cargo according to itinerary
@UseDefaults
Property<Boolean> isMisdirected();
/**
* RECEIVE
* LOAD
* UNLOAD
* CUSTOMS
* CLAIM
*
* ("HandlingActivity" in DDD sample)
*/
@Optional
Property<ExpectedHandlingEvent> nextExpectedHandlingEvent();
@Optional
Association<HandlingEvent> lastHandlingEvent();
@Optional
Association<Location> lastKnownLocation();
@Optional
Association<Voyage> currentVoyage();
@Optional
Property<Date> eta();
@UseDefaults
Property<Boolean> isUnloadedAtDestination();
}