From dee811999617b35694602e571b1a2a382b1ac310 Mon Sep 17 00:00:00 2001 From: Paul Poulain Date: Tue, 28 Apr 2009 22:13:23 +0200 Subject: [PATCH] basket management lot of new things: * basket now explicitely created * they can have a name, a bookseller note, a private (library) note, a contract attached * deal with granular permissions * feature to delete a basket * feature to close/reopen a basket in template, add link to fill a basket from a z3950 search or from a staged file --- acqui/basket.pl | 186 +++++++++++++----- .../prog/en/modules/acqui/basket.tmpl | 158 ++++++++++++--- 2 files changed, 272 insertions(+), 72 deletions(-) diff --git a/acqui/basket.pl b/acqui/basket.pl index 0e2947328e..01b63c65d3 100755 --- a/acqui/basket.pl +++ b/acqui/basket.pl @@ -1,9 +1,9 @@ #!/usr/bin/perl #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. # @@ -21,16 +21,19 @@ # Suite 330, Boston, MA 02111-1307 USA use strict; +use warnings; use C4::Auth; use C4::Koha; use C4::Output; use CGI; use C4::Acquisition; -use C4::Bookfund; +use C4::Budgets; + use C4::Bookseller; 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 @@ -62,7 +65,7 @@ the supplier this script have to display the basket. my $query = new CGI; my $basketno = $query->param('basketno'); my $booksellerid = $query->param('supplierid'); -my $sort = $query->param('order'); +my $sort = $query->param('order') || "aqorders.ordernumber"; my @sort_loop; if (defined $sort) { @@ -72,8 +75,8 @@ if (defined $sort) { ); # other possibly valid tables for later: aqbookfund biblio biblioitems if ( - (/^\s*(aqorderbreakdown)\.(\w+)\s*$/ and $2 eq 'bookfundid' ) or - (/^\s*(biblioitems)\.(\w+)\s*$/ and $2 eq 'publishercode') + (/^\s*(biblioitems)\.(\w+)\s*$/ and $2 eq 'publishercode') or + (/^\s*(aqorders)\.(\w+)\s*$/ and $2 eq 'ordernumber' ) ) { $sorthash{table} = $1; $sorthash{field} = $2; @@ -90,7 +93,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( query => $query, type => "intranet", authnotrequired => 0, - flagsrequired => { acquisition => 1 }, + flagsrequired => { acquisition => 'order_manage' }, debug => 1, } ); @@ -103,12 +106,54 @@ my $basket = GetBasket($basketno); # warn "=>".$basket->{booksellerid}; $booksellerid = $basket->{booksellerid} unless $booksellerid; my ($bookseller) = GetBookSellerFromId($booksellerid); +my $op = $query->param('op'); -if ( !$bookseller ) { +if ( $op eq 'delete_confirm' ) { + my $basketno = $query->param('basketno'); + DelBasket($basketno); + $template->param( delete_confirmed => 1 ); +} elsif ( !$bookseller ) { $template->param( NO_BOOKSELLER => 1 ); -} -else { - +} 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}); + my $count = scalar GetOrders( $basketno); + $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'}, + count => $count, + ); +} else { # get librarian branch... if ( C4::Context->preference("IndependantBranches") ) { my $userenv = C4::Context->userenv; @@ -123,7 +168,26 @@ else { } } } - +#if the basket is closed,and the user has the permission to edit basketgroups, display a list of basketgroups + my $basketgroups; + my $member = GetMember($loggedinuser, "borrowernumber"); + if ($basket->{closedate} && haspermission(C4::Context->dbh, $member->{userid}, { flagsrequired => { acquisition => 'group_manage'} })) { + $basketgroups = GetBasketgroups($basket->{booksellerid}); + for (my $i=0; $i < scalar(@$basketgroups); $i++) { + if (@$basketgroups[$i]->{closed}) { + splice(@$basketgroups, $i, 1); + $i--; + } elsif ($basket->{basketgroupid} == @$basketgroups[$i]->{id}){ + @$basketgroups[$i]->{default} = 1; + } + } + my %emptygroup = ( id => undef, + name => "No group"); + if ( ! $basket->{basketgroupid} ) { + $emptygroup{default} = 1; + } + unshift( @$basketgroups, \%emptygroup ); + } # if new basket, pre-fill infos $basket->{creationdate} = "" unless ( $basket->{creationdate} ); $basket->{authorisedby} = $loggedinuser unless ( $basket->{authorisedby} ); @@ -145,10 +209,14 @@ else { my $qty_total; my @books_loop; + for ( my $i = 0 ; $i < $count ; $i++ ) { my $rrp = $results[$i]->{'listprice'}; my $qty = $results[$i]->{'quantity'}; + + my $budget = GetBudget( $results[$i]->{'budget_id'} ); $rrp = ConvertCurrency( $results[$i]->{'currency'}, $rrp ); + $sub_total_rrp += $qty * $results[$i]->{'rrp'}; my $line_total = $qty * $results[$i]->{'ecost'}; # FIXME: what about the "actual cost" field? @@ -156,16 +224,28 @@ else { $qty_total += $qty; my %line = %{ $results[$i] }; ($i%2) and $line{toggle} = 1; - $line{order_received}= ( $qty eq $results[$i]->{'quantityreceived'} ); - $line{basketno} = $basketno; - $line{i} = $i; - $line{rrp} = sprintf( "%.2f", $line{'rrp'} ); - $line{ecost} = sprintf( "%.2f", $line{'ecost'} ); - $line{line_total} = sprintf( "%.2f", $line_total ); - $line{odd} = $i % 2; + + $line{order_received} = ( $qty eq $results[$i]->{'quantityreceived'} ); + $line{basketno} = $basketno; + $line{i} = $i; + $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 ); + $line{odd} = $i % 2; + if ($line{uncertainprice}) { + $template->param( unclosable => 1 ); + for my $key (qw/ecost line_total rrp/) { + $line{$key} .= '??'; + } + } push @books_loop, \%line; } - my $prefgist = C4::Context->preference("gist") || 0; + + + + + my $prefgist = $bookseller->{gstrate} || C4::Context->preference("gist") || 0; my $gist = $sub_total * $prefgist; my $gist_rrp = $sub_total_rrp * $prefgist; $grand_total = $sub_total_est = $sub_total; @@ -181,36 +261,44 @@ else { if ($temp = $bookseller->{'discount'}) { $template->param(discount => sprintf( "%.2f", $temp )); } + my $contract = &GetContract($basket->{contractnumber}); $template->param( - basketno => $basketno, - 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'}, - entrydate => format_date( $results[0]->{'entrydate'} ), - books_loop => \@books_loop, - sort_loop => \@sort_loop, - count => $count, - gist => $gist ? sprintf( "%.2f", $gist ) : 0, - gist_rate => sprintf( "%.2f", $prefgist * 100) . '%', - gist_est => sprintf( "%.2f", $sub_total_est * $prefgist ), - gist_rrp => sprintf( "%.2f", $gist_rrp), - sub_total => sprintf( "%.2f", $sub_total ), - grand_total => sprintf( "%.2f", $grand_total ), - sub_total_est => sprintf( "%.2f", $sub_total_est), - grand_total_est => sprintf( "%.2f", $grand_total_est), - sub_total_rrp => sprintf( "%.2f", $sub_total_rrp), - grand_total_rrp => sprintf( "%.2f", $sub_total_rrp + $gist_rrp), - currency => $bookseller->{'listprice'}, - qty_total => $qty_total, - GST => $prefgist, + 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'}, + entrydate => format_date( $results[0]->{'entrydate'} ), + books_loop => \@books_loop, + sort_loop => \@sort_loop, + count => $count, + gist => $gist ? sprintf( "%.2f", $gist ) : 0, + gist_rate => sprintf( "%.2f", $prefgist * 100 ) . '%', + gist_est => sprintf( "%.2f", $sub_total_est * $prefgist ), + gist_rrp => sprintf( "%.2f", $gist_rrp ), + sub_total => sprintf( "%.2f", $sub_total ), + grand_total => sprintf( "%.2f", $grand_total ), + sub_total_est => sprintf( "%.2f", $sub_total_est ), + grand_total_est => sprintf( "%.2f", $grand_total_est ), + sub_total_rrp => sprintf( "%.2f", $sub_total_rrp ), + grand_total_rrp => sprintf( "%.2f", $sub_total_rrp + $gist_rrp ), + currency => $bookseller->{'listprice'}, + qty_total => $qty_total, + GST => $prefgist, + basketgroups => $basketgroups, + grouped => $basket->{basketgroupid}, ); } output_html_with_http_headers $query, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tmpl index cee6d91131..555c2946a3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tmpl @@ -12,6 +12,19 @@ } //]]> + + + +