summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/Travelynx.pm82
-rw-r--r--lib/Travelynx/Command/work.pm26
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm17
-rw-r--r--lib/Travelynx/Helper/DBRIS.pm4
-rw-r--r--lib/Travelynx/Helper/EFA.pm4
-rw-r--r--lib/Travelynx/Helper/IRIS.pm4
-rwxr-xr-xlib/Travelynx/Model/Journeys.pm154
7 files changed, 177 insertions, 114 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 7b5cf99..89a0158 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -466,6 +466,64 @@ sub startup {
);
$self->helper(
+ 'LT' => sub {
+ my ( $self, $minutes ) = @_;
+
+ my @ret;
+
+ if ( $minutes >= 14 * 24 * 60 ) {
+ push( @ret,
+ int( $minutes / ( 7 * 24 * 60 ) ) . q{ }
+ . $self->L('LT.weeks') );
+ }
+ elsif ( $minutes >= 7 * 24 * 60 ) {
+ push( @ret, '1 ' . $self->L('LT.week') );
+ }
+ $minutes %= 7 * 24 * 60;
+
+ if ( $minutes >= 2 * 24 * 60 ) {
+ push( @ret,
+ int( $minutes / ( 24 * 60 ) ) . q{ }
+ . $self->L('LT.days') );
+ }
+ elsif ( $minutes >= 24 * 60 ) {
+ push( @ret, '1 ' . $self->L('LT.day') );
+ }
+ $minutes %= 24 * 60;
+
+ if ( $minutes >= 2 * 60 ) {
+ push( @ret,
+ int( $minutes / 60 ) . q{ } . $self->L('LT.hours') );
+ }
+ elsif ( $minutes >= 60 ) {
+ push( @ret, '1 ' . $self->L('LT.hour') );
+ }
+ $minutes %= 60;
+
+ if ( $minutes >= 2 ) {
+ push( @ret, "$minutes " . $self->L('LT.minutes') );
+ }
+ elsif ($minutes) {
+ push( @ret, '1 ' . $self->L('LT.minute') );
+ }
+
+ if ( @ret == 0 ) {
+ return $self->L('LT.zero-minutes');
+ }
+
+ if ( @ret == 1 ) {
+ return $ret[0];
+ }
+
+ my $last = pop(@ret);
+ return
+ join( ', ', @ret )
+ . $self->L( @ret > 1 ? 'LT.final-and' : 'LT.and' )
+ . " $last";
+ }
+ );
+
+ $self->helper(
'now' => sub {
return DateTime->now( time_zone => 'Europe/Berlin' );
}
@@ -1403,16 +1461,25 @@ sub startup {
arrival_eva => $new_checkout_station_id
);
- # If in_transit already contains arrival data for another estimated
- # destination, we must invalidate it.
if ( defined $journey->{checkout_station_id}
and $journey->{checkout_station_id}
!= $new_checkout_station_id )
{
+ # If in_transit already contains arrival data for another estimated
+ # destination, we must invalidate it.
$self->in_transit->unset_arrival_data(
uid => $uid,
db => $db
);
+
+ # The same applies to suggestions
+ $self->in_transit->update_data(
+ uid => $uid,
+ db => $db,
+ data => {
+ connection_suggestions_iris => [],
+ },
+ );
}
# Note that a train may pass the same station several times.
@@ -1741,6 +1808,17 @@ sub startup {
cancelled_destination => $found->[0],
);
}
+ else {
+ # remove connection suggestions that may have been saved for a different target station
+ $self->in_transit->update_data(
+ uid => $uid,
+ db => $db,
+ data => {
+ connection_suggestions_dbris => [],
+ connection_suggestions_efa => [],
+ },
+ );
+ }
if ($tx) {
$tx->commit;
diff --git a/lib/Travelynx/Command/work.pm b/lib/Travelynx/Command/work.pm
index 7a7ce22..f3bf71c 100644
--- a/lib/Travelynx/Command/work.pm
+++ b/lib/Travelynx/Command/work.pm
@@ -215,8 +215,11 @@ sub run {
exclude => $dep,
);
$self->app->dbris->get_connections_p(
- station => $arr,
- timestamp => $entry->{real_arr},
+ station => $arr,
+ timestamp => DateTime->from_epoch(
+ epoch => $entry->{real_arr_ts},
+ time_zone => 'Europe/Berlin'
+ ),
destinations => \@destinations
)->then(
sub {
@@ -348,9 +351,12 @@ sub run {
exclude => $dep,
);
$self->app->efa->get_connections_p(
- service => $entry->{backend_name},
- name => $arr,
- timestamp => $entry->{real_arr},
+ service => $entry->{backend_name},
+ name => $arr,
+ timestamp => DateTime->from_epoch(
+ epoch => $entry->{real_arr_ts},
+ time_zone => 'Europe/Berlin'
+ ),
destinations => \@destinations
)->then(
sub {
@@ -782,7 +788,8 @@ sub run {
$self->app->add_stationinfo( $uid, 0, $train->train_id,
$dep, $arr );
}
- if ( defined $entry->{real_arr_ts}
+ if ( $suggestions_enabled
+ and defined $entry->{real_arr_ts}
and $now->epoch - $entry->{real_arr_ts} < 900 )
{
my @destinations
@@ -793,8 +800,11 @@ sub run {
exclude => $dep,
);
$self->app->iris->get_connections_p(
- station => $arr,
- timestamp => $entry->{real_arr},
+ station => $arr,
+ timestamp => DateTime->from_epoch(
+ epoch => $entry->{real_arr_ts},
+ time_zone => 'Europe/Berlin'
+ ),
destinations => \@destinations
)->then(
sub {
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm
index 28d7bfd..0132a23 100755
--- a/lib/Travelynx/Controller/Traveling.pm
+++ b/lib/Travelynx/Controller/Traveling.pm
@@ -1582,6 +1582,7 @@ sub yearly_history {
uid => $self->current_user->{id},
after => $interval_start,
before => $interval_end,
+ sort => 'asc',
with_datetime => 1
);
@@ -1664,6 +1665,7 @@ sub monthly_history {
uid => $self->current_user->{id},
after => $interval_start,
before => $interval_end,
+ sort => 'asc',
with_datetime => 1
);
@@ -2203,8 +2205,19 @@ sub polyline_add_stops {
}
$route_i += 1;
}
- $route_i = 0;
+ $route_i = -1;
for my $stop ( @{$route} ) {
+ $route_i += 1;
+ if ( $opt{partial} ) {
+ if ( $route_i == 0 ) {
+ $polyline->[0][2] = $stop->[1];
+ next;
+ }
+ if ( $route_i == $#{$route} ) {
+ $polyline->[-1][2] = $stop->[1];
+ next;
+ }
+ }
my $key = $route_i . ';' . $stop->[1];
if ( $min_dist{$key} ) {
if ( defined $polyline->[ $min_dist{$key}{index} ][2] ) {
@@ -2230,7 +2243,6 @@ sub polyline_add_stops {
$polyline->[ $min_dist{$key}{index} ][2]
= $stop->[1];
}
- $route_i += 1;
}
return;
}
@@ -2348,6 +2360,7 @@ sub set_polyline {
my $err = $self->polyline_add_stops(
polyline => \@polyline,
route => \@route,
+ partial => ( $self->param('upload-partial') ? 1 : 0 ),
);
if ($err) {
diff --git a/lib/Travelynx/Helper/DBRIS.pm b/lib/Travelynx/Helper/DBRIS.pm
index edf8812..8fb1058 100644
--- a/lib/Travelynx/Helper/DBRIS.pm
+++ b/lib/Travelynx/Helper/DBRIS.pm
@@ -132,6 +132,10 @@ sub get_connections_p {
my $promise = Mojo::Promise->new;
my $destinations = $opt{destinations};
+ $self->{log}->debug(
+"get_connections_p(station => $opt{station}, timestamp => $opt{timestamp})"
+ );
+
$self->get_departures_p(
station => '@L=' . $opt{station},
timestamp => $opt{timestamp},
diff --git a/lib/Travelynx/Helper/EFA.pm b/lib/Travelynx/Helper/EFA.pm
index 70894df..af4903d 100644
--- a/lib/Travelynx/Helper/EFA.pm
+++ b/lib/Travelynx/Helper/EFA.pm
@@ -98,6 +98,10 @@ sub get_connections_p {
my $promise = Mojo::Promise->new;
my $destinations = $opt{destinations};
+ $self->{log}->debug(
+"get_connections_p(service => $opt{service}, station => $opt{name}, timestamp => $opt{timestamp})"
+ );
+
$self->get_departures_p(
service => $opt{service},
name => $opt{name},
diff --git a/lib/Travelynx/Helper/IRIS.pm b/lib/Travelynx/Helper/IRIS.pm
index 9a5aa87..5ed0654 100644
--- a/lib/Travelynx/Helper/IRIS.pm
+++ b/lib/Travelynx/Helper/IRIS.pm
@@ -206,6 +206,10 @@ sub get_connections_p {
my $promise = Mojo::Promise->new;
my $destinations = $opt{destinations};
+ $self->{log}->debug(
+"get_connections_p(station => $opt{station}, timestamp => $opt{timestamp})"
+ );
+
$self->get_departures_p(
station => $opt{station},
timestamp => $opt{timestamp},
diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm
index 744e7ae..ea3461c 100755
--- a/lib/Travelynx/Model/Journeys.pm
+++ b/lib/Travelynx/Model/Journeys.pm
@@ -50,56 +50,6 @@ sub epoch_to_dt {
);
}
-# TODO turn into a travelynx helper called from templates so that
-# loc_handle is available for localization
-sub min_to_human {
- my ( $self, $minutes ) = @_;
-
- my @ret;
-
- if ( $minutes >= 14 * 24 * 60 ) {
- push( @ret, int( $minutes / ( 7 * 24 * 60 ) ) . ' Wochen' );
- }
- elsif ( $minutes >= 7 * 24 * 60 ) {
- push( @ret, '1 Woche' );
- }
- $minutes %= 7 * 24 * 60;
-
- if ( $minutes >= 2 * 24 * 60 ) {
- push( @ret, int( $minutes / ( 24 * 60 ) ) . ' Tage' );
- }
- elsif ( $minutes >= 24 * 60 ) {
- push( @ret, '1 Tag' );
- }
- $minutes %= 24 * 60;
-
- if ( $minutes >= 2 * 60 ) {
- push( @ret, int( $minutes / 60 ) . ' Stunden' );
- }
- elsif ( $minutes >= 60 ) {
- push( @ret, '1 Stunde' );
- }
- $minutes %= 60;
-
- if ( $minutes >= 2 ) {
- push( @ret, "$minutes Minuten" );
- }
- elsif ($minutes) {
- push( @ret, '1 Minute' );
- }
-
- if ( @ret == 0 ) {
- return '0 Minuten';
- }
-
- if ( @ret == 1 ) {
- return $ret[0];
- }
-
- my $last = pop(@ret);
- return join( ', ', @ret ) . " und $last";
-}
-
sub new {
my ( $class, %opt ) = @_;
@@ -698,9 +648,14 @@ sub get {
user_id => $uid,
cancelled => 0
);
+
+ my $order_key = '-desc';
+ if ( $opt{sort} and $opt{sort} eq 'asc' ) {
+ $order_key = '-asc';
+ }
my %order = (
order_by => {
- -desc => 'real_dep_ts',
+ $order_key => 'real_dep_ts',
}
);
@@ -1046,20 +1001,20 @@ sub get_latest_checkout_stations {
my @ret;
while ( my $row = $res->hash ) {
- push(
- @ret,
- {
- name => $row->{arr_name},
- eva => $row->{arr_eva},
- external_id_or_eva => $row->{arr_external_id}
- // $row->{arr_eva},
- dbris => $row->{is_dbris} ? $row->{backend_name} : 0,
- efa => $row->{is_efa} ? $row->{backend_name} : 0,
- hafas => $row->{is_hafas} ? $row->{backend_name} : 0,
- motis => $row->{is_motis} ? $row->{backend_name} : 0,
- backend_id => $row->{backend_id},
- }
- );
+ my $entry = {
+ name => $row->{arr_name},
+ eva => $row->{arr_eva},
+ external_id_or_eva => $row->{arr_external_id} // $row->{arr_eva},
+ dbris => $row->{is_dbris} ? $row->{backend_name} : 0,
+ efa => $row->{is_efa} ? $row->{backend_name} : 0,
+ hafas => $row->{is_hafas} ? $row->{backend_name} : 0,
+ motis => $row->{is_motis} ? $row->{backend_name} : 0,
+ backend_id => $row->{backend_id},
+ };
+ if ( $row->{is_dbris} ) {
+ $entry->{external_id_or_eva} = '@L=' . $row->{arr_eva};
+ }
+ push( @ret, $entry );
}
return @ret;
@@ -1560,6 +1515,17 @@ sub compute_review {
}
}
}
+ if ( $journey->{user_data}{him_msg}
+ and @{ $journey->{user_data}{him_msg} } )
+ {
+ $message_count += 1;
+ for my $message ( @{ $journey->{user_data}{him_msg} } ) {
+ if ( not $seen{ $message->{lead} } ) {
+ $num_by_message{ $message->{lead} } += 1;
+ $seen{ $message->{lead} } = 1;
+ }
+ }
+ }
if ( $journey->{type} ) {
$num_by_linetype{ $journey->{type} } += 1;
@@ -1658,7 +1624,7 @@ sub compute_review {
$review{traveling_percentage_year}
= sprintf( "%.1f%%", $min_total * 100 / 525948.77 );
$review{traveling_percentage_year} =~ tr{.}{,};
- $review{traveling_time_year} = $self->min_to_human($min_total);
+ $review{traveling_time_year} = $min_total;
if (@linetypes) {
$review{typical_type_1} = $linetypes[0][0];
@@ -1673,24 +1639,18 @@ sub compute_review {
elsif ( @stops == 2 ) {
$review{typical_stops_2} = [ $stops[0][0], $stops[1][0] ];
}
- $review{typical_time}
- = $self->min_to_human( $stats->{min_travel_real} / $stats->{num_trains} );
+ $review{typical_time} = $stats->{min_travel_real} / $stats->{num_trains};
$review{typical_km}
= sprintf( '%.0f', $stats->{km_route} / $stats->{num_trains} );
$review{typical_kmh} = sprintf( '%.0f',
$stats->{km_route} / ( $stats->{min_travel_real} / 60 ) );
$review{typical_delay_dep}
= sprintf( '%.0f', $stats->{delay_dep} / $stats->{num_trains} );
- $review{typical_delay_dep_h}
- = $self->min_to_human( $review{typical_delay_dep} );
$review{typical_delay_arr}
= sprintf( '%.0f', $stats->{delay_arr} / $stats->{num_trains} );
- $review{typical_delay_arr_h}
- = $self->min_to_human( $review{typical_delay_arr} );
if ($longest_t) {
- $review{longest_t_time}
- = $self->min_to_human( $longest_t->{rt_duration} / 60 );
+ $review{longest_t_min} = $longest_t->{rt_duration} / 60;
$review{longest_t_type} = $longest_t->{type};
$review{longest_t_lineno} = $longest_t->{line} // $longest_t->{no};
$review{longest_t_from} = $longest_t->{from_name};
@@ -1708,8 +1668,7 @@ sub compute_review {
}
if ($shortest_t) {
- $review{shortest_t_time}
- = $self->min_to_human( $shortest_t->{rt_duration} / 60 );
+ $review{shortest_t_min} = $shortest_t->{rt_duration} / 60;
$review{shortest_t_type} = $shortest_t->{type};
$review{shortest_t_lineno} = $shortest_t->{line} // $shortest_t->{no};
$review{shortest_t_from} = $shortest_t->{from_name};
@@ -1729,12 +1688,10 @@ sub compute_review {
}
if ($most_delayed) {
- $review{most_delayed_type} = $most_delayed->{type};
- $review{most_delayed_delay_dep}
- = $self->min_to_human( $most_delayed->{delay_dep} );
- $review{most_delayed_delay_arr}
- = $self->min_to_human( $most_delayed->{delay_arr} );
- $review{most_delayed_lineno} = $most_delayed->{line}
+ $review{most_delayed_type} = $most_delayed->{type};
+ $review{most_delayed_delay_dep} = $most_delayed->{delay_dep};
+ $review{most_delayed_delay_arr} = $most_delayed->{delay_arr};
+ $review{most_delayed_lineno} = $most_delayed->{line}
// $most_delayed->{no};
$review{most_delayed_from} = $most_delayed->{from_name};
$review{most_delayed_to} = $most_delayed->{to_name};
@@ -1742,17 +1699,13 @@ sub compute_review {
}
if ($most_delay) {
- $review{most_delay_type} = $most_delay->{type};
- $review{most_delay_delay_dep} = $most_delay->{delay_dep};
- $review{most_delay_delay_arr} = $most_delay->{delay_arr};
- $review{most_delay_sched_time}
- = $self->min_to_human( $most_delay->{sched_duration} / 60 );
- $review{most_delay_real_time}
- = $self->min_to_human( $most_delay->{rt_duration} / 60 );
+ $review{most_delay_type} = $most_delay->{type};
+ $review{most_delay_delay_dep} = $most_delay->{delay_dep};
+ $review{most_delay_delay_arr} = $most_delay->{delay_arr};
+ $review{most_delay_sched_time} = $most_delay->{sched_duration} / 60;
+ $review{most_delay_real_time} = $most_delay->{rt_duration} / 60;
$review{most_delay_delta}
- = $self->min_to_human(
- ( $most_delay->{rt_duration} - $most_delay->{sched_duration} )
- / 60 );
+ = ( $most_delay->{rt_duration} - $most_delay->{sched_duration} ) / 60;
$review{most_delay_lineno} = $most_delay->{line} // $most_delay->{no};
$review{most_delay_from} = $most_delay->{from_name};
$review{most_delay_to} = $most_delay->{to_name};
@@ -1760,17 +1713,14 @@ sub compute_review {
}
if ($most_undelay) {
- $review{most_undelay_type} = $most_undelay->{type};
- $review{most_undelay_delay_dep} = $most_undelay->{delay_dep};
- $review{most_undelay_delay_arr} = $most_undelay->{delay_arr};
- $review{most_undelay_sched_time}
- = $self->min_to_human( $most_undelay->{sched_duration} / 60 );
- $review{most_undelay_real_time}
- = $self->min_to_human( $most_undelay->{rt_duration} / 60 );
+ $review{most_undelay_type} = $most_undelay->{type};
+ $review{most_undelay_delay_dep} = $most_undelay->{delay_dep};
+ $review{most_undelay_delay_arr} = $most_undelay->{delay_arr};
+ $review{most_undelay_sched_time} = $most_undelay->{sched_duration} / 60;
+ $review{most_undelay_real_time} = $most_undelay->{rt_duration} / 60;
$review{most_undelay_delta}
- = $self->min_to_human(
- ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} )
- / 60 );
+ = ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} )
+ / 60;
$review{most_undelay_lineno} = $most_undelay->{line}
// $most_undelay->{no};
$review{most_undelay_from} = $most_undelay->{from_name};