aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/DateRange.pm
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-03-01 13:52:44 +0000
committerMatthew Somerville <matthew-github@dracos.co.uk>2019-03-04 12:54:47 +0000
commitf79e03c914d28c0c3bb2a05b7e38ddfdf1fce54f (patch)
tree0171116a67039fbe835973a1b569884f4178b6eb /perllib/FixMyStreet/DateRange.pm
parent86827c23436fef52b6b38d3fbc357fb0bf20f0c6 (diff)
Add DateRange class.
This simplifies the places where a date range is used; it also makes Dashboard date parsing more flexible.
Diffstat (limited to 'perllib/FixMyStreet/DateRange.pm')
-rw-r--r--perllib/FixMyStreet/DateRange.pm72
1 files changed, 72 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/DateRange.pm b/perllib/FixMyStreet/DateRange.pm
new file mode 100644
index 000000000..bc4f4e1af
--- /dev/null
+++ b/perllib/FixMyStreet/DateRange.pm
@@ -0,0 +1,72 @@
+package FixMyStreet::DateRange;
+
+use DateTime;
+use DateTime::Format::Flexible;
+use Moo;
+use Try::Tiny;
+
+my $one_day = DateTime::Duration->new( days => 1 );
+
+has start_date => ( is => 'ro' );
+
+has start_default => ( is => 'ro' );
+
+has end_date => ( is => 'ro' );
+
+has parser => (
+ is => 'ro',
+ default => sub { DateTime::Format::Flexible->new }
+);
+
+has formatter => (
+ is => 'lazy',
+ default => sub {
+ my $self = shift;
+ return $self->parser;
+ }
+);
+
+sub _dt {
+ my ($self, $date) = @_;
+ my %params;
+ $params{european} = 1 if $self->parser->isa('DateTime::Format::Flexible');
+ my $d = try {
+ $self->parser->parse_datetime($date, %params)
+ };
+ return $d;
+}
+
+sub start {
+ my $self = shift;
+ $self->_dt($self->start_date) || $self->start_default
+}
+
+sub end {
+ my $self = shift;
+ my $d = $self->_dt($self->end_date);
+ $d += $one_day if $d;
+ return $d;
+}
+
+sub _formatted {
+ my ($self, $dt) = @_;
+ return unless $dt;
+ $self->formatter->format_datetime($dt);
+}
+
+sub start_formatted { $_[0]->_formatted($_[0]->start) }
+sub end_formatted { $_[0]->_formatted($_[0]->end) }
+
+sub sql {
+ my ($self, $default) = @_;
+ my $sql = {};
+ if (my $start = $self->start_formatted) {
+ $sql->{'>='} = $start;
+ }
+ if (my $end = $self->end_formatted) {
+ $sql->{'<'} = $end;
+ }
+ return $sql;
+}
+
+1;