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 164-169
sub is_holiday {
Link Here
|
164 |
return 0; |
200 |
return 0; |
165 |
} |
201 |
} |
166 |
|
202 |
|
|
|
203 |
sub next_open_day { |
204 |
my ( $self, $dt ) = @_; |
205 |
my $base_date = $dt->clone(); |
206 |
|
207 |
$base_date->add(days => 1); |
208 |
|
209 |
while ($self->is_holiday($base_date)) { |
210 |
$base_date->add(days => 1); |
211 |
} |
212 |
|
213 |
return $base_date; |
214 |
} |
215 |
|
216 |
sub prev_open_day { |
217 |
my ( $self, $dt ) = @_; |
218 |
my $base_date = $dt->clone(); |
219 |
|
220 |
$base_date->add(days => -1); |
221 |
|
222 |
while ($self->is_holiday($base_date)) { |
223 |
$base_date->add(days => -1); |
224 |
} |
225 |
|
226 |
return $base_date; |
227 |
} |
228 |
|
167 |
sub days_between { |
229 |
sub days_between { |
168 |
my $self = shift; |
230 |
my $self = shift; |
169 |
my $start_dt = shift; |
231 |
my $start_dt = shift; |
Lines 273-281
This documentation refers to Koha::Calendar version 0.0.1
Link Here
|
273 |
|
335 |
|
274 |
=head1 SYNOPSIS |
336 |
=head1 SYNOPSIS |
275 |
|
337 |
|
276 |
use Koha::Calendat |
338 |
use Koha::Calendar |
277 |
|
339 |
|
278 |
my $c = Koha::Calender->new( branchcode => 'MAIN' ); |
340 |
my $c = Koha::Calendar->new( branchcode => 'MAIN' ); |
279 |
my $dt = DateTime->now(); |
341 |
my $dt = DateTime->now(); |
280 |
|
342 |
|
281 |
# are we open |
343 |
# are we open |
Lines 311-321
Currently unit is only used to invoke Staffs return Monday at 10 am rule this
Link Here
|
311 |
parameter will be removed when issuingrules properly cope with that |
373 |
parameter will be removed when issuingrules properly cope with that |
312 |
|
374 |
|
313 |
|
375 |
|
|
|
376 |
=head2 addHours |
377 |
|
378 |
my $dt = $calendar->addHours($date, $dur, $return_by_hour ) |
379 |
|
380 |
C<$date> is a DateTime object representing the starting date of the interval. |
381 |
|
382 |
C<$offset> is a DateTime::Duration to add to it |
383 |
|
384 |
C<$return_by_hour> is an integer value representing the opening hour for the branch |
385 |
|
386 |
|
387 |
=head2 addDays |
388 |
|
389 |
my $dt = $calendar->addDays($date, $dur) |
390 |
|
391 |
C<$date> is a DateTime object representing the starting date of the interval. |
392 |
|
393 |
C<$offset> is a DateTime::Duration to add to it |
394 |
|
395 |
C<$unit> is a string value 'days' or 'hours' toflag granularity of duration |
396 |
|
397 |
Currently unit is only used to invoke Staffs return Monday at 10 am rule this |
398 |
parameter will be removed when issuingrules properly cope with that |
399 |
|
400 |
|
314 |
=head2 is_holiday |
401 |
=head2 is_holiday |
315 |
|
402 |
|
316 |
$yesno = $calendar->is_holiday($dt); |
403 |
$yesno = $calendar->is_holiday($dt); |
317 |
|
404 |
|
318 |
passed at DateTime object returns 1 if it is a closed day |
405 |
passed a DateTime object returns 1 if it is a closed day |
319 |
0 if not according to the calendar |
406 |
0 if not according to the calendar |
320 |
|
407 |
|
321 |
=head2 days_between |
408 |
=head2 days_between |
Lines 326-331
Passed two dates returns a DateTime::Duration object measuring the length betwee
Link Here
|
326 |
ignoring closed days. Always returns a positive number irrespective of the |
413 |
ignoring closed days. Always returns a positive number irrespective of the |
327 |
relative order of the parameters |
414 |
relative order of the parameters |
328 |
|
415 |
|
|
|
416 |
=head2 next_open_day |
417 |
|
418 |
$datetime = $calendar->next_open_day($duedate_dt) |
419 |
|
420 |
Passed a Datetime returns another Datetime representing the next open day. It is |
421 |
intended for use to calculate the due date when useDaysMode syspref is set to either |
422 |
'Datedue' or 'Calendar'. |
423 |
|
424 |
=head2 prev_open_day |
425 |
|
426 |
$datetime = $calendar->prev_open_day($duedate_dt) |
427 |
|
428 |
Passed a Datetime returns another Datetime representing the previous open day. It is |
429 |
intended for use to calculate the due date when useDaysMode syspref is set to either |
430 |
'Datedue' or 'Calendar'. |
431 |
|
329 |
=head2 set_daysmode |
432 |
=head2 set_daysmode |
330 |
|
433 |
|
331 |
For testing only allows the calling script to change days mode |
434 |
For testing only allows the calling script to change days mode |