From: Paul Poulain <[email protected]> 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 0e29473..01b63c6 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 [email protected] 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 cee6d91..555c294 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 @@ } //]]> </script> +<!-- TMPL_ELSE --> +<!-- TMPL_UNLESS name="grouped" --> +<script type="text/javascript"> +//<![CDATA[ + function confirm_reopen() { + var is_confirmed = confirm(_('Are you sure you want to reopen this basket?')); + if (is_confirmed) { + window.location = "/cgi-bin/koha/acqui/booksellers.pl?op=reopen&basketno=<!-- TMPL_VAR NAME="basketno" -->&supplierid=<!-- TMPL_VAR name="booksellerid" -->"; + } + } +//]]> +</script> +<!-- /TMPL_UNLESS --> <!-- /TMPL_UNLESS --> <style type="text/css"> .sortmsg {font-size: 80%;} @@ -29,24 +42,122 @@ <div id="bd"> <div id="yui-main"> <div class="yui-b"> + + <!-- TMPL_UNLESS name="closedate" --> + <div id="toolbar"> + <script type="text/javascript"> + //<![CDATA[ + // prepare DOM for YUI Toolbar + $(document).ready(function() { + yuiToolbar(); + }); + // YUI Toolbar Functions + function yuiToolbar() { + <!-- TMPL_IF name="unclosable" --> + new YAHOO.widget.Button("uncertpricesbutton"); + new YAHOO.widget.Button("closebutton", {disabled:true}); + <!-- TMPL_ELSE --> + new YAHOO.widget.Button("closebutton"); + <!-- /TMPL_IF --> + new YAHOO.widget.Button("basketheadbutton"); + new YAHOO.widget.Button("delbasketbutton"); + } + //]]> + </script> + <ul id=toolbar-list" class="toolbar"> + <li><a href="basketheader.pl?basketno=<!-- TMPL_VAR NAME="basketno" -->&op=add_form" class="button" id="basketheadbutton">Edit basket header information</a></li> + <li><a href="<!-- TMPL_VAR NAME="script_name" -->?op=del_basket&basketno=<!-- TMPL_VAR NAME="basketno" -->&booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->" class="button" id="delbasketbutton">Delete this basket</a></li> + <!-- TMPL_IF name="unclosable" --> + <li><button onclick="confirm_close()" class="yui-button-disabled" id="closebutton" type="push" disabled="true" title="You can not close this basket" >Can not close basket</a></li> + <li><a href="/cgi-bin/koha/acqui/uncertainprice.pl?booksellerid=<!-- TMPL_VAR name="booksellerid" -->&owner=1" class="button" id="uncertpricesbutton">Uncertain prices</a></li> + <!-- TMPL_ELSE --> + <li><a href="javascript:confirm_close()" class="button" id="closebutton">Close this basket</a></li> + <!-- /TMPL_IF --> + </ul> + </div> + <!-- TMPL_ELSE --> + <!-- TMPL_UNLESS name="grouped" --> + <div id="toolbar"> + <script type="text/javascript"> + //<![CDATA[ + // prepare DOM for YUI Toolbar + $(document).ready(function() { + yuiToolbar(); + }); + // YUI Toolbar Functions + function yuiToolbar() { + new YAHOO.widget.Button("reopenbutton"); + } + //]]> + </script> + <ul id="toolbar-list" class="toolbar"> + <li><a href="javascript:confirm_reopen()" class="button" id="reopenbutton">Reopen this basket</a></li> + </ul> + </div> + <!-- /TMPL_UNLESS --> + <!-- /TMPL_UNLESS --> + <!-- TMPL_IF NAME="NO_BOOKSELLER" --> <h2>Supplier Not Found</h2> <!-- TMPL_ELSE --> - <h1><!-- TMPL_UNLESS name="basketno" -->New <!-- /TMPL_UNLESS -->Basket <!-- TMPL_VAR NAME="basketno" --> for <a href="supplier.pl?supplierid=<!-- TMPL_VAR NAME="booksellerid" -->"><!-- TMPL_VAR NAME="name" --></a></h1> - + <!-- TMPL_IF NAME="delete_confirmed" --> + <h3>Basket deleted</h3> + <META HTTP-EQUIV=Refresh CONTENT="0; URL=booksellers.pl"> + <!-- TMPL_ELSE --> + <h1><!-- TMPL_UNLESS name="basketno" -->New <!-- /TMPL_UNLESS --><!-- TMPL_IF NAME="delete_confirm" -->Delete<!-- /TMPL_IF -->Basket <!-- TMPL_VAR NAME="basketno" --> for <a href="supplier.pl?supplierid=<!-- TMPL_VAR NAME="booksellerid" -->"><!-- TMPL_VAR NAME="name" --></a></h1> + <!-- TMPL_IF NAME="delete_confirm" --> + <h2> + <span class="yui-button yui-link-button"> + <em class="first-child"> + <a href="<!-- TMPL_VAR NAME="script_name" -->?op=delete_confirm&basketno=<!-- TMPL_VAR NAME="basketno" -->&booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->" class="yui-link-button">Yes, delete this basket!</a> + </em> + </span> + <span class="yui-button yui-link-button"> + <em class="first-child"> + <a href="<!-- TMPL_VAR name="script_name" -->?basketno=<!-- TMPL_VAR name="basketno" -->" class="yui-link-button">Cancel</a> + </em> + </span> + </h2> + <!-- /TMPL_IF --> <!-- TMPL_IF NAME="basketno" --><div id="acqui_basket_summary"> <h2>Basket Details</h2> <p>Basket number: <!-- TMPL_VAR NAME="basketno" --></p> + <p>Basket name: <!--TMPL_VAR NAME="basketname" --></p> + <p>Internal note: <!-- TMPL_VAR NAME="basketnote" --></p> + <p>Bookseller note: <!-- TMPL_VAR NAME="basketbooksellernote" --></p> + <!-- TMPL_IF NAME="basketcontractno" --> + <p>Contract number: <!-- TMPL_VAR NAME="basketcontractno" --></p> + <p>Contract name: <a href="../admin/aqcontract.pl?op=add_form&contractnumber=<!-- TMPL_VAR NAME="basketcontractno" -->"><!-- TMPL_VAR NAME="basketcontractname" --></a></p> + <!-- /TMPL_IF --> <p>Managed by: <!-- TMPL_VAR NAME="authorisedbyname" --></p> <p>Open on: <!-- TMPL_VAR NAME="creationdate" --></p> <p>For vendor ID: <!-- TMPL_VAR NAME="booksellerid" --></p> <p>Invoice number: <!-- TMPL_VAR NAME="booksellerinvoicenumber" --></p> - <!-- TMPL_IF name="closedate" --><p>Closed On: <!-- TMPL_VAR name="closedate" --></p><!-- /TMPL_IF --> - <!-- TMPL_UNLESS name="closedate" --> - <p><a href="javascript:confirm_close()" class="button">Close this basket</a></p> - <!-- /TMPL_UNLESS --> + <!-- TMPL_IF name="closedate" --> + <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="post"> + <p>Closed On: <!-- TMPL_VAR name="closedate" --></p> + <!-- TMPL_IF name="basketgroups" --> + <p> basketgroup: <select id="basketgroupid" name="basketgroupid"> + <!-- TMPL_LOOP name="basketgroups" --> + <!-- TMPL_IF name="default" --> + <option value="<!-- TMPL_VAR name="id" -->" selected="selected"><!-- TMPL_VAR name="name" --></option> + <!-- TMPL_ELSE --> + <option value="<!-- TMPL_VAR name="id" -->"><!-- TMPL_VAR name="name" --></option> + <!-- /TMPL_IF --> + <!-- /TMPL_LOOP --> + </select> + <input type="hidden" id="basketno" value="<!-- TMPL_VAR name="basketno" -->" name="basketno" /> + <input type="hidden" value="mod_basket" name="op" /> + <input type="hidden" name="booksellerid" value="<!-- TMPL_VAR name="booksellerid" -->" /> + <input type="submit" value="Change basketgroup" /> + </p> + </form> + <!-- /TMPL_IF --> + <!-- /TMPL_IF --> + <p>Number of orders: <!-- TMPL_VAR name="count" --></p> </div><!-- /TMPL_IF --> + <!-- TMPL_UNLESS name="delete_confirm" --> <div id="acqui_basket_content"> <h2>Order Details</h2> <!-- TMPL_IF NAME="sort_loop" --> @@ -59,7 +170,6 @@ <!-- /TMPL_IF --> <!-- /TMPL_LOOP --> <!-- /TMPL_IF --> - <!-- TMPL_IF name="books_loop" --> <table> <tr> @@ -71,9 +181,7 @@ <th>Est.</th> <th>Qty.</th> <th>Total</th> - <th> - <a href="basket.pl?basketno=<!-- TMPL_VAR name="basketno" -->&order=aqorderbreakdown.bookfundid,biblioitems.publishercode">Fund</a> - </th> + <th>Budget</th> <!-- TMPL_IF name="active" --> <!-- TMPL_UNLESS name="closedate" --> <th>Modify</th> @@ -98,7 +206,7 @@ <td class="number"><!-- TMPL_VAR NAME="ecost" --></td> <td class="number"><!-- TMPL_VAR NAME="quantity" --></td> <td class="number"><!-- TMPL_VAR NAME="line_total" --></td> - <td><!-- TMPL_VAR NAME="bookfundname" --></td> + <td><!-- TMPL_VAR NAME="budget_name" --></td> <!-- TMPL_IF name="active" --> <!-- TMPL_UNLESS name="closedate" --> <td> @@ -158,19 +266,23 @@ </div> <br /> <!-- TMPL_UNLESS name="closedate" --> - <fieldset id="acqui_basket_add"> - <legend>Add To Order</legend> - <form action="/cgi-bin/koha/acqui/neworderbiblio.pl" method="post"> - <input type="hidden" name="booksellerid" value="<!-- TMPL_VAR NAME="booksellerid" -->" /> - <input type="hidden" name="basketno" value="<!-- TMPL_VAR NAME="basketno" -->" /> - <ul><li><label for="q">From an existing record: </label><input id="q" type="text" size="25" name="q" /> - <input type="submit" class="submit" value="Search" /></li> - <li><a href="/cgi-bin/koha/acqui/newordersuggestion.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->">From a Suggestion</a></li> - <li><a href="/cgi-bin/koha/acqui/neworderempty.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->">From a new (empty) record</a></li> - </ul> - </form> - </fieldset> + <div id="acqui_basket_add"> + <h2>Add To Order</h2> + <form action="/cgi-bin/koha/acqui/neworderbiblio.pl" method="post"> + <input type="hidden" name="booksellerid" value="<!-- TMPL_VAR NAME="booksellerid" -->" /> + <input type="hidden" name="basketno" value="<!-- TMPL_VAR NAME="basketno" -->" /> + <ul><li><label for="q">From an existing record: </label><input id="q" type="text" size="25" name="q" /> + <input type="submit" value="Search" /></li> + <li><a href="/cgi-bin/koha/acqui/newordersuggestion.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->">From a Suggestion</a></li> + <li><a href="/cgi-bin/koha/acqui/neworderempty.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->">From a new (empty) record</a></li> + <li><a href="/cgi-bin/koha/acqui/z3950_search.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->">From a z3950 query</a></li> + <li><a href="/cgi-bin/koha/acqui/addorderiso2709.pl?booksellerid=<!-- TMPL_VAR NAME="booksellerid" -->&basketno=<!-- TMPL_VAR NAME="basketno" -->"> From an imported iso2709 file</a></li> + </ul> + </form> + </div> <!-- /TMPL_UNLESS --> + <!-- /TMPL_UNLESS --> +<!-- /TMPL_IF --> <!-- /TMPL_IF --> </div> </div> -- 1.6.0.4 _______________________________________________ Koha-patches mailing list [email protected] http://lists.koha.org/mailman/listinfo/koha-patches
