handle departure cancellation after checkin

This commit is contained in:
Daniel Friesel 2020-02-17 21:13:07 +01:00
parent a1865fa69e
commit cc7439dd5e
4 changed files with 90 additions and 1 deletions

View file

@ -2684,6 +2684,10 @@ sub startup {
my $db = $opt{db} //= $self->pg->db; my $db = $opt{db} //= $self->pg->db;
my $min_count = $opt{min_count} // 3; my $min_count = $opt{min_count} // 3;
if ( $opt{destination_name} ) {
return ( $opt{destination_name} );
}
my $dest_id = $opt{eva} // $self->get_latest_dest_id(%opt); my $dest_id = $opt{eva} // $self->get_latest_dest_id(%opt);
if ( not $dest_id ) { if ( not $dest_id ) {
@ -2730,6 +2734,9 @@ sub startup {
if ( $use_history & 0x01 ) { if ( $use_history & 0x01 ) {
$eva = $opt{eva}; $eva = $opt{eva};
} }
elsif ( $opt{destination_name} ) {
$eva = $opt{eva};
}
} }
else { else {
if ( $use_history & 0x02 ) { if ( $use_history & 0x02 ) {
@ -3357,6 +3364,38 @@ sub startup {
} }
)->expand->hash; )->expand->hash;
my $latest_cancellation = $db->select(
'journeys_str',
'*',
{
user_id => $uid,
},
{
order_by => { -desc => 'journey_id' },
limit => 1
}
)->expand->hash;
if ( $latest_cancellation and $latest_cancellation->{cancelled} ) {
if ( my $station
= $self->app->station_by_eva
->{ $latest_cancellation->{dep_eva} } )
{
$latest_cancellation->{dep_ds100} = $station->[0];
$latest_cancellation->{dep_name} = $station->[1];
}
if ( my $station
= $self->app->station_by_eva
->{ $latest_cancellation->{arr_eva} } )
{
$latest_cancellation->{arr_ds100} = $station->[0];
$latest_cancellation->{arr_name} = $station->[1];
}
}
else {
$latest_cancellation = undef;
}
if ($latest) { if ($latest) {
my $ts = $latest->{checkout_ts}; my $ts = $latest->{checkout_ts};
my $action_time = epoch_to_dt($ts); my $action_time = epoch_to_dt($ts);
@ -3375,6 +3414,7 @@ sub startup {
return { return {
checked_in => 0, checked_in => 0,
cancelled => 0, cancelled => 0,
cancellation => $latest_cancellation,
journey_id => $latest->{journey_id}, journey_id => $latest->{journey_id},
timestamp => $action_time, timestamp => $action_time,
timestamp_delta => $now->epoch - $action_time->epoch, timestamp_delta => $now->epoch - $action_time->epoch,
@ -3401,6 +3441,7 @@ sub startup {
return { return {
checked_in => 0, checked_in => 0,
cancelled => 0, cancelled => 0,
cancellation => $latest_cancellation,
no_journeys_yet => 1, no_journeys_yet => 1,
timestamp => epoch_to_dt(0), timestamp => epoch_to_dt(0),
timestamp_delta => $now->epoch, timestamp_delta => $now->epoch,

View file

@ -70,7 +70,44 @@ sub run {
train_no => $train->train_no train_no => $train->train_no
} }
); );
$self->app->add_route_timestamps( $uid, $train, 1 ); if ( $train->departure_is_cancelled and $arr ) {
# depending on the amount of users in transit, some time may
# have passed between fetching $entry from the database and
# now. Ensure that the user is still checked into this train
# before calling checkout to mark the cancellation.
if (
$db->select(
'in_transit',
'count(*) as count',
{
user_id => $uid,
train_no => $train->train_no,
checkin_station_id => $dep
}
)->hash->{count}
)
{
$db->update(
'in_transit',
{
cancelled => 1,
},
{
user_id => $uid,
train_no => $train->train_no,
checkin_station_id => $dep
}
);
# check out (adds a cancelled journey and resets journey state
# to checkin
$self->app->checkout( $arr, 1, $uid );
}
}
else {
$self->app->add_route_timestamps( $uid, $train, 1 );
}
} }
}; };
if ($@) { if ($@) {

View file

@ -133,6 +133,10 @@ sub status_card {
if ( $status->{checked_in} ) { if ( $status->{checked_in} ) {
$self->render( '_checked_in', journey => $status ); $self->render( '_checked_in', journey => $status );
} }
elsif ( $status->{cancellation} ) {
$self->render( '_cancelled_departure',
journey => $status->{cancellation} );
}
else { else {
$self->render( '_checked_out', journey => $status ); $self->render( '_checked_out', journey => $status );
} }

View file

@ -26,6 +26,13 @@
</div> </div>
</div> </div>
% } % }
% elsif ($status->{cancellation} and $station eq $status->{cancellation}{dep_name}) {
<div class="row">
<div class="col s12">
%= include '_cancelled_departure', journey => $status->{cancellation};
</div>
</div>
% }
% elsif ($status->{timestamp_delta} < 180) { % elsif ($status->{timestamp_delta} < 180) {
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">