X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=acqui%2Fbasket.pl;h=8ea292940a41ecf1dc0d787016ec90ed8579af56;hb=2c470899b3f0191b9597d713e895b9240fe1d137;hp=b7ac6b15f8464d19e7d8568b06c3e493117a37ba;hpb=70f86825595c3ea3cac63a4076e8480392da1a51;p=koha_gimpoz diff --git a/acqui/basket.pl b/acqui/basket.pl index b7ac6b15f8..8ea292940a 100755 --- a/acqui/basket.pl +++ b/acqui/basket.pl @@ -1,12 +1,9 @@ #!/usr/bin/perl -# $Id$ - #script to show display basket of orders -#written by chris@katipo.co.nz 24/2/2000 - -# Copyright 2000-2002 Katipo Communications +# Copyright 2000 - 2004 Katipo +# Copyright 2008 - 2009 BibLibre SARL # # This file is part of Koha. # @@ -19,117 +16,307 @@ # 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. use strict; +use warnings; use C4::Auth; use C4::Koha; use C4::Output; use CGI; -use C4::Interface::CGI::Output; -use C4::Database; -use HTML::Template; use C4::Acquisition; -use C4::Date; +use C4::Budgets; + +use C4::Bookseller qw( GetBookSellerFromId); +use C4::Dates qw/format_date/; +use C4::Debug; + +use C4::Members qw/GetMember/; #needed for permissions checking for changing basketgroup of a basket +=head1 NAME + +basket.pl + +=head1 DESCRIPTION + + This script display all informations about basket for the supplier given + on input arg. Moreover, it allows us to add a new order for this supplier from + an existing record, a suggestion or a new record. + +=head1 CGI PARAMETERS + +=over 4 + +=item $basketno + +The basket number. + +=item supplierid + +the supplier this script have to display the basket. + +=item order + +=back -my $query =new CGI; -my $basketno = $query ->param('basket'); +=cut + +my $query = new CGI; +my $basketno = $query->param('basketno'); my $booksellerid = $query->param('supplierid'); -my $order = $query->param('order'); -my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "acqui/basket.tmpl", - query => $query, - type => "intranet", - authnotrequired => 0, - flagsrequired => {acquisition => 1}, - debug => 1, - }); -my ($count,@results); - -my $basket = getbasket($basketno); + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "acqui/basket.tmpl", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { acquisition => 'order_manage' }, + debug => 1, + } +); + +my $basket = GetBasket($basketno); + +# FIXME : what about the "discount" percentage? # FIXME : the query->param('supplierid') below is probably useless. The bookseller is always known from the basket # if no booksellerid in parameter, get it from basket # warn "=>".$basket->{booksellerid}; $booksellerid = $basket->{booksellerid} unless $booksellerid; -my ($count2,@booksellers)=bookseller($booksellerid); - -# get librarian branch... - -# if new basket, pre-fill infos -$basket->{creationdate} = "" unless ($basket->{creationdate}); -$basket->{authorisedby} = $loggedinuser unless ($basket->{authorisedby}); -($count,@results)=getbasketcontent($basketno,'',$order); - -my $line_total; # total of each line -my $sub_total; # total of line totals -my $gist; # GST -my $grand_total; # $subttotal + $gist - -# my $line_total_est; # total of each line -my $sub_total_est; # total of line totals -my $gist_est; # GST -my $grand_total_est; # $subttotal + $gist - -my $qty_total; - -my @books_loop; -for (my $i=0;$i<$count;$i++){ - my $rrp=$results[$i]->{'listprice'}; - $rrp=curconvert($results[$i]->{'currency'},$rrp); - - $sub_total_est+=$results[$i]->{'quantity'}*$results[$i]->{'rrp'}; - $line_total=$results[$i]->{'quantity'}*$results[$i]->{'ecost'}; - $sub_total+=$line_total; - $qty_total += $results[$i]->{'quantity'}; - my %line; - $line{ordernumber} = $results[$i]->{'ordernumber'}; - $line{publishercode} = $results[$i]->{'publishercode'}; - $line{isbn} = $results[$i]->{'isbn'}; - $line{booksellerid} = $results[$i]->{'booksellerid'}; - $line{basketno}=$basketno; - $line{title} = $results[$i]->{'title'}; - $line{notes} = $results[$i]->{'notes'}; - $line{author} = $results[$i]->{'author'}; - $line{i} = $i; - $line{rrp} = $results[$i]->{'rrp'}; - $line{ecost} = $results[$i]->{'ecost'}; - $line{quantity} = $results[$i]->{'quantity'}; - $line{quantityrecieved} = $results[$i]->{'quantityreceived'}; - $line{line_total} = $line_total; - $line{biblionumber} = $results[$i]->{'biblionumber'}; - $line{bookfundid} = $results[$i]->{'bookfundid'}; - $line{odd} = $i %2; - push @books_loop, \%line; +my ($bookseller) = GetBookSellerFromId($booksellerid); +my $op = $query->param('op'); +if (!defined $op) { + $op = q{}; +} + +if ( $op eq 'delete_confirm' ) { + my $basketno = $query->param('basketno'); + DelBasket($basketno); + $template->param( delete_confirmed => 1 ); +} elsif ( !$bookseller ) { + $template->param( NO_BOOKSELLER => 1 ); +} elsif ( $op eq 'del_basket') { + $template->param( delete_confirm => 1 ); + if ( C4::Context->preference("IndependantBranches") ) { + my $userenv = C4::Context->userenv; + unless ( $userenv->{flags} == 1 ) { + my $validtest = ( $basket->{creationdate} eq '' ) + || ( $userenv->{branch} eq $basket->{branch} ) + || ( $userenv->{branch} eq '' ) + || ( $basket->{branch} eq '' ); + unless ($validtest) { + print $query->redirect("../mainpage.pl"); + exit 1; + } + } + } + $basket->{creationdate} = "" unless ( $basket->{creationdate} ); + $basket->{authorisedby} = $loggedinuser unless ( $basket->{authorisedby} ); + my $contract = &GetContract($basket->{contractnumber}); + $template->param( + basketno => $basketno, + basketname => $basket->{'basketname'}, + basketnote => $basket->{note}, + basketbooksellernote => $basket->{booksellernote}, + basketcontractno => $basket->{contractnumber}, + basketcontractname => $contract->{contractname}, + creationdate => format_date( $basket->{creationdate} ), + authorisedby => $basket->{authorisedby}, + authorisedbyname => $basket->{authorisedbyname}, + closedate => format_date( $basket->{closedate} ), + active => $bookseller->{'active'}, + booksellerid => $bookseller->{'id'}, + name => $bookseller->{'name'}, + address1 => $bookseller->{'address1'}, + address2 => $bookseller->{'address2'}, + address3 => $bookseller->{'address3'}, + address4 => $bookseller->{'address4'}, + ); +} elsif ($op eq 'attachbasket' && $template->{'param_map'}->{'CAN_user_acquisition_group_manage'} == 1) { + print $query->redirect('/cgi-bin/koha/acqui/basketgroup.pl?basketno=' . $basket->{'basketno'} . '&op=attachbasket&booksellerid=' . $booksellerid); + # check if we have to "close" a basket before building page +} elsif ($op eq 'export') { + print $query->header( + -type => 'text/csv', + -attachment => 'basket' . $basket->{'basketno'} . '.csv', + ); + print GetBasketAsCSV($query->param('basketno')); + exit; +} elsif ($op eq 'close') { + my $confirm = $query->param('confirm'); + if ($confirm) { + my $basketno = $query->param('basketno'); + my $booksellerid = $query->param('booksellerid'); + $basketno =~ /^\d+$/ and CloseBasket($basketno); + # if requested, create basket group, close it and attach the basket + if ($query->param('createbasketgroup')) { + my $basketgroupid = NewBasketgroup( { name => $basket->{basketname}, + booksellerid => $booksellerid, + closed => 1, + }); + ModBasket( { basketno => $basketno, + basketgroupid => $basketgroupid } ); + print $query->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid='.$booksellerid.'&closed=1'); + } else { + print $query->redirect('/cgi-bin/koha/acqui/booksellers.pl?supplierid=' . $booksellerid); + } + exit; + } else { + $template->param(confirm_close => "1", + booksellerid => $booksellerid, + basketno => $basket->{'basketno'}, + basketname => $basket->{'basketname'}, + basketgroupname => $basket->{'basketname'}); + + } +} elsif ($op eq 'reopen') { + my $basket; + $basket->{basketno} = $query->param('basketno'); + $basket->{closedate} = undef; + ModBasket($basket); + print $query->redirect('/cgi-bin/koha/acqui/basket.pl?basketno='.$basket->{'basketno'}) +} else { + # get librarian branch... + if ( C4::Context->preference("IndependantBranches") ) { + my $userenv = C4::Context->userenv; + unless ( $userenv->{flags} == 1 ) { + my $validtest = ( $basket->{creationdate} eq '' ) + || ( $userenv->{branch} eq $basket->{branch} ) + || ( $userenv->{branch} eq '' ) + || ( $basket->{branch} eq '' ); + unless ($validtest) { + print $query->redirect("../mainpage.pl"); + exit 1; + } + } + } +#if the basket is closed,and the user has the permission to edit basketgroups, display a list of basketgroups + my $basketgroups; + my $member = GetMember(borrowernumber => $loggedinuser); + if ($basket->{closedate} && haspermission({ flagsrequired => { acquisition => 'group_manage'} })) { + $basketgroups = GetBasketgroups($basket->{booksellerid}); + for my $bg ( @{$basketgroups} ) { + if ($basket->{basketgroupid} == $bg->{id}){ + $bg->{default} = 1; + } + } + my %emptygroup = ( id => undef, + name => "No group"); + if ( ! $basket->{basketgroupid} ) { + $emptygroup{default} = 1; + $emptygroup{nogroup} = 1; + } + unshift( @$basketgroups, \%emptygroup ); + } + # if new basket, pre-fill infos + $basket->{creationdate} = "" unless ( $basket->{creationdate} ); + $basket->{authorisedby} = $loggedinuser unless ( $basket->{authorisedby} ); + $debug + and warn sprintf + "loggedinuser: $loggedinuser; creationdate: %s; authorisedby: %s", + $basket->{creationdate}, $basket->{authorisedby}; + + my @results = GetOrders( $basketno ); + + my $gist = $bookseller->{gstrate} // C4::Context->preference("gist") // 0; + my $discount = $bookseller->{'discount'} / 100; + my $total_rrp; # RRP Total, its value will be assigned to $total_rrp_gsti or $total_rrp_gste depending of $bookseller->{'listincgst'} + my $total_rrp_gsti; # RRP Total, GST included + my $total_rrp_gste; # RRP Total, GST excluded + my $gist_rrp; + + my $qty_total; + my @books_loop; + + for my $order ( @results ) { + my $rrp = $order->{'listprice'} || 0; + my $qty = $order->{'quantity'} || 0; + if (!defined $order->{quantityreceived}) { + $order->{quantityreceived} = 0; + } + for ( qw(rrp ecost quantityreceived)) { + if (!defined $order->{$_}) { + $order->{$_} = 0; + } + } + + my $budget = GetBudget( $order->{'budget_id'} ); + $rrp = ConvertCurrency( $order->{'currency'}, $rrp ); + + $total_rrp += $qty * $order->{'rrp'}; + my $line_total = $qty * $order->{'ecost'}; + # FIXME: what about the "actual cost" field? + $qty_total += $qty; + my %line = %{ $order }; + + $line{order_received} = ( $qty == $order->{'quantityreceived'} ); + $line{basketno} = $basketno; + $line{budget_name} = $budget->{budget_name}; + $line{rrp} = sprintf( "%.2f", $line{'rrp'} ); + $line{ecost} = sprintf( "%.2f", $line{'ecost'} ); + $line{line_total} = sprintf( "%.2f", $line_total ); + if ($line{uncertainprice}) { + $template->param( uncertainprices => 1 ); + $line{rrp} .= ' (Uncertain)'; + } + if ($line{'title'}){ + my $volume = $order->{'volume'}; + my $seriestitle = $order->{'seriestitle'}; + $line{'title'} .= " / $seriestitle" if $seriestitle; + $line{'title'} .= " / $volume" if $volume; + } else { + $line{'title'} = "Deleted bibliographic notice, can't find title."; + } + push @books_loop, \%line; + } + + if ($bookseller->{'listincgst'}) { # if prices already includes GST + $total_rrp_gsti = $total_rrp; # we know $total_rrp_gsti + $total_rrp_gste = $total_rrp_gsti / ($gist + 1); # and can reverse compute other values + $gist_rrp = $total_rrp_gsti - $total_rrp_gste; # + } else { # if prices does not include GST + $total_rrp_gste = $total_rrp; # then we use the common way to compute other values + $gist_rrp = $total_rrp_gste * $gist; # + $total_rrp_gsti = $total_rrp_gste + $gist_rrp; # + } + # These vars are estimated totals and GST, taking in account the booksellet discount + my $total_est_gsti = $total_rrp_gsti - ($total_rrp_gsti * $discount); + my $gist_est = $gist_rrp - ($gist_rrp * $discount); + my $total_est_gste = $total_rrp_gste - ($total_rrp_gste * $discount); + + my $contract = &GetContract($basket->{contractnumber}); + my @orders = GetOrders($basketno); + $template->param( + basketno => $basketno, + basketname => $basket->{'basketname'}, + basketnote => $basket->{note}, + basketbooksellernote => $basket->{booksellernote}, + basketcontractno => $basket->{contractnumber}, + basketcontractname => $contract->{contractname}, + creationdate => C4::Dates->new($basket->{creationdate},'iso')->output, + authorisedby => $basket->{authorisedby}, + authorisedbyname => $basket->{authorisedbyname}, + closedate => C4::Dates->new($basket->{closedate},'iso')->output, + active => $bookseller->{'active'}, + booksellerid => $bookseller->{'id'}, + name => $bookseller->{'name'}, + entrydate => C4::Dates->new($results[0]->{'entrydate'},'iso')->output, + books_loop => \@books_loop, + gist_rate => sprintf( "%.2f", $gist * 100 ) . '%', + total_rrp_gste => sprintf( "%.2f", $total_rrp_gste ), + total_est_gste => sprintf( "%.2f", $total_est_gste ), + gist_est => sprintf( "%.2f", $gist_est ), + gist_rrp => sprintf( "%.2f", $gist_rrp ), + total_rrp_gsti => sprintf( "%.2f", $total_rrp_gsti ), + total_est_gsti => sprintf( "%.2f", $total_est_gsti ), + currency => $bookseller->{'listprice'}, + qty_total => $qty_total, + GST => $gist, + basketgroups => $basketgroups, + grouped => $basket->{basketgroupid}, + unclosable => @orders ? 0 : 1, + ); } -my $prefgist =C4::Context->preference("gist"); -$gist=sprintf("%.2f",$sub_total*$prefgist); -$grand_total=$sub_total+$gist; -$grand_total_est = $sub_total_est+sprintf("%.2f",$sub_total_est*$prefgist); -$gist_est = sprintf("%.2f",$sub_total_est*$prefgist); -$template->param(basketno => $basketno, - creationdate => format_date($basket->{creationdate}), - authorisedby => $basket->{authorisedby}, - authorisedbyname => $basket->{authorisedbyname}, - closedate => format_date($basket->{closedate}), - active => $booksellers[0]->{'active'}, - booksellerid=> $booksellers[0]->{'id'}, - name => $booksellers[0]->{'name'}, - address1 => $booksellers[0]->{'address1'}, - address2 => $booksellers[0]->{'address2'}, - address3 => $booksellers[0]->{'address3'}, - address4 => $booksellers[0]->{'address4'}, - entrydate => format_date($results[0]->{'entrydate'}), - books_loop => \@books_loop, - count =>$count, - sub_total => $sub_total, - gist => $gist, - grand_total =>$grand_total, - sub_total_est => $sub_total_est, - gist_est => $gist_est, - grand_total_est =>$grand_total_est, - currency => $booksellers[0]->{'listprice'}, - qty_total => $qty_total, - ); + output_html_with_http_headers $query, $cookie, $template->output;