Bugzilla – Attachment 125144 Details for
Bug 27945
Limit the number of active article requests per patron category
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 27945: Add limit article request feature
Bug-27945-Add-limit-article-request-feature.patch (text/plain), 24.43 KB, created by
Tomás Cohen Arazi (tcohen)
on 2021-09-22 15:11:23 UTC
(
hide
)
Description:
Bug 27945: Add limit article request feature
Filename:
MIME Type:
Creator:
Tomás Cohen Arazi (tcohen)
Created:
2021-09-22 15:11:23 UTC
Size:
24.43 KB
patch
obsolete
>From 959b01f3adb25ac82cb4cfd6f1300a315a6243cf Mon Sep 17 00:00:00 2001 >From: Agustin Moyano <agustinmoyano@theke.io> >Date: Tue, 27 Jul 2021 12:20:46 -0300 >Subject: [PATCH] Bug 27945: Add limit article request feature > >This patch makes it possible to limit article requests per patron per day. > >To test: >1. Apply patches >2. updatedatabase >3. Enable ArticleRequests preference >4. Edit a patron category and set an article request limit to 1 >CHECK => if you set the limit to anything else but a positive number or empty string, a warning appears >5. In staff search biblios and request an article for a patron of the modified category >6. Repeat step 5 >SUCCESS => if limit is reached, when you select the user to request an article a warning appears saying that the limit was reached >7. Repeat steps 5 and 6 but this time in opac >SUCCESS => Patron is not allowed to request another article if limit is reached >8. prove t/db_dependent/ArticleRequests.t > >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> > >Signed-off-by: David Nind <david@davidnind.com> > >Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> >--- > Koha/ArticleRequest.pm | 5 + > Koha/Exceptions/ArticleRequest.pm | 47 +++++ > Koha/Patron.pm | 26 +++ > admin/categories.pl | 190 ++++++++++-------- > circ/request-article.pl | 48 +++-- > .../prog/en/modules/admin/categories.tt | 20 ++ > .../prog/en/modules/circ/request-article.tt | 5 + > .../en/modules/opac-request-article.tt | 7 +- > opac/opac-request-article.pl | 54 +++-- > 9 files changed, 275 insertions(+), 127 deletions(-) > create mode 100644 Koha/Exceptions/ArticleRequest.pm > mode change 100755 => 100644 admin/categories.pl > >diff --git a/Koha/ArticleRequest.pm b/Koha/ArticleRequest.pm >index 71a106d3f7..1972f8f918 100644 >--- a/Koha/ArticleRequest.pm >+++ b/Koha/ArticleRequest.pm >@@ -27,6 +27,7 @@ use Koha::Items; > use Koha::Libraries; > use Koha::DateUtils qw( dt_from_string ); > use Koha::ArticleRequest::Status; >+use Koha::Exceptions::ArticleRequest; > > use base qw(Koha::Object); > >@@ -60,6 +61,10 @@ sub request { > sub set_pending { > my ($self) = @_; > >+ Koha::Exceptions::ArticleRequest::LimitReached->throw( >+ error => 'Patron cannot request more articles for today' >+ ) unless $self->borrower->can_request_article; >+ > $self->status(Koha::ArticleRequest::Status::Pending); > $self->SUPER::store(); > $self->notify(); >diff --git a/Koha/Exceptions/ArticleRequest.pm b/Koha/Exceptions/ArticleRequest.pm >new file mode 100644 >index 0000000000..f9fac5969e >--- /dev/null >+++ b/Koha/Exceptions/ArticleRequest.pm >@@ -0,0 +1,47 @@ >+package Koha::Exceptions::ArticleRequest; >+ >+# 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 Exception::Class ( >+ 'Koha::Exceptions::ArticleRequest' => { >+ description => 'Something went wrong!', >+ }, >+ 'Koha::Exceptions::ArticleRequest::LimitReached' => { >+ isa => 'Koha::Exceptions::ArticleRequest', >+ description => 'Article request limit was reached' >+ }, >+); >+ >+=head1 NAME >+ >+Koha::Exceptions::ArticleRequest - Base class for ArticleRequest exceptions >+ >+=head1 Exceptions >+ >+=head2 Koha::Exceptions::ArticleRequest >+ >+Generic ArticleRequest exception >+ >+=head2 Koha::Exceptions::ArticleRequest::IsNotCredit >+ >+Exception to be used when an action on an account line requires it to be a >+credit and it isn't. >+ >+=cut >+ >+1; >\ No newline at end of file >diff --git a/Koha/Patron.pm b/Koha/Patron.pm >index b861e53e9e..10033139b8 100644 >--- a/Koha/Patron.pm >+++ b/Koha/Patron.pm >@@ -958,6 +958,32 @@ sub move_to_deleted { > return Koha::Database->new->schema->resultset('Deletedborrower')->create($patron_infos); > } > >+=head3 can_request_article >+ >+my $can_request = $borrower->can_request_article >+ >+Returns true if patron can request articles >+ >+=cut >+ >+sub can_request_article { >+ my ($self) = @_; >+ my $limit = $self->category->article_request_limit; >+ >+ return 1 if !$limit; >+ >+ my $date = dt_from_string; >+ my $count = Koha::ArticleRequests->search({ >+ borrowernumber => $self->borrowernumber, >+ status => {'!=' => 'CANCELED'}, >+ created_on => { >+ '>=' => $date->date.' 00:00:00', >+ '<=' => $date->date.' 23:59:59' >+ } >+ })->count; >+ return $count < $limit ? 1 : 0; >+} >+ > =head3 article_requests > > my @requests = $borrower->article_requests(); >diff --git a/admin/categories.pl b/admin/categories.pl >old mode 100755 >new mode 100644 >index 368960f9cd..958bfd7c76 >--- a/admin/categories.pl >+++ b/admin/categories.pl >@@ -46,18 +46,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( > } > ); > >-if ( $op eq 'add_form' ) { >- >- $template->param( >- category => scalar Koha::Patron::Categories->find($categorycode), >- ); >- >- if ( C4::Context->preference('EnhancedMessagingPreferences') ) { >- C4::Form::MessagingPreferences::set_form_values( >- { categorycode => $categorycode }, $template ); >- } >-} >-elsif ( $op eq 'add_validate' ) { >+if ( $op eq 'add_validate' ) { > > my $categorycode = $input->param('categorycode'); > my $description = $input->param('description'); >@@ -78,6 +67,7 @@ elsif ( $op eq 'add_validate' ) { > my $exclude_from_local_holds_priority = $input->param('exclude_from_local_holds_priority'); > my $min_password_length = $input->param('min_password_length'); > my $require_strong_password = $input->param('require_strong_password'); >+ my $article_request_limit = $input->param('article_request_limit'); > my @branches = grep { $_ ne q{} } $input->multi_param('branches'); > > $reset_password = undef if $reset_password eq -1; >@@ -87,88 +77,98 @@ elsif ( $op eq 'add_validate' ) { > > my $is_a_modif = $input->param("is_a_modif"); > >- if ($enrolmentperioddate) { >- $enrolmentperioddate = output_pref( >- { >- dt => dt_from_string($enrolmentperioddate), >- dateformat => 'iso', >- dateonly => 1, >- } >- ); >- } >+ if ($article_request_limit ne '' && $article_request_limit !~ /\d+/) { >+ push @messages, {type => 'error', code => 'article_request_numeric_limit' }; >+ $op = 'add_form'; >+ } elsif ($article_request_limit ne '' && $article_request_limit < 0) { >+ push @messages, {type => 'error', code => 'article_request_negative_limit' }; >+ $op = 'add_form'; >+ } else { >+ if ($enrolmentperioddate) { >+ $enrolmentperioddate = output_pref( >+ { >+ dt => dt_from_string($enrolmentperioddate), >+ dateformat => 'iso', >+ dateonly => 1, >+ } >+ ); >+ } > >- if ($is_a_modif) { >- my $category = Koha::Patron::Categories->find( $categorycode ); >- $category->categorycode($categorycode); >- $category->description($description); >- $category->enrolmentperiod($enrolmentperiod); >- $category->enrolmentperioddate($enrolmentperioddate); >- $category->upperagelimit($upperagelimit); >- $category->dateofbirthrequired($dateofbirthrequired); >- $category->enrolmentfee($enrolmentfee); >- $category->reservefee($reservefee); >- $category->hidelostitems($hidelostitems); >- $category->overduenoticerequired($overduenoticerequired); >- $category->category_type($category_type); >- $category->BlockExpiredPatronOpacActions($BlockExpiredPatronOpacActions); >- $category->checkprevcheckout($checkPrevCheckout); >- $category->default_privacy($default_privacy); >- $category->reset_password($reset_password); >- $category->change_password($change_password); >- $category->exclude_from_local_holds_priority($exclude_from_local_holds_priority); >- $category->min_password_length($min_password_length); >- $category->require_strong_password($require_strong_password); >- eval { >- $category->store; >- $category->replace_library_limits( \@branches ); >- }; >- if ( $@ ) { >- push @messages, {type => 'error', code => 'error_on_update' }; >- } else { >- push @messages, { type => 'message', code => 'success_on_update' }; >+ if ($is_a_modif) { >+ my $category = Koha::Patron::Categories->find( $categorycode ); >+ $category->categorycode($categorycode); >+ $category->description($description); >+ $category->enrolmentperiod($enrolmentperiod); >+ $category->enrolmentperioddate($enrolmentperioddate); >+ $category->upperagelimit($upperagelimit); >+ $category->dateofbirthrequired($dateofbirthrequired); >+ $category->enrolmentfee($enrolmentfee); >+ $category->reservefee($reservefee); >+ $category->hidelostitems($hidelostitems); >+ $category->overduenoticerequired($overduenoticerequired); >+ $category->category_type($category_type); >+ $category->BlockExpiredPatronOpacActions($BlockExpiredPatronOpacActions); >+ $category->checkprevcheckout($checkPrevCheckout); >+ $category->default_privacy($default_privacy); >+ $category->reset_password($reset_password); >+ $category->change_password($change_password); >+ $category->exclude_from_local_holds_priority($exclude_from_local_holds_priority); >+ $category->min_password_length($min_password_length); >+ $category->require_strong_password($require_strong_password); >+ $category->article_request_limit($article_request_limit); >+ eval { >+ $category->store; >+ $category->replace_library_limits( \@branches ); >+ }; >+ if ( $@ ) { >+ push @messages, {type => 'error', code => 'error_on_update' }; >+ } else { >+ push @messages, { type => 'message', code => 'success_on_update' }; >+ } > } >- } >- else { >- my $category = Koha::Patron::Category->new({ >- categorycode => $categorycode, >- description => $description, >- enrolmentperiod => $enrolmentperiod, >- enrolmentperioddate => $enrolmentperioddate, >- upperagelimit => $upperagelimit, >- dateofbirthrequired => $dateofbirthrequired, >- enrolmentfee => $enrolmentfee, >- reservefee => $reservefee, >- hidelostitems => $hidelostitems, >- overduenoticerequired => $overduenoticerequired, >- category_type => $category_type, >- BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions, >- checkprevcheckout => $checkPrevCheckout, >- default_privacy => $default_privacy, >- reset_password => $reset_password, >- change_password => $change_password, >- exclude_from_local_holds_priority => $exclude_from_local_holds_priority, >- min_password_length => $min_password_length, >- require_strong_password => $require_strong_password, >- }); >- eval { >- $category->store; >- $category->replace_library_limits( \@branches ); >- }; >- >- if ( $@ ) { >- push @messages, { type => 'error', code => 'error_on_insert' }; >- } else { >- push @messages, { type => 'message', code => 'success_on_insert' }; >+ else { >+ my $category = Koha::Patron::Category->new({ >+ categorycode => $categorycode, >+ description => $description, >+ enrolmentperiod => $enrolmentperiod, >+ enrolmentperioddate => $enrolmentperioddate, >+ upperagelimit => $upperagelimit, >+ dateofbirthrequired => $dateofbirthrequired, >+ enrolmentfee => $enrolmentfee, >+ reservefee => $reservefee, >+ hidelostitems => $hidelostitems, >+ overduenoticerequired => $overduenoticerequired, >+ category_type => $category_type, >+ BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions, >+ checkprevcheckout => $checkPrevCheckout, >+ default_privacy => $default_privacy, >+ reset_password => $reset_password, >+ change_password => $change_password, >+ exclude_from_local_holds_priority => $exclude_from_local_holds_priority, >+ min_password_length => $min_password_length, >+ require_strong_password => $require_strong_password, >+ article_request_limit => $article_request_limit >+ }); >+ eval { >+ $category->store; >+ $category->replace_library_limits( \@branches ); >+ }; >+ >+ if ( $@ ) { >+ push @messages, { type => 'error', code => 'error_on_insert' }; >+ } else { >+ push @messages, { type => 'message', code => 'success_on_insert' }; >+ } > } >- } > >- if ( C4::Context->preference('EnhancedMessagingPreferences') ) { >- C4::Form::MessagingPreferences::handle_form_action( $input, >- { categorycode => scalar $input->param('categorycode') }, $template ); >- } >+ if ( C4::Context->preference('EnhancedMessagingPreferences') ) { >+ C4::Form::MessagingPreferences::handle_form_action( $input, >+ { categorycode => scalar $input->param('categorycode') }, $template ); >+ } > >- $searchfield = q||; >- $op = 'list'; >+ $searchfield = q||; >+ $op = 'list'; >+ } > } > elsif ( $op eq 'delete_confirm' ) { > >@@ -199,6 +199,18 @@ elsif ( $op eq 'delete_confirmed' ) { > $op = 'list'; > } > >+if ( $op eq 'add_form' ) { >+ >+ $template->param( >+ category => scalar Koha::Patron::Categories->find($categorycode), >+ ); >+ >+ if ( C4::Context->preference('EnhancedMessagingPreferences') ) { >+ C4::Form::MessagingPreferences::set_form_values( >+ { categorycode => $categorycode }, $template ); >+ } >+} >+ > if ( $op eq 'list' ) { > my $categories = Koha::Patron::Categories->search( > { >diff --git a/circ/request-article.pl b/circ/request-article.pl >index 678c4c9694..0cc4cc591d 100755 >--- a/circ/request-article.pl >+++ b/circ/request-article.pl >@@ -27,6 +27,7 @@ use C4::Serials qw( CountSubscriptionFromBiblionumber ); > use Koha::Biblios; > use Koha::Patrons; > use Koha::ArticleRequests; >+use Try::Tiny; > > my $cgi = CGI->new; > >@@ -68,23 +69,29 @@ if ( $action eq 'create' ) { > my $patron_notes = $cgi->param('patron_notes') || undef; > my $format = $cgi->param('format') || undef; > >- my $ar = Koha::ArticleRequest->new( >- { >- borrowernumber => $borrowernumber, >- biblionumber => $biblionumber, >- branchcode => $branchcode, >- itemnumber => $itemnumber, >- title => $title, >- author => $author, >- volume => $volume, >- issue => $issue, >- date => $date, >- pages => $pages, >- chapters => $chapters, >- patron_notes => $patron_notes, >- format => $format, >- } >- )->store(); >+ try { >+ my $ar = Koha::ArticleRequest->new( >+ { >+ borrowernumber => $borrowernumber, >+ biblionumber => $biblionumber, >+ branchcode => $branchcode, >+ itemnumber => $itemnumber, >+ title => $title, >+ author => $author, >+ volume => $volume, >+ issue => $issue, >+ date => $date, >+ pages => $pages, >+ chapters => $chapters, >+ patron_notes => $patron_notes, >+ format => $format, >+ } >+ )->store(); >+ } catch { >+ $template->param( >+ error_message => $_->{message} >+ ); >+ }; > > } > >@@ -109,6 +116,13 @@ if ( !$patron && $patron_cardnumber ) { > } > } > >+if( $patron && !$patron->can_request_article) { >+ $patron = undef; >+ $template->param( >+ error_message => 'Patron cannot request more articles for today' >+ ); >+} >+ > $template->param( > biblio => $biblio, > patron => $patron, >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt >index 029cc1c28d..5302e1d7b5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt >@@ -108,6 +108,10 @@ > Patron category deleted successfully. > [% CASE 'already_exists' %] > This patron category already exists. >+ [% CASE 'article_request_negative_limit' %] >+ Maximum article request limit cannot be negative. >+ [% CASE 'article_request_numeric_limit' %] >+ Maximum article request limit must be a positive number. > [% CASE %] > [% m.code | html %] > [% END %] >@@ -202,6 +206,12 @@ > <label for="reservefee">Hold fee: </label> > <input type="text" name="reservefee" id="reservefee" size="6" value="[% category.reservefee | $Price on_editing => 1 %]" /> > </li> >+ [% IF Koha.Preference('ArticleRequests') %] >+ <li> >+ <label for="article_request_limit">Maximum article scan requests</label> >+ <input type="text" name="article_request_limit" id="article_request_limit" size="6" value="[% category.article_request_limit | html %]" /> per day >+ </li> >+ [% END %] > <li> > <label for="category_type" class="required">Category type: </label> > <select name="category_type" id="category_type"> >@@ -523,6 +533,9 @@ > <th scope="col">Overdue</th> > <th scope="col">Lost items</th> > <th scope="col">Hold fee</th> >+ [% IF Koha.Preference('ArticleRequests') %] >+ <th scope="col">Maximum request limit</th> >+ [% END %] > [% IF ( EnhancedMessagingPreferences ) %] > <th scope="col">Messaging</th> > [% END %] >@@ -581,6 +594,13 @@ > [% ELSE %] > <td>-</td> > [% END %] >+ [% IF Koha.Preference('ArticleRequests') %] >+ [% IF (category.article_request_limit > 0) %] >+ <td>[% category.article_request_limit | html %]</td> >+ [% ELSE %] >+ <td>-</td> >+ [% END %] >+ [% END %] > [% IF Koha.Preference('EnhancedMessagingPreferences') %] > <td style="white-space: nowrap; font-size:80%;"> > [% SET default_messaging = category.default_messaging %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/request-article.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/request-article.tt >index 224d2bb846..f26a10318d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/request-article.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/request-article.tt >@@ -46,6 +46,11 @@ > <main> > > <h1>Request article from [% INCLUDE 'biblio-title.inc' link = 1 %]</h1> >+ [% IF error_message %] >+ <div class="dialog alert"> >+ <p>[% error_message | html %]</p> >+ </div> >+ [% END %] > [% IF no_patrons_found %] > <div class="dialog alert"> > <h3>Patron not found</h3> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-request-article.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-request-article.tt >index f33c470e87..e504556b74 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-request-article.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-request-article.tt >@@ -33,7 +33,7 @@ > <div class="container-fluid maincontent"> > <div class="row"> > <div class="col"> >- [% IF biblio.can_article_request( patron ) %] >+ [% IF !error_message && biblio.can_article_request( patron ) %] > <h1>Place article request for [% biblio.title | html %]</h1> > [% IF ( disclaimer && !action) %] > <div class="alert alert-warning"> >@@ -216,6 +216,11 @@ > <input type="submit" class="btn btn-primary" value="Place request" /> > </form> > [% END %] >+ [% ELSIF error_message %] >+ <h1 class="title">[% biblio.title | html %]</h1> >+ <div class="alert alert-info"> >+ [% error_message | html %] >+ </div> > [% ELSE %] > <h1 class="title">[% biblio.title | html %]</h1> > <div class="alert alert-info"> >diff --git a/opac/opac-request-article.pl b/opac/opac-request-article.pl >index dd02b4d7b9..146454f033 100755 >--- a/opac/opac-request-article.pl >+++ b/opac/opac-request-article.pl >@@ -26,6 +26,7 @@ use C4::Output qw( output_html_with_http_headers ); > > use Koha::Biblios; > use Koha::Patrons; >+use Try::Tiny; > > my $cgi = CGI->new; > >@@ -59,26 +60,33 @@ if ( $action eq 'create' ) { > my $patron_notes = $cgi->param('patron_notes') || undef; > my $format = $cgi->param('format') || undef; > >- my $ar = Koha::ArticleRequest->new( >- { >- borrowernumber => $borrowernumber, >- biblionumber => $biblionumber, >- branchcode => $branchcode, >- itemnumber => $itemnumber, >- title => $title, >- author => $author, >- volume => $volume, >- issue => $issue, >- date => $date, >- pages => $pages, >- chapters => $chapters, >- patron_notes => $patron_notes, >- format => $format, >- } >- )->store(); >- >- print $cgi->redirect("/cgi-bin/koha/opac-user.pl#opac-user-article-requests"); >- exit; >+ try { >+ my $ar = Koha::ArticleRequest->new( >+ { >+ borrowernumber => $borrowernumber, >+ biblionumber => $biblionumber, >+ branchcode => $branchcode, >+ itemnumber => $itemnumber, >+ title => $title, >+ author => $author, >+ volume => $volume, >+ issue => $issue, >+ date => $date, >+ pages => $pages, >+ chapters => $chapters, >+ patron_notes => $patron_notes, >+ format => $format, >+ } >+ )->store(); >+ >+ print $cgi->redirect("/cgi-bin/koha/opac-user.pl#opac-user-article-requests"); >+ exit; >+ } catch { >+ exit unless $_->[0] && $_->[0] eq 'EXIT'; >+ $template->param( >+ error_message => $_->{message} >+ ); >+ }; > # Should we redirect? > } > elsif ( !$action && C4::Context->preference('ArticleRequestsOpacHostRedirection') ) { >@@ -96,6 +104,12 @@ elsif ( !$action && C4::Context->preference('ArticleRequestsOpacHostRedirection' > > my $patron = Koha::Patrons->find($borrowernumber); > >+if(!$patron->can_request_article) { >+ $template->param( >+ error_message => 'You cannot request more articles for today' >+ ); >+} >+ > $template->param( > biblio => $biblio, > patron => $patron, >-- >2.30.2
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 27945
:
123217
|
123218
|
123219
|
123220
|
123714
|
123715
|
123774
|
123775
|
123776
|
123777
|
123778
|
123820
|
124066
|
124067
|
124068
|
124069
|
124070
|
124071
|
124072
|
124073
|
124074
|
124075
|
124076
|
124077
|
124078
|
124079
|
124284
|
124285
|
124633
|
124673
|
124674
|
124675
|
124676
|
124677
|
124678
|
124679
|
124680
|
124681
|
124682
|
125140
|
125142
|
125143
|
125144
|
125145
|
125146
|
125147
|
125148
|
125149
|
125150
|
125151
|
125152
|
125178
|
125179
|
125569
|
125571
|
125638
|
125690
|
125702
|
125703
|
125704
|
125705
|
125706
|
125707
|
125726
|
125741
|
125761