Bug 9807 : Make it possible to view a basket group without reopening it
authorMathieu Saby <mathieu.saby@univ-rennes2.fr>
Thu, 7 Nov 2013 19:16:40 +0000 (20:16 +0100)
committerGalen Charlton <gmc@esilibrary.com>
Tue, 17 Dec 2013 17:35:12 +0000 (17:35 +0000)
This patch make possible to view an individual closed basket group

without reopening it.
- It adds a new "View" button on closed basket group list
- It creates a view for closed basket groups, with 3 buttons (reopen,
  print, export)
- It adds a "delete" button on standard "edit" view (for open
  basket groups)

To test :
1/ regression test :
- create some empty basket groups
- create some basket groups by closing baskets
- in the list of basket groups closed and opened, check you can use
  the buttons that existed before the patch (close and print, delete,
  export, print, reopen)
- click on "Edit" to edit a opened basket group : check everything is
  like before :
-- change the billing and delivery places,
-- add a note,
-- put some new baskets  in the bg,
-- remove baskets from it
-- save it without checking "close" box => it should be saved but kept
   open
-- edit it again, and make other some changes (define a freetext
   delivery place for example)
-- save it with checking "close" => it should be saved but closed

2/ new feature test
- click on "view" button on top right column of some closed basket group
- check all the displayed informations are correct (places, free place,
  note, list of baskets)
- check you can not change anything
- click on "print" button => check a pdf is created
- click on "export" button => check a csv is created
- click on "reopen" button => you should stay on the same basket group, but
  it is now open and you can make some changes
- go back to the basket group list of the vendor. Check the reopened bg
   is in "open" tab
- click on "edit"
- click on new "delete" button => the bg should be deleted, and you are
  redirected to the bg list of the vendor.

Signed-off-by: cedric.vita@dracenie.com <cedric.vita@dracenie.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Passes koha-qa.pl, t and xt. Works as advertised.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
acqui/basketgroup.pl
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt

index 6fe4db2..c9db3b3 100755 (executable)
@@ -29,7 +29,7 @@ basketgroup.pl
 =head1 DESCRIPTION
 
  This script lets the user group (closed) baskets into basket groups for easier order management. Note that the grouped baskets have to be from the same bookseller and
- have to be closed.
+ have to be closed to be printed or exported.
 
 =head1 CGI PARAMETERS
 
@@ -294,11 +294,29 @@ sub printbasketgrouppdf{
 }
 
 my $op = $input->param('op') || 'display';
+# possible values of $op :
+# - add : adds a new basketgroup, or edit an open basketgroup, or display a closed basketgroup
+# - mod_basket : modify an individual basket of the basketgroup
+# - validate :  FIXME dead code
+# - closeandprint : close and print an closed basketgroup in pdf. called by clicking on "Close and print" button in closed basketgroups list
+# - print : print a closed basketgroup. called by clicking on "Print" button in closed basketgroups list
+# - export : export in CSV a closed basketgroup. called by clicking on "Export" button in closed basketgroups list
+# - delete : delete an open basketgroup. called by clicking on "Delete" button in open basketgroups list
+# - reopen : reopen a closed basketgroup. called by clicking on "Reopen" button in closed basketgroup list
+# - attachbasket : save a modified basketgroup, or creates a new basketgroup when a basket is closed. called from basket page
+# - display : display the list of all basketgroups for a vendor
 my $booksellerid = $input->param('booksellerid');
 $template->param(booksellerid => $booksellerid);
 
 if ( $op eq "add" ) {
+#
+# if no param('basketgroupid') is not defined, adds a new basketgroup
+# else, edit (if it is open) or display (if it is close) the basketgroup basketgroupid
+# the template will know if basketgroup must be displayed or edited, depending on the value of closed key
+#
     if(! $booksellerid){
+# Unknown bookseller
+# FIXME : ungroupedlist does not seem to be used in this file nor in template
         $template->param( ungroupedlist => 1);
         my @booksellers = GetBookSeller('');
        for (my $i=0; $i < scalar @booksellers; $i++) {
@@ -315,6 +333,7 @@ if ( $op eq "add" ) {
             }
         }
     } else {
+# Known bookseller
         my $basketgroupid = $input->param('basketgroupid');
         my $billingplace;
         my $deliveryplace;
@@ -338,8 +357,10 @@ if ( $op eq "add" ) {
             $billingplace  = $basketgroup->{billingplace};
             $deliveryplace = $basketgroup->{deliveryplace};
             $freedeliveryplace = $basketgroup->{freedeliveryplace};
+            $template->param( closedbg => ($basketgroup ->{'closed'}) ? 1 : 0);
+        } else {
+            $template->param( closedbg => 0);
         }
-
         # determine default billing and delivery places depending on librarian homebranch and existing basketgroup data
         my $borrower = GetMember( ( 'borrowernumber' => $loggedinuser ) );
         $billingplace  = $billingplace  || $borrower->{'branchcode'};
@@ -349,23 +370,27 @@ if ( $op eq "add" ) {
         $template->param( billingplaceloop => $branches );
         $branches = C4::Branch::GetBranchesLoop( $deliveryplace );
         $template->param( deliveryplaceloop => $branches );
-
         $template->param( booksellerid => $booksellerid );
     }
+    # the template will display a unique basketgroup
     $template->param(grouping => 1);
     my $basketgroups = &GetBasketgroups($booksellerid);
     my $bookseller = &GetBookSellerFromId($booksellerid);
     my $baskets = &GetBasketsByBookseller($booksellerid);
-
     displaybasketgroups($basketgroups, $bookseller, $baskets);
 } elsif ($op eq 'mod_basket') {
-#we want to modify an individual basket's group
+#
+# edit an individual basket contained in this basketgroup
+#
   my $basketno=$input->param('basketno');
   my $basketgroupid=$input->param('basketgroupid');
   ModBasket( { basketno => $basketno,
                          basketgroupid => $basketgroupid } );
   print $input->redirect("basket.pl?basketno=" . $basketno);
 } elsif ($op eq 'validate') {
+#
+#  FIXME dead code
+#
     if(! $booksellerid){
         $template->param( booksellererror => 1);
     } else {
@@ -374,7 +399,7 @@ if ( $op eq "add" ) {
     my $baskets = parseinputbaskets($booksellerid);
     my ($basketgroups, $newbasketgroups) = parseinputbasketgroups($booksellerid, $baskets);
     foreach my $nbgid (keys %$newbasketgroups){
-#javascript just picks an ID that's higher than anything else, the ID might not be correct..chenge it and change all the basket's basketgroupid as well
+#javascript just picks an ID that's higher than anything else, the ID might not be correct..change it and change all the basket's basketgroupid as well
         my $bgid = NewBasketgroup($newbasketgroups->{$nbgid});
         ${$newbasketgroups->{$nbgid}}->{'id'} = $bgid;
         ${$newbasketgroups->{$nbgid}}->{'oldid'} = $nbgid;
@@ -400,21 +425,28 @@ if ( $op eq "add" ) {
     $basketgroups = &GetBasketgroups($booksellerid);
     my $bookseller = &GetBookSellerFromId($booksellerid);
     $baskets = &GetBasketsByBookseller($booksellerid);
+    # keep ungroupedbaskets
 
     displaybasketgroups($basketgroups, $bookseller, $baskets);
 } elsif ( $op eq 'closeandprint') {
+#
+# close an open basketgroup and generates a pdf
+#
     my $basketgroupid = $input->param('basketgroupid');
-    
     CloseBasketgroup($basketgroupid);
-    
     printbasketgrouppdf($basketgroupid);
     exit;
 }elsif ($op eq 'print'){
+#
+# print a closed basketgroup
+#
     my $basketgroupid = $input->param('basketgroupid');
-    
     printbasketgrouppdf($basketgroupid);
     exit;
 }elsif ( $op eq "export" ) {
+#
+# export a closed basketgroup in csv
+#
     my $basketgroupid = $input->param('basketgroupid');
     print $input->header(
         -type       => 'text/csv',
@@ -423,20 +455,25 @@ if ( $op eq "add" ) {
     print GetBasketGroupAsCSV( $basketgroupid, $input );
     exit;
 }elsif( $op eq "delete"){
+#
+# delete an closed basketgroup
+#
     my $basketgroupid = $input->param('basketgroupid');
     DelBasketgroup($basketgroupid);
-    print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid);
-    
+    print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid.'&amp;listclosed=1');
 }elsif ( $op eq 'reopen'){
+#
+# reopen a closed basketgroup
+#
     my $basketgroupid   = $input->param('basketgroupid');
     my $booksellerid    = $input->param('booksellerid');
-    
     ReOpenBasketgroup($basketgroupid);
-        
-    print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid . '#closed');
-    
+    my $redirectpath = ((defined $input->param('mode'))&& ($input->param('mode') eq 'singlebg')) ?'/cgi-bin/koha/acqui/basketgroup.pl?op=add&amp;basketgroupid='.$basketgroupid.'&amp;booksellerid='.$booksellerid : '/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' .$booksellerid.'&amp;listclosed=1';
+    print $input->redirect($redirectpath);
 } elsif ( $op eq 'attachbasket') {
-    
+#
+# save a modified basketgroup, or creates a new basketgroup when a basket is closed. called from basket page
+#
     # Getting parameters
     my $basketgroup       = {};
     my @baskets           = $input->param('basket');
@@ -447,9 +484,9 @@ if ( $op eq "add" ) {
     my $deliveryplace     = $input->param('deliveryplace');
     my $freedeliveryplace = $input->param('freedeliveryplace');
     my $deliverycomment   = $input->param('deliverycomment');
-    my $close             = $input->param('close') ? 1 : 0;
-    # If we got a basketgroupname, we create a basketgroup
+    my $closedbg          = $input->param('closedbg') ? 1 : 0;
     if ($basketgroupid) {
+    # If we have a basketgroupid we edit the basketgroup
         $basketgroup = {
               name              => $basketgroupname,
               id                => $basketgroupid,
@@ -458,13 +495,14 @@ if ( $op eq "add" ) {
               deliveryplace     => $deliveryplace,
               freedeliveryplace => $freedeliveryplace,
               deliverycomment   => $deliverycomment,
-              closed            => $close,
+              closed            => $closedbg,
         };
         ModBasketgroup($basketgroup);
-        if($close){
-            
+        if($closedbg){
+# FIXME
         }
     }else{
+    # we create a new basketgroup (whith a closed basket)
         $basketgroup = {
             name              => $basketgroupname,
             booksellerid      => $booksellerid,
@@ -473,22 +511,22 @@ if ( $op eq "add" ) {
             deliveryplace     => $deliveryplace,
             freedeliveryplace => $freedeliveryplace,
             deliverycomment   => $deliverycomment,
-            closed            => $close,
+            closed            => $closedbg,
         };
         $basketgroupid = NewBasketgroup($basketgroup);
     }
-   
-    my $url = '/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid;
-    $url .= "&closed=1" if ($input->param("closed")); 
-    print $input->redirect($url);
+    my $redirectpath = ((defined $input->param('mode')) && ($input->param('mode') eq 'singlebg')) ?'/cgi-bin/koha/acqui/basketgroup.pl?op=add&amp;basketgroupid='.$basketgroupid.'&amp;booksellerid='.$booksellerid : '/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid;
+    $redirectpath .=  "&amp;listclosed=1" if $closedbg ;
+    print $input->redirect($redirectpath );
     
 }else{
+# no param : display the list of all basketgroups for a given vendor
     my $basketgroups = &GetBasketgroups($booksellerid);
     my $bookseller = &GetBookSellerFromId($booksellerid);
     my $baskets = &GetBasketsByBookseller($booksellerid);
 
     displaybasketgroups($basketgroups, $bookseller, $baskets);
 }
-$template->param(closed => $input->param("closed"));
+$template->param(listclosed => ((defined $input->param('listclosed')) && ($input->param('listclosed') eq '1'))? 1:0 );
 #prolly won't use all these, maybe just use print, the rest can be done inside validate
 output_html_with_http_headers $input, $cookie, $template->output;
index f256ec3..0352071 100644 (file)
@@ -140,10 +140,25 @@ function submitForm(form) {
     <div class="yui-b">
 
 [% IF ( grouping ) %]
+    [% IF (closedbg) %]
+        <div id="toolbar" class="btn-toolbar">
+            <div class="btn-group"><a href="[% script_name %]?op=reopen&amp;basketgroupid=[% basketgroupid %]&amp;booksellerid=[% booksellerid %]&amp;mode=singlebg" class="btn btn-small" id="reopenbutton"><i class="icon-download"></i> Reopen this basket group</a></div>
+            <div class="btn-group"><a href="[% script_name %]?op=export&amp;basketgroupid=[% basketgroupid %]&amp;booksellerid=[% booksellerid %]" class="btn btn-small" id="exportbutton"><i class="icon-download"></i> Export this basket group as CSV</a></div>
+            <div class="btn-group"><a href="[% script_name %]?op=print&amp;basketgroupid=[% basketgroupid %]&amp;booksellerid=[% booksellerid %]" class="btn btn-small" id="printbutton"><i class="icon-download"></i> Print this basket group in PDF</a></div>
+        </div>
+    [% ELSE %]
+    <div class="btn-group"><a href="[% script_name %]?op=delete&amp;basketgroupid=[% basketgroupid %]&amp;booksellerid=[% booksellerid %]" class="btn btn-small" id="delbutton"><i class="icon-remove"></i> Delete basket group</a></div>
+    [% END %]
+    [% IF (name && closedgb) %]
+        <h1>Basket group [% name %] ([% basketgroupid %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid %]">[% booksellername |html %]</a></h1>
+    [% ELSIF (name) %]
+        <h1>Edit basket group [% name %] ([% basketgroupid %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid %]">[% booksellername |html %]</a></h1>
+    [% ELSE %]
     <h1>Add basket group for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid %]">[% booksellername |html %]</a></h1>
+    [% END %]
         <div id="basketgroupcolumns" class="yui-g">
+        [% UNLESS (closedbg) %]
                    <div class="yui-u">
-
                                <form action="[% scriptname %]" method="post" name="basketgroups" id="basketgroups">
                    <div id="groups">
                    <fieldset class="brief">
@@ -170,39 +185,82 @@ function submitForm(form) {
                    </fieldset>
                    </div>
                    </form>
-
                        </div> 
-                       
+       [% END %]
                    <div class="yui-u first"> 
                        <form action="" method="post" id="groupingform" onsubmit="return submitForm(this)">
                                        <fieldset id="various" class="brief">
                                        <ol>
+                    [% UNLESS (closedbg) %]
                         <li><label for="basketgroupname">Basket group name:</label>
                                                        <input type="text" name="basketgroupname" id="basketgroupname" value="[% name %]" class="focus" /></li>
-                        <li><label for="billingplace">Billing place:</label>
+                    [% ELSE %]
+                        <input type="hidden" name="basketgroupname" id="basketgroupname" value="[% name %]" />
+                    [% END %]
+                        <li>
+                            [% UNLESS (closedbg) %]
+                            <label for="billingplace">Billing place:</label>
                                                        <select name="billingplace" id="billingplace" style="width:13em;">
                                 <option value="">--</option>
                                                                [% FOREACH billingplaceloo IN billingplaceloop %]
                                        [% IF ( billingplaceloo.selected ) %]<option value="[% billingplaceloo.value %]" selected="selected">[% billingplaceloo.branchname %]</option>
                                        [% ELSE %]<option value="[% billingplaceloo.value %]">[% billingplaceloo.branchname %]</option>[% END%]
                                                                [% END %]
-                                                                                               </select></li>
-                        <li><label for="deliveryplace">Delivery place:</label>
+                                </select>
+                            [% ELSE %]
+                                <span class="label">Billing place:</span>
+                                [% FOREACH billingplaceloo IN billingplaceloop %]
+                                    [% IF ( billingplaceloo.selected ) %]
+                                        <input name="billingplace" id="billingplace" type ="hidden" value="[% billingplaceloo.value %]" />[% billingplaceloo.branchname %]
+                                    [% END %]
+                                [% END %]
+                            [% END %]
+                        </li>
+                        [% UNLESS (closedbg) %]
+                            <li>
+                                <label for="deliveryplace">Delivery place:</label>
                                                        <select name="deliveryplace" id="deliveryplace" style="width:13em;">
                                                                <option value="">--</option>
                                                                [% FOREACH deliveryplaceloo IN deliveryplaceloop %]
                                        [% IF ( deliveryplaceloo.selected ) %]<option value="[% deliveryplaceloo.value %]" selected="selected">[% deliveryplaceloo.branchname %]</option>
                                        [% ELSE %]<option value="[% deliveryplaceloo.value %]">[% deliveryplaceloo.branchname %]</option>[% END %]
                                                                [% END %]
-                                                                                               </select></li>
+                                <select>
+                            </li>
                         <li><p>or</p></li>
                         <li><label for="freedeliveryplace">Delivery place:</label>
                             <textarea cols="26" rows="3" name="freedeliveryplace" id="freedeliveryplace">[% freedeliveryplace %]</textarea></li>
-                                               <li><label for="deliverycomment">Delivery comment:</label>
-                                                       <textarea cols="26" rows="3" name="deliverycomment" id="deliverycomment">[% deliverycomment %]</textarea>
+                        [% ELSE %]
+                            <li>
+                                <span class="label">Delivery place:</span>
+                                [% IF (freedeliveryplace) %]
+                                    <input name="freedeliveryplace" id="freedeliveryplace" type ="hidden" value="[% freedeliveryplace %]" />[% freedeliveryplace %]
+                                    <input name="deliveryplace" id="deliveryplace" type ="hidden" value="" />
+                                [% ELSE %]
+                                    [% FOREACH deliveryplaceloo IN deliveryplaceloop %]
+                                        [% IF ( deliveryplaceloo.selected ) %]
+                                            <input name="deliveryplace" id="deliveryplace" type ="hidden" value="[% deliveryplaceloo.value %]" />[% deliveryplaceloo.branchname %]
+                                        [% END %]
+                                    [% END %]
+                                    <input name="freedeliveryplace" id="freedeliveryplace" type ="hidden" value="" />
+                                [% END %]
+                            </li>
+                        [% END %]
+                        <li>
+                            [% UNLESS (closedbg) %]
+                                <label for="deliverycomment">Delivery comment:</label>
+                                <textarea cols="26" rows="3" name="deliverycomment" id="deliverycomment">[% deliverycomment %]</textarea>
+                            [% ELSE %]
+                                <span class="label">Delivery comment:</span>[% deliverycomment %]
+                                <input name="deliverycomment" id="deliverycomment" type="hidden" value = "[% deliverycomment %]" />
+                            [% END %]
                                                </li>
                                                <li><span class="label">Baskets in this group:</span>
+                            [% UNLESS (closedbg) %]
                                                        <ul class="draglist" id="bg">
+                            [% ELSE %]
+                                <ul>
+                            [% END %]
                                                                [% FOREACH selectedbasket IN selectedbaskets %]
                                                    <li class="grouped" id="b-[% selectedbasket.basketno %]" >
                                                        <a href="basket.pl?basketno=[% selectedbasket.basketno %]">
@@ -218,10 +276,14 @@ function submitForm(form) {
                                            [% END %]
                                                        </ul>
                                                </li>
-                                               <li><label><input type="checkbox" id="close" name="close" /> Close basket group</label></li>
+                       [% UNLESS (closedbg) %]
+                        <li><label><input type="checkbox" id="closedbg" name="closedbg" />Close basket group</label></li>
+                       [% ELSE %]
+                           <input type="hidden" id="closedbg" name="closedbg" value ="1"/>
+                       [% END %]
                                                </ol>
                                        </fieldset>
-
+                    [% UNLESS (closedbg) %]
                        <fieldset class="action"><input type="hidden" name="booksellerid" value="[% booksellerid %]" />
                                [% IF ( basketgroupid ) %]
                                        <input type="hidden" name="basketgroupid" value="[% basketgroupid %]" />
@@ -229,6 +291,7 @@ function submitForm(form) {
                                <input type="hidden" name="op" value="attachbasket" />
                         <input type="submit" value="Save" /> <a href="/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=[% booksellerid %]" class="cancel">Cancel</a>
                        </fieldset>
+                    [% END %]
                                </form>
                        </div> 
                </div>   
@@ -241,9 +304,9 @@ function submitForm(form) {
 
        <div id="basket_groups" class="toptabs">
        <ul class="ui-tabs-nav">
-        [% UNLESS ( closed ) %]<li class="ui-tabs-selected"><a href="#opened">Open</a></li>
+        [% UNLESS ( listclosed) %]<li class="ui-tabs-selected"><a href="#opened">Open</a></li>
         [% ELSE%]<li><a href="#opened">Open</a></li>[% END %]
-        [% IF ( closed ) %]<li class="ui-tabs-selected"><a href="#closed">Closed</a></li>
+        [% IF ( listclosed) %]<li class="ui-tabs-selected"><a href="#closed">Closed</a></li>
         [% ELSE %]<li><a href="#closed">Closed</a></li>[% END %]
     </ul>
     <div id="opened">
@@ -273,7 +336,7 @@ function submitForm(form) {
                                     <td>[% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) %][% END %]</td>
                                     <td>[% basketgroup.basketsqty %]</td>
                                                        <td>
-                                                               <input type="button" onclick="closeandprint([% basketgroup.id %])" value="Close and print" />
+                                                             <input type="button" onclick="closeandprint('[% basketgroup.id %]');" value="Close and print" />
                                                                <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="add" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Edit" /></form>
                                                                <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="delete" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Delete" /></form>
                                                        </td>
@@ -311,6 +374,7 @@ function submitForm(form) {
                                     <td>[% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) %][% END %]</td>
                                     <td>[% basketgroup.basketsqty %]</td>
                                        <td>
+                            <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="add" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="View" /></form>
                                                        <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="reopen" /><input type="hidden" name="booksellerid" value="[% basketgroup.booksellerid %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Reopen" /></form>
                                                        <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="print" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Print" /></form>
                                                         <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="export" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id %]" /><input type="submit" value="Export as CSV" /></form>