|
Lines 85-141
sub _init {
Link Here
|
| 85 |
|
85 |
|
| 86 |
sub addDate { |
86 |
sub addDate { |
| 87 |
my ( $self, $startdate, $add_duration, $unit ) = @_; |
87 |
my ( $self, $startdate, $add_duration, $unit ) = @_; |
| 88 |
my $base_date = $startdate->clone(); |
88 |
|
|
|
89 |
# Default to days duration (legacy support I guess) |
| 89 |
if ( ref $add_duration ne 'DateTime::Duration' ) { |
90 |
if ( ref $add_duration ne 'DateTime::Duration' ) { |
| 90 |
$add_duration = DateTime::Duration->new( days => $add_duration ); |
91 |
$add_duration = DateTime::Duration->new( days => $add_duration ); |
| 91 |
} |
92 |
} |
| 92 |
$unit ||= q{}; # default days ? |
93 |
|
| 93 |
my $days_mode = $self->{days_mode}; |
94 |
$unit ||= 'days'; # default days ? |
| 94 |
Readonly::Scalar my $return_by_hour => 10; |
95 |
my $dt; |
| 95 |
my $day_dur = DateTime::Duration->new( days => 1 ); |
96 |
|
| 96 |
if ( $add_duration->is_negative() ) { |
97 |
if ( $unit eq 'hours' ) { |
| 97 |
$day_dur = DateTime::Duration->new( days => -1 ); |
98 |
# Fixed for legacy support. Should be set as a branch parameter |
|
|
99 |
Readonly::Scalar my $return_by_hour => 10; |
| 100 |
|
| 101 |
$dt = $self->addHours($startdate, $add_duration, $return_by_hour); |
| 102 |
} else { |
| 103 |
# days |
| 104 |
$dt = $self->addDays($startdate, $add_duration); |
| 98 |
} |
105 |
} |
| 99 |
if ( $days_mode eq 'Datedue' ) { |
|
|
| 100 |
|
106 |
|
| 101 |
my $dt = $base_date + $add_duration; |
107 |
return $dt; |
| 102 |
while ( $self->is_holiday($dt) ) { |
108 |
} |
| 103 |
|
109 |
|
| 104 |
$dt->add_duration($day_dur); |
110 |
sub addHours { |
| 105 |
if ( $unit eq 'hours' ) { |
111 |
my ( $self, $startdate, $hours_duration, $return_by_hour ) = @_; |
| 106 |
$dt->set_hour($return_by_hour); # Staffs specific |
112 |
my $base_date = $startdate->clone(); |
| 107 |
} |
113 |
|
|
|
114 |
$base_date->add_duration($hours_duration); |
| 115 |
|
| 116 |
# If we are using the calendar behave for now as if Datedue |
| 117 |
# was the chosen option (current intended behaviour) |
| 118 |
|
| 119 |
if ( $self->{days_mode} ne 'Days' && |
| 120 |
$self->is_holiday($base_date) ) { |
| 121 |
|
| 122 |
if ( $hours_duration->is_negative() ) { |
| 123 |
$base_date = $self->prev_open_day($base_date); |
| 124 |
} else { |
| 125 |
$base_date = $self->next_open_day($base_date); |
| 108 |
} |
126 |
} |
| 109 |
return $dt; |
|
|
| 110 |
} elsif ( $days_mode eq 'Calendar' ) { |
| 111 |
if ( $unit eq 'hours' ) { |
| 112 |
$base_date->add_duration($add_duration); |
| 113 |
while ( $self->is_holiday($base_date) ) { |
| 114 |
$base_date->add_duration($day_dur); |
| 115 |
|
127 |
|
| 116 |
} |
128 |
$base_date->set_hour($return_by_hour); |
|
|
129 |
|
| 130 |
} |
| 131 |
|
| 132 |
return $base_date; |
| 133 |
} |
| 117 |
|
134 |
|
|
|
135 |
sub addDays { |
| 136 |
my ( $self, $startdate, $days_duration ) = @_; |
| 137 |
my $base_date = $startdate->clone(); |
| 138 |
|
| 139 |
if ( $self->{days_mode} eq 'Calendar' ) { |
| 140 |
# use the calendar to skip all days the library is closed |
| 141 |
# when adding |
| 142 |
my $days = abs $days_duration->in_units('days'); |
| 143 |
|
| 144 |
if ( $days_duration->is_negative() ) { |
| 145 |
while ($days) { |
| 146 |
$base_date = $self->prev_open_day($base_date); |
| 147 |
--$days; |
| 148 |
} |
| 118 |
} else { |
149 |
} else { |
| 119 |
my $days = abs $add_duration->in_units('days'); |
|
|
| 120 |
while ($days) { |
150 |
while ($days) { |
| 121 |
$base_date->add_duration($day_dur); |
151 |
$base_date = $self->next_open_day($base_date); |
| 122 |
if ( $self->is_holiday($base_date) ) { |
152 |
--$days; |
| 123 |
next; |
|
|
| 124 |
} else { |
| 125 |
--$days; |
| 126 |
} |
| 127 |
} |
153 |
} |
| 128 |
} |
154 |
} |
| 129 |
if ( $unit eq 'hours' ) { |
155 |
|
| 130 |
my $dt = $base_date->clone()->subtract( days => 1 ); |
156 |
} else { # Days or Datedue |
| 131 |
if ( $self->is_holiday($dt) ) { |
157 |
# use straight days, then use calendar to push |
| 132 |
$base_date->set_hour($return_by_hour); # Staffs specific |
158 |
# the date to the next open day if Datedue |
|
|
159 |
$base_date->add_duration($days_duration); |
| 160 |
|
| 161 |
if ( $self->{days_mode} eq 'Datedue' ) { |
| 162 |
# Datedue, then use the calendar to push |
| 163 |
# the date to the next open day if holiday |
| 164 |
if ( $self->is_holiday($base_date) ) { |
| 165 |
if ( $days_duration->is_negative() ) { |
| 166 |
$base_date = $self->prev_open_day($base_date); |
| 167 |
} else { |
| 168 |
$base_date = $self->next_open_day($base_date); |
| 169 |
} |
| 133 |
} |
170 |
} |
| 134 |
} |
171 |
} |
| 135 |
return $base_date; |
|
|
| 136 |
} else { # Days |
| 137 |
return $base_date + $add_duration; |
| 138 |
} |
172 |
} |
|
|
173 |
|
| 174 |
return $base_date; |
| 139 |
} |
175 |
} |
| 140 |
|
176 |
|
| 141 |
sub is_holiday { |
177 |
sub is_holiday { |
|
Lines 165-170
sub is_holiday {
Link Here
|
| 165 |
return 0; |
201 |
return 0; |
| 166 |
} |
202 |
} |
| 167 |
|
203 |
|
|
|
204 |
sub next_open_day { |
| 205 |
my ( $self, $dt ) = @_; |
| 206 |
my $base_date = $dt->clone(); |
| 207 |
|
| 208 |
$base_date->add(days => 1); |
| 209 |
|
| 210 |
while ($self->is_holiday($base_date)) { |
| 211 |
$base_date->add(days => 1); |
| 212 |
} |
| 213 |
|
| 214 |
return $base_date; |
| 215 |
} |
| 216 |
|
| 217 |
sub prev_open_day { |
| 218 |
my ( $self, $dt ) = @_; |
| 219 |
my $base_date = $dt->clone(); |
| 220 |
|
| 221 |
$base_date->add(days => -1); |
| 222 |
|
| 223 |
while ($self->is_holiday($base_date)) { |
| 224 |
$base_date->add(days => -1); |
| 225 |
} |
| 226 |
|
| 227 |
return $base_date; |
| 228 |
} |
| 229 |
|
| 168 |
sub days_between { |
230 |
sub days_between { |
| 169 |
my $self = shift; |
231 |
my $self = shift; |
| 170 |
my $start_dt = shift; |
232 |
my $start_dt = shift; |
|
Lines 274-282
This documentation refers to Koha::Calendar version 0.0.1
Link Here
|
| 274 |
|
336 |
|
| 275 |
=head1 SYNOPSIS |
337 |
=head1 SYNOPSIS |
| 276 |
|
338 |
|
| 277 |
use Koha::Calendat |
339 |
use Koha::Calendar |
| 278 |
|
340 |
|
| 279 |
my $c = Koha::Calender->new( branchcode => 'MAIN' ); |
341 |
my $c = Koha::Calendar->new( branchcode => 'MAIN' ); |
| 280 |
my $dt = DateTime->now(); |
342 |
my $dt = DateTime->now(); |
| 281 |
|
343 |
|
| 282 |
# are we open |
344 |
# are we open |
|
Lines 312-322
Currently unit is only used to invoke Staffs return Monday at 10 am rule this
Link Here
|
| 312 |
parameter will be removed when issuingrules properly cope with that |
374 |
parameter will be removed when issuingrules properly cope with that |
| 313 |
|
375 |
|
| 314 |
|
376 |
|
|
|
377 |
=head2 addHours |
| 378 |
|
| 379 |
my $dt = $calendar->addHours($date, $dur, $return_by_hour ) |
| 380 |
|
| 381 |
C<$date> is a DateTime object representing the starting date of the interval. |
| 382 |
|
| 383 |
C<$offset> is a DateTime::Duration to add to it |
| 384 |
|
| 385 |
C<$return_by_hour> is an integer value representing the opening hour for the branch |
| 386 |
|
| 387 |
|
| 388 |
=head2 addDays |
| 389 |
|
| 390 |
my $dt = $calendar->addDays($date, $dur) |
| 391 |
|
| 392 |
C<$date> is a DateTime object representing the starting date of the interval. |
| 393 |
|
| 394 |
C<$offset> is a DateTime::Duration to add to it |
| 395 |
|
| 396 |
C<$unit> is a string value 'days' or 'hours' toflag granularity of duration |
| 397 |
|
| 398 |
Currently unit is only used to invoke Staffs return Monday at 10 am rule this |
| 399 |
parameter will be removed when issuingrules properly cope with that |
| 400 |
|
| 401 |
|
| 315 |
=head2 is_holiday |
402 |
=head2 is_holiday |
| 316 |
|
403 |
|
| 317 |
$yesno = $calendar->is_holiday($dt); |
404 |
$yesno = $calendar->is_holiday($dt); |
| 318 |
|
405 |
|
| 319 |
passed at DateTime object returns 1 if it is a closed day |
406 |
passed a DateTime object returns 1 if it is a closed day |
| 320 |
0 if not according to the calendar |
407 |
0 if not according to the calendar |
| 321 |
|
408 |
|
| 322 |
=head2 days_between |
409 |
=head2 days_between |
|
Lines 327-332
Passed two dates returns a DateTime::Duration object measuring the length betwee
Link Here
|
| 327 |
ignoring closed days. Always returns a positive number irrespective of the |
414 |
ignoring closed days. Always returns a positive number irrespective of the |
| 328 |
relative order of the parameters |
415 |
relative order of the parameters |
| 329 |
|
416 |
|
|
|
417 |
=head2 next_open_day |
| 418 |
|
| 419 |
$datetime = $calendar->next_open_day($duedate_dt) |
| 420 |
|
| 421 |
Passed a Datetime returns another Datetime representing the next open day. It is |
| 422 |
intended for use to calculate the due date when useDaysMode syspref is set to either |
| 423 |
'Datedue' or 'Calendar'. |
| 424 |
|
| 425 |
=head2 prev_open_day |
| 426 |
|
| 427 |
$datetime = $calendar->prev_open_day($duedate_dt) |
| 428 |
|
| 429 |
Passed a Datetime returns another Datetime representing the previous open day. It is |
| 430 |
intended for use to calculate the due date when useDaysMode syspref is set to either |
| 431 |
'Datedue' or 'Calendar'. |
| 432 |
|
| 330 |
=head2 set_daysmode |
433 |
=head2 set_daysmode |
| 331 |
|
434 |
|
| 332 |
For testing only allows the calling script to change days mode |
435 |
For testing only allows the calling script to change days mode |