X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=acqui%2Fparcels.pl;h=3565d6d0337d104f850159d346954234ff35807f;hb=5d6c092921919526ade501facb1220f8a108a08f;hp=d4dee4b9b503ac543c82b2ebdcbc87b1824541ba;hpb=a7d1ef6dff0a31ceda59dbc965c24acb459f277f;p=koha_fer diff --git a/acqui/parcels.pl b/acqui/parcels.pl index d4dee4b9b5..3565d6d033 100755 --- a/acqui/parcels.pl +++ b/acqui/parcels.pl @@ -2,10 +2,10 @@ #script to show display basket of orders -#written by chris@katipo.co.nz 24/2/2000 # Copyright 2000-2002 Katipo Communications +# Copyright 2008-2009 BibLibre SARL # # This file is part of Koha. # @@ -18,15 +18,16 @@ # 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. =head1 NAME parcels.pl =head1 DESCRIPTION + This script shows all orders/parcels receipt or pending for a given supplier. It allows to write an order/parcels as 'received' when he arrives. @@ -34,26 +35,31 @@ It allows to write an order/parcels as 'received' when he arrives. =over 4 -=item supplierid +=item booksellerid + To know the supplier this script has to show orders. =item orderby + sort list of order by 'orderby'. Orderby can be equals to * datereceived desc (default value) - * aqorders.booksellerinvoicenumber + * invoicenumber * datereceived - * aqorders.booksellerinvoicenumber desc + * invoicenumber desc =item filter =item datefrom + To filter on date =item dateto + To filter on date =item resultsperpage + To know how many results have to be display / page. =back @@ -61,108 +67,189 @@ To know how many results have to be display / page. =cut use strict; +use warnings; use CGI; use C4::Auth; use C4::Output; -use C4::Dates; - +use C4::Dates qw/format_date/; use C4::Acquisition; -use C4::Bookseller; - -my $input=new CGI; -my $supplierid=$input->param('supplierid'); -my $order=$input->param('orderby') || "datereceived desc"; -my $startfrom=$input->param('startfrom'); -my $code=$input->param('filter'); -my $datefrom=$input->param('datefrom'); -my $dateto=$input->param('dateto'); +use C4::Bookseller qw/ GetBookSellerFromId /; +use C4::Budgets; + +my $input = CGI->new; +my $booksellerid = $input->param('booksellerid'); +my $order = $input->param('orderby') || 'shipmentdate desc'; +my $startfrom = $input->param('startfrom'); +my $code = $input->param('filter'); +my $datefrom = $input->param('datefrom'); +my $dateto = $input->param('dateto'); my $resultsperpage = $input->param('resultsperpage'); +my $op = $input->param('op'); +$resultsperpage ||= 20; + +our ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user( + { template_name => 'acqui/parcels.tmpl', + query => $input, + type => 'intranet', + authnotrequired => 0, + flagsrequired => { acquisition => 'order_receive' }, + debug => 1, + } +); + +my $invoicenumber = $input->param('invoice'); +my $shipmentdate = $input->param('shipmentdate'); +my $shipmentcost = $input->param('shipmentcost'); +my $shipmentcost_budgetid = $input->param('shipmentcost_budgetid'); +if($shipmentdate) { + $shipmentdate = C4::Dates->new($shipmentdate)->output('iso'); +} -my @booksellers=GetBookSeller($supplierid); -my $count = scalar @booksellers; +if ( $op and $op eq 'new' ) { + if ( C4::Context->preference('AcqWarnOnDuplicateInvoice') ) { + my @invoices = GetInvoices( + supplierid => $booksellerid, + invoicenumber => $invoicenumber, + ); + if ( scalar @invoices > 0 ) { + $template->{'VARS'}->{'duplicate_invoices'} = \@invoices; + $template->{'VARS'}->{'invoicenumber'} = $invoicenumber; + $template->{'VARS'}->{'shipmentdate'} = $shipmentdate; + $template->{'VARS'}->{'shipmentcost'} = $shipmentcost; + $template->{'VARS'}->{'shipmentcost_budgetid'} = + $shipmentcost_budgetid; + } + } + $op = 'confirm' unless $template->{'VARS'}->{'duplicate_invoices'}; +} +if ($op and $op eq 'confirm') { + my $invoiceid = AddInvoice( + invoicenumber => $invoicenumber, + booksellerid => $booksellerid, + shipmentdate => $shipmentdate, + shipmentcost => $shipmentcost, + shipmentcost_budgetid => $shipmentcost_budgetid, + ); + if(defined $invoiceid) { + # Successful 'Add' + print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid"); + exit 0; + } else { + $template->param(error_failed_to_create_invoice => 1); + } +} -my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "acqui/parcels.tmpl", - query => $input, - type => "intranet", - authnotrequired => 0, - flagsrequired => {acquisition => 1}, - debug => 1, -}); +my $bookseller = GetBookSellerFromId($booksellerid); +my @parcels = GetInvoices( + supplierid => $booksellerid, + invoicenumber => $code, + shipmentdatefrom => $datefrom, + shipmentdateto => $dateto, + order_by => $order +); +my $count_parcels = @parcels; +# multi page display gestion +$startfrom ||= 0; +if ( $count_parcels > $resultsperpage ) { + set_page_navigation( $count_parcels, $startfrom, $resultsperpage ); +} +my $loopres = []; + +my $next_page_start = $startfrom + $resultsperpage; +my $last_row = ( $next_page_start < $count_parcels ) ? $next_page_start - 1 : $count_parcels - 1; +for my $i ( $startfrom .. $last_row) { + my $p = $parcels[$i]; + + push @{$loopres}, + { number => $i + 1, + invoiceid => $p->{invoiceid}, + code => $p->{invoicenumber}, + nullcode => $p->{invoicenumber} eq 'NULL', + emptycode => $p->{invoicenumber} eq q{}, + raw_datereceived => $p->{shipmentdate}, + datereceived => $p->{shipmentdate}, + bibcount => $p->{receivedbiblios} || 0, + reccount => $p->{receiveditems} || 0, + itemcount => $p->{itemsexpected} || 0, + }; +} +if ($count_parcels) { + $template->param( searchresults => $loopres, count => $count_parcels ); +} -$resultsperpage = 20 unless ($resultsperpage); -my @results =GetParcels($supplierid, $order, $code,$datefrom,$dateto); -$count = scalar @results; +# build budget list +my $budget_loop = []; +my $budgets = GetBudgetHierarchy; +foreach my $r (@{$budgets}) { + next unless (CanUserUseBudget($loggedinuser, $r, $flags)); + if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) { + next; + } + push @{$budget_loop}, { + b_id => $r->{budget_id}, + b_txt => $r->{budget_name}, + b_active => $r->{budget_period_active}, + }; +} -# multi page display gestion -$startfrom=0 unless ($startfrom); -if ($count>$resultsperpage){ - my $displaynext=0; - my $displayprev=$startfrom; - if(($count - ($startfrom+$resultsperpage)) > 0 ) { +@{$budget_loop} = + sort { uc( $a->{b_txt}) cmp uc( $b->{b_txt}) } @{$budget_loop}; + + +$template->param( + orderby => $order, + filter => $code, + datefrom => $datefrom, + dateto => $dateto, + resultsperpage => $resultsperpage, + name => $bookseller->{'name'}, + shipmentdate_today => C4::Dates->new()->output(), + booksellerid => $booksellerid, + GST => C4::Context->preference('gist'), + budgets => $budget_loop, +); + +output_html_with_http_headers $input, $cookie, $template->output; + +sub set_page_navigation { + my ( $total_rows, $startfrom, $resultsperpage ) = @_; + my $displaynext = 0; + my $displayprev = $startfrom; + my $next_row = $startfrom + $resultsperpage; + my $prev_row = $startfrom - $resultsperpage; + + if ( $total_rows - $next_row > 0 ) { $displaynext = 1; } - my @numbers = (); - if ($count>$resultsperpage) { - for (my $i=1; $i<$count/$resultsperpage+1; $i++) { - if ($i<16) { - my $highlight=0; - ($startfrom/$resultsperpage==($i-1)) && ($highlight=1); - push @numbers, { number => $i, - highlight => $highlight , -# searchdata=> "test", - startfrom => ($i-1)*$resultsperpage}; - } + # set up index numbers for paging + my $numbers = []; + if ( $total_rows > $resultsperpage ) { + my $pages = $total_rows / $resultsperpage; + if ( $total_rows % $resultsperpage ) { + ++$pages; } - } - my $from = $startfrom*$resultsperpage+1; - my $to; - if($count < (($startfrom+1)*$resultsperpage)){ - $to = $count; - } else { - $to = (($startfrom+1)*$resultsperpage); + # set up page indexes for at max 15 pages + my $max_idx = ( $pages < 15 ) ? $pages : 15; + my $current_page = ( $startfrom / $resultsperpage ) - 1; + for my $idx ( 1 .. $max_idx ) { + push @{$numbers}, + { number => $idx, + startfrom => ( $idx - 1 ) * $resultsperpage, + highlight => ( $idx == $current_page ), + }; + } } - $template->param(numbers=>\@numbers, - displaynext=>$displaynext, - displayprev=>$displayprev, - nextstartfrom=>(($startfrom+$resultsperpage<$count)?$startfrom+$resultsperpage:$count), - prevstartfrom=>(($startfrom-$resultsperpage>0)?$startfrom-$resultsperpage:0) - ); -} -my @loopres; - -my $hilighted=0; -for (my $i=$startfrom;$i<=($startfrom+$resultsperpage-1<$count-1?$startfrom+$resultsperpage-1:$count-1);$i++){ -### startfrom: $startfrom -### resultsperpage: $resultsperpage -### count: $count -### code: $results[$i]->{booksellerinvoicenumber} -### datereceived: $results[$i]->{datereceived} - - my %cell; - $cell{number}=$i+1; - $cell{code}=$results[$i]->{booksellerinvoicenumber}; - $cell{nullcode}=$results[$i]->{booksellerinvoicenumber} eq "NULL"; - $cell{emptycode}=$results[$i]->{booksellerinvoicenumber} eq ''; - $cell{raw_datereceived}=$results[$i]->{datereceived}; - $cell{datereceived}=format_date($results[$i]->{datereceived}); - $cell{bibcount}=$results[$i]->{biblio}; - $cell{reccount}=$results[$i]->{itemsreceived}; - $cell{itemcount}=$results[$i]->{itemsexpected}; - $cell{hilighted} = $hilighted%2; - $hilighted++; - push @loopres, \%cell; -} -$template->param(searchresults=>\@loopres, count=>$count) if ($count); -$template->param(orderby=>$order, filter=>$code, datefrom=>$datefrom,dateto=>$dateto, resultsperpage=>$resultsperpage); -$template->param( - name => $booksellers[0]->{'name'}, - supplierid => $supplierid, - GST => C4::Context->preference("gist"), - ); -output_html_with_http_headers $input, $cookie, $template->output; + $template->param( + numbers => $numbers, + displaynext => $displaynext, + displayprev => $displayprev, + nextstartfrom => ( ( $next_row < $total_rows ) ? $next_row : $total_rows ), + prevstartfrom => ( ( $prev_row > 0 ) ? $prev_row : 0 ) + ); + return; +}