+
+=head2 GetPendingOnSiteCheckouts
+
+=cut
+
+sub GetPendingOnSiteCheckouts {
+ my $dbh = C4::Context->dbh;
+ return $dbh->selectall_arrayref(q|
+ SELECT
+ items.barcode,
+ items.biblionumber,
+ items.itemnumber,
+ items.itemnotes,
+ items.itemcallnumber,
+ items.location,
+ issues.date_due,
+ issues.branchcode,
+ issues.date_due < NOW() AS is_overdue,
+ biblio.author,
+ biblio.title,
+ borrowers.firstname,
+ borrowers.surname,
+ borrowers.cardnumber,
+ borrowers.borrowernumber
+ FROM items
+ LEFT JOIN issues ON items.itemnumber = issues.itemnumber
+ LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber
+ LEFT JOIN borrowers ON issues.borrowernumber = borrowers.borrowernumber
+ WHERE issues.onsite_checkout = 1
+ |, { Slice => {} } );
+}
+
+sub GetTopIssues {
+ my ($params) = @_;
+
+ my ($count, $branch, $itemtype, $ccode, $newness)
+ = @$params{qw(count branch itemtype ccode newness)};
+
+ my $dbh = C4::Context->dbh;
+ my $query = q{
+ SELECT b.biblionumber, b.title, b.author, bi.itemtype, bi.publishercode,
+ bi.place, bi.publicationyear, b.copyrightdate, bi.pages, bi.size,
+ i.ccode, SUM(i.issues) AS count
+ FROM biblio b
+ LEFT JOIN items i ON (i.biblionumber = b.biblionumber)
+ LEFT JOIN biblioitems bi ON (bi.biblionumber = b.biblionumber)
+ };
+
+ my (@where_strs, @where_args);
+
+ if ($branch) {
+ push @where_strs, 'i.homebranch = ?';
+ push @where_args, $branch;
+ }
+ if ($itemtype) {
+ if (C4::Context->preference('item-level_itypes')){
+ push @where_strs, 'i.itype = ?';
+ push @where_args, $itemtype;
+ } else {
+ push @where_strs, 'bi.itemtype = ?';
+ push @where_args, $itemtype;
+ }
+ }
+ if ($ccode) {
+ push @where_strs, 'i.ccode = ?';
+ push @where_args, $ccode;
+ }
+ if ($newness) {
+ push @where_strs, 'TO_DAYS(NOW()) - TO_DAYS(b.datecreated) <= ?';
+ push @where_args, $newness;
+ }
+
+ if (@where_strs) {
+ $query .= 'WHERE ' . join(' AND ', @where_strs);
+ }
+
+ $query .= q{
+ GROUP BY b.biblionumber
+ HAVING count > 0
+ ORDER BY count DESC
+ };
+
+ $count = int($count);
+ if ($count > 0) {
+ $query .= "LIMIT $count";
+ }
+
+ my $rows = $dbh->selectall_arrayref($query, { Slice => {} }, @where_args);
+
+ return @$rows;
+}
+
+sub _CalculateAndUpdateFine {
+ my ($params) = @_;
+
+ my $borrower = $params->{borrower};
+ my $item = $params->{item};
+ my $issue = $params->{issue};
+ my $return_date = $params->{return_date};
+
+ unless ($borrower) { carp "No borrower passed in!" && return; }
+ unless ($item) { carp "No item passed in!" && return; }
+ unless ($issue) { carp "No issue passed in!" && return; }
+
+ my $datedue = $issue->{date_due};
+
+ # we only need to calculate and change the fines if we want to do that on return
+ # Should be on for hourly loans
+ my $control = C4::Context->preference('CircControl');
+ my $control_branchcode =
+ ( $control eq 'ItemHomeLibrary' ) ? $item->{homebranch}
+ : ( $control eq 'PatronLibrary' ) ? $borrower->{branchcode}
+ : $issue->{branchcode};
+
+ my $date_returned = $return_date ? dt_from_string($return_date) : dt_from_string();
+
+ my ( $amount, $type, $unitcounttotal ) =
+ C4::Overdues::CalcFine( $item, $borrower->{categorycode}, $control_branchcode, $datedue, $date_returned );
+
+ $type ||= q{};
+
+ if ( C4::Context->preference('finesMode') eq 'production' ) {
+ if ( $amount > 0 ) {
+ C4::Overdues::UpdateFine({
+ issue_id => $issue->{issue_id},
+ itemnumber => $issue->{itemnumber},
+ borrowernumber => $issue->{borrowernumber},
+ amount => $amount,
+ type => $type,
+ due => output_pref($datedue),
+ });
+ }
+ elsif ($return_date) {
+
+ # Backdated returns may have fines that shouldn't exist,
+ # so in this case, we need to drop those fines to 0
+
+ C4::Overdues::UpdateFine({
+ issue_id => $issue->{issue_id},
+ itemnumber => $issue->{itemnumber},
+ borrowernumber => $issue->{borrowernumber},
+ amount => 0,
+ type => $type,
+ due => output_pref($datedue),
+ });
+ }
+ }
+}
+