Bugzilla – Attachment 85544 Details for
Bug 20912
Rental fees based on time period
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 20912: Rental Fees based on Time Period
Bug-20912-Rental-Fees-based-on-Time-Period.patch (text/plain), 21.60 KB, created by
Martin Renvoize (ashimema)
on 2019-02-22 14:54:25 UTC
(
hide
)
Description:
Bug 20912: Rental Fees based on Time Period
Filename:
MIME Type:
Creator:
Martin Renvoize (ashimema)
Created:
2019-02-22 14:54:25 UTC
Size:
21.60 KB
patch
obsolete
>From d256883e41ae702ca204d11dce47407ef128d7ee Mon Sep 17 00:00:00 2001 >From: Kyle M Hall <kyle@bywatersolutions.com> >Date: Thu, 14 Jun 2018 13:36:51 +0000 >Subject: [PATCH] Bug 20912: Rental Fees based on Time Period > >Some libraries would like to be able to charge a rental fee based on the >number of days an item will be checked out, as opposed to the flat fee >currently offered by Koha. > >Test Plan: >1) Apply this patch >2) Run updatedatabase.pl >3) Edit an itemtype, add a daily rental fee of 1.00 >4) Check an item of that itemtype out for 7 days >5) Verify the patron now has rental fee of 7.00 > >Signed-off-by: Matha Fuerst <mfuerst@hmcpl.org> >Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> >--- > C4/Circulation.pm | 29 ++++- > Koha/ItemType.pm | 33 ++++++ > admin/itemtypes.pl | 30 ++--- > catalogue/moredetail.pl | 1 - > .../prog/en/modules/admin/itemtypes.tt | 22 +++- > .../prog/en/modules/catalogue/moredetail.tt | 2 + > t/db_dependent/Circulation.t | 105 +++++++++++++++++- > t/db_dependent/Koha/ItemTypes.t | 52 ++++++++- > 8 files changed, 245 insertions(+), 29 deletions(-) > >diff --git a/C4/Circulation.pm b/C4/Circulation.pm >index 1a78ddc208..7292546a01 100644 >--- a/C4/Circulation.pm >+++ b/C4/Circulation.pm >@@ -977,6 +977,8 @@ sub CanBookBeIssued { > > if ( $rentalConfirmation ){ > my ($rentalCharge) = GetIssuingCharges( $item->{'itemnumber'}, $patron->borrowernumber ); >+ my $itemtype = Koha::ItemTypes->find( $item->{itype} ); # GetItem sets effective itemtype >+ $rentalCharge += $itemtype->calc_rental_charge_daily( { from => dt_from_string(), to => $duedate } ); > if ( $rentalCharge > 0 ){ > $needsconfirmation{RENTALCHARGE} = $rentalCharge; > } >@@ -1419,13 +1421,23 @@ sub AddIssue { > ModDateLastSeen( $item->{'itemnumber'} ); > > # If it costs to borrow this book, charge it to the patron's account. >- my ( $charge, $itemtype ) = GetIssuingCharges( $item->{'itemnumber'}, $borrower->{'borrowernumber'} ); >+ my ( $charge ) = GetIssuingCharges( $item->{'itemnumber'}, $borrower->{'borrowernumber'} ); > if ( $charge > 0 ) { > my $description = "Rental"; > AddIssuingCharge( $issue, $charge, $description ); > $item->{'charge'} = $charge; > } > >+ my $itemtype = Koha::ItemTypes->find( $item_object->effective_itemtype ); >+ if ( $itemtype ) { >+ my $daily_charge = $itemtype->calc_rental_charge_daily( { from => $issuedate, to => $datedue } ); >+ if ( $daily_charge > 0 ) { >+ AddIssuingCharge( $issue, $daily_charge, 'Daily rental' ) if $daily_charge > 0; >+ $charge += $daily_charge; >+ $item->{charge} = $charge; >+ } >+ } >+ > # Record the fact that this book was issued. > &UpdateStats( > { >@@ -2871,13 +2883,24 @@ sub AddRenewal { > $renews = $item->{renewals} + 1; > ModItem( { renewals => $renews, onloan => $datedue->strftime('%Y-%m-%d %H:%M')}, $item->{biblionumber}, $itemnumber, { log_action => 0 } ); > >- # Charge a new rental fee, if applicable? >+ # Charge a new rental fee, if applicable > my ( $charge, $type ) = GetIssuingCharges( $itemnumber, $borrowernumber ); > if ( $charge > 0 ) { > my $description = "Renewal of Rental Item " . $biblio->title . " $item->{'barcode'}"; > AddIssuingCharge($issue, $charge, $description); > } > >+ # Charge a new daily rental fee, if applicable >+ my $itemtype = Koha::ItemTypes->find( $item_object->effective_itemtype ); >+ if ( $itemtype ) { >+ my $daily_charge = $itemtype->calc_rental_charge_daily( { from => dt_from_string($lastreneweddate), to => $datedue } ); >+ if ( $daily_charge > 0 ) { >+ my $type_desc = "Renewal of Daily Rental Item " . $biblio->title . " $item->{'barcode'}"; >+ AddIssuingCharge( $issue, $daily_charge, $type_desc ) >+ } >+ $charge += $daily_charge; >+ } >+ > # Send a renewal slip according to checkout alert preferencei > if ( C4::Context->preference('RenewalSendNotice') eq '1' ) { > my $circulation_alert = 'C4::ItemCirculationAlertPreference'; >@@ -3195,7 +3218,7 @@ sub _get_discount_from_rule { > > =head2 AddIssuingCharge > >- &AddIssuingCharge( $checkout, $charge ) >+ &AddIssuingCharge( $checkout, $charge, [$description] ) > > =cut > >diff --git a/Koha/ItemType.pm b/Koha/ItemType.pm >index 3d769a5f91..5faf499a69 100644 >--- a/Koha/ItemType.pm >+++ b/Koha/ItemType.pm >@@ -90,6 +90,39 @@ sub translated_descriptions { > } @translated_descriptions ]; > } > >+=head3 calc_rental_charge_daily >+ >+ my $fee = $itemtype->calc_rental_charge_daily( { from => $dt_from, to => $dt_to } ); >+ >+ This method calculates the daily rental fee for a given itemtype for a given >+ period of time passed in as a pair of DateTime objects. >+ >+=cut >+ >+sub calc_rental_charge_daily { >+ my ( $self, $params ) = @_; >+ >+ my $rental_charge_daily = $self->rental_charge_daily; >+ return 0 unless $rental_charge_daily; >+ >+ my $from_dt = $params->{from}; >+ my $to_dt = $params->{to}; >+ >+ my $duration; >+ if ( C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed' ) { >+ my $branchcode = C4::Context->userenv->{branch}; >+ my $calendar = Koha::Calendar->new( branchcode => $branchcode ); >+ $duration = $calendar->days_between( $from_dt, $to_dt ); >+ } >+ else { >+ $duration = $to_dt->delta_days($from_dt); >+ } >+ my $days = $duration->in_units('days'); >+ >+ my $charge = $rental_charge_daily * $days; >+ >+ return $charge; >+} > > > =head3 can_be_deleted >diff --git a/admin/itemtypes.pl b/admin/itemtypes.pl >index d397fee4f9..723dfe9c93 100755 >--- a/admin/itemtypes.pl >+++ b/admin/itemtypes.pl >@@ -72,6 +72,7 @@ if ( $op eq 'add_form' ) { > my $itemtype = Koha::ItemTypes->find($itemtype_code); > my $description = $input->param('description'); > my $rentalcharge = $input->param('rentalcharge'); >+ my $rental_charge_daily = $input->param('rental_charge_daily'); > my $defaultreplacecost = $input->param('defaultreplacecost'); > my $processfee = $input->param('processfee'); > my $image = $input->param('image') || q||; >@@ -92,6 +93,7 @@ if ( $op eq 'add_form' ) { > if ( $itemtype and $is_a_modif ) { # it's a modification > $itemtype->description($description); > $itemtype->rentalcharge($rentalcharge); >+ $itemtype->rental_charge_daily($rental_charge_daily); > $itemtype->defaultreplacecost($defaultreplacecost); > $itemtype->processfee($processfee); > $itemtype->notforloan($notforloan); >@@ -112,19 +114,21 @@ if ( $op eq 'add_form' ) { > } > } elsif ( not $itemtype and not $is_a_modif ) { > my $itemtype = Koha::ItemType->new( >- { itemtype => $itemtype_code, >- description => $description, >- rentalcharge => $rentalcharge, >- defaultreplacecost => $defaultreplacecost, >- processfee => $processfee, >- notforloan => $notforloan, >- imageurl => $imageurl, >- summary => $summary, >- checkinmsg => $checkinmsg, >- checkinmsgtype => $checkinmsgtype, >- sip_media_type => $sip_media_type, >- hideinopac => $hideinopac, >- searchcategory => $searchcategory, >+ { >+ itemtype => $itemtype_code, >+ description => $description, >+ rentalcharge => $rentalcharge, >+ rental_charge_daily => $rental_charge_daily, >+ defaultreplacecost => $defaultreplacecost, >+ processfee => $processfee, >+ notforloan => $notforloan, >+ imageurl => $imageurl, >+ summary => $summary, >+ checkinmsg => $checkinmsg, >+ checkinmsgtype => $checkinmsgtype, >+ sip_media_type => $sip_media_type, >+ hideinopac => $hideinopac, >+ searchcategory => $searchcategory, > } > ); > eval { $itemtype->store; }; >diff --git a/catalogue/moredetail.pl b/catalogue/moredetail.pl >index 6adcca9008..e8736ff398 100755 >--- a/catalogue/moredetail.pl >+++ b/catalogue/moredetail.pl >@@ -128,7 +128,6 @@ my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_l > > $data->{'itemtypename'} = $itemtypes->{ $data->{'itemtype'} }->{'translated_description'} > if $data->{itemtype} && exists $itemtypes->{ $data->{itemtype} }; >-$data->{'rentalcharge'} = $data->{'rentalcharge'}; > foreach ( keys %{$data} ) { > $template->param( "$_" => defined $data->{$_} ? $data->{$_} : '' ); > } >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt >index fdf2ab73b7..6c47f91a38 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt >@@ -137,7 +137,7 @@ Item types administration > [% END %] > [% END %] > </select> >- (Options are defined as the authorized values for the ITEMTYPECAT category) >+ <span class="hint">Options are defined as the authorized values for the ITEMTYPECAT category.</span> > </li> > [% IF Koha.Preference('noItemTypeImages') %] > <li> >@@ -217,7 +217,7 @@ Item types administration > [% ELSE %] > <input type="checkbox" id="hideinopac" name="hideinopac" value="1" /> > [% END %] >- (if checked, items of this type will be hidden as filters in OPAC's advanced search) >+ <span class="hint">If checked, items of this type will be hidden as filters in OPAC's advanced search.</span> > </li> > <li> > <label for="notforloan">Not for loan: </label> >@@ -226,11 +226,17 @@ Item types administration > [% ELSE %] > <input type="checkbox" id="notforloan" name="notforloan" value="1" /> > [% END %] >- (if checked, no item of this type can be issued. If not checked, every item of this type can be issued unless notforloan is set for a specific item) >+ <span class="hint">If checked, no item of this type can be issued. If not checked, every item of this type can be issued unless notforloan is set for a specific item.</span> > </li> > <li> > <label for="rentalcharge">Rental charge: </label> >- <input type="text" id="rentalcharge" name="rentalcharge" size="10" value="[% itemtype.rentalcharge | html %]" /> >+ <input type="text" id="rentalcharge" name="rentalcharge" size="10" value="[% itemtype.rentalcharge | $Price %]" /> >+ <span class="hint">This fee is charged once per checkout/renewal per item</span> >+ </li> >+ <li> >+ <label for="rental_charge_daily">Daily rental charge: </label> >+ <input type="text" id="rental_charge_daily" name="rental_charge_daily" size="10" value="[% itemtype.rental_charge_daily | $Price %]" /> >+ <span class="hint">This fee is charged a checkout/renewal time for each day between the checkout/renewal date and due date.</span> > </li> > <li> > <label for="defaultreplacecost">Default replacement cost: </label> >@@ -329,7 +335,8 @@ Item types administration > <th>Search category</th> > <th>Not for loan</th> > <th>Hide in OPAC</th> >- <th>Charge</th> >+ <th>Rental charge</th> >+ <th>Daily rental charge</th> > <th>Default replacement cost</th> > <th>Processing fee (when lost)</th> > <th>Checkin message</th> >@@ -371,6 +378,11 @@ Item types administration > [% itemtype.rentalcharge | $Price %] > [% END %] > </td> >+ <td> >+ [% UNLESS ( itemtype.notforloan ) %] >+ [% itemtype.rental_charge_daily | $Price %] >+ [% END %] >+ </td> > <td>[% itemtype.defaultreplacecost | $Price %]</td> > <td>[% itemtype.processfee | $Price %]</td> > <td>[% itemtype.checkinmsg | html_line_break | $raw %]</td> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >index 2e10ef9f46..cd83edc8ad 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >@@ -1,4 +1,5 @@ > [% USE raw %] >+[% USE Price %] > [% USE Asset %] > [% USE Koha %] > [% USE Branches %] >@@ -34,6 +35,7 @@ > <li><span class="label">Item type:</span> [% itemtypename | html %] </li> > [% END %] > [% IF ( rentalcharge ) %]<li><span class="label">Rental charge:</span>[% rentalcharge | $Price %] </li>[% END %] >+ [% IF ( rental_charge_daily ) %]<li><span class="label">Daily rental charge:</span>[% rental_charge_daily | $Price %] </li>[% END %] > <li><span class="label">ISBN:</span> [% isbn | html %] </li> > <li><span class="label">Publisher:</span>[% place | html %] [% publishercode | html %] [% publicationyear | html %] </li> > [% IF ( volumeddesc ) %]<li><span class="label">Volume:</span> [% volumeddesc | html %]</li>[% END %] >diff --git a/t/db_dependent/Circulation.t b/t/db_dependent/Circulation.t >index 707582d44a..0f25c98fc3 100755 >--- a/t/db_dependent/Circulation.t >+++ b/t/db_dependent/Circulation.t >@@ -68,8 +68,15 @@ my $library2 = $builder->build({ > source => 'Branch', > }); > my $itemtype = $builder->build( >- { source => 'Itemtype', >- value => { notforloan => undef, rentalcharge => 0, defaultreplacecost => undef, processfee => undef } >+ { >+ source => 'Itemtype', >+ value => { >+ notforloan => undef, >+ rentalcharge => 0, >+ rental_charge_daily => 0, >+ defaultreplacecost => undef, >+ processfee => undef >+ } > } > )->{itemtype}; > my $patron_category = $builder->build( >@@ -2980,4 +2987,96 @@ sub test_debarment_on_checkout { > $expected_expiration_date, 'Test at line ' . $line_number ); > Koha::Patron::Debarments::DelUniqueDebarment( > { borrowernumber => $patron->{borrowernumber}, type => 'SUSPENSION' } ); >-} >+}; >+ >+subtest 'Koha::ItemType::calc_rental_charge_daily tests' => sub { >+ plan tests => 8; >+ >+ t::lib::Mocks::mock_preference('item-level_itypes', 1); >+ >+ my $library = $builder->build_object( { class => 'Koha::Libraries' } )->store; >+ >+ my $module = new Test::MockModule('C4::Context'); >+ $module->mock('userenv', sub { { branch => $library->id } }); >+ >+ my $patron = $builder->build_object( >+ { >+ class => 'Koha::Patrons', >+ value => { categorycode => $patron_category->{categorycode} } >+ } >+ )->store; >+ >+ my $itemtype = $builder->build_object( >+ { >+ class => 'Koha::ItemTypes', >+ value => { >+ notforloan => undef, >+ rentalcharge => 0, >+ rental_charge_daily => 1.000000 >+ } >+ } >+ )->store; >+ >+ my $biblioitem = $builder->build( { source => 'Biblioitem' } ); >+ my $item = $builder->build_object( >+ { >+ class => 'Koha::Items', >+ value => { >+ homebranch => $library->id, >+ holdingbranch => $library->id, >+ notforloan => 0, >+ itemlost => 0, >+ withdrawn => 0, >+ itype => $itemtype->id, >+ biblionumber => $biblioitem->{biblionumber}, >+ biblioitemnumber => $biblioitem->{biblioitemnumber}, >+ } >+ } >+ )->store; >+ >+ is( $itemtype->rental_charge_daily, '1.000000', 'Daily rental charge stored and retreived correctly' ); >+ is( $item->effective_itemtype, $itemtype->id, "Itemtype set correctly for item"); >+ >+ my $dt_from = dt_from_string(); >+ my $dt_to = dt_from_string()->add( days => 7 ); >+ my $dt_to_renew = dt_from_string()->add( days => 13 ); >+ >+ t::lib::Mocks::mock_preference('finesCalendar', 'ignoreCalendar'); >+ my $issue = AddIssue( $patron->unblessed, $item->barcode, $dt_to, undef, $dt_from ); >+ my $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '7.000000', "Daily rental charge calulated correctly with finesCalendar = ignoreCalendar" ); >+ $accountline->delete(); >+ AddRenewal( $patron->id, $item->id, $library->id, $dt_to_renew, $dt_to ); >+ $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '6.000000', "Daily rental charge calulated correctly with finesCalendar = ignoreCalendar, for renewal" ); >+ $accountline->delete(); >+ $issue->delete(); >+ >+ t::lib::Mocks::mock_preference('finesCalendar', 'noFinesWhenClosed'); >+ $issue = AddIssue( $patron->unblessed, $item->barcode, $dt_to, undef, $dt_from ); >+ $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '7.000000', "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed" ); >+ $accountline->delete(); >+ AddRenewal( $patron->id, $item->id, $library->id, $dt_to_renew, $dt_to ); >+ $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '6.000000', "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed, for renewal" ); >+ $accountline->delete(); >+ $issue->delete(); >+ >+ my $calendar = C4::Calendar->new( branchcode => $library->id ); >+ $calendar->insert_week_day_holiday( >+ weekday => 3, >+ title => 'Test holiday', >+ description => 'Test holiday' >+ ); >+ $issue = AddIssue( $patron->unblessed, $item->barcode, $dt_to, undef, $dt_from ); >+ $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '6.000000', "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed and closed Wednesdays" ); >+ $accountline->delete(); >+ AddRenewal( $patron->id, $item->id, $library->id, $dt_to_renew, $dt_to ); >+ $accountline = Koha::Account::Lines->find({ itemnumber => $item->id }); >+ is( $accountline->amount, '5.000000', "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed and closed Wednesdays, for renewal" ); >+ $accountline->delete(); >+ $issue->delete(); >+ >+}; >diff --git a/t/db_dependent/Koha/ItemTypes.t b/t/db_dependent/Koha/ItemTypes.t >index eb08c65927..34ab094c9f 100755 >--- a/t/db_dependent/Koha/ItemTypes.t >+++ b/t/db_dependent/Koha/ItemTypes.t >@@ -19,14 +19,19 @@ > > use Modern::Perl; > >-use Test::More tests => 24; > use Data::Dumper; >-use Koha::Database; >+use Test::More tests => 25; >+ > use t::lib::Mocks; >-use Koha::Items; >-use Koha::Biblioitems; > use t::lib::TestBuilder; > >+use C4::Calendar; >+use Koha::Biblioitems; >+use Koha::Libraries; >+use Koha::Database; >+use Koha::DateUtils qw(dt_from_string);; >+use Koha::Items; >+ > BEGIN { > use_ok('Koha::ItemType'); > use_ok('Koha::ItemTypes'); >@@ -144,4 +149,43 @@ $biblioitem->delete; > > is ( $item_type->can_be_deleted, 1, 'The item type that was being used by the removed item and biblioitem can now be deleted' ); > >+subtest 'Koha::ItemType::calc_rental_charge_daily tests' => sub { >+ plan tests => 4; >+ >+ my $library = Koha::Libraries->search()->next(); >+ my $module = new Test::MockModule('C4::Context'); >+ $module->mock('userenv', sub { { branch => $library->id } }); >+ >+ my $itemtype = Koha::ItemType->new( >+ { >+ itemtype => 'type4', >+ description => 'description', >+ rental_charge_daily => 1.00, >+ } >+ )->store; >+ >+ is( $itemtype->rental_charge_daily, 1.00, 'Daily rental charge stored and retreived correctly' ); >+ >+ my $dt_from = dt_from_string(); >+ my $dt_to = dt_from_string()->add( days => 7 ); >+ >+ t::lib::Mocks::mock_preference('finesCalendar', 'ignoreCalendar'); >+ my $charge = $itemtype->calc_rental_charge_daily( { from => $dt_from, to => $dt_to } ); >+ is( $charge, 7.00, "Daily rental charge calulated correctly with finesCalendar = ignoreCalendar" ); >+ >+ t::lib::Mocks::mock_preference('finesCalendar', 'noFinesWhenClosed'); >+ $charge = $itemtype->calc_rental_charge_daily( { from => $dt_from, to => $dt_to } ); >+ is( $charge, 7.00, "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed" ); >+ >+ my $calendar = C4::Calendar->new( branchcode => $library->id ); >+ $calendar->insert_week_day_holiday( >+ weekday => 3, >+ title => 'Test holiday', >+ description => 'Test holiday' >+ ); >+ $charge = $itemtype->calc_rental_charge_daily( { from => $dt_from, to => $dt_to } ); >+ is( $charge, 6.00, "Daily rental charge calulated correctly with finesCalendar = noFinesWhenClosed and closed Wednesdays" ); >+ >+}; >+ > $schema->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 20912
:
76065
|
76066
|
76067
|
76068
|
76069
|
77302
|
77303
|
77304
|
81141
|
81142
|
81143
|
81450
|
81771
|
81772
|
81773
|
81774
|
81775
|
81778
|
82195
|
82196
|
84412
|
84413
|
84414
|
84415
|
84416
|
84417
|
84418
|
84419
|
84420
|
84570
|
84571
|
84572
|
84573
|
84574
|
84575
|
84576
|
84577
|
84578
|
84579
|
84580
|
84581
|
84582
|
84583
|
84584
|
84585
|
84610
|
84611
|
84612
|
84613
|
84614
|
84615
|
84616
|
84617
|
84618
|
84619
|
84620
|
84621
|
84622
|
84623
|
84624
|
84625
|
84707
|
84708
|
84709
|
84710
|
84711
|
84712
|
84713
|
84714
|
84715
|
84716
|
84717
|
84718
|
84719
|
84720
|
84721
|
84722
|
84723
|
84724
|
85291
|
85292
|
85293
|
85294
|
85295
|
85296
|
85297
|
85298
|
85299
|
85300
|
85301
|
85302
|
85303
|
85304
|
85305
|
85306
|
85307
|
85308
|
85316
|
85543
|
85544
|
85545
|
85546
|
85547
|
85548
|
85549
|
85550
|
85551
|
85552
|
85553
|
85554
|
85555
|
85556
|
85557
|
85558
|
85559
|
85560
|
85561
|
85628
|
85631
|
86140
|
86141
|
86142
|
86143
|
86144
|
86145
|
86146
|
86147
|
86148
|
86149
|
86151
|
86152
|
86153
|
86154
|
86155
|
86156
|
86157
|
86158
|
86159
|
86160
|
86244
|
86245
|
86246
|
86247
|
86248
|
86249
|
86250
|
86251
|
86252
|
86253
|
86254
|
86255
|
86256
|
86257
|
86258
|
86259
|
86260
|
86261
|
86262
|
86263
|
86264
|
86282
|
86283
|
86284
|
86285
|
86286
|
86287
|
86288
|
86289
|
86290
|
86291
|
86292
|
86293
|
86294
|
86295
|
86296
|
86297
|
86298
|
86299
|
86300
|
86301
|
86302
|
86306
|
86307
|
86308
|
86309
|
86310
|
86311
|
86312
|
86313
|
86314
|
86315
|
86316
|
86317
|
86318
|
86319
|
86320
|
86321
|
86322
|
86323
|
86324
|
86325
|
86326
|
86327
|
87363
|
87413
|
87703