Bugzilla – Attachment 34096 Details for
Bug 6427
Rewrite of the accounts system
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 6427 - Update database
Bug-6427---Update-database.patch (text/plain), 20.54 KB, created by
Kyle M Hall (khall)
on 2014-12-03 17:59:01 UTC
(
hide
)
Description:
Bug 6427 - Update database
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2014-12-03 17:59:01 UTC
Size:
20.54 KB
patch
obsolete
>From 6020961a8c39e6b232a7ba5ab9f81d12824e5f1b Mon Sep 17 00:00:00 2001 >From: Kyle M Hall <kyle@bywatersolutions.com> >Date: Tue, 15 Jul 2014 10:32:16 -0400 >Subject: [PATCH] Bug 6427 - Update database > >This patch set re-engineers Koha's accounting system to be faster, more >stable, and have a better historical accounting of fees and payments >while also unifying much of the payment logic and simplifying the code >behind it. > >Three new tables have been created: >account_debits stores fines and fees owed by the patron. > >account_credits stores payments, write-offs, and other line items that >reduce the amount owed by a patron. > >account_offsets stores data about changes to debits and credits, >including which credits paid which debits. > >borrowers.account_balance stores the current balance of the >patron, so it does not have to be calculated each time it needs to be >displayed. > >issues.issue_id has been added so that individual fines can be directly >linked to the issue that caused them without ambiguity. > >The various accounting code strings ( F, FU, Rent, etc ), some of which >have little or no documentation have been replaced by what enumerated >data types which are documented via POD. >There are three, one for each of Debits ( fees/fines ), Credits ( payments ), >and Offsets. > >The system continues to allow custom fee types ( moving MANUAL_INV to MANUAL_DEBIT ) >while additionally allowing custom payment types ( MANUAL_CREDIT ). > >The system also allows for overpayment, the the outstanding credit being >applied to future fees as they are created. > >The system also allows for a librarian to accept a different amount of >money than what is to be paid, and will calculate the change to be >given. > >Test Plan: >1) Apply this patch >2) Create some manual fees >3) Test the fee payments > * Pay one fee > * Pay multiple fees > * Make a partial payment > * Write off a fee >4) View the fees/payments, verify they are correct >5) Check out some items as overdue that should have fines >6) Run fines.pl, verify fines were generated >7) Pay on an accruing fine >8) Run fines.pl again, verify the fine hasn't changed >9) Increase the daily fine in issuing rules >10) Run fines.pl again, verify the fine has increased >11) Decrease the daily fine in issuing rules >12) Run fines.pl again, verify the fine has decreased >13) Test dropbox mode >14) Test WhenLostChargeReplacementFee both ways >15) Test RefundLostItemFeeOnReturn both ways >16) Test WhenLostForgiveFine both ways >17) Test CalculateFinesOnReturn both ways >--- > installer/data/mysql/kohastructure.sql | 134 ++++++++++++++++-------- > installer/data/mysql/updatedatabase.pl | 184 ++++++++++++++++++++++++++++++++ > 2 files changed, 274 insertions(+), 44 deletions(-) > >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index 4ffbbf2..bfde145 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -265,6 +265,7 @@ CREATE TABLE `borrowers` ( -- this table includes information about your patrons > `altcontactphone` varchar(50) default NULL, -- the phone number for the alternate contact for the patron/borrower > `smsalertnumber` varchar(50) default NULL, -- the mobile phone number where the patron/borrower would like to receive notices (if SNS turned on) > `privacy` integer(11) DEFAULT '1' NOT NULL, -- patron/borrower's privacy settings related to their reading history >+ `account_balance` decimal(28,6) NOT NULL, > UNIQUE KEY `cardnumber` (`cardnumber`), > PRIMARY KEY `borrowernumber` (`borrowernumber`), > KEY `categorycode` (`categorycode`), >@@ -2734,50 +2735,6 @@ CREATE TABLE `messages` ( -- circulation messages left via the patron's check ou > ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > > -- >--- Table structure for table `accountlines` >--- >- >-DROP TABLE IF EXISTS `accountlines`; >-CREATE TABLE `accountlines` ( >- `accountlines_id` int(11) NOT NULL AUTO_INCREMENT, >- `borrowernumber` int(11) NOT NULL default 0, >- `accountno` smallint(6) NOT NULL default 0, >- `itemnumber` int(11) default NULL, >- `date` date default NULL, >- `amount` decimal(28,6) default NULL, >- `description` mediumtext, >- `dispute` mediumtext, >- `accounttype` varchar(5) default NULL, >- `amountoutstanding` decimal(28,6) default NULL, >- `lastincrement` decimal(28,6) default NULL, >- `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, >- `notify_id` int(11) NOT NULL default 0, >- `notify_level` int(2) NOT NULL default 0, >- `note` text NULL default NULL, >- `manager_id` int(11) NULL, >- PRIMARY KEY (`accountlines_id`), >- KEY `acctsborridx` (`borrowernumber`), >- KEY `timeidx` (`timestamp`), >- KEY `itemnumber` (`itemnumber`), >- CONSTRAINT `accountlines_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE, >- CONSTRAINT `accountlines_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE SET NULL ON UPDATE SET NULL >-) ENGINE=InnoDB DEFAULT CHARSET=utf8; >- >--- >--- Table structure for table `accountoffsets` >--- >- >-DROP TABLE IF EXISTS `accountoffsets`; >-CREATE TABLE `accountoffsets` ( >- `borrowernumber` int(11) NOT NULL default 0, >- `accountno` smallint(6) NOT NULL default 0, >- `offsetaccount` smallint(6) NOT NULL default 0, >- `offsetamount` decimal(28,6) default NULL, >- `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, >- CONSTRAINT `accountoffsets_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE >-) ENGINE=InnoDB DEFAULT CHARSET=utf8; >- >--- > -- Table structure for table `action_logs` > -- > >@@ -3502,6 +3459,95 @@ CREATE TABLE items_search_fields ( > ON DELETE SET NULL ON UPDATE CASCADE > ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > >+-- >+-- Table structure for table 'account_credits' >+-- >+DROP TABLE IF EXISTS account_credits; >+CREATE TABLE IF account_credits ( >+ credit_id int(11) NOT NULL AUTO_INCREMENT, -- The unique id for this credit >+ borrowernumber int(11) NOT NULL, -- The borrower this credit applies to >+ `type` varchar(255) NOT NULL, -- The type of credit this is ( defined by Koha::Accounts::CreditTypes ) >+ amount_received decimal(28,6) DEFAULT NULL, -- If this was a cash payment, the amount of money given >+ amount_paid decimal(28,6) NOT NULL, -- The actual ammount paid, if less than amount_recieved, change was given back >+ amount_remaining decimal(28,6) NOT NULL, -- The amount of this credit that has not been applied to outstanding debits >+ amount_voided decimal(28,6) NULL DEFAULT NULL, -- The amount of this credit was for before it was voided >+ notes text, -- Misc notes for this credit >+ branchcode VARCHAR( 10 ) NULL DEFAULT NULL, -- Branchcode where the credit was created ( if any ) >+ manager_id int(11) DEFAULT NULL, -- The borrowernumber of the user who created this credit ( if any ) >+ created_on timestamp NULL DEFAULT NULL, -- Timestamp for when this credit was created >+ updated_on timestamp NULL DEFAULT NULL, -- Timestamp for when this credit was last modified >+ PRIMARY KEY (credit_id), >+ KEY borrowernumber (borrowernumber), >+ KEY branchcode (branchcode) >+) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ >+-- >+-- Constraints for table `account_credits` >+-- >+ALTER TABLE `account_credits` >+ ADD CONSTRAINT account_credits_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_credits_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE; >+ >+-- >+-- Table structure for table 'account_debits' >+-- >+ >+DROP TABLE IF EXISTS account_debits; >+CREATE TABLE account_debits ( >+ debit_id int(11) NOT NULL AUTO_INCREMENT, -- The unique id for this debit >+ borrowernumber int(11) NOT NULL DEFAULT '0', -- The borrower this debit applies to >+ itemnumber int(11) DEFAULT NULL, -- The item related to this debit ( for fines, lost fees, etc ) >+ issue_id int(11) DEFAULT NULL, -- The checkout this debit is related to ( again, for fines, lost fees, etc ) >+ `type` varchar(255) NOT NULL, -- The type of debit this is ( defined by Koha::Accounts::DebitTypes ) >+ accruing tinyint(1) NOT NULL DEFAULT '0', -- Boolean flag, tells of if this is a fine that is still accruing >+ amount_original decimal(28,6) DEFAULT NULL, -- The total amount of this debit >+ amount_outstanding decimal(28,6) DEFAULT NULL, -- The amount still owed on this debit >+ amount_last_increment decimal(28,6) DEFAULT NULL, -- The amount by which this debit last changed >+ description mediumtext, -- The description for this debit >+ notes text, -- Misc notes for this debit >+ branchcode VARCHAR( 10 ) NULL DEFAULT NULL, -- Branchcode where the debit was created ( if any ) >+ manager_id int(11) DEFAULT NULL, -- The borrowernumber of the user who created this debit ( if any ) >+ created_on timestamp NULL DEFAULT NULL, -- Timestamp for when this credit was created >+ updated_on timestamp NULL DEFAULT NULL, -- Timestamp for when this credit was last modified >+ PRIMARY KEY (debit_id), >+ KEY acctsborridx (borrowernumber), >+ KEY itemnumber (itemnumber), >+ KEY borrowernumber (borrowernumber), >+ KEY issue_id (issue_id), >+ KEY branchcode (branchcode) >+) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ >+-- >+-- Constraints for table `account_debits` >+-- >+ALTER TABLE `account_debits` >+ ADD CONSTRAINT account_debits_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_debits_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE; >+ >+-- >+-- Table structure for table 'account_offsets' >+-- >+ >+DROP TABLE IF EXISTS account_offsets; >+CREATE TABLE account_offsets ( >+ offset_id int(11) NOT NULL AUTO_INCREMENT, -- Unique id for this offset >+ debit_id int(11) DEFAULT NULL, -- Related debit >+ credit_id int(11) DEFAULT NULL, -- Related credit ( if any ) >+ `type` varchar(255) DEFAULT NULL, -- The type of this offset ( defined by Koha::Accounts::OffsetTypes ), if any >+ amount decimal(28,6) NOT NULL, -- The amount of the offset, positive means patron owes more, negative means patron owes less >+ created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Timestamp for when this offset was created >+ PRIMARY KEY (offset_id), >+ KEY fee_id (debit_id), >+ KEY payment_id (credit_id) >+) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ >+-- >+-- Constraints for table `account_offsets` >+-- >+ALTER TABLE `account_offsets` >+ ADD CONSTRAINT account_offsets_ibfk_1 FOREIGN KEY (debit_id) REFERENCES account_debits (debit_id) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_offsets_ibfk_2 FOREIGN KEY (credit_id) REFERENCES account_credits (credit_id) ON DELETE CASCADE ON UPDATE CASCADE; >+ > /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; > /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; > /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 97cbf9f..23d214b 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -37,6 +37,7 @@ use Getopt::Long; > use C4::Context; > use C4::Installer; > use C4::Dates; >+use Koha::Database; > > use MARC::Record; > use MARC::File::XML ( BinaryEncoding => 'utf8' ); >@@ -7257,6 +7258,7 @@ if ( CheckVersion($DBversion) ) { > > $dbh->{AutoCommit} = 1; > $dbh->{RaiseError} = 0; >+ SetVersion ($DBversion); > } > > $DBversion = "3.13.00.031"; >@@ -8814,6 +8816,188 @@ if ( CheckVersion($DBversion) ) { > $dbh->do("ALTER TABLE `biblioitems` CHANGE `cn_sort` `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL"); > $dbh->do("ALTER TABLE `deletedbiblioitems` CHANGE `cn_sort` `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL"); > print "Upgrade to $DBversion done (Bug 12424 - ddc sorting of call numbers truncates long Cutter parts)\n"; >+ SetVersion($DBversion); >+} >+ >+$DBversion = "3.17.00.XXX"; >+if ( CheckVersion($DBversion) ) { >+ $dbh->do(q{ >+ ALTER TABLE old_issues ADD issue_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST >+ }); >+ $dbh->do(q{ >+ ALTER TABLE issues ADD issue_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; >+ }); >+ $dbh->do(q{ >+ UPDATE issues SET issue_id = issue_id + ( SELECT COUNT(*) FROM old_issues ) ORDER BY issue_id DESC >+ }); >+ >+ $dbh->do(" >+ CREATE TABLE IF NOT EXISTS account_credits ( >+ credit_id int(11) NOT NULL AUTO_INCREMENT, >+ borrowernumber int(11) NOT NULL, >+ `type` varchar(255) NOT NULL, >+ amount_received decimal(28,6) DEFAULT NULL, >+ amount_paid decimal(28,6) NOT NULL, >+ amount_remaining decimal(28,6) NOT NULL, >+ amount_voided decimal(28,6) NULL DEFAULT NULL, >+ notes text, >+ branchcode VARCHAR( 10 ) NULL DEFAULT NULL, >+ manager_id int(11) DEFAULT NULL, >+ created_on timestamp NULL DEFAULT NULL, >+ updated_on timestamp NULL DEFAULT NULL, >+ PRIMARY KEY (credit_id), >+ KEY borrowernumber (borrowernumber), >+ KEY branchcode (branchcode) >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ "); >+ $dbh->do(" >+ CREATE TABLE IF NOT EXISTS account_debits ( >+ debit_id int(11) NOT NULL AUTO_INCREMENT, >+ borrowernumber int(11) NOT NULL DEFAULT '0', >+ itemnumber int(11) DEFAULT NULL, >+ issue_id int(11) DEFAULT NULL, >+ `type` varchar(255) NOT NULL, >+ accruing tinyint(1) NOT NULL DEFAULT '0', >+ amount_original decimal(28,6) DEFAULT NULL, >+ amount_outstanding decimal(28,6) DEFAULT NULL, >+ amount_last_increment decimal(28,6) DEFAULT NULL, >+ description mediumtext, >+ notes text, >+ branchcode VARCHAR( 10 ) NULL DEFAULT NULL, >+ manager_id int(11) DEFAULT NULL, >+ created_on timestamp NULL DEFAULT NULL, >+ updated_on timestamp NULL DEFAULT NULL, >+ PRIMARY KEY (debit_id), >+ KEY acctsborridx (borrowernumber), >+ KEY itemnumber (itemnumber), >+ KEY borrowernumber (borrowernumber), >+ KEY issue_id (issue_id), >+ KEY branchcode (branchcode) >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ "); >+ >+ $dbh->do(" >+ CREATE TABLE account_offsets ( >+ offset_id int(11) NOT NULL AUTO_INCREMENT, >+ debit_id int(11) DEFAULT NULL, >+ credit_id int(11) DEFAULT NULL, >+ `type` varchar(255) DEFAULT NULL, >+ amount decimal(28,6) NOT NULL COMMENT 'A positive number here represents a payment, a negative is a increase in a fine.', >+ created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, >+ PRIMARY KEY (offset_id), >+ KEY fee_id (debit_id), >+ KEY payment_id (credit_id) >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ "); >+ >+ $dbh->do(" >+ ALTER TABLE `account_credits` >+ ADD CONSTRAINT account_credits_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_credits_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE; >+ "); >+ $dbh->do(" >+ ALTER TABLE `account_debits` >+ ADD CONSTRAINT account_debits_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_debits_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE; >+ "); >+ $dbh->do(" >+ ALTER TABLE `account_offsets` >+ ADD CONSTRAINT account_offsets_ibfk_1 FOREIGN KEY (debit_id) REFERENCES account_debits (debit_id) ON DELETE CASCADE ON UPDATE CASCADE, >+ ADD CONSTRAINT account_offsets_ibfk_2 FOREIGN KEY (credit_id) REFERENCES account_credits (credit_id) ON DELETE CASCADE ON UPDATE CASCADE; >+ "); >+ >+ $dbh->do(" >+ ALTER TABLE borrowers ADD account_balance DECIMAL( 28, 6 ) NOT NULL; >+ "); >+ >+ my $schema = Koha::Database->new()->schema; >+ my $debit_rs = $schema->resultset('AccountDebit'); >+ my $credit_rs = $schema->resultset('AccountCredit'); >+ my $issues_rs = $schema->resultset('Issue'); >+ >+ use Koha::Accounts::DebitTypes; >+ use Koha::Accounts::CreditTypes; >+ >+ my $debit_types_map = { >+ 'A' => Koha::Accounts::DebitTypes::AccountManagementFee, >+ 'F' => Koha::Accounts::DebitTypes::Fine, >+ 'FU' => Koha::Accounts::DebitTypes::Fine, >+ 'L' => Koha::Accounts::DebitTypes::Lost, >+ 'M' => Koha::Accounts::DebitTypes::Sundry, >+ 'N' => Koha::Accounts::DebitTypes::NewCard, >+ 'Rent' => Koha::Accounts::DebitTypes::Rental, >+ }; >+ >+ my $credit_types_map = { >+ 'FOR' => Koha::Accounts::CreditTypes::Forgiven, >+ 'LR' => Koha::Accounts::CreditTypes::Found, >+ 'Pay' => Koha::Accounts::CreditTypes::Payment, >+ 'PAY' => Koha::Accounts::CreditTypes::Payment, >+ 'WO' => Koha::Accounts::CreditTypes::WriteOff, >+ 'W' => Koha::Accounts::CreditTypes::WriteOff, >+ 'C' => Koha::Accounts::CreditTypes::Credit, >+ 'CR' => Koha::Accounts::CreditTypes::Credit, >+ }; >+ >+ my $sth = $dbh->prepare("SELECT * FROM accountlines"); >+ $sth->execute(); >+ while ( my $a = $sth->fetchrow_hashref() ) { >+ if ( $debit_types_map->{ $a->{accounttype} } ) { >+ $debit_rs->create( >+ { >+ borrowernumber => $a->{borrowernumber}, >+ itemnumber => $a->{itemnumber}, >+ amount_original => $a->{amount}, >+ amount_outstanding => $a->{amountoutstanding}, >+ created_on => $a->{timestamp}, >+ description => $a->{description}, >+ notes => $a->{note}, >+ manager_id => $a->{manager_id}, >+ accruing => $a->{accounttype} eq 'FU', >+ type => $debit_types_map->{ $a->{accounttype} }, >+ issue_id => $a->{accounttype} eq 'FU' >+ ? $issues_rs->single( >+ { >+ borrowernumber => $a->{borrowernumber}, >+ itemnumber => $a->{itemnumber}, >+ } >+ )->issue_id() >+ : undef, >+ } >+ ); >+ } >+ elsif ( $credit_types_map->{ $a->{accounttype} } ) { >+ $credit_rs->create( >+ { >+ borrowernumber => $a->{borrowernumber}, >+ amount_paid => $a->{amount} * -1, >+ amount_remaining => $a->{amountoutstanding} * -1, >+ created_on => $a->{timestamp}, >+ notes => $a->{note}, >+ manager_id => $a->{manager_id}, >+ type => $credit_types_map->{ $a->{accounttype} }, >+ } >+ ); >+ } >+ else { >+ # Everything else must be a MANUAL_INV >+ $debit_rs->create( >+ { >+ borrowernumber => $a->{borrowernumber}, >+ itemnumber => $a->{itemnumber}, >+ amount_original => $a->{amount}, >+ amount_outstanding => $a->{amountoutstanding}, >+ created_on => $a->{timestamp}, >+ description => $a->{description}, >+ notes => $a->{note}, >+ manager_id => $a->{manager_id}, >+ type => Koha::Accounts::DebitTypes::Sundry, >+ } >+ ); >+ } >+ } >+ >+ print "Upgrade to $DBversion done ( Bug 6427 - Rewrite of the accounts system )\n"; > SetVersion ($DBversion); > } > >-- >1.7.2.5
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 6427
:
21922
|
22704
|
22705
|
22708
|
22709
|
22710
|
22741
|
22870
|
22871
|
22872
|
22873
|
22874
|
22875
|
22876
|
22881
|
22889
|
22940
|
22948
|
22949
|
22995
|
23000
|
23137
|
23158
|
23161
|
23171
|
23186
|
23269
|
23275
|
23276
|
23391
|
23392
|
23400
|
23401
|
23402
|
23403
|
23404
|
23405
|
23406
|
23407
|
23408
|
23409
|
23410
|
23411
|
23412
|
23413
|
23420
|
23421
|
23422
|
23423
|
23424
|
23425
|
23426
|
23427
|
23428
|
23429
|
23430
|
23431
|
23432
|
23433
|
23440
|
23441
|
23442
|
23443
|
23444
|
23445
|
23446
|
23447
|
23448
|
23449
|
23450
|
23451
|
23452
|
23453
|
23454
|
23458
|
23459
|
23460
|
23461
|
23462
|
23463
|
23464
|
23465
|
23466
|
23467
|
23468
|
23469
|
23470
|
23471
|
23603
|
23643
|
23644
|
23645
|
23646
|
23647
|
23648
|
23649
|
23650
|
23651
|
23652
|
23653
|
23654
|
23655
|
23656
|
23657
|
23937
|
23938
|
23939
|
23940
|
23941
|
23942
|
23943
|
23944
|
23945
|
23946
|
23947
|
23948
|
23949
|
23950
|
23951
|
24612
|
24613
|
24614
|
24615
|
24616
|
24617
|
24618
|
24619
|
24620
|
24621
|
24622
|
24623
|
24624
|
24625
|
24626
|
24627
|
24628
|
24757
|
24758
|
24759
|
24760
|
24761
|
24762
|
24763
|
24764
|
24765
|
24766
|
24767
|
24768
|
24769
|
24770
|
24771
|
24772
|
24777
|
24792
|
24793
|
24794
|
24795
|
24796
|
24797
|
24798
|
24799
|
24800
|
24801
|
24802
|
24803
|
24804
|
24805
|
24806
|
24807
|
24808
|
24809
|
24810
|
24811
|
24812
|
24813
|
24814
|
24815
|
24816
|
24817
|
24818
|
24819
|
24820
|
24821
|
24822
|
24823
|
24824
|
24825
|
24826
|
24827
|
24828
|
24829
|
24830
|
24831
|
24832
|
24833
|
24834
|
24835
|
24836
|
24837
|
24838
|
24839
|
24840
|
24841
|
24842
|
24843
|
24844
|
25777
|
25778
|
25779
|
25780
|
25781
|
25782
|
25783
|
25784
|
25785
|
25786
|
25787
|
25788
|
25789
|
25790
|
25791
|
25792
|
25793
|
25794
|
25795
|
25796
|
25797
|
25798
|
25799
|
25800
|
25801
|
25802
|
25803
|
25804
|
25805
|
25806
|
25807
|
25808
|
25809
|
25810
|
25811
|
25812
|
25813
|
25814
|
25815
|
25816
|
25930
|
25932
|
25933
|
25934
|
26033
|
26034
|
26035
|
26036
|
26107
|
27167
|
27168
|
27169
|
27170
|
27171
|
27172
|
27173
|
27174
|
27175
|
27176
|
27177
|
27178
|
27179
|
27180
|
27181
|
27182
|
27183
|
27184
|
27185
|
27186
|
27187
|
27189
|
27190
|
27197
|
28067
|
28068
|
28069
|
28070
|
28071
|
28072
|
28073
|
28074
|
28075
|
28076
|
28077
|
28078
|
28079
|
28080
|
28081
|
28082
|
28083
|
28084
|
28085
|
28086
|
28087
|
28088
|
28089
|
28090
|
28091
|
28527
|
28528
|
28529
|
28530
|
28531
|
28532
|
28533
|
28534
|
28535
|
28536
|
28537
|
28538
|
28539
|
28540
|
28541
|
28542
|
28543
|
28544
|
28545
|
28546
|
28547
|
28548
|
28549
|
28550
|
28551
|
28552
|
28553
|
28555
|
28556
|
28561
|
28563
|
28564
|
28795
|
28796
|
28797
|
28798
|
28799
|
28800
|
28801
|
28802
|
28803
|
28804
|
28805
|
28806
|
28807
|
28808
|
28809
|
28810
|
28811
|
28812
|
28813
|
28814
|
28815
|
28816
|
28817
|
28818
|
28819
|
28820
|
28821
|
28822
|
28887
|
28888
|
28889
|
28890
|
28909
|
29176
|
29230
|
29231
|
29232
|
29233
|
29234
|
29235
|
29236
|
29237
|
29238
|
29239
|
29240
|
29241
|
29242
|
29243
|
29244
|
29245
|
29246
|
29247
|
29248
|
29249
|
29250
|
29251
|
29252
|
29253
|
29254
|
29255
|
29256
|
29257
|
29258
|
29259
|
29260
|
29261
|
29262
|
29263
|
29264
|
29265
|
29706
|
29707
|
29708
|
29709
|
29710
|
29711
|
29712
|
29713
|
29714
|
29715
|
29716
|
29717
|
29719
|
29720
|
29721
|
29722
|
29723
|
29724
|
29725
|
29726
|
29727
|
29728
|
29729
|
29730
|
30271
|
30272
|
30273
|
30274
|
30275
|
30276
|
30277
|
30278
|
30279
|
30280
|
30281
|
30282
|
30320
|
30321
|
30322
|
30323
|
30324
|
30325
|
30326
|
30327
|
30328
|
30329
|
30330
|
30331
|
30416
|
30417
|
30418
|
30419
|
30420
|
30421
|
30422
|
30423
|
30424
|
30425
|
30426
|
30427
|
31477
|
31478
|
31479
|
31480
|
31481
|
31482
|
31483
|
31484
|
31485
|
31486
|
31487
|
31488
|
31754
|
31755
|
31756
|
31757
|
31758
|
31759
|
31760
|
31761
|
31762
|
31763
|
31764
|
31765
|
31766
|
31767
|
31768
|
31769
|
31770
|
31771
|
31772
|
31773
|
31774
|
31775
|
31776
|
31777
|
32478
|
32479
|
32480
|
32481
|
32482
|
32483
|
32484
|
32485
|
32486
|
32487
|
32488
|
32489
|
32591
|
32592
|
32593
|
32594
|
32595
|
32596
|
32597
|
32598
|
32599
|
32600
|
32601
|
32602
|
32827
|
32828
|
32829
|
32830
|
32831
|
32832
|
32833
|
32834
|
32835
|
32836
|
32837
|
32838
|
33251
|
33252
|
33253
|
33254
|
33255
|
33256
|
33257
|
33258
|
33259
|
33260
|
33261
|
33262
|
34096
|
34097
|
34098
|
34099
|
34100
|
34101
|
34102
|
34103
|
34104
|
34105
|
34106
|
34107
|
34204
|
34205
|
34206
|
34207
|
34208
|
34209
|
34210
|
34211
|
34212
|
34213
|
34214
|
34215
|
35196
|
35197
|
35198
|
35199
|
35200
|
35201
|
35202
|
35203
|
35204
|
35205
|
35206
|
35207
|
35208
|
35302
|
36324
|
36326
|
36327
|
36328
|
36329
|
36330
|
36331
|
36332
|
36333
|
36334
|
36335
|
36337
|
36338
|
36340
|
36380
|
36391
|
36393
|
37127
|
37128
|
37129
|
37130
|
37131
|
37133
|
37134
|
37135
|
37136
|
37137
|
37138
|
37139
|
37140
|
37141
|
37142
|
37143
|
37147
|
37148
|
37149
|
37150
|
37151
|
37152
|
37153
|
37154
|
37155
|
37156
|
37157
|
37158
|
37159
|
37160
|
37161
|
37162
|
37229
|
37230
|
37231
|
37232
|
37233
|
37234
|
37235
|
37236
|
37237
|
37238
|
37239
|
37240
|
37241
|
37242
|
37243
|
37244
|
38247
|
38248
|
38249
|
38250
|
38251
|
38252
|
38253
|
38254
|
38255
|
38256
|
38257
|
38258
|
38259
|
38260
|
38261
|
38262
|
39063
|
39064
|
39065
|
39066
|
39067
|
39069
|
39070
|
39071
|
39072
|
39073
|
39074
|
39075
|
39076
|
39077
|
39078
|
39079
|
39671
|
39672
|
39673
|
39674
|
39675
|
39676
|
39677
|
39678
|
39679
|
39680
|
39681
|
39682
|
39683
|
39684
|
39685
|
39686