diff options
author | Daniel Friesel <derf@finalrewind.org> | 2019-04-28 22:33:09 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2019-04-28 22:33:09 +0200 |
commit | fd6d12d355e5fb5596168b91affe71eb059c0e99 (patch) | |
tree | bc984831db2c7d3a1bb2d55fb2cbd231c708029d | |
parent | cc1a620041ec946ae130055c56f0d35c760c7468 (diff) |
Handle inconsistent data when calculating monthly/yearly stats
Closes #11
-rwxr-xr-x | lib/Travelynx.pm | 25 | ||||
-rw-r--r-- | lib/Travelynx/Command/database.pm | 13 | ||||
-rw-r--r-- | templates/_history_stats.html.ep | 23 |
3 files changed, 54 insertions, 7 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 6434e00..1e7c965 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -1445,8 +1445,9 @@ sub startup { my $interchange_real = 0; my $num_trains = 0; my $num_journeys = 0; + my @inconsistencies; - my $next_departure = 0; + my $next_departure = epoch_to_dt(0); for my $journey (@journeys) { $num_trains++; @@ -1472,18 +1473,27 @@ sub startup { # Note that journeys are sorted from recent to older entries if ( $journey->{rt_arrival} - and $next_departure - and $next_departure - $journey->{rt_arrival}->epoch + and $next_departure->epoch + and $next_departure->epoch - $journey->{rt_arrival}->epoch < ( 60 * 60 ) ) { - $interchange_real - += ( $next_departure - $journey->{rt_arrival}->epoch ) - / 60; + if ( $next_departure->epoch - $journey->{rt_arrival}->epoch + < 0 ) + { + push( @inconsistencies, + $next_departure->strftime('%d.%m.%Y %H:%M') ); + } + else { + $interchange_real + += ( $next_departure->epoch + - $journey->{rt_arrival}->epoch ) + / 60; + } } else { $num_journeys++; } - $next_departure = $journey->{rt_departure}->epoch; + $next_departure = $journey->{rt_departure}; } return { km_route => $km_route, @@ -1495,6 +1505,7 @@ sub startup { min_interchange_real => $interchange_real, delay_dep => $delay_dep, delay_arr => $delay_arr, + inconsistencies => \@inconsistencies, }; } ); diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm index b5e8cf5..bd22512 100644 --- a/lib/Travelynx/Command/database.pm +++ b/lib/Travelynx/Command/database.pm @@ -330,6 +330,19 @@ my @migrations = ( } $db->update( 'schema_version', { version => 4 } ); }, + + # v4 -> v5 + # Handle inconsistent data (overlapping journeys) in statistics. Introduces + # the "inconsistencies" stats key -> rebuild all stats. + sub { + my ($db) = @_; + $db->query( + qq{ + truncate journey_stats; + update schema_version set version = 5; + } + ); + }, ); sub setup_db { diff --git a/templates/_history_stats.html.ep b/templates/_history_stats.html.ep index f203631..715fa1a 100644 --- a/templates/_history_stats.html.ep +++ b/templates/_history_stats.html.ep @@ -1,3 +1,26 @@ +% if (@{$stats->{inconsistencies}}) { + <div class="row"> + <div class="col s12"> + <div class="card red darken-4"> + <div class="card-content white-text"> + <i class="material-icons small right">warning</i> + <span class="card-title">Inkonsistente Reisedaten</span> + <p> + Die folgenden Abfahrtszeiten liegen vor der Ankunftszeit der + vorherigen Zugfahrt und wurden bei der Wartezeitberechnung + ignoriert. + <ul> + % for my $date (@{$stats->{inconsistencies}}) { + <li><%= $date %></li> + % } + </ul> + </p> + </div> + </div> + </div> + </div> +% } + <div class="row"> <div class="col s12"> <table class="striped"> |