UnitOfWork uow = module.currentUnitOfWork();
HandlingEventsEntity HANDLING_EVENTS = uow.get( HandlingEventsEntity.class, HandlingEventsEntity.HANDLING_EVENTS_ID );
// Unexpected unload in Tokyo
HandlingEvent handlingEvent = HANDLING_EVENTS.createHandlingEvent( day( 5 ), day( 5 ), trackingId, UNLOAD, TOKYO, V100S );
Delivery delivery = new BuildDeliverySnapshot( cargo, handlingEvent ).get();
cargo.delivery().set( delivery );
assertThat( delivery.isMisdirected().get(), is( equalTo( true ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get(), is( equalTo( null ) ) );
assertThat( delivery.eta().get(), is( equalTo( null ) ) );
assertThat( delivery.routingStatus().get(), is( equalTo( RoutingStatus.ROUTED ) ) );
assertThat( delivery.transportStatus().get(), is( equalTo( TransportStatus.IN_PORT ) ) );
assertThat( delivery.lastHandlingEvent().get(), is( equalTo( handlingEvent ) ) );
assertThat( delivery.lastHandlingEvent().get().handlingEventType().get(), is( equalTo( UNLOAD ) ) );
assertThat( delivery.lastHandlingEvent().get().voyage().get(), is( equalTo( V100S ) ) );
assertThat( delivery.lastKnownLocation().get(), is( equalTo( TOKYO ) ) );
assertThat( delivery.currentVoyage().get(), is( equalTo( null ) ) );
assertThat( delivery.isUnloadedAtDestination().get(), is( equalTo( false ) ) );
// Cargo needs to be rerouted
// Customer specifies a new route
RouteSpecification routeSpec = routeSpecification( TOKYO, STOCKHOLM, day( 20 ) );
cargo.routeSpecification().set( routeSpec );
delivery = new BuildDeliverySnapshot( cargo ).get();
cargo.delivery().set( delivery );
// Old itinerary will not satisfy new route specification
assertThat( itinerary.firstLeg().loadLocation().get(), is( not( equalTo( routeSpec.origin().get() ) ) ) );
assertThat( itinerary.lastLeg().unloadLocation().get(), is( equalTo( routeSpec.destination().get() ) ) );
assertThat( delivery.routingStatus().get(), is( equalTo( RoutingStatus.MISROUTED ) ) );
// Old planned arrival time is still satisfying new deadline
assertTrue( routeSpec.arrivalDeadline().get().after( itinerary.finalArrivalDate() ) );
// We don't know what's next before a new itinerary has been chosen
assertThat( delivery.nextExpectedHandlingEvent().get(), is( equalTo( null ) ) );
assertThat( delivery.eta().get(), is( equalTo( null ) ) );
// Cargo is still misdirected (in unexpected location) according to old itinerary
assertThat( delivery.isMisdirected().get(), is( equalTo( true ) ) );
// Last known data
assertThat( delivery.transportStatus().get(), is( equalTo( TransportStatus.IN_PORT ) ) );
assertThat( delivery.lastHandlingEvent().get(), is( equalTo( handlingEvent ) ) );
assertThat( delivery.lastHandlingEvent().get().handlingEventType().get(), is( equalTo( UNLOAD ) ) );
assertThat( delivery.lastHandlingEvent().get().voyage().get(), is( equalTo( V100S ) ) );
assertThat( delivery.lastKnownLocation().get(), is( equalTo( TOKYO ) ) );
assertThat( delivery.currentVoyage().get(), is( equalTo( null ) ) );
assertThat( delivery.isUnloadedAtDestination().get(), is( equalTo( false ) ) );
// New itinerary that satisfy the new route specification. New origin departure from Tokyo.
Date arrival= day( 19 );
itinerary = itinerary(
leg( V400S, TOKYO, HAMBURG, day( 9 ), day( 16 ) ),
leg( V500S, HAMBURG, STOCKHOLM, day( 17 ), arrival )
);
// Customer reroutes cargo. This is a possible step in the cargo booking process.
new BookNewCargo( cargo, itinerary ).assignCargoToRoute();
delivery = cargo.delivery().get();
// Cargo is on track again
assertThat( delivery.isMisdirected().get(), is( equalTo( false ) ) );
assertThat( delivery.routingStatus().get(), is( equalTo( RoutingStatus.ROUTED ) ) );
assertThat( delivery.transportStatus().get(), is( equalTo( TransportStatus.IN_PORT ) ) );
assertThat( delivery.lastHandlingEvent().get(), is( equalTo( handlingEvent ) ) );
assertThat( delivery.lastHandlingEvent().get().handlingEventType().get(), is( equalTo( UNLOAD ) ) );
assertThat( delivery.lastHandlingEvent().get().voyage().get(), is( equalTo( V100S ) ) );
assertThat( delivery.lastKnownLocation().get(), is( equalTo( TOKYO ) ) );
assertThat( delivery.currentVoyage().get(), is( equalTo( null ) ) );
assertThat( delivery.eta().get(), is( equalTo( arrival ) ) );
assertThat( delivery.isUnloadedAtDestination().get(), is( equalTo( false ) ) );
// When a cargo is rerouted the (often misdirected) last handling event is flagged as disregarded
// since it doesn't have to be part of the new itinerary (this isn't in the Citerus version).
// We now expect the cargo to be loaded onto voyage V400S in Tokyo heading to Hamburg
assertThat( delivery.isMisdirected().get(), is( equalTo( false ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().handlingEventType().get(), is( equalTo( LOAD ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().location().get(), is( equalTo( TOKYO ) ) );
assertThat( delivery.nextExpectedHandlingEvent().get().voyage().get(), is( equalTo( V400S ) ) );
// Cargo is not misdirected anymore according to new itinerary. Cargo location is now expected to be in Tokyo.
}