diff options
Diffstat (limited to 'rt/lib')
-rw-r--r-- | rt/lib/RT/Date.pm | 52 | ||||
-rw-r--r-- | rt/lib/RT/Tickets_Overlay.pm | 21 |
2 files changed, 68 insertions, 5 deletions
diff --git a/rt/lib/RT/Date.pm b/rt/lib/RT/Date.pm index fc4c43ce4..2c7a6b66f 100644 --- a/rt/lib/RT/Date.pm +++ b/rt/lib/RT/Date.pm @@ -273,6 +273,39 @@ sub SetToMidnight { return $self->Unix( $new ); } +=head2 SetToStart PERIOD[, Timezone => 'utc' ] + +Set to the beginning of the current PERIOD, which can be +"year", "month", "day", "hour", or "minute". + +=cut + +sub SetToStart { + my $self = shift; + my $p = uc(shift); + my %args = @_; + my $tz = $args{'Timezone'} || ''; + my @localtime = $self->Localtime($tz); + + # This is the cleanest way to implement it, I swear. + { + $localtime[0]=0; + last if ($p eq 'MINUTE'); + $localtime[1]=0; + last if ($p eq 'HOUR'); + $localtime[2]=0; + last if ($p eq 'DAY'); + $localtime[3]=1; + last if ($p eq 'MONTH'); + $localtime[4]=0; + last if ($p eq 'YEAR'); + $RT::Logger->warning("Couldn't find start date of '$p'."); + return; + } + my $new = $self->Timelocal($tz, @localtime); + return $self->Unix($new); +} + =head2 Diff Takes either an C<RT::Date> object or the date in unixtime format as a string, @@ -479,6 +512,25 @@ Adds 24 hours to the current time. Returns new unix time. sub AddDay { return $_[0]->AddSeconds($DAY) } +=head2 AddMonth + +Adds one month to the current time. Returns new +unix time. + +=cut + +sub AddMonth { + require Time::ParseDate; + my $self = shift; + my $date = ( + Time::ParseDate::parsedate( + '1 month', + NOW => $self->Unix + ) + ); + return $self->Unix($date); +} + =head2 Unix [unixtime] Optionally takes a date in unix seconds since the epoch format. diff --git a/rt/lib/RT/Tickets_Overlay.pm b/rt/lib/RT/Tickets_Overlay.pm index 89d64c557..e3658fee6 100644 --- a/rt/lib/RT/Tickets_Overlay.pm +++ b/rt/lib/RT/Tickets_Overlay.pm @@ -539,11 +539,22 @@ sub _DateFieldLimit { # if we're specifying =, that means we want everything on a # particular single day. in the database, we need to check for > # and < the edges of that day. - - $date->SetToMidnight( Timezone => 'server' ); - my $daystart = $date->ISO; - $date->AddDay; - my $dayend = $date->ISO; + + my ($daystart, $dayend); + if ( lc($value) eq 'this month' ) { + # special case: > and < the edges of this month + $date->SetToNow; + $date->SetToStart('month'); + $daystart = $date->ISO; + $date->AddMonth; + $dayend = $date->ISO; + } + else { + $date->SetToMidnight( Timezone => 'server' ); + $daystart = $date->ISO; + $date->AddDay; + $dayend = $date->ISO; + } $sb->_OpenParen; |