Bugzilla – Attachment 148943 Details for
Bug 33260
Show message queue on staff interface and make notices printable
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 33260: [WIP] Add Notice management tool
Bug-33260-WIP-Add-Notice-management-tool.patch (text/plain), 22.53 KB, created by
Aleisha Amohia
on 2023-03-30 04:05:08 UTC
(
hide
)
Description:
Bug 33260: [WIP] Add Notice management tool
Filename:
MIME Type:
Creator:
Aleisha Amohia
Created:
2023-03-30 04:05:08 UTC
Size:
22.53 KB
patch
obsolete
>From a6441cae66e0496f229861d2969f375302938830 Mon Sep 17 00:00:00 2001 >From: Aleisha Amohia <aleishaamohia@hotmail.com> >Date: Tue, 21 Mar 2023 02:49:45 +0000 >Subject: [PATCH] Bug 33260: [WIP] Add Notice management tool > >TODO: Get date filtering working, get Print going, add Print to members/notices.pl >--- > .../prog/en/includes/tools-menu.inc | 5 +- > .../prog/en/modules/tools/notices.tt | 264 ++++++++++++++++++ > .../prog/en/modules/tools/tools-home.tt | 7 +- > .../prog/js/patron-autocomplete.js | 4 +- > tools/notices.pl | 79 ++++++ > 5 files changed, 356 insertions(+), 3 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/tools/notices.tt > create mode 100755 tools/notices.pl > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc >index b106cffbea8..22d3ecd6f1d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc >@@ -7,7 +7,7 @@ > <ul> > <li><a href="/cgi-bin/koha/tools/tools-home.pl">Tools home</a></li> > </ul> >- [% IF ( CAN_user_tools_manage_patron_lists || CAN_user_clubs || CAN_user_tools_moderate_comments || CAN_user_tools_import_patrons || CAN_user_tools_edit_notices || CAN_user_tools_edit_notice_status_triggers || CAN_user_tools_label_creator || CAN_user_tools_delete_anonymize_patrons || CAN_user_tools_edit_patrons || CAN_user_tools_moderate_tags || ( CAN_user_tools_batch_upload_patron_images && Koha.Preference('patronimages') ) || CAN_user_tools_rotating_collections ) %] >+ [% IF ( CAN_user_tools_manage_patron_lists || CAN_user_clubs || CAN_user_tools_moderate_comments || CAN_user_tools_import_patrons || CAN_user_tools_edit_notices || CAN_user_tools_edit_notice_status_triggers || CAN_user_tools_label_creator || CAN_user_tools_delete_anonymize_patrons || CAN_user_tools_edit_patrons || CAN_user_tools_moderate_tags || ( CAN_user_tools_batch_upload_patron_images && Koha.Preference('patronimages') ) || CAN_user_tools_rotating_collections ) || ( CAN_user_tools_view_generated_notices && Koha.Preference('NoticesManagement') ) %] > <h5>Patrons and circulation</h5> > <ul> > [% IF ( CAN_user_tools_manage_patron_lists ) %] >@@ -28,6 +28,9 @@ > [% IF ( CAN_user_tools_edit_notice_status_triggers ) %] > <li><a href="/cgi-bin/koha/tools/overduerules.pl">Overdue notice/status triggers</a></li> > [% END %] >+ [% IF ( CAN_user_tools_view_generated_notices && Koha.Preference('NoticesManagement') ) %] >+ <li><a href="/cgi-bin/koha/tools/notices.pl">Notices management</a></li> >+ [% END %] > [% IF ( CAN_user_tools_label_creator ) %] > <li><a href="/cgi-bin/koha/patroncards/home.pl">Patron card creator</a></li> > [% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/notices.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/notices.tt >new file mode 100644 >index 00000000000..712366070ce >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/notices.tt >@@ -0,0 +1,264 @@ >+[% USE raw %] >+[% USE Asset %] >+[% USE KohaDates %] >+[% USE Branches %] >+[% USE Categories %] >+[% USE TablesSettings %] >+[% SET footerjs = 1 %] >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Notices management › Tools › Koha</title> >+[% PROCESS "patron-search.inc" %] >+[% SET libraries = Branches.all %] >+[% SET categories = Categories.all.unblessed %] >+[% SET columns = ['name', 'cardnumber', 'dateofbirth', 'category', 'branch', 'address', 'phone'] %] >+[% INCLUDE 'doc-head-close.inc' %] >+<style> >+ .notice { display: none; } >+</style> >+</head> >+ >+<body id="tools_notices_mgmt" class="tools"> >+[% WRAPPER 'header.inc' %] >+ [% INCLUDE 'circ-search.inc' %] >+[% END %] >+ >+[% WRAPPER 'sub-header.inc' %] >+<nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb"> >+ <ol> >+ <li> >+ <a href="/cgi-bin/koha/mainpage.pl">Home</a> >+ </li> >+ <li> >+ <a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a> >+ </li> >+ <li> >+ <a href="#" aria-current="page"> >+ Notices management >+ </a> >+ </li> >+ </ol> >+</nav> >+[% END %] >+ >+<div class="main container-fluid"> >+ <div class="row"> >+ <div class="col-sm-10 col-sm-push-2"> >+ <main> >+ >+ <h1>Notices management</h1> >+ >+ [% IF notices %] >+ >+ <table id="notices"> >+ <thead> >+ <tr> >+ <th>Time created</th> >+ <th>Patron</th> >+ <th>Notice</th> >+ <th>Type</th> >+ <th>Status</th> >+ <th>Updated on</th> >+ <th>Actions</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH notice IN notices %] >+ <tr> >+ <td>[% notice.time_queued | $KohaDates with_hours = 1 %]</td> >+ <td>[% INCLUDE 'patron-title.inc' patron=notice.patron hide_patron_infos_if_needed=1 %]</td> >+ <td> >+ <a class="notice-title" data-noticeid="[% notice.message_id | html %]" href="/cgi-bin/koha/members/notices.pl?borrowernumber=[% notice.borrowernumber | uri %]&noticeid=[% notice.message_id | uri %]">[% notice.subject | html %]</a> >+ <iframe class="notice" id="notice[% notice.message_id | html %]" srcdoc="[% notice.content | html | html_line_break %]"></iframe> >+ </td> >+ <td>[% notice.message_transport_type | html %]</td> >+ <td>[% notice.status | html %]</td> >+ <td>[% notice.updated_on | $KohaDates with_hours = 1 %]</td> >+ <td class="actions"><button class="btn btn-default btn-xs print"><i class="fa fa-print"></i> Print</button></td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> >+ >+ [% ELSE %] >+ >+ <div class="dialog message"> >+ Use the search form on the left to find sent notices. >+ </div> >+ >+ [% END %] >+ >+ </main> >+ </div> <!-- /.col-sm-10.col-sm-push-2 --> >+ >+ <div class="col-sm-2 col-sm-pull-10"> >+ <aside> >+ <fieldset class="sidebar brief"> >+ <h3>Go to a patron's notices</h3> >+ <ol> >+ <li> >+ <div id="notices_patronsearch_pane" role="tabpanel" class="tab-pane active"> >+ [% PROCESS patron_search_filters_simple %] >+ [% PROCESS patron_search_table table_id => 'table_borrowers', open_on_row_click => 1 %] >+ </div> >+ </li> >+ </ol> >+ </fieldset> >+ <fieldset class="sidebar brief"> >+ <form id="notices-search" action="/cgi-bin/koha/tools/notices.pl" method="post"> >+ <input type="hidden" name="op" value="search"> >+ <h3>Search filters</h3> >+ <ol> >+ <li> >+ <label for="branchcode">Library:</label> >+ <select id="branchcode" name="branchcode"> >+ <option value="">All libraries</option> >+ [% FOREACH branch IN Branches.all( selected => branchcode ) %] >+ [% IF ( branch.selected ) %] >+ <option selected="selected" value="[% branch.branchcode | html %]">[% branch.branchname | html %]</option> >+ [% ELSE %] >+ <option value="[% branch.branchcode | html %]">[% branch.branchname | html %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="letter_code">Notice:</label> >+ <select id="letter_code" name="letter_code"> >+ <option value="">All notices</option> >+ [% FOREACH letter IN letters %] >+ [% IF ( letter.code == letter_code ) %] >+ <option selected="selected" value="[% letter.code | html %]">[% letter.name | html %] ([% letter.code | html %])</option> >+ [% ELSE %] >+ <option value="[% letter.code | html %]">[% letter.name | html %] ([% letter.code | html %])</option> >+ [% END %] >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <label for="status">Notice status:</label> >+ <select id="status" name="status"> >+ <option value="">All statuses</option> >+ [% IF status == 'sent' %] >+ <option selected="selected" value="sent">Sent</option> >+ [% ELSE %] >+ <option value="sent">Sent</option> >+ [% END %] >+ [% IF status == 'sent' %] >+ <option selected="selected" value="pending">Pending</option> >+ [% ELSE %] >+ <option value="pending">Pending</option> >+ [% END %] >+ [% IF status == 'sent' %] >+ <option selected="selected" value="failed">Failed</option> >+ [% ELSE %] >+ <option value="failed">Failed</option> >+ [% END %] >+ [% IF status == 'sent' %] >+ <option selected="selected" value="deleted">Deleted</option> >+ [% ELSE %] >+ <option value="deleted">Deleted</option> >+ [% END %] >+ </select> >+ </li> >+ <li> >+ <fieldset class="brief"> >+ <legend>Date queued</legend> >+ <ol> >+ <li> >+ <label for="from">From:</label> >+ <input type="text" id="from" name="from" size="10" value="[% from | html %]" class="flatpickr" data-date_to="to" /> >+ <div class="hint">[% INCLUDE 'date-format.inc' %]</div> >+ </li> >+ <li> >+ <label for="to">To:</label> >+ <input type="text" id="to" name="to" size="10" value="[% to | html %]" class="flatpickr" /> >+ <div class="hint">[% INCLUDE 'date-format.inc' %]</div> >+ </li> >+ </ol> >+ </fieldset> >+ </li> >+ <li> >+ <label for="categorycode">Patron category:</label> >+ <select id="categorycode" name="categorycode"> >+ <option value="">All patron categories</option> >+ [% FOREACH category IN Categories.all %] >+ [% IF ( category.categorycode == categorycode ) %] >+ <option selected="selected" value="[% category.categorycode | html %]">[% category.description | html %]</option> >+ [% ELSE %] >+ <option value="[% category.categorycode | html %]">[% category.description | html %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ </li> >+ </ol> >+ <fieldset class="action"> >+ <input type="submit" class="btn btn-primary" value="Search"> >+ </fieldset> >+ </form> >+ </fieldset> >+ [% INCLUDE 'tools-menu.inc' %] >+ </aside> >+ </div> <!-- /.col-sm-2.col-sm-pull-10 --> >+ </div> <!-- /.row --> >+ >+<!-- Modal --> >+<div class="modal" id="noticeModal" tabindex="-1" aria-labelledby="noticeModalLabel" aria-hidden="true"> >+ <div class="modal-dialog"> >+ <div class="modal-content"> >+ <div class="modal-header"> >+ <button type="button" class="closebtn" data-dismiss="modal" aria-label="Close"> >+ <span aria-hidden="true">×</span> >+ </button> >+ <h5 class="modal-title" id="noticeModalLabel">Notice</h5> >+ </div> >+ <div class="modal-body"> >+ ... >+ </div> >+ <div class="modal-footer"> >+ <button type="button" class="btn btn-default deny cancel" data-dismiss="modal"><i class="fa fa-remove"></i> Close</button> >+ </div> >+ </div> <!-- /.modal-content --> >+ </div> <!-- /.modal-dialog --> >+</div> <!-- /.modal --> >+ >+[% MACRO jsinclude BLOCK %] >+ [% Asset.js("js/tools-menu.js") | $raw %] >+ [% INCLUDE 'calendar.inc' %] >+ [% INCLUDE 'datatables.inc' %] >+ [% PROCESS patron_search_js table_id => 'table_borrowers', categories => categories, libraries => libraries, extended_attribute_types => attribute_type_codes, columns => columns, open_on_row_click => 1, on_click_url => '/cgi-bin/koha/tools/notices.pl?', redirect_if_one_result => 1, redirect_url => '/cgi-bin/koha/tools/notices.pl?', redirect_if_attribute_equal => 'cardnumber' %] >+ >+ <script> >+ table_settings = [% TablesSettings.GetColumns( 'circ', 'circulation', 'table_borrowers', 'json' ) | $raw %]; >+ $(document).ready(function() { >+ $("#notices").dataTable($.extend(true, {}, dataTablesDefaults, { >+ "aaSorting": [[ 3, "desc" ]], >+ "sPaginationType": "full" >+ })); >+ >+ $("#notices").on("click", ".notice-title", function(e){ >+ e.preventDefault(); >+ var title = $(this).text(); >+ var noticeid = $(this).data("noticeid"); >+ var body = $("#notice" + noticeid ).attr("srcdoc"); >+ $("#noticeModalLabel").text( title ); >+ $("#noticeModal .modal-body").html( body ); >+ $("#noticeModal").modal("show"); >+ }); >+ >+ $("#noticeModal").on("hide.bs.modal", function(){ >+ $("#noticeModalLabel").text(""); >+ $("#noticeModal .modal-body").html(""); >+ }); >+ >+ $("#notices_patronsearch").on("submit", filter); >+ [% UNLESS patron %] >+ [% IF ( PatronAutoComplete ) %] >+ patron_autocomplete($("#search_patron_filter"), { 'link-to': 'notices', 'url-params': '[% url_biblio_params | url %]' }); >+ [% END %] >+ [% END %] >+ }); >+ </script> >+ >+[% END %] >+ >+[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt >index 73508b2c649..097ee4a10a1 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt >@@ -32,7 +32,7 @@ > <h1>Tools</h1> > <div class="row"> > <div class="col-sm-6"> >- [% IF ( CAN_user_tools_manage_patron_lists || CAN_user_clubs || CAN_user_tools_moderate_comments || CAN_user_tools_import_patrons || CAN_user_tools_edit_notices || CAN_user_tools_edit_notice_status_triggers || CAN_user_tools_label_creator || CAN_user_tools_delete_anonymize_patrons || CAN_user_tools_edit_patrons || CAN_user_tools_batch_extend_due_dates || CAN_user_tools_moderate_tags || CAN_user_tools_rotating_collections || ( CAN_user_tools_batch_upload_patron_images && Koha.Preference('patronimages') ) ) %] >+ [% IF ( CAN_user_tools_manage_patron_lists || CAN_user_clubs || CAN_user_tools_moderate_comments || CAN_user_tools_import_patrons || CAN_user_tools_edit_notices || CAN_user_tools_edit_notice_status_triggers || CAN_user_tools_label_creator || CAN_user_tools_delete_anonymize_patrons || CAN_user_tools_edit_patrons || CAN_user_tools_batch_extend_due_dates || CAN_user_tools_moderate_tags || CAN_user_tools_rotating_collections || ( CAN_user_tools_batch_upload_patron_images && Koha.Preference('patronimages') ) || ( CAN_user_tools_view_generated_notices && Koha.Preference('NoticesManagement') ) ) %] > <h3>Patrons and circulation</h3> > [% END %] > <dl> >@@ -71,6 +71,11 @@ > <dd>Set notice/status triggers for overdue items</dd> > [% END %] > >+ [% IF ( CAN_user_tools_view_generated_notices && Koha.Preference('NoticesManagement') ) %] >+ <dt><a href="/cgi-bin/koha/tools/notices.pl">Notices management</a></dt> >+ <dd>View and print generated notices</dd> >+ [% END %] >+ > [% IF ( CAN_user_tools_label_creator ) %] > <dt><a href="/cgi-bin/koha/patroncards/home.pl">Patron card creator</a></dt> > <dd>Create printable patron cards</dd> >diff --git a/koha-tmpl/intranet-tmpl/prog/js/patron-autocomplete.js b/koha-tmpl/intranet-tmpl/prog/js/patron-autocomplete.js >index 49ff14f84b8..1ff039f28c7 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/patron-autocomplete.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/patron-autocomplete.js >@@ -71,7 +71,9 @@ function patron_autocomplete(node, options) { > ? "/cgi-bin/koha/circ/circulation.pl" > : link_to == 'reserve' > ? "/cgi-bin/koha/reserve/request.pl" >- : "/cgi-bin/koha/members/moremember.pl"; >+ : link_to == 'notices' >+ ? "/cgi-bin/koha/members/notices.pl" >+ : "/cgi-bin/koha/members/moremember.pl"; > item.link += ( url_params ? '?' + url_params + '&' : "?" ) + 'borrowernumber=' + item.patron_id; > } else { > item.link = null; >diff --git a/tools/notices.pl b/tools/notices.pl >new file mode 100755 >index 00000000000..2adf3e6c209 >--- /dev/null >+++ b/tools/notices.pl >@@ -0,0 +1,79 @@ >+#!/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 qw( get_template_and_user ); >+use C4::Output qw( output_html_with_http_headers ); >+use Koha::Notice::Messages; >+use Koha::DateUtils qw( dt_from_string ); >+ >+my $query = CGI->new; >+my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+ { >+ template_name => "tools/notices.tt", >+ query => $query, >+ type => "intranet", >+ flagsrequired => { tools => 'view_generated_notices' }, >+ } >+); >+ >+my $op = $query->param('op'); >+ >+if ( $op and $op eq 'search' ) { >+ my $letter_code = $query->param('letter_code') || undef; >+ my $categorycode = $query->param('categorycode') || undef; >+ my $branchcode = $query->param('branchcode') || undef; >+ my $from = $query->param('from') || undef; >+ my $to = $query->param('to') || undef; >+ my $status = $query->param('status') || undef; >+ my $dtf = Koha::Database->new->schema->storage->datetime_parser; >+ >+ my %where = (); >+ $where{'me.letter_code'} = $letter_code if ( $letter_code ); >+ $where{'borrowernumber.categorycode'} = $categorycode if ( $categorycode ); >+ $where{'borrowernumber.branchcode'} = $branchcode if ( $branchcode ); >+ $where{'me.time_queued'} = { '<=', $dtf->format_datetime( dt_from_string($to) ) } if ( $to ); >+ $where{'me.time_queued'} = { '>=', $dtf->format_datetime( dt_from_string($from) ) } if ( $from ); >+ $where{'me.status'} = $status if ( $status ); >+ >+ my $notices = Koha::Notice::Messages->search( >+ { %where }, >+ { join => 'borrowernumber', order_by => { -desc => 'time_queued' } } >+ ); >+ >+ $template->param( >+ notices => $notices, >+ letter_code => $letter_code, >+ categorycode => $categorycode, >+ branchcode => $branchcode, >+ from => $from, >+ to => $to, >+ status => $status, >+ ); >+} >+ >+$template->param( >+ letters => Koha::Notice::Templates->search({}, { order_by => { -asc => 'code' } }), >+ attribute_type_codes => ( C4::Context->preference('ExtendedPatronAttributes') >+ ? [ Koha::Patron::Attribute::Types->search( { staff_searchable => 1 } )->get_column('code') ] >+ : [] >+ ), >+); >+ >+output_html_with_http_headers $query, $cookie, $template->output; >-- >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 33260
:
148437
|
148438
|
148439
|
148440
|
148943
|
149009
|
149413
|
149581
|
149593
|
149594
|
149595
|
149596
|
149597
|
149598
|
150346
|
150347
|
154927
|
154928
|
157383
|
157384
|
157385
|
157386
|
158852
|
158853
|
158854
|
158855
|
162570
|
162571
|
162572
|
162573
|
162574
|
162624
|
162625
|
162677
|
162678
|
162679
|
162680
|
162681
|
164783
|
164784
|
164785
|
164786
|
164787
|
165238
|
165239
|
165717
|
165939
|
165946
|
165947
|
165948
|
165949
|
165950
|
165951
|
166020
|
166178
|
166335
|
166336
|
166337
|
166338
|
166339
|
166340
|
166341
|
166342
|
166343
|
166344
|
166345
|
166362
|
166363
|
166364
|
166365
|
166366
|
166367
|
166368
|
166369
|
166370
|
166371
|
166372
|
166373
|
167909
|
167910
|
167911
|
167912
|
167913
|
167914
|
167915
|
167916
|
167917
|
167918
|
167919
|
167920
|
172247
|
172248
|
172303
|
172307
|
172308
|
172309
|
172310
|
172311
|
172312
|
172313
|
172314
|
172315
|
172316
|
172317
|
172318
|
172319
|
172320
|
172321
|
172322
|
172342
|
172343
|
172344
|
172345
|
172346
|
172347
|
172348
|
172349
|
172350
|
172351
|
172352
|
172353
|
172354
|
172355
|
172356
|
172357
|
172358
|
172359
|
172379
|
175501
|
175502
|
175503
|
175504
|
175505
|
175506
|
175507
|
175508
|
175509
|
175510
|
175511
|
175512
|
175513
|
175514
|
175515
|
175516
|
175517
|
175518
|
175519
|
175520
|
175521
|
175522
|
175523
|
175524
|
175525
|
175530
|
175537
|
175538
|
175539
|
175540
|
175541
|
175542
|
175543
|
175544
|
175545
|
175546
|
175547
|
175548
|
175549
|
175550
|
175551
|
175552
|
175553
|
175554
|
175555
|
175556
|
175557
|
175558
|
175559
|
175560
|
175561
|
175562
|
175563
|
175730
|
175731
|
175732
|
175733
|
175734
|
175735
|
175736
|
175737
|
175738
|
175739
|
175740
|
175741
|
175742
|
175743
|
175744
|
175745
|
175746
|
175747
|
175748
|
175749
|
175750
|
175751
|
175752
|
175753
|
175754
|
175755
|
175756
|
178733
|
178734
|
178735
|
178736
|
178737
|
178738
|
178739
|
178740
|
178741
|
178742
|
178743
|
178744
|
178745
|
178746
|
178747
|
178748
|
178749
|
178750
|
178751
|
178752
|
178753
|
178754
|
178755
|
178756
|
178757
|
178758
|
178759