Bugzilla – Attachment 91286 Details for
Bug 11708
Display all basketgroups on one page, and new column aqbasketgroups.closeddate
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 11708: New page for basket groups
Bug-11708-New-page-for-basket-groups.patch (text/plain), 75.01 KB, created by
Julian Maurice
on 2019-07-04 10:50:27 UTC
(
hide
)
Description:
Bug 11708: New page for basket groups
Filename:
MIME Type:
Creator:
Julian Maurice
Created:
2019-07-04 10:50:27 UTC
Size:
75.01 KB
patch
obsolete
>From 12aa626c3b6af6f57bb0c5ecb6fb1f26564e7713 Mon Sep 17 00:00:00 2001 >From: Julian Maurice <julian.maurice@biblibre.com> >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 <severine.queune@bulac.fr> >--- > 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 | 211 +++----------- > .../prog/en/modules/acqui/basketgroups.tt | 168 +++++++++++ > .../prog/en/modules/acqui/parcel.tt | 2 +- > .../intranet-tmpl/prog/js/basketgroup.js | 8 - > koha-tmpl/intranet-tmpl/prog/js/datatables.js | 103 +++++-- > t/db_dependent/Koha/Acquisition/Basket.t | 46 ++- > 15 files changed, 609 insertions(+), 392 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 5bda3ab303..beea393e1d 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 Koha::Object::Mixin::AdditionalFields ); > >@@ -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 e9bf7cd440..59d1b198c1 100755 >--- a/acqui/basket.pl >+++ b/acqui/basket.pl >@@ -211,7 +211,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); > } >@@ -563,7 +563,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 cc3f9fcc48..ab0ff6dc3e 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 + ( get_rounded_price($order->{ecost_tax_included}) * $order->{quantity} ); >- } else { >- $total = $total + ( get_rounded_price($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 <http://www.gnu.org/licenses>. >+ >+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 f5ef2e4579..64ec5d895c 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 @@ > <h5>Acquisitions</h5> > <ul> > <li><a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions home</a></li> >+ [% IF ( CAN_user_acquisition_group_manage ) %] >+ <li><a href="/cgi-bin/koha/acqui/basketgroups.pl">Basket groups</a></li> >+ [% END %] > [% IF ( CAN_user_acquisition_order_receive ) %]<li><a href="/cgi-bin/koha/acqui/lateorders.pl">Late orders</a></li>[% END %] > [% IF ( suggestion && CAN_user_acquisition_suggestions_manage ) %]<li><a href="/cgi-bin/koha/suggestion/suggestion.pl">Suggestions</a></li>[% END %] > <li><a href="/cgi-bin/koha/acqui/invoices.pl">Invoices</a></li> >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<br>to your system clipboard.<br><br>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 @@ > <div id="menu"> > <ul> > [% IF ( CAN_user_acquisition_order_manage ) %]<li><a href="/cgi-bin/koha/acqui/booksellers.pl?booksellerid=[% booksellerid | uri %]">Baskets</a></li>[% END %] >- [% IF ( CAN_user_acquisition_group_manage ) %]<li><a href="/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=[% booksellerid | uri %]">Basket groups</a></li>[% END %] >+ [% IF ( CAN_user_acquisition_group_manage ) %]<li><a href="/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=[% booksellerid | uri %]">Basket groups</a></li>[% END %] > [% IF ( CAN_user_acquisition_contracts_manage ) %]<li><a href="/cgi-bin/koha/admin/aqcontract.pl?booksellerid=[% booksellerid | uri %]">Contracts</a></li>[% END %] > <li><a href="/cgi-bin/koha/acqui/invoices.pl?supplierid=[% booksellerid | uri %]&op=do_search">Invoices</a></li> > [% IF ( CAN_user_acquisition_order_manage ) %][% IF ( basketno ) %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >index 96858b9268..aff1fad60e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basket.tt >@@ -881,7 +881,7 @@ > $(document).ready(function(){ > $("#basketgroupid").change(function(){ > if($(this).val() == "new"){ >- location.href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% booksellerid | html %]"; >+ location.href="/cgi-bin/koha/acqui/basketgroups.pl?op=add&booksellerid=[% booksellerid | html %]"; > } else { > $(this).parent().submit(); > } >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt >index c3df5140df..705cbe0576 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/basketgroup.tt >@@ -2,8 +2,9 @@ > [% USE Asset %] > [% USE Branches %] > [% USE Price %] >+[% USE KohaDates %] > [% INCLUDE 'doc-head-open.inc' %] >-<title>Koha › Basket grouping for [% booksellername | html %]</title> >+<title>Koha › Basket groups for [% booksellername | html %]</title> > [% INCLUDE 'doc-head-close.inc' %] > [% INCLUDE 'datatables.inc' %] > [% Asset.js("lib/yui/utilities/utilities.js") | $raw %] >@@ -11,7 +12,6 @@ > [% Asset.js("lib/yui/container/container_core-min.js") | $raw %] > [% Asset.js("lib/yui/menu/menu-min.js") | $raw %] > [% Asset.js("js/basketgroup.js") | $raw %] >-[% IF ( grouping ) %] > [% Asset.js("lib/yui/yahoo-dom-event/yahoo-dom-event.js") | $raw %] > [% Asset.js("lib/yui/animation/animation-min.js") | $raw %] > [% Asset.js("lib/yui/dragdrop/dragdrop-min.js") | $raw %] >@@ -85,7 +85,6 @@ fieldset.various li { > } > > </style> >- [% END %] > <script> > YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true); > >@@ -95,27 +94,6 @@ fieldset.various li { > var MSG_REOPEN_BASKETGROUP = _("reopen basketgroup"); > var MSG_FILE_DOWNLOAD_ERROR = _("Error downloading the file"); > >- function submitForm(form) { >- if (form.close.checked == true) { >- var input = document.createElement("input"); >- input.setAttribute("type", "hidden"); >- input.setAttribute("name", "closed"); >- input.setAttribute("value", "1"); >- form.appendChild(input); >- } >- } >- >- $(document).ready(function() { >- $("#basket_groups").tabs(); >- >- $("table").dataTable($.extend(true, {}, dataTablesDefaults, { >- "aoColumnDefs": [ >- { "aTargets": [ -1 ], "bSortable": false, "bSearchable": false }, >- ], >- "bAutoWidth": false, >- "sPaginationType": "four_button" >- } )); >- }); > </script> > > </head> >@@ -124,11 +102,12 @@ fieldset.various li { > [% INCLUDE 'acquisitions-search.inc' %] > > <div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> › >-[% IF ( grouping ) %] >- <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a> › <a href="/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=[% booksellerid | html %]">Basket grouping</a> › Add basket group for [% booksellername | html %]</div> >-[% ELSE %] >- <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a> › Basket grouping</div> >-[% END %] >+ <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | uri %]">[% bookseller.name | html %]</a> >+ › >+ <a href="/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=[% bookseller.id | uri %]">Basket groups</a> >+ › >+ Add basket group for [% bookseller.name | html %] >+</div> > > > <div class="main container-fluid"> >@@ -136,26 +115,26 @@ fieldset.various li { > <div class="col-sm-10 col-sm-push-2"> > <main> > >- [% IF ( grouping ) %] >- [% IF (closedbg) %] >+ [% IF (basketgroup.closeddate) %] > <div id="toolbar" class="btn-toolbar"> >- <div class="btn-group"><a href="[% script_name | url %]?op=reopen&basketgroupid=[% basketgroupid | uri %]&booksellerid=[% booksellerid | uri %]&mode=singlebg" class="btn btn-default" id="reopenbutton"><i class="fa fa-download"></i> Reopen this basket group</a></div> >- <div class="btn-group"><a href="[% script_name | url %]?op=export&basketgroupid=[% basketgroupid | uri %]&booksellerid=[% booksellerid | uri %]" class="btn btn-default" id="exportbutton"><i class="fa fa-download"></i> Export this basket group as CSV</a></div> >- <div class="btn-group"><a href="[% script_name | url %]?op=print&basketgroupid=[% basketgroupid | uri %]&booksellerid=[% booksellerid | uri %]" class="btn btn-default" id="printbutton"><i class="fa fa-download"></i> Print this basket group in PDF</a></div> >+ <div class="btn-group"><a href="[% script_name | url %]?op=reopen&basketgroupid=[% basketgroup.id | uri %]&booksellerid=[% bookseller.id | uri %]&mode=singlebg" class="btn btn-default" id="reopenbutton"><i class="fa fa-download"></i> Reopen this basket group</a></div> >+ <div class="btn-group"><a href="[% script_name | url %]?op=export&basketgroupid=[% basketgroup.id | uri %]&booksellerid=[% bookseller.id | uri %]" class="btn btn-default" id="exportbutton"><i class="fa fa-download"></i> Export this basket group as CSV</a></div> >+ <div class="btn-group"><a href="[% script_name | url %]?op=print&basketgroupid=[% basketgroup.id | uri %]&booksellerid=[% bookseller.id | uri %]" class="btn btn-default" id="printbutton"><i class="fa fa-download"></i> Print this basket group in PDF</a></div> > [% IF (ediaccount) %] >- <div class="btn-group"><a href="[% script_name | url %]?op=ediprint&basketgroupid=[% basketgroupid | uri %]&booksellerid=[% booksellerid | uri %]" class="btn btn-default" id="printbutton"><i class="fa fa-download"></i> Generate EDIFACT order</a></div> >+ <div class="btn-group"><a href="[% script_name | url %]?op=ediprint&basketgroupid=[% basketgroup.id | uri %]&booksellerid=[% bookseller.id | uri %]" class="btn btn-default" id="printbutton"><i class="fa fa-download"></i> Generate EDIFACT order</a></div> > [% END %] > </div> > [% END %] >- [% IF (name && closedbg) %] >- <h1>Basket group [% name | html %] ([% basketgroupid | html %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a></h1> >- [% ELSIF (name) %] >- <h1>Edit basket group [% name | html %] ([% basketgroupid | html %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a></h1> >+ [% IF (basketgroup && basketgroup.closeddate) %] >+ <h1>Basket group [% basketgroup.name | html %] ([% basketgroup.id | html %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | uri %]">[% bookseller.name | html %]</a></h1> >+ [% ELSIF (basketgroup) %] >+ <h1>Edit basket group [% basketgroup.name | html %] ([% basketgroup.id | html %]) for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | uri %]">[% bookseller.name | html %]</a></h1> > [% ELSE %] >- <h1>Add basket group for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a></h1> >+ <h1>Add basket group for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | uri %]">[% bookseller.name | html %]</a></h1> > [% END %] >+ [% IF NoEDIMessage %]<div><strong>No EDIFACT configuration for [% bookseller.name | html %]</strong></div>[% END %] > <div id="basketgroupcolumns" class="row"> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <div class="col-xs-6 col-xs-push-6"> > <form action="[% scriptname | html %]" method="post" name="basketgroups" id="basketgroups"> > <div id="groups"> >@@ -185,24 +164,24 @@ fieldset.various li { > </form> > </div> > [% END %] >- [% IF ( closedbg ) %] >+ [% IF ( basketgroup.closeddate ) %] > <div class="col-xs-12"> > [% ELSE %] > <div class="col-xs-6 col-xs-pull-6"> > [% END %] >- <form action="" method="post" id="groupingform" onsubmit="return submitForm(this)"> >+ <form action="" method="post" id="groupingform"> > <fieldset id="various" class="brief"> > <ol> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <li> > <label for="basketgroupname">Basket group name:</label> >- <input type="text" name="basketgroupname" id="basketgroupname" value="[% name | html %]" class="focus" /> >+ <input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroup.name | html %]" class="focus" /> > </li> > [% ELSE %] >- <input type="hidden" name="basketgroupname" id="basketgroupname" value="[% name | html %]" /> >+ <input type="hidden" name="basketgroupname" id="basketgroupname" value="[% basketgroup.name | html %]" /> > [% END %] > <li> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <label for="billingplace">Billing place:</label> > <select name="billingplace" id="billingplace"> > <option value="">--</option> >@@ -210,10 +189,10 @@ fieldset.various li { > </select> > [% ELSE %] > <span class="label">Billing place:</span> >- <input name="billingplace" id="billingplace" type ="hidden" value="[% billingplace | html %]" />[% Branches.GetName( billingplace ) | html %] >+ <input name="billingplace" id="billingplace" type ="hidden" value="[% billingplace | html %]" />[% Branches.GetName( basketgroup.billingplace ) | html %] > [% END %] > </li> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <li> > <label for="deliveryplace">Delivery place:</label> > <select name="deliveryplace" id="deliveryplace"> >@@ -224,37 +203,37 @@ fieldset.various li { > <li><p>or</p></li> > <li> > <label for="freedeliveryplace">Delivery place:</label> >- <textarea cols="26" rows="3" name="freedeliveryplace" id="freedeliveryplace">[% freedeliveryplace | html %]</textarea> >+ <textarea cols="26" rows="3" name="freedeliveryplace" id="freedeliveryplace">[% basketgroup.freedeliveryplace | html %]</textarea> > </li> > [% ELSE %] > <li> > <span class="label">Delivery place:</span> >- [% IF (freedeliveryplace) %] >- <input name="freedeliveryplace" id="freedeliveryplace" type ="hidden" value="[% freedeliveryplace | html %]" />[% freedeliveryplace | html %] >+ [% IF (basketgroup.freedeliveryplace) %] >+ <input name="freedeliveryplace" id="freedeliveryplace" type ="hidden" value="[% basketgroup.freedeliveryplace | html %]" />[% basketgroup.freedeliveryplace | html %] > <input name="deliveryplace" id="deliveryplace" type ="hidden" value="" /> > [% ELSE %] >- <input name="deliveryplace" id="deliveryplace" type ="hidden" value="[% deliveryplace | html %]" />[% Branches.GetName( deliveryplace ) | html %] >+ <input name="deliveryplace" id="deliveryplace" type ="hidden" value="[% basketgroup.deliveryplace | html %]" />[% Branches.GetName( basketgroup.deliveryplace ) | html %] > <input name="freedeliveryplace" id="freedeliveryplace" type ="hidden" value="" /> > [% END %] > </li> > [% END %] > <li> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <label for="deliverycomment">Delivery comment:</label> >- <textarea cols="26" rows="3" name="deliverycomment" id="deliverycomment">[% deliverycomment | html %]</textarea> >+ <textarea cols="26" rows="3" name="deliverycomment" id="deliverycomment">[% basketgroup.deliverycomment | html %]</textarea> > [% ELSE %] >- <span class="label">Delivery comment:</span>[% deliverycomment | html %] >- <input name="deliverycomment" id="deliverycomment" type="hidden" value = "[% deliverycomment | html %]" /> >+ <span class="label">Delivery comment:</span>[% basketgroup.deliverycomment | html %] >+ <input name="deliverycomment" id="deliverycomment" type="hidden" value = "[% basketgroup.deliverycomment | html %]" /> > [% END %] > </li> > <li> > <span class="label">Baskets in this group:</span> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <ul class="draglist" id="bg"> > [% ELSE %] > <ul> > [% END %] >- [% FOREACH selectedbasket IN selectedbaskets %] >+ [% FOREACH selectedbasket IN basketgroup.baskets %] > <li class="grouped" id="b-[% selectedbasket.basketno | html %]" > > <a href="basket.pl?basketno=[% selectedbasket.basketno | uri %]"> > [% IF ( selectedbasket.basketname ) %] >@@ -269,131 +248,31 @@ fieldset.various li { > [% END %] > </ul> > </li> >- [% UNLESS (closedbg) %] >+ [% UNLESS (basketgroup.closeddate) %] > <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 | html %]" /> >- [% IF ( basketgroupid ) %] >- <input type="hidden" name="basketgroupid" value="[% basketgroupid | html %]" /> >+ [% UNLESS (basketgroup.closeddate) %] >+ <fieldset class="action"><input type="hidden" name="booksellerid" value="[% bookseller.id | html %]" /> >+ [% IF ( basketgroup ) %] >+ <input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /> > [% END %] > <input type="hidden" name="op" value="attachbasket" /> >- <input type="submit" value="Save" /> <a href="/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=[% booksellerid | uri %]" class="cancel">Cancel</a> >+ <input type="submit" value="Save" /> <a href="/cgi-bin/koha/acqui/basketgroups.pl?booksellerid=[% bookseller.id | uri %]" class="cancel">Cancel</a> > </fieldset> > [% END %] > </form> > </div> > </div> >- [% ELSE %] >- <div id="toolbar" class="btn-toolbar"> >- <div class="btn-group"><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% booksellerid | uri %]" class="btn btn-default" id="newbasketgroup"><i class="fa fa-plus"></i> New basket group</a></div> >- </div> >- <h1>Basket grouping for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% booksellerid | uri %]">[% booksellername | html %]</a></h1> >- [% IF (NoEDIMessage) %]<div><strong>No EDIFACT configuration for [% booksellername | html %]</strong></div>[% END %] >- <div id="basket_groups" class="toptabs"> >- <ul class="ui-tabs-nav"> >- [% UNLESS ( listclosed) %]<li class="ui-tabs-active"><a href="#opened">Open</a></li> >- [% ELSE%]<li><a href="#opened">Open</a></li>[% END %] >- [% IF ( listclosed) %]<li class="ui-tabs-active"><a href="#closed">Closed</a></li> >- [% ELSE %]<li><a href="#closed">Closed</a></li>[% END %] >- </ul> >- <div id="opened"> >- <table id="basket_group_opened"> >- <thead> >- <tr> >- <th>Name</th> >- <th>Number</th> >- <th>Billing place</th> >- <th>Delivery place</th> >- <th>Number of baskets</th> >- <th>Action</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH basketgroup IN basketgroups %] >- [% UNLESS ( basketgroup.closed ) %] >- <tr> >- <td>[% IF ( basketgroup.name ) %] >- [% basketgroup.name | html %] >- [% ELSE %] >- Basket group no. [% basketgroup.id | html %] >- [% END %] >- </td> >- <td>[% basketgroup.id | html %]</td> >- <td>[% Branches.GetName( basketgroup.billingplace ) | html %]</td> >- <td>[% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) | html %][% END %]</td> >- <td>[% basketgroup.basketsqty | html %]</td> >- <td> >- <input type="button" onclick="closeandprint('[% basketgroup.id | html %]');" value="Close and export as PDF" /> >- <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 | html %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /><input type="submit" value="Edit" /></form> >- [% UNLESS basketgroup.basketsqty %] >- <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 | html %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /><input type="submit" value="Delete" /></form> >- [% END %] >- </td> >- </tr> >- [% END %] >- [% END %] >- </tbody> >- </table> >- </div> >- <div id="closed"> >- <table id="basket_group_closed"> >- <thead> >- <tr> >- <th>Name</th> >- <th>Number</th> >- <th>Billing place</th> >- <th>Delivery place</th> >- <th>Number of baskets</th> >- <th>Action</th> >- </tr> >- </thead> >- <tbody> >- [% FOREACH basketgroup IN basketgroups %] >- [% IF ( basketgroup.closed ) %] >- <tr> >- <td> >- [% IF ( basketgroup.name ) %] >- [% basketgroup.name | html %] >- [% ELSE %] >- Basket group no. [% basketgroup.id | html %] >- [% END %] >- </td> >- <td>[% basketgroup.id | html %]</td> >- <td>[% Branches.GetName( basketgroup.billingplace ) | html %]</td> >- <td>[% IF (basketgroup.freedeliveryplace) %]Free delivery place[% ELSE %][% Branches.GetName( basketgroup.deliveryplace ) | html %][% END %]</td> >- <td>[% basketgroup.basketsqty | html %]</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 | html %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /><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 | html %]" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /><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 | html %]" /><input type="submit" value="Export as PDF" /></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 | html %]" /><input type="submit" value="Export as CSV" /></form> >- [% IF (ediaccount) %] >- <form action="/cgi-bin/koha/acqui/basketgroup.pl" method="get"><input type="hidden" name="op" value="ediprint" /><input type="hidden" name="basketgroupid" value="[% basketgroup.id | html %]" /><input type="submit" value="Generate EDIFACT order" /></form> >- [% ELSE %] >- <div>No EDIFACT configuration for [% booksellername | html %]</div> >- [% END %] >- </td> >- </tr> >- [% END %] >- [% END %] >- </tbody> >- </table> >- </div> >- </div> >- [% END %] > </main> > </div> <!-- /.col-sm-10.col-sm-push-2 --> > > <div class="col-sm-2 col-sm-pull-10"> > <aside> >- [% IF ( booksellerid ) %] >- [% INCLUDE 'vendor-menu.inc' %] >- [% END %] >+ [% INCLUDE 'vendor-menu.inc' %] > [% INCLUDE 'acquisitions-menu.inc' %] > </aside> > </div> >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 %] >+ <title>Koha › Basket groups for [% bookseller.name |html %]</title> >+ [% ELSE %] >+ <title>Koha › Basket groups</title> >+ [% END %] >+[% INCLUDE 'doc-head-close.inc' %] >+[% Asset.css('css/datatables.css') | $raw %] >+</head> >+<body id="acq_basketgroup" class="acq"> >+ [% INCLUDE 'header.inc' %] >+ [% INCLUDE 'acquisitions-search.inc' %] >+ >+ <div id="breadcrumbs"> >+ <a href="/cgi-bin/koha/mainpage.pl">Home</a> >+ › >+ <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> >+ › >+ [% IF (bookseller) %] >+ <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | $raw %]">[% bookseller.name | html %]</a> >+ › >+ [% END %] >+ Basket groups >+ </div> >+ >+ <div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b"> >+ [% IF bookseller %] >+ <div id="toolbar" class="btn-toolbar"> >+ <div class="btn-group"> >+ <a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% bookseller.id | $raw %]" class="btn btn-default btn-sm" id="newbasketgroup"><i class="fa fa-plus"></i> New basket group</a> >+ </div> >+ </div> >+ >+ <h1>Basket groups for <a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% bookseller.id | $raw %]">[% bookseller.name | html %]</a></h1> >+ [% END %] >+ >+ [% IF basketgroups.size > 0 %] >+ <table id="basketgroups-table" class="group"> >+ <thead> >+ <tr> >+ <th>Name</th> >+ <th>Vendor</th> >+ <th>Billing place</th> >+ <th>Delivery place</th> >+ <th>No. of baskets</th> >+ <th>No. of ordered titles</th> >+ <th>No. of received titles</th> >+ <th>Date closed</th> >+ <th>Action</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH basketgroup IN basketgroups %] >+ <tr> >+ <td> >+ [% IF ( basketgroup.name ) %] >+ [% basketgroup.name | html %] >+ [% ELSE %] >+ Basket group no. [% basketgroup.id | $raw %] >+ [% END %] >+ </td> >+ <td>[% basketgroup.vendor.name | html %]</td> >+ <td>[% Branches.GetName(basketgroup.billingplace) | html %]</td> >+ <td> >+ [% IF (basketgroup.freedeliveryplace) %] >+ [% basketgroup.freedeliveryplace | html %] >+ [% ELSE %] >+ [% Branches.GetName(basketgroup.deliveryplace) | html %] >+ [% END %] >+ </td> >+ <td>[% basketgroup.baskets_count | $raw %]</td> >+ <td>[% basketgroup.ordered_titles_count | $raw %]</td> >+ <td>[% basketgroup.received_titles_count | $raw %]</td> >+ <td>[% basketgroup.closeddate | $KohaDates %]</td> >+ <td> >+ <div class="dropdown"> >+ <a class="btn btn-default btn-xs dropdown-toggle" id="actions-[% basketgroup.id | $raw %]" role="button" data-toggle="dropdown">Actions <b class="caret"></b></a> >+ <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="actions-[% basketgroup.id | $raw %]"> >+ [% IF basketgroup.closeddate %] >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% basketgroup.booksellerid | $raw %]&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-eye"></i> View</a></li> >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=reopen&booksellerid=[% basketgroup.booksellerid | $raw %]&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-folder-open"></i> Reopen</a></li> >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=print&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-print"></i> Export as PDF</a></li> >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=export&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-file-text"></i> Export as CSV</a></li> >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=ediprint&booksellerid=[% basketgroup.booksellerid | $raw %]&basketgroupid=[% basketgroup.id | $raw %]">Generate EDIFACT order</a></li> >+ [% ELSE %] >+ <li><a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% basketgroup.booksellerid | $raw %]&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-pencil"></i> Edit</a></li> >+ <li><a class="closeandprint" href="/cgi-bin/koha/acqui/basketgroup.pl?op=closeandprint&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-print"></i> Close and export as PDF</a></li> >+ [% UNLESS basketgroup.baskets_count %] >+ <li><a class="delete" href="/cgi-bin/koha/acqui/basketgroup.pl?op=delete&booksellerid=[% basketgroup.booksellerid | $raw %]&basketgroupid=[% basketgroup.id | $raw %]"><i class="fa fa-trash"></i> Delete</a></li> >+ [% END %] >+ [% END %] >+ </ul> >+ </div> >+ </td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> >+ [% END %] >+ </div> >+ </div> >+ <div class="yui-b"> >+ [% IF bookseller %] >+ [% INCLUDE 'vendor-menu.inc' booksellerid = bookseller.id %] >+ [% END %] >+ [% INCLUDE 'acquisitions-menu.inc' %] >+ </div> >+ </div> >+ >+ [% MACRO jsinclude BLOCK %] >+ [% INCLUDE 'datatables.inc' %] >+ [% Asset.js('lib/jquery/plugins/jquery.dataTables.columnFilter.js') | $raw %] >+ <script type="text/javascript"> >+ $(document).ready(function() { >+ var options = { >+ "paging": false, >+ "autoWidth": false, >+ "columnDefs": [ >+ { "visible": false, "targets": 1 }, >+ { "orderable": false, "targets": -1 } >+ ], >+ "orderFixed": [[ 1, 'asc' ]] >+ }; >+ [% UNLESS bookseller %] >+ options.drawCallback = function(settings) { >+ var api = this.api(); >+ var rows = api.rows({page: 'current'}).nodes(); >+ var last = null; >+ >+ api.column(1, {page: 'current'}).data().each(function(group, i) { >+ if (last !== group) { >+ $(rows).eq(i).before( >+ '<tr><td class="group" colspan="8">' + group + '</td></tr>' >+ ); >+ last = group; >+ } >+ }); >+ }; >+ [% END %] >+ $("#basketgroups-table").kohaDataTable(options); >+ >+ $('#basketgroups-table').on('click', '.closeandprint', function(e) { >+ e.preventDefault(); >+ var w = window.open($(this).attr('href')); >+ var timer = setInterval(function() { >+ if (w.closed === true) { >+ clearInterval(timer); >+ window.location.reload(true); >+ } >+ }, 1000); >+ }); >+ $('#basketgroups-table').on('click', '.delete', function() { >+ return confirm(_("Are you sure you want to delete this basketgroup ?")); >+ }); >+ }); >+ </script> >+ [% 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 1b260f3340..3173b5c572 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt >@@ -278,7 +278,7 @@ > <td><a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% order.basketno | uri %]"> [% order.basketname | html %] ([% order.basketno | html %])</a></td> > <td> > [% IF order.basketgroupid %] >- <a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% booksellerid | uri %]">[% order.basketgroupname | html %] ([% order.basketgroupid | html %])</a> >+ <a href="/cgi-bin/koha/acqui/basketgroup.pl?op=add&booksellerid=[% booksellerid | uri %]&basketgroupid=[% order.basketgroupid | uri %]">[% order.basketgroupname | html %] ([% order.basketgroupid | html %])</a> > [% 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 dd07ddc04d..31b824aa71 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/datatables.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/datatables.js >@@ -1,37 +1,47 @@ > // 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 >-// } ) ); >-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" >+// 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" > }, >- "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: { >+ "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 <i>ctrl</i> or <i>â</i> + <i>C</i> to copy the table data<br>to your system clipboard.<br><br>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" >+ "_": 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"ilpfB>tr<"bottom pager"ip>', >+ "dom": '<"top pager"ilpf>tr<"bottom pager"ip>', > "buttons": [{ > fade: 100, > className: "dt_button_clear_filter", >@@ -49,8 +59,8 @@ var dataTablesDefaults = { > node.addClass("disabled"); > } > }], >- "aLengthMenu": [[10, 20, 50, 100, -1], [10, 20, 50, 100, window.MSG_DT_ALL || "All"]], >- "iDisplayLength": 20, >+ "lengthMenu": [[10, 20, 50, 100, -1], [10, 20, 50, 100, window.MSG_DT_ALL || "All"]], >+ "pageLength": 20, > initComplete: function( settings) { > var tableId = settings.nTable.id > // When the DataTables search function is triggered, >@@ -63,9 +73,48 @@ var dataTablesDefaults = { > $("#" + tableId + "_wrapper").find(".dt_button_clear_filter").removeClass("disabled"); > } > }); >- } >+ }, >+}; >+ >+var dataTablesDefaults = { >+ "oLanguage": { >+ "oPaginate": { >+ "sFirst" : DataTableDefaults.language.paginate.first, >+ "sLast" : DataTableDefaults.language.paginate.last, >+ "sNext" : DataTableDefaults.language.paginate.next, >+ "sPrevious" : DataTableDefaults.language.paginate.previous, >+ }, >+ "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": { >+ "_": DataTableDefaults.language.buttons.copySuccess["_"], >+ "1": DataTableDefaults.language.buttons.copySuccess["1"] >+ } >+ } >+ }, >+ "dom": '<"top pager"ilpfB>tr<"bottom pager"ip>', >+ "buttons": DataTableDefaults.buttons, >+ "aLengthMenu": DataTableDefaults.lengthMenu, >+ "iDisplayLength": DataTableDefaults.pageLength, >+ initComplete: DataTableDefaults.initComplete, > }; > >+(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
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 11708
:
25115
|
25116
|
25117
|
26003
|
26004
|
26006
|
28868
|
28869
|
28870
|
28871
|
28872
|
31305
|
31306
|
31307
|
31308
|
31309
|
31530
|
31531
|
31532
|
31533
|
31534
|
31535
|
31536
|
31537
|
31538
|
31539
|
31540
|
31541
|
31542
|
31543
|
31544
|
31702
|
31703
|
31704
|
31705
|
31748
|
31749
|
31750
|
31751
|
31752
|
31753
|
32909
|
32910
|
32911
|
32912
|
32913
|
32914
|
33308
|
33309
|
33310
|
33311
|
33312
|
33313
|
34936
|
34937
|
34938
|
34939
|
34940
|
34941
|
34977
|
35748
|
35749
|
35750
|
35751
|
35752
|
35753
|
35754
|
35755
|
35756
|
35971
|
35972
|
35973
|
35974
|
35975
|
35976
|
35977
|
35978
|
35979
|
40260
|
40261
|
40262
|
40263
|
40264
|
40265
|
40266
|
40267
|
40268
|
40272
|
48992
|
48993
|
48994
|
48995
|
48996
|
52417
|
52418
|
52419
|
52420
|
52421
|
55277
|
55278
|
55279
|
58770
|
58771
|
58772
|
58773
|
58774
|
58775
|
58776
|
58777
|
58778
|
59301
|
59302
|
59303
|
59304
|
59305
|
59306
|
59307
|
59308
|
59309
|
61018
|
61019
|
61020
|
61021
|
61022
|
61023
|
61024
|
61025
|
61026
|
71260
|
71261
|
71262
|
71263
|
71264
|
71265
|
71266
|
71267
|
71268
|
72069
|
72070
|
72071
|
72072
|
72073
|
72074
|
72075
|
72076
|
72077
|
72691
|
72692
|
72693
|
72694
|
72695
|
72696
|
72697
|
72698
|
72699
|
74213
|
74214
|
74215
|
74216
|
74217
|
74218
|
74219
|
74220
|
74221
|
74222
|
74302
|
74303
|
74304
|
74305
|
74306
|
74307
|
74308
|
74309
|
74310
|
74311
|
74349
|
74350
|
74351
|
74352
|
74353
|
74354
|
74355
|
74356
|
74357
|
74358
|
75003
|
75004
|
75908
|
75909
|
78662
|
78663
|
78664
|
80697
|
80698
|
80699
|
80700
|
80979
|
80980
|
80981
|
80982
|
85786
|
85787
|
91285
|
91286
|
92378
|
92379
|
92380
|
92381
|
92382
|
93460
|
93461
|
93462
|
93463
|
93464
|
93482
|
93483
|
93484
|
93485
|
93487
|
104928
|
104929
|
104930
|
104931
|
104932
|
104933
|
104934
|
104935