Bug 19919: Stop using paidfor altogether
[koha-equinox.git] / catalogue / moredetail.pl
index d883586..57647ed 100755 (executable)
@@ -1,58 +1,80 @@
 #!/usr/bin/perl
 
 # Copyright 2000-2003 Katipo Communications
+# parts copyright 2010 BibLibre
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-# $Id$
 
-use strict;
-require Exporter;
+use Modern::Perl;
 use C4::Koha;
-use CGI;
-use C4::Biblio;             # to use &GetBiblioItemData &GetItemsByBiblioitemnumber
+use CGI qw ( -utf8 );
+use HTML::Entities;
+use C4::Biblio;
+use C4::Items;
 use C4::Acquisition;
-use C4::Output;             # contains gettemplate
+use C4::Output;
 use C4::Auth;
-use C4::Date;
-use C4::Circulation;  # to use itemissues
+use C4::Serials;
+use C4::Search;                # enabled_staff_search_views
+
+use Koha::Acquisition::Booksellers;
+use Koha::AuthorisedValues;
+use Koha::Biblios;
+use Koha::DateUtils;
+use Koha::Items;
+use Koha::Patrons;
 
 my $query=new CGI;
 
-# FIXME  subject is not exported to the template?
-my $subject=$query->param('subject');
+my ($template, $loggedinuser, $cookie) = get_template_and_user(
+    {
+        template_name   => 'catalogue/moredetail.tt',
+        query           => $query,
+        type            => "intranet",
+        authnotrequired => 0,
+        flagsrequired   => { catalogue => 1 },
+    }
+);
 
-# if its a subject we need to use the subject.tmpl
-my ($template, $loggedinuser, $cookie) = get_template_and_user({
-    template_name   => ($subject? 'catalogue/subject.tmpl':
-                      'catalogue/moredetail.tmpl'),
-    query           => $query,
-    type            => "intranet",
-    authnotrequired => 0,
-    flagsrequired   => {catalogue => 1},
-    });
+if($query->cookie("holdfor")){ 
+    my $holdfor_patron = Koha::Patrons->find( $query->cookie("holdfor") );
+    $template->param(
+        holdfor => $query->cookie("holdfor"),
+        holdfor_surname => $holdfor_patron->surname,
+        holdfor_firstname => $holdfor_patron->firstname,
+        holdfor_cardnumber => $holdfor_patron->cardnumber,
+    );
+}
 
 # get variables
 
 my $biblionumber=$query->param('biblionumber');
+$biblionumber = HTML::Entities::encode($biblionumber);
 my $title=$query->param('title');
 my $bi=$query->param('bi');
-
-my $data=GetBiblioItemData($bi);
+$bi = $biblionumber unless $bi;
+my $itemnumber = $query->param('itemnumber');
+my $data = &GetBiblioData($biblionumber);
 my $dewey = $data->{'dewey'};
+my $showallitems = $query->param('showallitems');
+
+#coping with subscriptions
+my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
+
 # FIXME Dewey is a string, not a number, & we should use a function
 # $dewey =~ s/0+$//;
 # if ($dewey eq "000.") { $dewey = "";};
@@ -64,36 +86,214 @@ my $dewey = $data->{'dewey'};
 # $dewey=~ s/\.$//;
 # $data->{'dewey'}=$dewey;
 
-my @results;
+my $fw = GetFrameworkCode($biblionumber);
+my @all_items= GetItemsInfo($biblionumber);
+my @items;
+my $patron = Koha::Patrons->find( $loggedinuser );
+for my $itm (@all_items) {
+    push @items, $itm unless ( $itm->{itemlost} && 
+                               $patron->category->hidelostitems &&
+                               !$showallitems && 
+                               ($itemnumber != $itm->{itemnumber}));
+}
 
-my $items= GetItemsByBiblioitemnumber($bi);
-my $count=@$items;
-$data->{'count'}=$count;
+my $record=GetMarcBiblio({ biblionumber => $biblionumber });
 
-my $ordernum = GetOrderNumber($biblionumber,$bi);
-my $order = GetOrder($ordernum);
+output_and_exit( $query, $cookie, $template, 'unknown_biblio')
+    unless $record;
 
-$results[0]=$data;
+my $hostrecords;
+# adding items linked via host biblios
+my @hostitems = GetHostItemsInfo($record);
+if (@hostitems){
+        $hostrecords =1;
+        push (@items,@hostitems);
+}
 
-foreach my $item (@$items){
-    $item->{'replacementprice'}=sprintf("%.2f", $item->{'replacementprice'});
-    $item->{'datelastborrowed'}= format_date($item->{'datelastborrowed'});
-    $item->{'dateaccessioned'} = format_date($item->{'dateaccessioned'});
-    $item->{'datelastseen'} = format_date($item->{'datelastseen'});
-    $item->{'ordernumber'} = $ordernum;
-    $item->{'booksellerinvoicenumber'} = $order->{'booksellerinvoicenumber'};
+my $subtitle = GetRecordValue('subtitle', $record, $fw);
 
-    if ($item->{'date_due'} eq ''){
-        $item->{'issue'}= 0;
-    } else {
-        $item->{'date_due'} = format_date($item->{'date_due'});
+my $totalcount=@all_items;
+my $showncount=@items;
+my $hiddencount = $totalcount - $showncount;
+$data->{'count'}=$totalcount;
+$data->{'showncount'}=$showncount;
+$data->{'hiddencount'}=$hiddencount;  # can be zero
+
+my $ccodes =
+  { map { $_->{authorised_value} => $_->{lib} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $fw, kohafield => 'items.ccode' } ) };
+my $copynumbers =
+  { map { $_->{authorised_value} => $_->{lib} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $fw, kohafield => 'items.copynumber' } ) };
+
+my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } };
+
+$data->{'itemtypename'} = $itemtypes->{ $data->{'itemtype'} }->{'translated_description'}
+  if $data->{itemtype} && exists $itemtypes->{ $data->{itemtype} };
+foreach ( keys %{$data} ) {
+    $template->param( "$_" => defined $data->{$_} ? $data->{$_} : '' );
+}
+
+($itemnumber) and @items = (grep {$_->{'itemnumber'} == $itemnumber} @items);
+foreach my $item (@items){
+    $item->{object} = Koha::Items->find( $item->{itemnumber} );
+    $item->{'collection'}              = $ccodes->{ $item->{ccode} } if $ccodes && $item->{ccode} && exists $ccodes->{ $item->{ccode} };
+    $item->{'itype'}                   = $itemtypes->{ $item->{'itype'} }->{'translated_description'} if exists $itemtypes->{ $item->{'itype'} };
+    $item->{'replacementprice'}        = $item->{'replacementprice'};
+    if ( defined $item->{'copynumber'} ) {
+        $item->{'displaycopy'} = 1;
+        if ( defined $copynumbers->{ $item->{'copynumber'} } ) {
+            $item->{'copyvol'} = $copynumbers->{ $item->{'copynumber'} }
+        }
+        else {
+            $item->{'copyvol'} = $item->{'copynumber'};
+        }
+    }
+
+    # item has a host number if its biblio number does not match the current bib
+    if ($item->{biblionumber} ne $biblionumber){
+        $item->{hostbiblionumber} = $item->{biblionumber};
+        $item->{hosttitle} = GetBiblioData($item->{biblionumber})->{title};
+    }
+
+    my $order  = GetOrderFromItemnumber( $item->{'itemnumber'} );
+    $item->{'ordernumber'}             = $order->{'ordernumber'};
+    $item->{'basketno'}                = $order->{'basketno'};
+    $item->{'orderdate'}               = $order->{'entrydate'};
+    if ($item->{'basketno'}){
+           my $basket = GetBasket($item->{'basketno'});
+        my $bookseller = Koha::Acquisition::Booksellers->find( $basket->{booksellerid} );
+        $item->{'vendor'} = $bookseller->name;
+    }
+    $item->{'invoiceid'}               = $order->{'invoiceid'};
+    if($item->{invoiceid}) {
+        my $invoice = GetInvoice($item->{invoiceid});
+        $item->{invoicenumber} = $invoice->{invoicenumber} if $invoice;
+    }
+    $item->{'datereceived'}            = $order->{'datereceived'};
+
+    if ($item->{notforloantext} or $item->{itemlost} or $item->{damaged} or $item->{withdrawn}) {
+        $item->{status_advisory} = 1;
+    }
+
+    # Add paidfor info
+    if ( $item->{itemlost} ) {
+        my $accountlines = Koha::Account::Lines->search(
+            {
+                itemnumber        => $item->{itemnumber},
+                accounttype       => 'LOST',
+                status            => [ undef, { '<>' => 'RETURNED' } ],
+                amountoutstanding => 0
+            },
+            {
+                order_by => { '-desc' => 'date' },
+                rows     => 1
+            }
+        );
+
+        if ( my $accountline = $accountlines->next ) {
+            my $payment_offsets = Koha::Account::Offsets->search(
+                {
+                    debit_id  => $accountline->id,
+                    credit_id => { '!=' => undef }, # it is not the debit itself
+                    type => { '!=' => [ 'Writeoff', 'Forgiven' ] },
+                    amount => { '<' => 0 }    # credits are negative on the DB
+                },
+                { order_by => { '-desc' => 'created_on' } }
+            );
+
+            if ($payment_offsets->count) {
+                my $patron = $accountline->patron;
+                my $payment_offset = $payment_offsets->next;
+                $item->{paidfor} =
+                    $patron->firstname . " "
+                  . $patron->surname . " "
+                  . $patron->cardnumber . " "
+                  . $payment_offset->created_on;
+            }
+        }
+    }
+
+    if (C4::Context->preference("IndependentBranches")) {
+        #verifying rights
+        my $userenv = C4::Context->userenv();
+        unless (C4::Context->IsSuperLibrarian() or ($userenv->{'branch'} eq $item->{'homebranch'})) {
+                $item->{'nomod'}=1;
+        }
+    }
+    if ($item->{'datedue'}) {
         $item->{'issue'}= 1;
+    } else {
+        $item->{'issue'}= 0;
+    }
+
+    if ( $item->{'borrowernumber'} ) {
+        my $curr_borrower = Koha::Patrons->find( $item->{borrowernumber} );
+        $item->{patron} = $curr_borrower;
     }
 }
 
-$template->param(BIBITEM_DATA => \@results);
-$template->param(ITEM_DATA => $items);
-$template->param(loggedinuser => $loggedinuser);
+my $mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.itemlost', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] });
+if ( $mss->count ) {
+    $template->param( itemlostloop => GetAuthorisedValues( $mss->next->authorised_value ) );
+}
+$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.damaged', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] });
+if ( $mss->count ) {
+    $template->param( itemdamagedloop => GetAuthorisedValues( $mss->next->authorised_value ) );
+}
+$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.withdrawn', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] });
+if ( $mss->count ) {
+    $template->param( itemwithdrawnloop => GetAuthorisedValues( $mss->next->authorised_value) );
+}
+
+$template->param(count => $data->{'count'},
+       subscriptionsnumber => $subscriptionsnumber,
+    subscriptiontitle   => $data->{title},
+       C4::Search::enabled_staff_search_views,
+);
+
+$template->param(
+    ITEM_DATA           => \@items,
+    moredetailview      => 1,
+    loggedinuser        => $loggedinuser,
+    biblionumber        => $biblionumber,
+    biblioitemnumber    => $bi,
+    itemnumber          => $itemnumber,
+    z3950_search_params => C4::Search::z3950_search_args(GetBiblioData($biblionumber)),
+    subtitle            => $subtitle,
+);
+$template->param(ONLY_ONE => 1) if ( $itemnumber && $showncount != @items );
+$template->{'VARS'}->{'searchid'} = $query->param('searchid');
+
+my @allorders_using_biblio = GetOrdersByBiblionumber ($biblionumber);
+my @deletedorders_using_biblio;
+my @orders_using_biblio;
+my @baskets_orders;
+my @baskets_deletedorders;
+
+foreach my $myorder (@allorders_using_biblio) {
+    my $basket = $myorder->{'basketno'};
+    if ((defined $myorder->{'datecancellationprinted'}) and  ($myorder->{'datecancellationprinted'} ne '0000-00-00') ){
+        push @deletedorders_using_biblio, $myorder;
+        unless (grep(/^$basket$/, @baskets_deletedorders)){
+            push @baskets_deletedorders,$myorder->{'basketno'};
+        }
+    }
+    else {
+        push @orders_using_biblio, $myorder;
+        unless (grep(/^$basket$/, @baskets_orders)){
+            push @baskets_orders,$myorder->{'basketno'};
+            }
+    }
+}
+
+my $count_orders_using_biblio = scalar @orders_using_biblio ;
+$template->param (countorders => $count_orders_using_biblio);
+
+my $count_deletedorders_using_biblio = scalar @deletedorders_using_biblio ;
+$template->param (countdeletedorders => $count_deletedorders_using_biblio);
+
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+$template->param( holdcount => $holds->count );
 
 output_html_with_http_headers $query, $cookie, $template->output;