View | Details | Raw Unified | Return to bug 17983
Collapse All | Expand All

(-)a/Koha/DiscreteCalendar.pm (-1 / +94 lines)
Lines 1176-1181 sub open_hours_between { Link Here
1176
    return ($working_hours_between->next()->get_column('hours_between') - $not_used_hours->next()->get_column('not_used_hours'));
1176
    return ($working_hours_between->next()->get_column('hours_between') - $not_used_hours->next()->get_column('not_used_hours'));
1177
}
1177
}
1178
1178
1179
=head2 open_minutes_between
1180
1181
  $minutes = $calendar->open_minutes_between($start_date, $end_date)
1182
1183
Returns the number of minutes between C<$start_date> and C<$end_date>, taking into
1184
account the opening hours of the library.
1185
1186
=cut
1187
1188
sub open_minutes_between {
1189
    my ($self, $start_date, $end_date) = @_;
1190
    my $branchcode = $self->{branchcode};
1191
    my $schema = Koha::Database->new->schema;
1192
    my $dtf = $schema->storage->datetime_parser;
1193
    $start_date = $dtf->format_datetime($start_date);
1194
    $end_date = $dtf->format_datetime($end_date);
1195
1196
    my $working_minutes_between = $schema->resultset('DiscreteCalendar')->search(
1197
        {
1198
            branchcode  => $branchcode,
1199
            isopened    => 1,
1200
        },
1201
        {
1202
            select  => \['sum(time_to_sec(timediff(closehour, openhour)) / 60)'],
1203
            as      => [qw /minutes_between/],
1204
            where   => \['date BETWEEN DATE(?) AND DATE(?)', $start_date, $end_date]
1205
        }
1206
    );
1207
1208
    my $loan_day = $schema->resultset('DiscreteCalendar')->search(
1209
        {
1210
            branchcode  => $branchcode,
1211
        },
1212
        {
1213
            where       => \['date = DATE(?)', $start_date],
1214
        }
1215
    );
1216
1217
    my $return_day = $schema->resultset('DiscreteCalendar')->search(
1218
        {
1219
            branchcode  => $branchcode,
1220
        },
1221
        {
1222
            where       => \['date = DATE(?)', $end_date],
1223
        }
1224
    );
1225
1226
    #Capture the time portion of the date
1227
    $start_date =~ /\s(.*)/;
1228
    my $loan_date_time = $1;
1229
    $end_date =~ /\s(.*)/;
1230
    my $return_date_time = $1;
1231
1232
    my $not_used_minutes = $schema->resultset('DiscreteCalendar')->search(
1233
        {
1234
            branchcode  => $branchcode,
1235
            isopened    => 1,
1236
        },
1237
        {
1238
            select  => \[ '(time_to_sec(timediff(?, ?)) + time_to_sec(timediff(?, ?)) ) / 60', $return_day->next()->closehour(), $return_date_time, $loan_date_time, $loan_day->next()->openhour()],
1239
            as      => [qw /not_used_minutes/],
1240
        }
1241
    );
1242
1243
    return DateTime::Duration->new( minutes => $working_minutes_between->next()->get_column('minutes_between') - $not_used_minutes->next()->get_column('not_used_minutes'));
1244
}
1245
1179
=head2 addDate
1246
=head2 addDate
1180
1247
1181
  my $dt = $calendar->addDate($date, $dur, $unit)
1248
  my $dt = $calendar->addDate($date, $dur, $unit)
Lines 1202-1207 sub addDate { Link Here
1202
        my $return_by_hour = 10;
1269
        my $return_by_hour = 10;
1203
1270
1204
        $dt = $self->addHours($startdate, $add_duration, $return_by_hour);
1271
        $dt = $self->addHours($startdate, $add_duration, $return_by_hour);
1272
    } elsif($unit eq 'minutes') {
1273
        $dt = $self->addMinutes($startdate, $add_duration);
1205
    } else {
1274
    } else {
1206
        # days
1275
        # days
1207
        $dt = $self->addDays($startdate, $add_duration);
1276
        $dt = $self->addDays($startdate, $add_duration);
Lines 1244-1249 sub addHours { Link Here
1244
    return $base_date;
1313
    return $base_date;
1245
}
1314
}
1246
1315
1316
=head2 addMinutes
1317
1318
  $end = $calendar->addMinutes($date, $dur)
1319
1320
Add C<$dur> minutes to C<$start> date.
1321
1322
=cut
1323
1324
sub addMinutes {
1325
    my ( $self, $startdate, $minutes_duration) = @_;
1326
    my $base_date = $startdate->clone();
1327
1328
    $base_date->add_duration($minutes_duration);
1329
1330
    my $dateInfo = $self->get_date_info($base_date);
1331
1332
    my $close_datetime = dt_from_string($dateInfo->{date} ." ". $dateInfo->{closehour}, 'iso');
1333
1334
    if(DateTime->compare($base_date, $close_datetime) > 0) {
1335
        return $close_datetime;
1336
    }
1337
1338
    return $base_date;
1339
}
1340
1247
=head2 addDays
1341
=head2 addDays
1248
1342
1249
  $date = $calendar->addDays($start, $duration)
1343
  $date = $calendar->addDays($start, $duration)
1250
- 

Return to bug 17983