From 5f752d299434d65f2ab8eb1acf90ed2f274a6fa2 Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Wed, 8 Jan 2014 12:08:50 +0100 Subject: [PATCH] Bug 11708: New page for basket groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch moves the code responsible for displaying a list of basket groups into its own Perl script (acqui/basketgroups.pl), making the code in basketgroup.pl and basketgroup.tt a little bit easier to read. basketgroups.pl displays all basket groups in a single table (as bug 13371 for vendors) where rows are grouped by bookseller. This patch also adds 3 columns: - No. of ordered titles - No. of received titles - Date closed It also adds a wrapper around the new DataTable() constructor to be able to use it with the same defaults than the previous dataTable() constructor Test plan: 0. Create a bunch of booksellers and basketgroups 1. Go back to acquisitions home page and click on "Basket groups" link on the left 2. Play with the table (sort, filter) and try every possible actions (Edit, Close and export as PDF, View, Reopen, Export as CSV) 3. Go to a specific vendor page and click on "Basket groups" tab 4. Check that only the vendor's basket groups are displayed 5. prove t/db_dependent/Koha/Acquisition/Basket.t Signed-off-by: Séverine QUEUNE --- Koha/Acquisition/Basket.pm | 37 +++ Koha/Acquisition/BasketGroup.pm | 92 +++++- acqui/basket.pl | 4 +- acqui/basketgroup.pl | 269 ++++++------------ acqui/basketgroups.pl | 52 ++++ .../prog/en/includes/acquisitions-menu.inc | 3 + .../prog/en/includes/datatables.inc | 2 + .../prog/en/includes/vendor-menu.inc | 2 +- .../prog/en/modules/acqui/basket.tt | 2 +- .../prog/en/modules/acqui/basketgroup.tt | 214 +++----------- .../prog/en/modules/acqui/basketgroups.tt | 168 +++++++++++ .../prog/en/modules/acqui/parcel.tt | 4 +- .../intranet-tmpl/prog/js/basketgroup.js | 8 - koha-tmpl/intranet-tmpl/prog/js/datatables.js | 95 +++++-- t/db_dependent/Koha/Acquisition/Basket.t | 46 ++- 15 files changed, 605 insertions(+), 393 deletions(-) create mode 100755 acqui/basketgroups.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroups.tt diff --git a/Koha/Acquisition/Basket.pm b/Koha/Acquisition/Basket.pm index d5e6b8ccb1..6a3982d5e7 100644 --- a/Koha/Acquisition/Basket.pm +++ b/Koha/Acquisition/Basket.pm @@ -21,6 +21,7 @@ use Modern::Perl; use Koha::Database; use Koha::Acquisition::BasketGroups; +use Koha::Acquisition::Orders; use base qw( Koha::Object ); @@ -71,6 +72,42 @@ sub effective_create_items { return $self->create_items || C4::Context->preference('AcqCreateItem'); } +=head3 orders + +Returns basket's orders + + # As an arrayref + my $orders = $basket->orders; + + # As an array + my @orders = $basket->orders; + +=cut + +sub orders { + my ($self) = @_; + + $self->{_orders} ||= Koha::Acquisition::Orders->search({ basketno => $self->basketno }); + + return wantarray ? $self->{_orders}->as_list : $self->{_orders}; +} + +sub total { + my ($self) = @_; + + my $total = 0; + for my $order ($self->orders){ + # FIXME The following is wrong + if ( $self->bookseller->listincgst ) { + $total = $total + ( $order->ecost_tax_included * $order->quantity ); + } else { + $total = $total + ( $order->ecost_tax_excluded * $order->quantity ); + } + } + return $total; +} + + =head2 Internal methods =head3 _type diff --git a/Koha/Acquisition/BasketGroup.pm b/Koha/Acquisition/BasketGroup.pm index a63d8299c4..40f7fc22fe 100644 --- a/Koha/Acquisition/BasketGroup.pm +++ b/Koha/Acquisition/BasketGroup.pm @@ -17,7 +17,10 @@ package Koha::Acquisition::BasketGroup; use Modern::Perl; +use List::MoreUtils qw/uniq/; + use Koha::Database; +use Koha::Acquisition::Baskets; use base qw( Koha::Object ); @@ -27,10 +30,97 @@ Koha::Acquisition::BasketGroup - Koha Basket group Object class =head1 API -=head2 Class Methods +=head2 Methods + +=head3 vendor + +Returns the basketgroup's vendor (Koha::Acquisition::Bookseller) + + my $vendor = $basketgroup->vendor; + +=cut + +sub vendor { + my ($self) = @_; + + return scalar Koha::Acquisition::Booksellers->find($self->booksellerid); +} + +=head3 baskets + +Returns the basketgroup's baskets + + my $baskets = $basketgroup->baskets; # Koha::Acquisition::Baskets + my @baskets = $basketgroup->baskets; # array of Koha::Acquisition::Basket + +=cut + +sub baskets { + my ($self) = @_; + + my $baskets = Koha::Acquisition::Baskets->search({ basketgroupid => $self->id }); + + return wantarray ? $baskets->as_list : $baskets; +} + +=head3 baskets_count + +Returns the number of baskets contained in a basket group + + my $count = $basketgroup->baskets_count; =cut +sub baskets_count { + my ($self) = @_; + + return $self->baskets->count; +} + +=head3 ordered_titles_count + +Returns the number of ordered titles contained in a basket group + + my $count = $basketgroup->ordered_titles_count; + +=cut + +sub ordered_titles_count { + my ($self) = @_; + + my @biblionumbers; + foreach my $basket ($self->baskets) { + foreach my $order ($basket->orders) { + push @biblionumbers, $order->biblionumber; + } + } + + return scalar uniq @biblionumbers; +} + +=head3 received_titles_count + +Returns the number of received titles contained in a basket group + + my $count = $basketgroup->ordered_titles_count; + +=cut + +sub received_titles_count { + my ($self) = @_; + + my @biblionumbers; + foreach my $basket ($self->baskets) { + foreach my $order ($basket->orders) { + if ($order->datereceived) { + push @biblionumbers, $order->biblionumber; + } + } + } + + return scalar uniq @biblionumbers; +} + =head2 Internal methods =head3 _type diff --git a/acqui/basket.pl b/acqui/basket.pl index 1b55e74763..b8bad3602d 100755 --- a/acqui/basket.pl +++ b/acqui/basket.pl @@ -208,7 +208,7 @@ if ( $op eq 'delete_confirm' ) { }); ModBasket( { basketno => $basketno, basketgroupid => $basketgroupid } ); - print $query->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid='.$booksellerid.'&closed=1'); + print $query->redirect('/cgi-bin/koha/acqui/basketgroups.pl?booksellerid='.$booksellerid); } else { print $query->redirect('/cgi-bin/koha/acqui/booksellers.pl?booksellerid=' . $booksellerid); } @@ -556,7 +556,7 @@ sub edi_close_and_order { } ); print $query->redirect( -"/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=$booksellerid&closed=1" + "/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=$booksellerid" ); } else { diff --git a/acqui/basketgroup.pl b/acqui/basketgroup.pl index 4cb1be1478..2fa251ea97 100755 --- a/acqui/basketgroup.pl +++ b/acqui/basketgroup.pl @@ -56,71 +56,20 @@ use Koha::EDI qw/create_edi_order get_edifact_ean/; use Koha::Biblioitems; use Koha::Acquisition::Booksellers; +use Koha::Acquisition::BasketGroups; use Koha::ItemTypes; use Koha::Patrons; -our $input=new CGI; - -our ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "acqui/basketgroup.tt", - query => $input, - type => "intranet", - authnotrequired => 0, - flagsrequired => {acquisition => 'group_manage'}, - debug => 1, - }); - -sub BasketTotal { - my $basketno = shift; - my $bookseller = shift; - my $total = 0; - my @orders = GetOrders($basketno); - for my $order (@orders){ - # FIXME The following is wrong - if ( $bookseller->listincgst ) { - $total = $total + ( $order->{ecost_tax_included} * $order->{quantity} ); - } else { - $total = $total + ( $order->{ecost_tax_excluded} * $order->{quantity} ); - } - } - return $total; -} +my $input = new CGI; -#displays all basketgroups and all closed baskets (in their respective groups) -sub displaybasketgroups { - my $basketgroups = shift; - my $bookseller = shift; - my $baskets = shift; - if (scalar @$basketgroups != 0) { - foreach my $basketgroup (@$basketgroups){ - my $i = 0; - my $basketsqty = 0; - while($i < scalar(@$baskets)){ - my $basket = @$baskets[$i]; - if($basket->{'basketgroupid'} && $basket->{'basketgroupid'} == $basketgroup->{'id'}){ - $basket->{total} = BasketTotal($basket->{basketno}, $bookseller); - push(@{$basketgroup->{'baskets'}}, $basket); - splice(@$baskets, $i, 1); - ++$basketsqty; - --$i; - } - ++$i; - } - $basketgroup -> {'basketsqty'} = $basketsqty; - } - $template->param(basketgroups => $basketgroups); - } - for(my $i=0; $i < scalar @$baskets; ++$i) { - if( ! @$baskets[$i]->{'closedate'} ) { - splice(@$baskets, $i, 1); - --$i; - }else{ - @$baskets[$i]->{total} = BasketTotal(@$baskets[$i]->{basketno}, $bookseller); - } - } - $template->param(baskets => $baskets); - $template->param( booksellername => $bookseller->name); -} +our ($template, $loggedinuser, $cookie) = get_template_and_user({ + template_name => "acqui/basketgroup.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => {acquisition => 'group_manage'}, + debug => 1, +}); sub printbasketgrouppdf{ my ($basketgroupid) = @_; @@ -211,7 +160,6 @@ sub printbasketgrouppdf{ ); my $pdf = printpdf($basketgroup, $bookseller, $baskets, \%orders, $bookseller->tax_rate // C4::Context->preference("gist")) || die "pdf generation failed"; print $pdf; - } sub generate_edifact_orders { @@ -232,104 +180,60 @@ sub generate_edifact_orders { return; } -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 -# - 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 +# - 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 # - ediprint : generate edi order messages for the baskets in the group -# - 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 +# - 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 +my $op = $input->param('op'); +my $basketgroupid = $input->param('basketgroupid'); my $booksellerid = $input->param('booksellerid'); -$template->param(booksellerid => $booksellerid); -my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid ); + +my $basketgroup; +my $bookseller; +if ($basketgroupid) { + $basketgroup = Koha::Acquisition::BasketGroups->find($basketgroupid); + $bookseller = $basketgroup->vendor; +} elsif ($booksellerid) { + $bookseller = Koha::Acquisition::Booksellers->find($booksellerid); +} my $schema = Koha::Database->new()->schema(); my $rs = $schema->resultset('VendorEdiAccount')->search( { vendor_id => $booksellerid, } ); $template->param( ediaccount => ($rs->count > 0)); -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 -# - my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid ); - my $basketgroupid = $input->param('basketgroupid'); - my $billingplace; - my $deliveryplace; - my $freedeliveryplace; - if ( $basketgroupid ) { - # Get the selected baskets in the basketgroup to display them - my $selecteds = GetBasketsByBasketgroup($basketgroupid); - foreach my $basket(@{$selecteds}){ - $basket->{total} = BasketTotal($basket->{basketno}, $bookseller); - } - $template->param(basketgroupid => $basketgroupid, - selectedbaskets => $selecteds); - - # Get general informations about the basket group to prefill the form - my $basketgroup = GetBasketgroup($basketgroupid); - $template->param( - name => $basketgroup->{name}, - deliverycomment => $basketgroup->{deliverycomment}, - freedeliveryplace => $basketgroup->{freedeliveryplace}, - ); - $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 $patron = Koha::Patrons->find( $loggedinuser ); # FIXME Not needed if billingplace and deliveryplace are set - $billingplace = $billingplace || $patron->branchcode; - $deliveryplace = $deliveryplace || $patron->branchcode; - - $template->param( billingplace => $billingplace ); - $template->param( deliveryplace => $deliveryplace ); - $template->param( booksellerid => $booksellerid ); - - # the template will display a unique basketgroup - $template->param(grouping => 1); - my $basketgroups = &GetBasketgroups($booksellerid); - my $baskets = &GetBasketsByBookseller($booksellerid); - displaybasketgroups($basketgroups, $bookseller, $baskets); -} elsif ($op eq 'mod_basket') { -# -# 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); +if ($op eq 'mod_basket') { + # edit an individual basket contained in this basketgroup + + my $basketno=$input->param('basketno'); + ModBasket( { basketno => $basketno, + basketgroupid => $basketgroupid } ); + print $input->redirect("basket.pl?basketno=" . $basketno); } elsif ( $op eq 'closeandprint') { -# -# close an open basketgroup and generates a pdf -# - my $basketgroupid = $input->param('basketgroupid'); + # close an open basketgroup and generates a pdf + CloseBasketgroup($basketgroupid); printbasketgrouppdf($basketgroupid); exit; }elsif ($op eq 'print'){ -# -# print a closed basketgroup -# - my $basketgroupid = $input->param('basketgroupid'); + # print a closed basketgroup + printbasketgrouppdf($basketgroupid); exit; }elsif ( $op eq "export" ) { -# -# export a closed basketgroup in csv -# - my $basketgroupid = $input->param('basketgroupid'); + # export a closed basketgroup in csv + print $input->header( -type => 'text/csv', -attachment => 'basketgroup' . $basketgroupid . '.csv', @@ -337,29 +241,29 @@ if ( $op eq "add" ) { print GetBasketGroupAsCSV( $basketgroupid, $input ); exit; }elsif( $op eq "delete"){ -# -# delete an closed basketgroup -# - my $basketgroupid = $input->param('basketgroupid'); + # delete an closed basketgroup + DelBasketgroup($basketgroupid); - print $input->redirect('/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid.'&listclosed=1'); + print $input->redirect('/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=' . $bookseller->id); + exit; }elsif ( $op eq 'reopen'){ -# -# reopen a closed basketgroup -# - my $basketgroupid = $input->param('basketgroupid'); - my $booksellerid = $input->param('booksellerid'); + # reopen a closed basketgroup + ReOpenBasketgroup($basketgroupid); - my $redirectpath = ((defined $input->param('mode'))&& ($input->param('mode') eq 'singlebg')) ?'/cgi-bin/koha/acqui/basketgroup.pl?op=add&basketgroupid='.$basketgroupid.'&booksellerid='.$booksellerid : '/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' .$booksellerid.'&listclosed=1'; + my $redirectpath; + my $mode = $input->param('mode'); + if (defined $mode && $mode eq 'singlebg') { + $redirectpath = '/cgi-bin/koha/acqui/basketgroup.pl?op=add&basketgroupid='.$basketgroupid.'&booksellerid='.$bookseller->id; + } else { + $redirectpath = '/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=' .$bookseller->id; + } print $input->redirect($redirectpath); + exit; } elsif ( $op eq 'attachbasket') { -# -# save a modified basketgroup, or creates a new basketgroup when a basket is closed. called from basket page -# - # Getting parameters + # save a modified basketgroup, or creates a new basketgroup when a basket is closed. called from basket page + my $basketgroup = {}; my @baskets = $input->multi_param('basket'); - my $basketgroupid = $input->param('basketgroupid'); my $basketgroupname = $input->param('basketgroupname'); my $booksellerid = $input->param('booksellerid'); my $billingplace = $input->param('billingplace'); @@ -368,7 +272,7 @@ if ( $op eq "add" ) { my $deliverycomment = $input->param('deliverycomment'); my $closedbg = $input->param('closedbg') ? 1 : 0; if ($basketgroupid) { - # If we have a basketgroupid we edit the basketgroup + # If we have a basketgroupid we edit the basketgroup $basketgroup = { name => $basketgroupname, id => $basketgroupid, @@ -380,14 +284,11 @@ if ( $op eq "add" ) { closed => $closedbg, }; ModBasketgroup($basketgroup); - if($closedbg){ -# FIXME - } - }else{ - # we create a new basketgroup (with a closed basket) + } else { + # we create a new basketgroup (with a closed basket) $basketgroup = { name => $basketgroupname, - booksellerid => $booksellerid, + booksellerid => $bookseller->id, basketlist => \@baskets, billingplace => $billingplace, deliveryplace => $deliveryplace, @@ -397,31 +298,31 @@ if ( $op eq "add" ) { }; $basketgroupid = NewBasketgroup($basketgroup); } - my $redirectpath = ((defined $input->param('mode')) && ($input->param('mode') eq 'singlebg')) ?'/cgi-bin/koha/acqui/basketgroup.pl?op=add&basketgroupid='.$basketgroupid.'&booksellerid='.$booksellerid : '/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=' . $booksellerid; - $redirectpath .= "&listclosed=1" if $closedbg ; - print $input->redirect($redirectpath ); - + my $redirectpath; + my $mode = $input->param('mode'); + if (defined $mode && $mode eq 'singlebg') { + $redirectpath = '/cgi-bin/koha/acqui/basketgroup.pl?op=add&basketgroupid='.$basketgroupid.'&booksellerid='.$booksellerid; + } else { + $redirectpath = '/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=' . $booksellerid; + } + print $input->redirect($redirectpath); + exit; } elsif ( $op eq 'ediprint') { - my $basketgroupid = $input->param('basketgroupid'); if ($template->param( 'ediaccount' )) { generate_edifact_orders( $basketgroupid ); exit; } else { $template->param('NoEDIMessage' => 1); - my $basketgroups = &GetBasketgroups($booksellerid); - my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid ); - my $baskets = &GetBasketsByBookseller($booksellerid); - - displaybasketgroups($basketgroups, $bookseller, $baskets); } -}else{ -# no param : display the list of all basketgroups for a given vendor - my $basketgroups = &GetBasketgroups($booksellerid); - my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid ); - my $baskets = &GetBasketsByBookseller($booksellerid); - - displaybasketgroups($basketgroups, $bookseller, $baskets); } -$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 + +my $borrower = Koha::Patrons->find( $loggedinuser ); +$template->param( + bookseller => $bookseller, + basketgroup => $basketgroup, + billingplace => $basketgroup ? $basketgroup->billingplace : $borrower->branchcode, + deliveryplace => $basketgroup ? $basketgroup->deliveryplace : $borrower->branchcode, + baskets => [ Koha::Acquisition::Baskets->search({booksellerid => $bookseller->id, basketgroupid => undef}) ], +); + output_html_with_http_headers $input, $cookie, $template->output; diff --git a/acqui/basketgroups.pl b/acqui/basketgroups.pl new file mode 100755 index 0000000000..b690997352 --- /dev/null +++ b/acqui/basketgroups.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY 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, see . + +use Modern::Perl; + +use CGI qw(-utf8); + +use C4::Auth; +use C4::Output; + +use Koha::Acquisition::BasketGroups; +use Koha::Acquisition::Booksellers; + +my $cgi = new CGI; + +my ($template, $loggedinuser, $cookie) = get_template_and_user({ + template_name => 'acqui/basketgroups.tt', + query => $cgi, + type => 'intranet', + flagsrequired => { acquisition => 'group_manage' }, +}); + +my $booksellerid = $cgi->param('booksellerid'); + +my $params = {}; +if ($booksellerid) { + $params->{booksellerid} = $booksellerid; + my $bookseller = Koha::Acquisition::Booksellers->find($booksellerid); + $template->param(bookseller => $bookseller); +} + +my @basketgroups = Koha::Acquisition::BasketGroups->search($params); + +$template->param( + basketgroups => \@basketgroups, +); + +output_html_with_http_headers $cgi, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc index 39da875c31..7b94a242ec 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc @@ -3,6 +3,9 @@
Acquisitions
  • Acquisitions home
  • + [% IF ( CAN_user_acquisition_group_manage ) %] +
  • Basket groups
  • + [% END %] [% IF ( CAN_user_acquisition_order_receive ) %]
  • Late orders
  • [% END %] [% IF ( suggestion && CAN_user_acquisition_suggestions_manage ) %]
  • Suggestions
  • [% END %]
  • Invoices
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc index eda776e03c..314dd57072 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc @@ -23,6 +23,8 @@ var MSG_DT_SEARCH = _("Search:"); var MSG_DT_ZERO_RECORDS = _("No matching records found"); var MSG_DT_ALL = _("All"); + var MSG_DT_SORT_ASC = _(": activate to sort column ascending"); + var MSG_DT_SORT_DESC = _(": activate to sort column descending"); var CONFIG_EXCLUDE_ARTICLES_FROM_SORT = _("a an the"); var MSG_DT_COPY_TITLE = _("Copy to clipboard"); var MSG_DT_COPY_KEYS = _("Press ctrl or ⌘ + C to copy the table data
    to your system clipboard.

    To cancel, click this message or press escape."); diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/vendor-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/vendor-menu.inc index 3fc669e840..6bf329b6ac 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/vendor-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/vendor-menu.inc @@ -2,7 +2,7 @@ -[% END %] + [% bookseller.name | html %] + › + Basket groups + › + Add basket group for [% bookseller.name | html %] +
    @@ -140,26 +116,26 @@ function submitForm(form) {
    - [% IF ( grouping ) %] - [% IF (closedbg) %] + [% IF (basketgroup.closeddate) %] [% END %] - [% IF (name && closedbg) %] -

    Basket group [% name | html %] ([% basketgroupid | html %]) for [% booksellername | html %]

    - [% ELSIF (name) %] -

    Edit basket group [% name | html %] ([% basketgroupid | html %]) for [% booksellername | html %]

    + [% IF (basketgroup && basketgroup.closeddate) %] +

    Basket group [% basketgroup.name | html %] ([% basketgroup.id | html %]) for [% bookseller.name | html %]

    + [% ELSIF (basketgroup) %] +

    Edit basket group [% basketgroup.name | html %] ([% basketgroup.id | html %]) for [% bookseller.name | html %]

    [% ELSE %] -

    Add basket group for [% booksellername | html %]

    +

    Add basket group for [% bookseller.name | html %]

    [% END %] + [% IF NoEDIMessage %]
    No EDIFACT configuration for [% bookseller.name | html %]
    [% END %]
    - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %]
    @@ -189,24 +165,24 @@ function submitForm(form) {
    [% END %] - [% IF ( closedbg ) %] + [% IF ( basketgroup.closeddate ) %]
    [% ELSE %]
    [% END %] -
    +
      - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %]
    1. - +
    2. [% ELSE %] - + [% END %]
    3. - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %] [% ELSE %] Billing place: - [% Branches.GetName( billingplace ) | html %] + [% Branches.GetName( basketgroup.billingplace ) | html %] [% END %]
    4. - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %]
    5. +
    6. [% ELSE %]
    7. Delivery place: - [% IF (freedeliveryplace) %] - [% freedeliveryplace | html %] + [% IF (basketgroup.freedeliveryplace) %] + [% basketgroup.freedeliveryplace | html %] [% ELSE %] - [% Branches.GetName( deliveryplace ) | html %] + [% Branches.GetName( basketgroup.deliveryplace ) | html %] [% END %]
    8. [% END %]
    9. - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %] - + [% ELSE %] - Delivery comment:[% deliverycomment | html %] - + Delivery comment:[% basketgroup.deliverycomment | html %] + [% END %]
    10. Baskets in this group: - [% UNLESS (closedbg) %] + [% UNLESS (basketgroup.closeddate) %]
    - [% UNLESS (closedbg) %] -
    - [% IF ( basketgroupid ) %] - + [% UNLESS (basketgroup.closeddate) %] +
    + [% IF ( basketgroup ) %] + [% END %] - Cancel + Cancel
    [% END %]
    - [% ELSE %] - -

    Basket grouping for [% booksellername | html %]

    - [% IF (NoEDIMessage) %]
    No EDIFACT configuration for [% booksellername | html %]
    [% END %] -
    -
      - [% UNLESS ( listclosed) %]
    • Open
    • - [% ELSE%]
    • Open
    • [% END %] - [% IF ( listclosed) %]
    • Closed
    • - [% ELSE %]
    • Closed
    • [% END %] -
    -
    - - - - - - - - - - - - - [% FOREACH basketgroup IN basketgroups %] - [% UNLESS ( basketgroup.closed ) %] - - - - - - - - - [% END %] - [% END %] - -
    NameNumberBilling placeDelivery placeNumber of basketsAction
    [% IF ( basketgroup.name ) %] - [% basketgroup.name | html %] - [% ELSE %] - Basket group no. [% basketgroup.id | html %] - [% END %] - [% basketgroup.id | html %][% Branches.GetName( basketgroup.billingplace ) | html %][% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) | html %][% END %][% basketgroup.basketsqty | html %] - -
    - [% UNLESS basketgroup.basketsqty %] -
    - [% END %] -
    -
    -
    - - - - - - - - - - - - - [% FOREACH basketgroup IN basketgroups %] - [% IF ( basketgroup.closed ) %] - - - - - - - - - [% END %] - [% END %] - -
    NameNumberBilling placeDelivery placeNumber of basketsAction
    - [% IF ( basketgroup.name ) %] - [% basketgroup.name | html %] - [% ELSE %] - Basket group no. [% basketgroup.id | html %] - [% END %] - [% basketgroup.id | html %][% Branches.GetName( basketgroup.billingplace ) | html %][% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) | html %][% END %][% basketgroup.basketsqty | html %] -
    -
    -
    -
    - [% IF (ediaccount) %] -
    - [% ELSE %] -
    No EDIFACT configuration for [% booksellername | html %]
    - [% END %] -
    -
    -
    - [% END %]
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroups.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroups.tt new file mode 100644 index 0000000000..d7bd8979c7 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroups.tt @@ -0,0 +1,168 @@ +[% USE Asset %] +[% USE Branches %] +[% USE KohaDates %] +[% USE raw %] + +[% SET footerjs = 1 %] +[% INCLUDE 'doc-head-open.inc' %] + [% IF bookseller %] + Koha › Basket groups for [% bookseller.name |html %] + [% ELSE %] + Koha › Basket groups + [% END %] +[% INCLUDE 'doc-head-close.inc' %] +[% Asset.css('css/datatables.css') | $raw %] + + + [% INCLUDE 'header.inc' %] + [% INCLUDE 'acquisitions-search.inc' %] + + + +
    +
    +
    +
    + [% IF bookseller %] + + +

    Basket groups for [% bookseller.name | html %]

    + [% END %] + + [% IF basketgroups.size > 0 %] + + + + + + + + + + + + + + + + [% FOREACH basketgroup IN basketgroups %] + + + + + + + + + + + + [% END %] + +
    NameVendorBilling placeDelivery placeNo. of basketsNo. of ordered titlesNo. of received titlesDate closedAction
    + [% IF ( basketgroup.name ) %] + [% basketgroup.name | html %] + [% ELSE %] + Basket group no. [% basketgroup.id | $raw %] + [% END %] + [% basketgroup.vendor.name | html %][% Branches.GetName(basketgroup.billingplace) | html %] + [% IF (basketgroup.freedeliveryplace) %] + [% basketgroup.freedeliveryplace | html %] + [% ELSE %] + [% Branches.GetName(basketgroup.deliveryplace) | html %] + [% END %] + [% basketgroup.baskets_count | $raw %][% basketgroup.ordered_titles_count | $raw %][% basketgroup.received_titles_count | $raw %][% basketgroup.closeddate | $KohaDates %] + +
    + [% END %] +
    +
    +
    + [% IF bookseller %] + [% INCLUDE 'vendor-menu.inc' booksellerid = bookseller.id %] + [% END %] + [% INCLUDE 'acquisitions-menu.inc' %] +
    +
    + + [% MACRO jsinclude BLOCK %] + [% INCLUDE 'datatables.inc' %] + [% Asset.js('lib/jquery/plugins/jquery.dataTables.columnFilter.js') | $raw %] + + [% END %] + + [% INCLUDE 'intranet-bottom.inc' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt index 6ee609c971..2cfb840945 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt @@ -132,7 +132,7 @@ [% loop_order.basketname | html %] ([% loop_order.basketno | html %]) [% IF loop_order.basketgroupid %] - [% loop_order.basketgroupname | html %] ([% loop_order.basketgroupid | html %]) + [% loop_order.basketgroupname | html %] ([% loop_order.basketgroupid | html %]) [% ELSE %] No basket group [% END %] @@ -279,7 +279,7 @@ [% order.basketname | html %] ([% order.basketno | html %]) [% IF order.basketgroupid %] - [% order.basketgroupname | html %] ([% order.basketgroupid | html %]) + [% order.basketgroupname | html %] ([% order.basketgroupid | html %]) [% ELSE %] No basket group [% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/js/basketgroup.js b/koha-tmpl/intranet-tmpl/prog/js/basketgroup.js index 0d8a525a46..daf0a15d23 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/basketgroup.js +++ b/koha-tmpl/intranet-tmpl/prog/js/basketgroup.js @@ -233,14 +233,6 @@ function closebasketgroup(bgid) { div.appendChild(unclosegroup); } -function closeandprint(bg){ - if(document.location = '/cgi-bin/koha/acqui/basketgroup.pl?op=closeandprint&basketgroupid=' + bg ){ - setTimeout("window.location.reload();",3000); - }else{ - alert(MSG_FILE_DOWNLOAD_ERROR); - } -} - //function that lets the user unclose a basketgroup //as long as they haven't submitted the changes to the page. function unclosegroup(bgid){ diff --git a/koha-tmpl/intranet-tmpl/prog/js/datatables.js b/koha-tmpl/intranet-tmpl/prog/js/datatables.js index 0e95d1e2f0..b6e614d62f 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/datatables.js +++ b/koha-tmpl/intranet-tmpl/prog/js/datatables.js @@ -1,42 +1,89 @@ // These default options are for translation but can be used // for any other datatables settings // MSG_DT_* variables comes from datatables.inc -// To use it, write: -// $("#table_id").dataTable($.extend(true, {}, dataTableDefaults, { -// // other settings -// } ) ); +// Since version 1.10, DataTables has a new API while still providing the older +// one. +// You can use the new API with these defaults by writing: +// +// $('#table_id').kohaDataTable({ ... }); +// +// To use the older API, write: +// +// $("#table_id").dataTable($.extend(true, {}, dataTablesDefaults, { ... }); + +var DataTableDefaults = { + "language": { + "emptyTable": window.MSG_DT_EMPTY_TABLE || "No data available in table", + "info": window.MSG_DT_INFO || "Showing _START_ to _END_ of _TOTAL_ entries", + "infoEmpty": window.MSG_DT_INFO_EMPTY || "No entries to show", + "infoFiltered": window.MSG_DT_INFO_FILTERED || "(filtered from _MAX_ total entries)", + "lengthMenu": window.MSG_DT_LENGTH_MENU || "Show _MENU_ entries", + "loadingRecords": window.MSG_DT_LOADING_RECORDS || "Loading...", + "processing": window.MSG_DT_PROCESSING || "Processing...", + "search": window.MSG_DT_SEARCH || "Search:", + "zeroRecords": window.MSG_DT_ZERO_RECORDS || "No matching records found", + "paginate": { + "first": window.MSG_DT_FIRST || "First", + "last": window.MSG_DT_LAST || "Last", + "next": window.MSG_DT_NEXT || "Next", + "previous": window.MSG_DT_PREVIOUS || "Previous" + }, + "aria": { + "sortAscending": window.MSG_DT_SORT_ASC || ": activate to sort column ascending", + "sortDescending": window.MSG_DT_SORT_DESC || ": activate to sort column descending" + }, + "buttons": { + "copyTitle" : window.MSG_DT_COPY_TITLE || "Copy to clipboard", + "copyKeys" : window.MSG_DT_COPY_KEYS || "Press ctrl or + C to copy the table data
    to your system clipboard.

    To cancel, click this message or press escape.", + "copySuccess": { + "_": window.MSG_DT_COPY_SUCCESS_X || "Copied %d rows to clipboard", + "1": window.MSG_DT_COPY_SUCCESS_ONE || "Copied one row to clipboard" + } + } + }, + "dom": '<"top pager"ilpf>tr<"bottom pager"ip>', + "lengthMenu": [[10, 20, 50, 100, -1], [10, 20, 50, 100, window.MSG_DT_ALL || "All"]], + "pageLength": 20 +}; + var dataTablesDefaults = { "oLanguage": { "oPaginate": { - "sFirst" : window.MSG_DT_FIRST || "First", - "sLast" : window.MSG_DT_LAST || "Last", - "sNext" : window.MSG_DT_NEXT || "Next", - "sPrevious" : window.MSG_DT_PREVIOUS || "Previous" + "sFirst" : DataTableDefaults.language.paginate.first, + "sLast" : DataTableDefaults.language.paginate.last, + "sNext" : DataTableDefaults.language.paginate.next, + "sPrevious" : DataTableDefaults.language.paginate.previous, }, - "sEmptyTable" : window.MSG_DT_EMPTY_TABLE || "No data available in table", - "sInfo" : window.MSG_DT_INFO || "Showing _START_ to _END_ of _TOTAL_ entries", - "sInfoEmpty" : window.MSG_DT_INFO_EMPTY || "No entries to show", - "sInfoFiltered" : window.MSG_DT_INFO_FILTERED || "(filtered from _MAX_ total entries)", - "sLengthMenu" : window.MSG_DT_LENGTH_MENU || "Show _MENU_ entries", - "sLoadingRecords" : window.MSG_DT_LOADING_RECORDS || "Loading...", - "sProcessing" : window.MSG_DT_PROCESSING || "Processing...", - "sSearch" : window.MSG_DT_SEARCH || "Search:", - "sZeroRecords" : window.MSG_DT_ZERO_RECORDS || "No matching records found", - buttons: { - "copyTitle" : window.MSG_DT_COPY_TITLE || "Copy to clipboard", - "copyKeys" : window.MSG_DT_COPY_KEYS || "Press ctrl or + C to copy the table data
    to your system clipboard.

    To cancel, click this message or press escape.", + "sEmptyTable" : DataTableDefaults.language.emptyTable, + "sInfo" : DataTableDefaults.language.info, + "sInfoEmpty" : DataTableDefaults.language.infoEmpty, + "sInfoFiltered" : DataTableDefaults.language.infoFiltered, + "sLengthMenu" : DataTableDefaults.language.lengthMenu, + "sLoadingRecords" : DataTableDefaults.language.loadingRecords, + "sProcessing" : DataTableDefaults.language.processing, + "sSearch" : DataTableDefaults.language.search, + "sZeroRecords" : DataTableDefaults.language.zeroRecords, + "buttons": { + "copyTitle" : DataTableDefaults.language.buttons.copyTitle, + "copyKeys" : DataTableDefaults.language.buttons.copyKeys, "copySuccess": { - _: window.MSG_DT_COPY_SUCCESS_X || "Copied %d rows to clipboard", - 1: window.MSG_DT_COPY_SUCCESS_ONE || "Copied one row to clipboard" + "_": DataTableDefaults.language.buttons.copySuccess["_"], + "1": DataTableDefaults.language.buttons.copySuccess["1"] } } }, "dom": '<"top pager"ilpfB>tr<"bottom pager"ip>', "buttons": [], - "aLengthMenu": [[10, 20, 50, 100, -1], [10, 20, 50, 100, window.MSG_DT_ALL || "All"]], - "iDisplayLength": 20 + "aLengthMenu": DataTableDefaults.lengthMenu, + "iDisplayLength": DataTableDefaults.pageLength }; +(function($) { + $.fn.kohaDataTable = function(options) { + return this.DataTable($.extend(true, {}, DataTableDefaults, options)); + }; +})(jQuery); + // Return an array of string containing the values of a particular column $.fn.dataTableExt.oApi.fnGetColumnData = function ( oSettings, iColumn, bUnique, bFiltered, bIgnoreEmpty ) { diff --git a/t/db_dependent/Koha/Acquisition/Basket.t b/t/db_dependent/Koha/Acquisition/Basket.t index e262e2d1f2..ef151a6290 100644 --- a/t/db_dependent/Koha/Acquisition/Basket.t +++ b/t/db_dependent/Koha/Acquisition/Basket.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 4; +use Test::More tests => 5; use t::lib::TestBuilder; use t::lib::Mocks; @@ -107,3 +107,47 @@ subtest 'basket_group' => sub { $schema->storage->txn_rollback; }; + +subtest 'total' => sub { + plan tests => 2; + + $schema->storage->txn_begin; + my $bookseller = $builder->build_object({ + class => 'Koha::Acquisition::Booksellers', + value => { + listincgst => 0, + }, + }); + my $basket = $builder->build_object({ + class => 'Koha::Acquisition::Baskets', + value => { + booksellerid => $bookseller->id, + }, + }); + my $order1 = $builder->build_object({ + class => 'Koha::Acquisition::Orders', + value => { + basketno => $basket->basketno, + ecost_tax_excluded => 1.5, + ecost_tax_included => 2, + quantity => 2, + } + }); + my $order2 = $builder->build_object({ + class => 'Koha::Acquisition::Orders', + value => { + basketno => $basket->basketno, + ecost_tax_excluded => 1.5, + ecost_tax_included => 2, + quantity => 2, + } + }); + + is ($basket->total, 6); + + $bookseller->listincgst(1)->store(); + $basket = Koha::Acquisition::Baskets->find($basket->basketno); + is ($basket->total, 8); + + $schema->storage->txn_rollback; +}; -- 2.20.1