Bugzilla – Attachment 131631 Details for
Bug 19532
Recalls for Koha
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 19532: (QA follow-up) Simplify resultset accessors
Bug-19532-QA-follow-up-Simplify-resultset-accessor.patch (text/plain), 16.68 KB, created by
Tomás Cohen Arazi (tcohen)
on 2022-03-11 19:56:41 UTC
(
hide
)
Description:
Bug 19532: (QA follow-up) Simplify resultset accessors
Filename:
MIME Type:
Creator:
Tomás Cohen Arazi (tcohen)
Created:
2022-03-11 19:56:41 UTC
Size:
16.68 KB
patch
obsolete
>From b8d1683add118d99dab8f9ed3c35d067729b89aa Mon Sep 17 00:00:00 2001 >From: Tomas Cohen Arazi <tomascohen@theke.io> >Date: Fri, 11 Mar 2022 16:46:45 -0300 >Subject: [PATCH] Bug 19532: (QA follow-up) Simplify resultset accessors > >This patch makes the different ->recalls accessors implemented on this >bug be more standard. This means: >- They don't do special things like default sorting or stripping out > special parameters. That's all left to the caller and the methods are > clean: they just return the related objects >- Useful filtering methods for Koha::Recalls resultsets are added. The > only used one (in the end) was ->filter_by_current. It seems like a > better approach, because it gives devs more control on how they want > to chain things, and there's a single place in which to maintain the > criteria of what is 'current' or 'finished'. This clearly makes the > 'old' column obsolete IMHO, at least in the use cases I found. This is > covered by tests as well. > >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> >--- > C4/Circulation.pm | 2 +- > C4/Overdues.pm | 2 +- > C4/Reserves.pm | 2 +- > Koha/Biblio.pm | 18 ++++--------- > Koha/Item.pm | 15 ++++++----- > Koha/Patron.pm | 16 +++-------- > Koha/Recalls.pm | 45 +++++++++++++++++++++++++++++++ > circ/circulation.pl | 2 +- > members/moremember.pl | 2 +- > opac/opac-recall.pl | 2 +- > t/db_dependent/Koha/Biblio.t | 10 +++---- > t/db_dependent/Koha/Patron.t | 10 ++++--- > t/db_dependent/Koha/Recalls.t | 51 ++++++++++++++++++++++++++++++++++- > 13 files changed, 130 insertions(+), 47 deletions(-) > >diff --git a/C4/Circulation.pm b/C4/Circulation.pm >index 03b5580d69..dea25b6915 100644 >--- a/C4/Circulation.pm >+++ b/C4/Circulation.pm >@@ -1125,7 +1125,7 @@ sub CanBookBeIssued { > # Only bother doing this if UseRecalls is enabled and the item is recallable > # Don't look at recalls that are in transit > if ( C4::Context->preference('UseRecalls') and $item_object->can_be_waiting_recall ) { >- my @recalls = $biblio->recalls->as_list; >+ my @recalls = $biblio->recalls({},{ order_by => { -asc => 'recalldate' } })->filter_by_current->as_list; > > foreach my $r ( @recalls ) { > if ( $r->itemnumber and >diff --git a/C4/Overdues.pm b/C4/Overdues.pm >index 7d8877b303..09d6724ff3 100644 >--- a/C4/Overdues.pm >+++ b/C4/Overdues.pm >@@ -260,7 +260,7 @@ sub CalcFine { > > # check if item has been recalled. recall should have been marked Overdue by cronjob, so only look at overdue recalls > # only charge using recall_overdue_fine if there is an item-level recall for this particular item, OR a biblio-level recall >- my @recalls = Koha::Recalls->search({ biblionumber => $item->{biblionumber}, old => undef, status => 'overdue' })->as_list; >+ my @recalls = Koha::Recalls->search({ biblionumber => $item->{biblionumber}, status => 'overdue' })->as_list; > my $bib_level_recall = 0; > $bib_level_recall = 1 if scalar @recalls > 0; > foreach my $recall ( @recalls ) { >diff --git a/C4/Reserves.pm b/C4/Reserves.pm >index 9634a2bd4e..54af13d7f0 100644 >--- a/C4/Reserves.pm >+++ b/C4/Reserves.pm >@@ -423,7 +423,7 @@ sub CanItemBeReserved { > > # check if a recall exists on this item from this borrower > return { status => 'recall' } >- if Koha::Recalls->search({ borrowernumber => $patron->borrowernumber, itemnumber => $item->itemnumber, old => undef })->count; >+ if $patron->recalls->filter_by_current->search({ itemnumber => $item->itemnumber })->count; > > my $controlbranch = C4::Context->preference('ReservesControlBranch'); > >diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm >index 8379f207d6..0e8e477f13 100644 >--- a/Koha/Biblio.pm >+++ b/Koha/Biblio.pm >@@ -1166,21 +1166,13 @@ sub get_marc_host { > > my $recalls = $biblio->recalls; > >-Return all active recalls attached to this biblio, sorted by oldest first >+Return recalls linked to this biblio > > =cut > > sub recalls { >- my ( $self, $params ) = @_; >- >- my $args = { >- biblionumber => $self->biblionumber, >- old => undef, >- }; >- $args->{ borrowernumber } = $params->{ borrowernumber } if $params->{ borrowernumber }; >- >- my $recalls_rs = $self->_result->recalls->search( $args, { order_by => { -asc => 'recalldate' } }); >- return Koha::Recalls->_new_from_dbic( $recalls_rs ); >+ my ( $self ) = @_; >+ return Koha::Recalls->_new_from_dbic( scalar $self->_result->recalls ); > } > > =head3 can_be_recalled >@@ -1254,10 +1246,10 @@ sub can_be_recalled { > > if ( $patron ) { > # check borrower has not reached open recalls allowed limit >- return 0 if ( $patron->recalls->count >= $recalls_allowed ); >+ return 0 if ( $patron->recalls->filter_by_current->count >= $recalls_allowed ); > > # check borrower has not reached open recalls allowed per record limit >- return 0 if ( $patron->recalls({ biblionumber => $self->biblionumber })->count >= $recalls_per_record ); >+ return 0 if ( $patron->recalls->filter_by_current->search({ biblionumber => $self->biblionumber })->count >= $recalls_per_record ); > > # check if any of the items under this biblio are already checked out by this borrower > return 0 if ( Koha::Checkouts->search({ itemnumber => [ @all_itemnumbers ], borrowernumber => $patron->borrowernumber })->count > 0 ); >diff --git a/Koha/Item.pm b/Koha/Item.pm >index 2b5ab5c044..80dcdf0d31 100644 >--- a/Koha/Item.pm >+++ b/Koha/Item.pm >@@ -1517,13 +1517,13 @@ sub can_be_recalled { > > if ( $patron ) { > # check borrower has not reached open recalls allowed limit >- return 0 if ( $patron->recalls->count >= $rule->{recalls_allowed} ); >+ return 0 if ( $patron->recalls->filter_by_current->count >= $rule->{recalls_allowed} ); > > # check borrower has not reach open recalls allowed per record limit >- return 0 if ( $patron->recalls({ biblionumber => $self->biblionumber })->count >= $rule->{recalls_per_record} ); >+ return 0 if ( $patron->recalls->filter_by_current->search({ biblionumber => $self->biblionumber })->count >= $rule->{recalls_per_record} ); > > # check if this patron has already recalled this item >- return 0 if ( Koha::Recalls->search({ itemnumber => $self->itemnumber, borrowernumber => $patron->borrowernumber, old => undef })->count > 0 ); >+ return 0 if ( Koha::Recalls->search({ itemnumber => $self->itemnumber, borrowernumber => $patron->borrowernumber })->filter_by_current->count > 0 ); > > # check if this patron has already checked out this item > return 0 if ( Koha::Checkouts->search({ itemnumber => $self->itemnumber, borrowernumber => $patron->borrowernumber })->count > 0 ); >@@ -1608,9 +1608,12 @@ Get the most relevant recall for this item. > sub check_recalls { > my ( $self ) = @_; > >- my @recalls = >- Koha::Recalls->search( { biblionumber => $self->biblionumber, itemnumber => [ $self->itemnumber, undef ], status => [ 'requested', 'overdue', 'waiting', 'in_transit' ] }, >- { order_by => { -asc => 'recalldate' } } )->as_list; >+ my @recalls = Koha::Recalls->search( >+ { biblionumber => $self->biblionumber, >+ itemnumber => [ $self->itemnumber, undef ] >+ }, >+ { order_by => { -asc => 'recalldate' } } >+ )->filter_by_current->as_list; > > my $recall; > # iterate through relevant recalls to find the best one. >diff --git a/Koha/Patron.pm b/Koha/Patron.pm >index 5f9a38f953..82760f200f 100644 >--- a/Koha/Patron.pm >+++ b/Koha/Patron.pm >@@ -2058,24 +2058,14 @@ sub safe_to_delete { > > my $recalls = $patron->recalls; > >- my $recalls = $patron->recalls({ biblionumber => $biblionumber }); >- >-Return the patron's active recalls - total, or on a specific biblio >+Return the patron's recalls. > > =cut > > sub recalls { >- my ( $self, $params ) = @_; >- >- my $biblionumber = $params->{biblionumber}; >- >- my $recalls_rs = Koha::Recalls->search({ borrowernumber => $self->borrowernumber, old => undef }); >- >- if ( $biblionumber ) { >- $recalls_rs = Koha::Recalls->search({ borrowernumber => $self->borrowernumber, old => undef, biblionumber => $biblionumber }); >- } >+ my ( $self ) = @_; > >- return $recalls_rs; >+ return Koha::Recalls->search({ borrowernumber => $self->borrowernumber }); > } > > =head2 Internal methods >diff --git a/Koha/Recalls.pm b/Koha/Recalls.pm >index b0777c3901..204680ca1b 100644 >--- a/Koha/Recalls.pm >+++ b/Koha/Recalls.pm >@@ -35,6 +35,51 @@ Koha::Recalls - Koha Recalls Object set class > > =head2 Class methods > >+=head3 filter_by_current >+ >+ my $current_recalls = $recalls->filter_by_current; >+ >+Returns a new resultset, filtering out finished recalls. >+ >+=cut >+ >+sub filter_by_current { >+ my ($self) = @_; >+ >+ return $self->search( >+ { >+ status => [ >+ 'in_transit', >+ 'overdue', >+ 'requested', >+ 'waiting', >+ ] >+ } >+ ); >+} >+ >+=head3 filter_by_finished >+ >+ my $finished_recalls = $recalls->filter_by_finished; >+ >+Returns a new resultset, filtering out current recalls. >+ >+=cut >+ >+sub filter_by_finished { >+ my ($self) = @_; >+ >+ return $self->search( >+ { >+ status => [ >+ 'cancelled', >+ 'expired', >+ 'fulfilled', >+ ] >+ } >+ ); >+} >+ > =head3 add_recall > > my ( $recall, $due_interval, $due_date ) = Koha::Recalls->add_recall({ >diff --git a/circ/circulation.pl b/circ/circulation.pl >index 7c7f92344b..36f29d1b39 100755 >--- a/circ/circulation.pl >+++ b/circ/circulation.pl >@@ -446,7 +446,7 @@ if ($patron) { > $template->param( > holds_count => $holds->count(), > WaitingHolds => $waiting_holds, >- recalls => $patron->recalls, >+ recalls => $patron->recalls->filter_by_current->search({},->search({},{ order_by => { -asc => 'recalldate' } })), > specific_patron => 1, > ); > } >diff --git a/members/moremember.pl b/members/moremember.pl >index 2d3a39bc1c..af76827091 100755 >--- a/members/moremember.pl >+++ b/members/moremember.pl >@@ -273,7 +273,7 @@ $template->param( > files => Koha::Patron::Files->new( borrowernumber => $borrowernumber ) ->GetFilesInfo(), > #debarments => scalar GetDebarments({ borrowernumber => $borrowernumber }), > has_modifications => $has_modifications, >- recalls => $patron->recalls, >+ recalls => $patron->recalls({},{ order_by => { -asc => 'recalldate' } })->filter_by_current, > specific_patron => 1, > ); > >diff --git a/opac/opac-recall.pl b/opac/opac-recall.pl >index 0e071dea78..8cea5efb79 100755 >--- a/opac/opac-recall.pl >+++ b/opac/opac-recall.pl >@@ -46,7 +46,7 @@ if ( C4::Context->preference('UseRecalls') ) { > my $items = Koha::Items->search({ biblionumber => $biblionumber })->as_list; > > # check if already recalled >- my $recalled = $biblio->recalls({ borrowernumber => $borrowernumber })->count; >+ my $recalled = $biblio->recalls->filter_by_current->search({ borrowernumber => $borrowernumber })->count; > if ( defined $recalled and $recalled > 0 ) { > my $recalls_per_record = Koha::CirculationRules->get_effective_rule({ > categorycode => $patron->categorycode, >diff --git a/t/db_dependent/Koha/Biblio.t b/t/db_dependent/Koha/Biblio.t >index 3751fdca3e..0a7ed4d43f 100755 >--- a/t/db_dependent/Koha/Biblio.t >+++ b/t/db_dependent/Koha/Biblio.t >@@ -885,7 +885,7 @@ subtest 'get_marc_authors() tests' => sub { > > subtest 'Recalls tests' => sub { > >- plan tests => 12; >+ plan tests => 13; > > $schema->storage->txn_begin; > >@@ -929,14 +929,14 @@ subtest 'Recalls tests' => sub { > } > )->store; > >- my $recalls_count = $biblio->recalls->count; >- is( $recalls_count, 3, 'Correctly get number of active recalls for biblio' ); >+ my $recalls = $biblio->recalls; >+ is( $recalls->count, 3, 'Correctly get number of recalls for biblio' ); > > $recall1->set_cancelled; > $recall2->set_expired({ interface => 'COMMANDLINE' }); > >- $recalls_count = $biblio->recalls->count; >- is( $recalls_count, 1, 'Correctly get number of active recalls for biblio' ); >+ is( $recalls->count, 3, 'Correctly get number of recalls for biblio' ); >+ is( $recalls->filter_by_current->count, 1, 'Correctly get number of active recalls for biblio' ); > > t::lib::Mocks::mock_preference('UseRecalls', 0); > is( $biblio->can_be_recalled({ patron => $patron1 }), 0, "Can't recall with UseRecalls disabled" ); >diff --git a/t/db_dependent/Koha/Patron.t b/t/db_dependent/Koha/Patron.t >index a5f56167cc..a1aff0035e 100755 >--- a/t/db_dependent/Koha/Patron.t >+++ b/t/db_dependent/Koha/Patron.t >@@ -1053,7 +1053,10 @@ subtest 'messages' => sub { > > subtest 'recalls() tests' => sub { > >- plan tests => 2; >+ plan tests => 3; >+ >+ $schema->storage->txn_begin; >+ > my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); > my $biblio1 = $builder->build_object({ class => 'Koha::Biblios' }); > my $item1 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $biblio1->biblionumber } }); >@@ -1098,8 +1101,9 @@ subtest 'recalls() tests' => sub { > )->store; > $recall->set_cancelled; > >- is( $patron->recalls->count, 3, "Correctly gets this patron's active recalls" ); >- is( $patron->recalls({ biblionumber => $biblio1->biblionumber })->count, 2, "Correctly gets this patron's active recalls on a specific biblio" ); >+ is( $patron->recalls->count, 4, "Correctly gets this patron's recalls" ); >+ is( $patron->recalls->filter_by_current->count, 3, "Correctly gets this patron's active recalls" ); >+ is( $patron->recalls->filter_by_current->search( { biblionumber => $biblio1->biblionumber } )->count, 2, "Correctly gets this patron's active recalls on a specific biblio" ); > > $schema->storage->txn_rollback; > }; >diff --git a/t/db_dependent/Koha/Recalls.t b/t/db_dependent/Koha/Recalls.t >index 4b0ac8f048..610a84a4e2 100755 >--- a/t/db_dependent/Koha/Recalls.t >+++ b/t/db_dependent/Koha/Recalls.t >@@ -17,7 +17,7 @@ > > use Modern::Perl; > >-use Test::More tests => 19; >+use Test::More tests => 20; > use t::lib::TestBuilder; > use t::lib::Mocks; > >@@ -173,3 +173,52 @@ $recall = Koha::Recalls->find( $recall->recall_id ); > ok( $recall->fulfilled, "Recall fulfilled with move_recall" ); > > $schema->storage->txn_rollback(); >+ >+subtest 'filter_by_current() and filter_by_finished() tests' => sub { >+ >+ plan tests => 10; >+ >+ $schema->storage->txn_begin; >+ >+ my $in_transit = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'in_transit' } } ); >+ my $overdue = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'overdue' } } ); >+ my $requested = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'requested' } } ); >+ my $waiting = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'waiting' } } ); >+ my $cancelled = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'cancelled' } } ); >+ my $expired = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'expired' } } ); >+ my $fulfilled = $builder->build_object( { class => 'Koha::Recalls', value => { status => 'fulfilled' } } ); >+ >+ my $recalls = Koha::Recalls->search( >+ { >+ recall_id => [ >+ $in_transit->id, >+ $overdue->id, >+ $requested->id, >+ $waiting->id, >+ $cancelled->id, >+ $expired->id, >+ $fulfilled->id, >+ ] >+ }, >+ { order_by => [ 'recall_id' ] } >+ ); >+ >+ is( $recalls->count, 7, 'Resultset count is correct' ); >+ >+ my $current_recalls = $recalls->filter_by_current; >+ is( $current_recalls->count, 4, 'Current recalls count correct' ); >+ >+ is( $current_recalls->next->status, 'in_transit', 'Resultset correctly includes in_transit recall'); >+ is( $current_recalls->next->status, 'overdue', 'Resultset correctly includes overdue recall'); >+ is( $current_recalls->next->status, 'requested', 'Resultset correctly includes requested recall'); >+ is( $current_recalls->next->status, 'waiting', 'Resultset correctly includes waiting recall'); >+ >+ my $finished_recalls = $recalls->filter_by_finished; >+ is( $finished_recalls->count, 3, 'Finished recalls count correct' ); >+ >+ is( $finished_recalls->next->status, 'cancelled', 'Resultset correctly includes cancelled recall'); >+ is( $finished_recalls->next->status, 'expired', 'Resultset correctly includes expired recall'); >+ is( $finished_recalls->next->status, 'fulfilled', 'Resultset correctly includes fulfilled recall'); >+ >+ $schema->storage->txn_rollback; >+}; >-- >2.35.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 19532
:
68569
|
68570
|
68571
|
68572
|
68642
|
68643
|
68644
|
68645
|
68653
|
69100
|
69102
|
69147
|
69148
|
69149
|
69170
|
69172
|
69221
|
69222
|
69223
|
69322
|
69353
|
69354
|
69405
|
69409
|
69410
|
69411
|
69841
|
69872
|
69873
|
69874
|
69875
|
69876
|
69877
|
69878
|
69879
|
69880
|
69881
|
69882
|
69883
|
69884
|
69885
|
69886
|
69887
|
69888
|
69889
|
69890
|
69986
|
70093
|
71409
|
71574
|
71575
|
71576
|
71577
|
71578
|
71579
|
71580
|
71581
|
71582
|
71583
|
71584
|
71585
|
71586
|
71587
|
71588
|
71589
|
71590
|
71591
|
71592
|
72244
|
72311
|
72312
|
72313
|
72314
|
72315
|
72316
|
72317
|
72318
|
72319
|
72320
|
72321
|
72322
|
72323
|
72324
|
72325
|
72326
|
72327
|
72328
|
72329
|
72330
|
72331
|
72332
|
72333
|
72334
|
72335
|
72336
|
72337
|
72338
|
72527
|
76817
|
76818
|
76819
|
76820
|
76821
|
76822
|
76823
|
76824
|
76825
|
76826
|
76827
|
76828
|
76829
|
76830
|
76831
|
76832
|
76833
|
76834
|
76835
|
76836
|
76837
|
76838
|
76839
|
76840
|
76841
|
76842
|
76843
|
76844
|
76845
|
76846
|
76847
|
77177
|
77178
|
77179
|
78755
|
78757
|
78759
|
78761
|
78763
|
78765
|
78766
|
78768
|
78770
|
78772
|
78773
|
78774
|
78775
|
78776
|
78777
|
78778
|
78780
|
78782
|
78785
|
78787
|
78789
|
78790
|
78792
|
78794
|
78797
|
78800
|
78801
|
78802
|
78803
|
78804
|
78805
|
78806
|
78807
|
78808
|
80763
|
80764
|
80765
|
80766
|
80767
|
80768
|
80769
|
80770
|
80771
|
80772
|
80773
|
80774
|
80775
|
80776
|
80777
|
80778
|
80779
|
80780
|
80781
|
80782
|
80783
|
80784
|
80785
|
80786
|
80787
|
80788
|
80789
|
80793
|
80878
|
81204
|
81205
|
81206
|
81207
|
81208
|
81209
|
81210
|
81211
|
81212
|
81213
|
81214
|
81215
|
81216
|
81217
|
81218
|
81219
|
81220
|
81221
|
81222
|
81223
|
81224
|
81225
|
81226
|
81227
|
81228
|
81229
|
81230
|
81231
|
81232
|
81233
|
81234
|
81235
|
81236
|
81237
|
81238
|
81239
|
81240
|
81241
|
81242
|
81243
|
81244
|
81245
|
81246
|
81247
|
81547
|
81548
|
81549
|
81550
|
81551
|
81552
|
81553
|
81554
|
81555
|
81556
|
81557
|
81558
|
81559
|
81560
|
81561
|
81562
|
81563
|
81564
|
81565
|
81566
|
81567
|
81568
|
81569
|
81583
|
81584
|
81585
|
81586
|
81587
|
81588
|
81595
|
81618
|
81652
|
81653
|
81654
|
81655
|
81656
|
81657
|
81658
|
81659
|
81660
|
81661
|
81662
|
81663
|
81664
|
81665
|
81666
|
81667
|
81668
|
81669
|
81670
|
81671
|
81672
|
81673
|
81674
|
81675
|
81676
|
81677
|
81678
|
81679
|
81680
|
81681
|
81682
|
81683
|
103887
|
103888
|
103890
|
103899
|
103900
|
103901
|
103999
|
104000
|
104001
|
104002
|
104005
|
104006
|
104007
|
104066
|
104067
|
104068
|
104069
|
104070
|
104071
|
104246
|
104247
|
104248
|
104249
|
104250
|
104322
|
104323
|
104324
|
104325
|
104326
|
104327
|
104328
|
104329
|
104330
|
104331
|
104332
|
104333
|
104334
|
104335
|
104336
|
104391
|
104392
|
104393
|
104394
|
104395
|
104396
|
104397
|
104398
|
104474
|
104475
|
104476
|
104477
|
104478
|
104479
|
104480
|
104481
|
104545
|
104546
|
104547
|
104548
|
104549
|
104550
|
104551
|
104552
|
104646
|
104647
|
104648
|
104649
|
104650
|
104651
|
104652
|
104653
|
104722
|
104723
|
104724
|
104725
|
104726
|
104727
|
104728
|
104729
|
104806
|
104807
|
104808
|
104809
|
104810
|
104811
|
104812
|
104813
|
104814
|
104815
|
104816
|
104817
|
104818
|
104819
|
104820
|
104821
|
104863
|
104864
|
104865
|
104866
|
104867
|
104868
|
104869
|
104870
|
104902
|
104903
|
104904
|
104905
|
104906
|
104907
|
104908
|
104909
|
104910
|
104913
|
104914
|
104915
|
104916
|
104917
|
104918
|
104919
|
104920
|
104988
|
104989
|
104990
|
104991
|
104992
|
106268
|
106269
|
106371
|
106372
|
106373
|
106374
|
106375
|
106376
|
106377
|
106378
|
106810
|
106811
|
106812
|
106813
|
106814
|
106815
|
106816
|
106817
|
106857
|
107198
|
107199
|
107200
|
107201
|
107202
|
107203
|
107204
|
107205
|
107807
|
107808
|
107809
|
107810
|
107811
|
107812
|
107813
|
107814
|
107918
|
107919
|
107920
|
107921
|
107922
|
107923
|
107924
|
107925
|
108222
|
108223
|
108224
|
108225
|
108226
|
108227
|
108228
|
108229
|
108980
|
108981
|
108982
|
109306
|
109307
|
109308
|
109309
|
109310
|
109311
|
109312
|
109313
|
109314
|
109315
|
109316
|
109317
|
109318
|
109463
|
109464
|
109465
|
109466
|
109467
|
109468
|
109469
|
109775
|
109776
|
109777
|
109778
|
109779
|
109780
|
109781
|
109782
|
109783
|
109784
|
109785
|
111199
|
111200
|
111201
|
111202
|
111203
|
111204
|
111205
|
111206
|
112316
|
112317
|
112321
|
112322
|
112323
|
112324
|
112325
|
112326
|
112346
|
112472
|
112491
|
112540
|
112612
|
112613
|
112614
|
112615
|
112616
|
112617
|
112618
|
112619
|
112620
|
112621
|
112622
|
113195
|
113196
|
113197
|
113198
|
113199
|
113200
|
113201
|
113202
|
113203
|
113204
|
113205
|
113286
|
113287
|
113288
|
113289
|
113290
|
113291
|
113292
|
113293
|
113294
|
113295
|
113296
|
113297
|
113298
|
113335
|
113351
|
113352
|
113353
|
113354
|
113355
|
113356
|
113357
|
113358
|
113359
|
113361
|
113362
|
113363
|
113364
|
113365
|
113430
|
113431
|
113432
|
113433
|
113434
|
113435
|
113436
|
113437
|
113438
|
113439
|
113440
|
113441
|
113442
|
113443
|
113444
|
113445
|
116121
|
116122
|
116123
|
116124
|
116125
|
116126
|
116127
|
116128
|
116129
|
116130
|
116131
|
116132
|
116133
|
116134
|
118267
|
118268
|
118269
|
118270
|
118271
|
118272
|
118273
|
118274
|
118275
|
118276
|
118277
|
118278
|
118279
|
118280
|
122993
|
122994
|
122995
|
122996
|
122997
|
122998
|
122999
|
123000
|
123001
|
123002
|
123003
|
123004
|
123005
|
126244
|
126245
|
126246
|
126247
|
126248
|
126249
|
126250
|
126251
|
126252
|
126253
|
126254
|
126255
|
126256
|
126257
|
126453
|
126454
|
126455
|
126456
|
126457
|
126458
|
126459
|
126460
|
126469
|
126470
|
126565
|
126566
|
126568
|
126569
|
126570
|
126571
|
126572
|
126573
|
126574
|
126575
|
126576
|
126577
|
126578
|
126579
|
126580
|
129305
|
129306
|
129307
|
129308
|
129309
|
129310
|
129311
|
129312
|
129313
|
129314
|
129315
|
129316
|
129317
|
129318
|
129319
|
130641
|
130642
|
130643
|
130644
|
130645
|
130646
|
130647
|
130648
|
130649
|
130650
|
130651
|
130652
|
130653
|
130654
|
130655
|
130656
|
131108
|
131156
|
131157
|
131158
|
131159
|
131160
|
131193
|
131213
|
131257
|
131260
|
131261
|
131262
|
131263
|
131264
|
131265
|
131266
|
131267
|
131268
|
131269
|
131270
|
131271
|
131272
|
131273
|
131274
|
131275
|
131276
|
131277
|
131278
|
131279
|
131280
|
131281
|
131282
|
131330
|
131629
|
131630
|
131631
|
131664
|
131665
|
131666
|
131701
|
132332