Bugzilla – Attachment 107532 Details for
Bug 25089
Add checkout_type to circulation rules
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 25089: (OLD GUI) Add checkout_type to smart-rules
Bug-25089-OLD-GUI-Add-checkouttype-to-smart-rules.patch (text/plain), 27.59 KB, created by
Lari Taskula
on 2020-07-29 19:55:18 UTC
(
hide
)
Description:
Bug 25089: (OLD GUI) Add checkout_type to smart-rules
Filename:
MIME Type:
Creator:
Lari Taskula
Created:
2020-07-29 19:55:18 UTC
Size:
27.59 KB
patch
obsolete
>From 7d817de89ec2eb883fdcad190ed713c906bc9262 Mon Sep 17 00:00:00 2001 >From: Lari Taskula <lari.taskula@hypernova.fi> >Date: Mon, 20 Apr 2020 07:47:11 +0000 >Subject: [PATCH] Bug 25089: (OLD GUI) Add checkout_type to smart-rules > >To test: >1. First apply all the patches tagged with (OLD GUI) prefix in commit title >2. Go to Circulation rules page in Koha >3. Observe checkout type column in the rule matrix >4. Test circulation rules matrix by setting, modifying and deleting > rules. >5. Test default checkout, hold and return policy settings. >6. Test default checkout, hold policy by patron category settings. > >Sponsored-by: The National Library of Finland >--- > admin/smart-rules.pl | 151 +++++++++++++++++- > .../prog/en/modules/admin/smart-rules.tt | 87 +++++++--- > 2 files changed, 216 insertions(+), 22 deletions(-) > >diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl >index 37f378d1c3..7e3bc086e2 100755 >--- a/admin/smart-rules.pl >+++ b/admin/smart-rules.pl >@@ -75,6 +75,8 @@ $cache->clear_from_cache( Koha::CirculationRules::GUESSED_ITEMTYPES_KEY ); > if ($op eq 'delete') { > my $itemtype = $input->param('itemtype'); > my $categorycode = $input->param('categorycode'); >+ my $checkout_type = $input->param('checkout_type'); >+ > $debug and warn "deleting $1 $2 $branch"; > > Koha::CirculationRules->set_rules( >@@ -82,6 +84,7 @@ if ($op eq 'delete') { > categorycode => $categorycode eq '*' ? undef : $categorycode, > branchcode => $branch eq '*' ? undef : $branch, > itemtype => $itemtype eq '*' ? undef : $itemtype, >+ checkout_type => $checkout_type eq '*' ? undef : $checkout_type, > rules => { > maxissueqty => undef, > rentaldiscount => undef, >@@ -126,7 +129,26 @@ elsif ($op eq 'delete-branch-cat') { > categorycode => undef, > rules => { > max_holds => undef, >- patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ branchcode => undef, >+ categorycode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, >+ rules => { >+ patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ branchcode => undef, >+ categorycode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ patron_maxissueqty => undef, > } > } > ); >@@ -148,6 +170,25 @@ elsif ($op eq 'delete-branch-cat') { > branchcode => undef, > rules => { > max_holds => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, >+ rules => { >+ patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { > patron_maxissueqty => undef, > } > } >@@ -158,6 +199,17 @@ elsif ($op eq 'delete-branch-cat') { > { > branchcode => $branch, > categorycode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, >+ rules => { >+ patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ branchcode => $branch, >+ categorycode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, > rules => { > max_holds => undef, > patron_maxissueqty => undef, >@@ -182,7 +234,26 @@ elsif ($op eq 'delete-branch-cat') { > branchcode => $branch, > rules => { > max_holds => undef, >- patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{checkout}, >+ rules => { >+ patron_maxissueqty => undef, >+ } >+ } >+ ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ patron_maxissueqty => undef, > } > } > ); >@@ -247,6 +318,7 @@ elsif ($op eq 'add') { > my $br = $branch; # branch > my $bor = $input->param('categorycode'); # borrower category > my $itemtype = $input->param('itemtype'); # item type >+ my $checkout_type = $input->param('checkout_type'); > my $fine = $input->param('fine'); > my $finedays = $input->param('finedays'); > my $maxsuspensiondays = $input->param('maxsuspensiondays') || ''; >@@ -322,6 +394,7 @@ elsif ($op eq 'add') { > categorycode => $bor eq '*' ? undef : $bor, > itemtype => $itemtype eq '*' ? undef : $itemtype, > branchcode => $br eq '*' ? undef : $br, >+ checkout_type => $checkout_type eq '*' ? undef : $checkout_type, > rules => $rules, > } > ); >@@ -330,6 +403,7 @@ elsif ($op eq 'add') { > elsif ($op eq "set-branch-defaults") { > my $categorycode = $input->param('categorycode'); > my $patron_maxissueqty = strip_non_numeric( scalar $input->param('patron_maxissueqty') ); >+ my $patron_maxonsiteissueqty = strip_non_numeric( scalar $input->param('patron_maxonsiteissueqty') ); > my $holdallowed = $input->param('holdallowed'); > my $hold_fulfillment_policy = $input->param('hold_fulfillment_policy'); > my $returnbranch = $input->param('returnbranch'); >@@ -353,11 +427,22 @@ elsif ($op eq "set-branch-defaults") { > { > categorycode => undef, > branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => undef, >+ branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } else { > Koha::CirculationRules->set_rules( > { >@@ -374,11 +459,22 @@ elsif ($op eq "set-branch-defaults") { > { > categorycode => undef, > branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => undef, >+ branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } > Koha::CirculationRules->set_rule( > { >@@ -392,6 +488,7 @@ elsif ($op eq "set-branch-defaults") { > elsif ($op eq "add-branch-cat") { > my $categorycode = $input->param('categorycode'); > my $patron_maxissueqty = strip_non_numeric( scalar $input->param('patron_maxissueqty') ); >+ my $patron_maxonsiteissueqty = strip_non_numeric( scalar $input->param('patron_maxonsiteissueqty') ); > my $max_holds = $input->param('max_holds'); > $max_holds =~ s/\s//g; > $max_holds = undef if $max_holds !~ /^\d+/; >@@ -402,46 +499,94 @@ elsif ($op eq "add-branch-cat") { > { > categorycode => undef, > branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > max_holds => $max_holds, > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => undef, >+ branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ max_holds => $max_holds, >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } else { > Koha::CirculationRules->set_rules( > { > categorycode => $categorycode, > branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > max_holds => $max_holds, > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => undef, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ max_holds => $max_holds, >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } > } elsif ($categorycode eq "*") { > Koha::CirculationRules->set_rules( > { > categorycode => undef, > branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > max_holds => $max_holds, > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => undef, >+ branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ max_holds => $max_holds, >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } else { > Koha::CirculationRules->set_rules( > { > categorycode => $categorycode, > branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{checkout}, > rules => { > max_holds => $max_holds, > patron_maxissueqty => $patron_maxissueqty, > } > } > ); >+ Koha::CirculationRules->set_rules( >+ { >+ categorycode => $categorycode, >+ branchcode => $branch, >+ checkout_type => $Koha::Checkouts::type->{onsite_checkout}, >+ rules => { >+ max_holds => $max_holds, >+ patron_maxissueqty => $patron_maxonsiteissueqty, >+ } >+ } >+ ); > } > } > elsif ($op eq "add-branch-item") { >@@ -551,7 +696,7 @@ my $definedbranch = $all_rules->count ? 1 : 0; > my $rules = {}; > while ( my $r = $all_rules->next ) { > $r = $r->unblessed; >- $rules->{ $r->{categorycode} // '' }->{ $r->{itemtype} // '' }->{ $r->{rule_name} } = $r->{rule_value}; >+ $rules->{ $r->{categorycode} // '' }->{ $r->{itemtype} // '' }->{ $r->{checkout_type} // '' }->{ $r->{rule_name} } = $r->{rule_value}; > } > > $template->param(show_branch_cat_rule_form => 1); >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt >index 0326bf6cb1..88919074c7 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt >@@ -5,6 +5,7 @@ > [% USE Branches %] > [% USE Categories %] > [% USE ItemTypes %] >+[% USE Checkouts %] > [% USE CirculationRules %] > [% SET footerjs = 1 %] > >@@ -22,6 +23,12 @@ > [% END %] > [% itemtypes.push(undef) %] > >+[% SET checkout_types = [] %] >+[% FOREACH ct IN Checkouts.checkout_type %] >+ [% checkout_types.push( ct.value ) %] >+[% END %] >+[% checkout_types.push(undef) %] >+ > [% INCLUDE 'doc-head-open.inc' %] > <title>Koha › Administration › Circulation and fine rules</title> > [% INCLUDE 'doc-head-close.inc' %] >@@ -86,6 +93,7 @@ > <table id="default-circulation-rules"> > <thead> > <tr> >+ <th>Checkout type</th> > <th>Patron category</th> > <th>Item type</th> > <th>Actions</th> >@@ -122,10 +130,12 @@ > </thead> > <tbody> > [% SET row_count = 0 %] >- [% FOREACH c IN categorycodes %] >- [% SET c = '' UNLESS c.defined %] >- [% FOREACH i IN itemtypes %] >+ [% FOREACH ct IN checkout_types %] >+ [% FOREACH c IN categorycodes %] >+ [% SET c = '' UNLESS c.defined %] >+ [% FOREACH i IN itemtypes %] > [% SET i = '' UNLESS i.defined %] >+ [% SET ct = '' UNLESS ct.defined %] > [% SET note = all_rules.$c.$i.note %] > [% SET maxissueqty = all_rules.$c.$i.maxissueqty %] > [% SET issuelength = all_rules.$c.$i.issuelength %] >@@ -160,6 +170,17 @@ > [% IF show_rule %] > [% SET row_count = row_count + 1 %] > <tr row_countd="row_[% row_count | html %]"> >+ <td> >+ [% IF ct == undef %] >+ <em>All</em> >+ [% ELSE %] >+ [% IF ct == 'CHECKOUT' %] >+ <em>Normal checkout</em> >+ [% ELSIF ct == 'ONSITE' %] >+ <em>On-site checkout</em> >+ [% END %] >+ [% END %] >+ </td> > <td> > [% IF c == undef %] > <em>All</em> >@@ -176,7 +197,7 @@ > </td> > <td class="actions"> > <a href="#" class="editrule btn btn-default btn-xs"><i class="fa fa-pencil"></i> Edit</a> >- <a class="btn btn-default btn-xs delete" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&itemtype=[% i || '*' | html %]&categorycode=[% c || '*' | html %]&branch=[% current_branch | html %]"><i class="fa fa-trash"></i> Delete</a> >+ <a class="btn btn-default btn-xs delete" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&checkout_type=[% ct || '*' | html %]&itemtype=[% i || '*' | html %]&categorycode=[% c || '*' | html %]&branch=[% current_branch | html %]"><i class="fa fa-trash"></i> Delete</a> > </td> > <td> > [% IF note.defined && note != '' %] >@@ -309,9 +330,17 @@ > </td> > </tr> > [% END %] >+ [% END %] > [% END %] > [% END %] > <tr id="edit_row"> >+ <td> >+ <select name="checkout_type" id="matrixcheckout_type" style="width:13em;"> >+ <option value="*">All</option> >+ <option value="CHECKOUT">Normal checkout</option> >+ <option value="ONSITE">On-site checkout</option> >+ </select> >+ </td> > <td> > <select name="categorycode" id="categorycode"> > <option value="*">All</option> >@@ -422,6 +451,7 @@ > </tr> > <tfoot> > <tr> >+ <th>Checkout type</th> > <th>Patron category</th> > <th>Item type</th> > <th> </th> >@@ -470,6 +500,7 @@ > <tr> > <th> </th> > <th>Total current checkouts allowed</th> >+ <th>Total current on-site checkouts allowed</th> > <th>Maximum total holds allowed (count)</th> > <th>Hold policy</th> > <th>Hold pickup library match</th> >@@ -479,16 +510,20 @@ > <tr> > <td><em>Defaults</em></td> > <td> >- [% SET patron_maxissueqty = CirculationRules.Search( current_branch, undef, undef, 'patron_maxissueqty' ) %] >+ [% SET patron_maxissueqty = CirculationRules.Search( current_branch, undef, undef, Checkouts.checkout_type.checkout, 'patron_maxissueqty' ) %] > <input type="text" name="patron_maxissueqty" size="3" value="[% patron_maxissueqty | html %]"/> > </td> > <td> >- [% SET rule_value = CirculationRules.Search( current_branch, undef , undef, 'max_holds' ) %] >+ [% SET patron_maxissueqty = CirculationRules.Search( current_branch, undef, undef, Checkouts.checkout_type.onsite_checkout, 'patron_maxissueqty' ) %] >+ <input type="text" name="patron_maxonsiteissueqty" size="3" value="[% patron_maxissueqty | html %]"/> >+ </td> >+ <td> >+ [% SET rule_value = CirculationRules.Search( current_branch, undef , undef, undef, 'max_holds' ) %] > <input name="max_holds" size="3" value="[% rule_value | html %]" /> > </td> > <td> > <select name="holdallowed"> >- [% SET holdallowed = CirculationRules.Search( current_branch, undef, undef, 'holdallowed' ) %] >+ [% SET holdallowed = CirculationRules.Search( current_branch, undef, undef, undef, 'holdallowed' ) %] > <option value=""> > Not set > </option> >@@ -528,7 +563,7 @@ > </td> > <td> > <select name="hold_fulfillment_policy"> >- [% SET hold_fulfillment_policy = CirculationRules.Search( current_branch, undef, undef, 'hold_fulfillment_policy' ) %] >+ [% SET hold_fulfillment_policy = CirculationRules.Search( current_branch, undef, undef, undef, 'hold_fulfillment_policy' ) %] > > <option value=""> > Not set >@@ -587,7 +622,7 @@ > </td> > <td> > <select name="returnbranch"> >- [% SET returnbranch = CirculationRules.Search( current_branch, undef, undef, 'returnbranch' ) %] >+ [% SET returnbranch = CirculationRules.Search( current_branch, undef, undef, undef, 'returnbranch' ) %] > > <option value=""> > Not set >@@ -640,13 +675,15 @@ > <tr> > <th>Patron category</th> > <th>Total current checkouts allowed</th> >+ <th>Total current on-site checkouts allowed</th> > <th>Total holds allowed</th> > <th> </th> > </tr> > [% FOREACH c IN categorycodes %] > [% NEXT UNLESS c %] >- [% SET patron_maxissueqty = CirculationRules.Search( branchcode, c, undef, 'patron_maxissueqty' ) %] >- [% SET max_holds = CirculationRules.Search( branchcode, c, undef, 'max_holds' ) %] >+ [% SET patron_maxissueqty = CirculationRules.Search( branchcode, c, undef, Checkouts.checkout_type.checkout, 'patron_maxissueqty' ) %] >+ [% SET patron_maxonsiteissueqty = CirculationRules.Search( branchcode, c, undef, Checkouts.checkout_type.onsite_checkout, 'patron_maxissueqty' ) %] >+ [% SET max_holds = CirculationRules.Search( branchcode, c, undef, undef, 'max_holds' ) %] > > [% IF ( patron_maxissueqty.defined && patron_maxissueqty != '' ) || ( max_holds.defined && max_holds != '' ) %] > <tr> >@@ -664,6 +701,13 @@ > <span>Unlimited</span> > [% END %] > </td> >+ <td> >+ [% IF patron_maxonsiteissueqty.defined && patron_maxonsiteissueqty != '' %] >+ [% patron_maxonsiteissueqty | html %] >+ [% ELSE %] >+ <span>Unlimited</span> >+ [% END %] >+ </td> > <td> > [% IF max_holds.defined && max_holds != '' %] > [% max_holds | html %] >@@ -687,6 +731,7 @@ > </select> > </td> > <td><input name="patron_maxissueqty" size="3" type="text" /></td> >+ <td><input name="patron_maxonsiteissueqty" size="3" type="text" /></td> > <td><input name="max_holds" size="3" type="text" /></td> > <td class="actions"><button type="submit" class="btn btn-default btn-xs"><i class="fa fa-plus"></i> Add</td> > </tr> >@@ -806,9 +851,9 @@ > <th> </th> > </tr> > [% FOREACH i IN itemtypeloop %] >- [% SET holdallowed = CirculationRules.Search( branchcode, undef, i.itemtype, 'holdallowed' ) %] >- [% SET hold_fulfillment_policy = CirculationRules.Search( branchcode, undef, i.itemtype, 'hold_fulfillment_policy' ) %] >- [% SET returnbranch = CirculationRules.Search( branchcode, undef, i.itemtype, 'returnbranch' ) %] >+ [% SET holdallowed = CirculationRules.Search( branchcode, undef, i.itemtype, undef, 'holdallowed' ) %] >+ [% SET hold_fulfillment_policy = CirculationRules.Search( branchcode, undef, i.itemtype, undef, 'hold_fulfillment_policy' ) %] >+ [% SET returnbranch = CirculationRules.Search( branchcode, undef, i.itemtype, undef, 'returnbranch' ) %] > > [% IF holdallowed || hold_fulfillment_policy || returnbranch %] > <tr> >@@ -979,11 +1024,11 @@ > itm = $(this).text(); > itm = itm.replace(/^\s*|\s*$/g,''); > var current_column = $("#edit_row td:eq("+i+")"); >- if ( i == 3 ) { >+ if ( i == 4 ) { > // specific processing for the Note column > var note = $(this).find("a[name='viewnote']").data("content"); > $(current_column).find("input[type='text']").val(note); >- } else if ( i == 8 ) { >+ } else if ( i == 9 ) { > // specific processing for the Hard due date column > var select_value = $(this).find("input[type='hidden'][name='hardduedatecomparebackup']").val(); > var input_value = ''; >@@ -994,7 +1039,7 @@ > } > $(current_column).find("input[type='text']").val(input_value); > $(current_column).find("select").val(select_value); >- } else if ( i == 14 ) { >+ } else if ( i == 15 ) { > // specific processing for cap_fine_to_replacement_price > var cap_fine_to_replacement_price = $(this).find("input[type='checkbox']"); > $('#cap_fine_to_replacement_price').prop('checked', cap_fine_to_replacement_price.is(':checked') ); >@@ -1009,17 +1054,20 @@ > $(this).attr('selected', 'selected'); > } > }); >- if ( i == 0 || i == 1 ) { >+ if ( i == 0 || i == 1 || i == 2 ) { > // Disable the 2 first columns, we cannot update them. > var val = $(current_column).find("select option:selected").val(); > var name = "categorycode"; > if ( i == 1 ) { > name="itemtype"; > } >+ if ( i == 2 ) { >+ name="checkout_type"; >+ } > // Remove potential previous input added > $(current_column).find("input").remove(); > $(current_column).append("<input type='hidden' name='"+name+"' value='"+val+"' />"); >- } else if ( i == 5 || i == 25 || i == 26 || i == 27 ) { >+ } else if ( i == 6 || i == 25 || i == 26 || i == 27 ) { > // If the value is not an integer for > // - "Current checkouts allowed" > // - "Holds allowed (total)" >@@ -1035,6 +1083,7 @@ > }); > $("#default-circulation-rules tr:last td:eq(0) select").prop('disabled', true); > $("#default-circulation-rules tr:last td:eq(1) select").prop('disabled', true); >+ $("#default-circulation-rules tr:last td:eq(2) select").prop('disabled', true); > return false; > }); > $(".clear_edit").on("click",function(e){ >-- >2.17.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 25089
:
103046
|
103047
|
103048
|
103049
|
103050
|
103051
|
103052
|
103053
|
103054
|
103239
|
103240
|
103241
|
103242
|
103243
|
103244
|
103245
|
103246
|
103247
|
103248
|
103283
|
103284
|
103285
|
103286
|
103287
|
103288
|
103289
|
103290
|
103291
|
103292
|
103339
|
103340
|
103341
|
103342
|
103343
|
103344
|
103345
|
103346
|
103347
|
103348
|
103349
|
103351
|
103352
|
103353
|
103354
|
103355
|
103356
|
103357
|
103358
|
103359
|
103360
|
103361
|
103537
|
103538
|
103539
|
103540
|
103541
|
103542
|
103543
|
103544
|
103545
|
103546
|
103547
|
104274
|
104275
|
107523
|
107524
|
107525
|
107526
|
107527
|
107528
|
107529
|
107530
|
107531
| 107532 |
107533