App-Dochazka-REST
view release on metacpan or search on metacpan
lib/App/Dochazka/REST/Model/Interval.pm view on Meta::CPAN
# check how many intervals we are talking about here
$status = select_single(
conn => $conn,
sql => $site->SQL_INTERVAL_SELECT_COUNT_BY_EID_AND_TSRANGE,
keys => [ $eid, $tsrange, $site->DOCHAZKA_INTERVAL_SELECT_LIMIT ],
);
return $status unless $status->ok;
# $status->payload contains [ $count ]
my $count = $status->payload->[0];
# if it's greater than or equal to the limit, no go
return $CELL->status_err( 'DOCHAZKA_INTERVAL_DELETE_LIMIT_EXCEEDED', args => [ $count ] )
if $count >= $site->DOCHAZKA_INTERVAL_DELETE_LIMIT;
return cud_generic(
conn => $conn,
eid => $eid,
sql => $site->SQL_INTERVAL_DELETE_BY_EID_AND_TSRANGE,
bind_params => [ $eid, $tsrange ],
);
}
=head2 generate_interval_summary
Given DBIx::Connector object, EID, and tsrange, generate a hash keyed on
dates (YYYY-MM-DD) in the range. The value of each key/date is another
hash keyed on activity codes. For each activity code the value is the
total number of hours spent by the employee doing that activity on the day
in question.
The interval must start and end on a day boundary (i.e. 00:00 or 24:00)
and partial intervals are treated the same as whole intervals.
=cut
sub generate_interval_summary {
my ( $conn, $eid, $tsrange ) = validate_pos( @_,
{ isa => 'DBIx::Connector' },
{ type => SCALAR },
{ type => SCALAR },
);
my $status = canonicalize_tsrange( $conn, $tsrange );
return $status unless $status->ok;
my $canon_tsrange = $status->payload;
$log->debug( "generate_interval_summary: $canon_tsrange" );
# convert canonicalized tsrange into begin, end dates
$status = tsrange_to_dates_and_times( $canon_tsrange );
return $status unless $status->ok;
# extract the beginning/ending dates/times
my $pl = $status->payload;
my $begin_date = $pl->{begin}->[0];
my $begin_time = $pl->{begin}->[1];
my $end_date = $pl->{end}->[0];
my $end_time = $pl->{end}->[1];
# interval must begin and end at 00:00/24:00,
# otherwise no game
return $CELL->status_err( 'DISPATCH_SUMMARY_ILLEGAL_TSRANGE' ) unless
( $begin_time eq '00:00' or $begin_time eq '24:00' ) and
( $end_time eq '00:00' or $end_time eq '24:00' );
# get list of dates in range
my $date_hash = holidays_and_weekends( begin => $begin_date, end => $end_date );
# get intervals for each date
foreach my $date ( keys %$date_hash ) {
my $status = fetch_intervals_by_eid_and_tsrange(
$conn,
$eid,
"[ $date 00:00, $date 24:00 )",
);
if ( $status->ok and $status->code eq 'DISPATCH_RECORDS_FOUND' ) {
map { $date_hash
->{ $date }
->{ code_by_aid( $conn, $_->aid ) } += calculate_hours( $_->intvl )
} ( @{ $status->payload } );
} elsif ( $status->level eq 'NOTICE' and $status->code eq 'DISPATCH_NO_RECORDS_FOUND' ) {
# do nothing
} else {
return $CELL->status_crit(
'DISPATCH_SUMMARY_UNEXPECTED_FAILURE',
payload => $status->text
);
}
}
return $CELL->status_ok( 'DISPATCH_SUMMARY_OK', payload => $date_hash );
}
=head1 AUTHOR
Nathan Cutler, C<< <presnypreklad@gmail.com> >>
=cut
1;
( run in 2.346 seconds using v1.01-cache-2.11-cpan-63c85eba8c4 )