Bugzilla – Attachment 129305 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: Database and installer stuff
Bug-19532-Database-and-installer-stuff.patch (text/plain), 40.61 KB, created by
Marcel de Rooy
on 2022-01-11 15:58:35 UTC
(
hide
)
Description:
Bug 19532: Database and installer stuff
Filename:
MIME Type:
Creator:
Marcel de Rooy
Created:
2022-01-11 15:58:35 UTC
Size:
40.61 KB
patch
obsolete
>From af8d53de7fc9e6cb909d923a69ff4a443eacbf3c Mon Sep 17 00:00:00 2001 >From: Aleisha Amohia <aleishaamohia@hotmail.com> >Date: Wed, 22 Apr 2020 00:47:13 +0000 >Subject: [PATCH] Bug 19532: Database and installer stuff >Content-Type: text/plain; charset=utf-8 > >- Add recalls table >- Add recalls circulation rules - recalls allowed, recalls per record, on shelf recalls, recall due date interval, recall overdue fine, recall shelf time >- Add system preferences - useRecalls, RecallsMaxPickUpDelay, RecallsLog >- Add email notices (RETURN_RECALLED_ITEM, PICKUP_RECALLED_ITEM) >- Add print notice (RECALL_REQUESTER_DET) >- Add user permission - recalls, manage_recalls >- Add Recall and CancelRecall enum options for branchtransfers reason > >Signed-off-by: David Nind <david@davidnind.com> > >Signed-off-by: David Nind <david@davidnind.com> >--- > C4/Auth.pm | 1 + > C4/InstallAuth.pm | 1 + > Koha/CirculationRules.pm | 18 ++++++ > Makefile.PL | 1 + > admin/smart-rules.pl | 18 ++++++ > ...9532-add_recalls_enum_branchtransfers.perl | 6 ++ > .../bug_19532-add_recalls_flags.perl | 7 +++ > .../bug_19532-add_recalls_notices.perl | 36 ++++++++++++ > .../bug_19532-add_recalls_sysprefs.perl | 11 ++++ > .../bug_19532-add_recalls_table.perl | 34 +++++++++++ > .../mysql/en/mandatory/sample_notices.yml | 58 +++++++++++++++++++ > .../fr-FR/1-Obligatoire/sample_notices.sql | 30 +++++++++- > installer/data/mysql/kohastructure.sql | 36 +++++++++++- > installer/data/mysql/mandatory/sysprefs.sql | 4 +- > installer/data/mysql/mandatory/userflags.sql | 3 +- > .../data/mysql/mandatory/userpermissions.sql | 3 +- > installer/onboarding.pl | 6 ++ > .../prog/en/includes/permissions.inc | 9 +++ > .../admin/preferences/circulation.pref | 13 +++++ > .../en/modules/admin/preferences/logs.pref | 7 +++ > .../prog/en/modules/admin/smart-rules.tt | 51 +++++++++++++++- > 21 files changed, 346 insertions(+), 7 deletions(-) > create mode 100644 installer/data/mysql/atomicupdate/bug_19532-add_recalls_enum_branchtransfers.perl > create mode 100644 installer/data/mysql/atomicupdate/bug_19532-add_recalls_flags.perl > create mode 100644 installer/data/mysql/atomicupdate/bug_19532-add_recalls_notices.perl > create mode 100644 installer/data/mysql/atomicupdate/bug_19532-add_recalls_sysprefs.perl > create mode 100644 installer/data/mysql/atomicupdate/bug_19532-add_recalls_table.perl > >diff --git a/C4/Auth.pm b/C4/Auth.pm >index 1cfeed48cc..5e8ad88cf7 100644 >--- a/C4/Auth.pm >+++ b/C4/Auth.pm >@@ -335,6 +335,7 @@ sub get_template_and_user { > $template->param( CAN_user_stockrotation => 1 ); > $template->param( CAN_user_cash_management => 1 ); > $template->param( CAN_user_problem_reports => 1 ); >+ $template->param( CAN_user_recalls => 1 ); > > foreach my $module ( keys %$all_perms ) { > foreach my $subperm ( keys %{ $all_perms->{$module} } ) { >diff --git a/C4/InstallAuth.pm b/C4/InstallAuth.pm >index bb868aa33e..de19adc4f0 100644 >--- a/C4/InstallAuth.pm >+++ b/C4/InstallAuth.pm >@@ -142,6 +142,7 @@ sub get_template_and_user { > $template->param( CAN_user_serials => 1 ); > $template->param( CAN_user_reports => 1 ); > $template->param( CAN_user_problem_reports => 1 ); >+ $template->param( CAN_user_recalls => 1 ); > } > > my $minPasswordLength = C4::Context->preference('minPasswordLength'); >diff --git a/Koha/CirculationRules.pm b/Koha/CirculationRules.pm >index eb66f5f1a0..7cae9bf71c 100644 >--- a/Koha/CirculationRules.pm >+++ b/Koha/CirculationRules.pm >@@ -174,6 +174,24 @@ our $RULE_KINDS = { > decreaseloanholds => { > scope => [ 'branchcode', 'categorycode', 'itemtype' ], > }, >+ recalls_allowed => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, >+ recalls_per_record => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, >+ on_shelf_recalls => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, >+ recall_due_date_interval => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, >+ recall_overdue_fine => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, >+ recall_shelf_time => { >+ scope => [ 'branchcode', 'categorycode', 'itemtype' ], >+ }, > # Not included (deprecated?): > # * accountsent > # * reservecharge >diff --git a/Makefile.PL b/Makefile.PL >index 2534e85ca3..967540443e 100644 >--- a/Makefile.PL >+++ b/Makefile.PL >@@ -352,6 +352,7 @@ my $target_map = { > './patron_lists' => 'INTRANET_CGI_DIR', > './plugins' => 'INTRANET_CGI_DIR', > './pos' => 'INTRANET_CGI_DIR', >+ './recalls' => 'INTRANET_CGI_DIR', > './reports' => 'INTRANET_CGI_DIR', > './reserve' => 'INTRANET_CGI_DIR', > './reviews' => 'INTRANET_CGI_DIR', >diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl >index 31ed87a83a..8dfc1a4528 100755 >--- a/admin/smart-rules.pl >+++ b/admin/smart-rules.pl >@@ -109,6 +109,12 @@ if ($op eq 'delete') { > cap_fine_to_replacement_price => undef, > article_requests => undef, > note => undef, >+ recalls_allowed => undef, >+ recalls_per_record => undef, >+ on_shelf_recalls => undef, >+ recall_due_date_interval => undef, >+ recall_overdue_fine => undef, >+ recall_shelf_time => undef, > } > } > ); >@@ -287,6 +293,12 @@ elsif ($op eq 'add') { > my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on'; > my $note = $input->param('note'); > my $decreaseloanholds = $input->param('decreaseloanholds') || undef; >+ my $recalls_allowed = $input->param('recalls_allowed'); >+ my $recalls_per_record = $input->param('recalls_per_record'); >+ my $on_shelf_recalls = $input->param('on_shelf_recalls'); >+ my $recall_due_date_interval = $input->param('recall_due_date_interval'); >+ my $recall_overdue_fine = $input->param('recall_overdue_fine'); >+ my $recall_shelf_time = $input->param('recall_shelf_time'); > > my $rules = { > maxissueqty => $maxissueqty, >@@ -321,6 +333,12 @@ elsif ($op eq 'add') { > article_requests => $article_requests, > note => $note, > decreaseloanholds => $decreaseloanholds, >+ recalls_allowed => $recalls_allowed, >+ recalls_per_record => $recalls_per_record, >+ on_shelf_recalls => $on_shelf_recalls, >+ recall_due_date_interval => $recall_due_date_interval, >+ recall_overdue_fine => $recall_overdue_fine, >+ recall_shelf_time => $recall_shelf_time, > }; > > Koha::CirculationRules->set_rules( >diff --git a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_enum_branchtransfers.perl b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_enum_branchtransfers.perl >new file mode 100644 >index 0000000000..654242817e >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_enum_branchtransfers.perl >@@ -0,0 +1,6 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q{ ALTER TABLE branchtransfers MODIFY COLUMN reason ENUM('Manual', 'StockrotationAdvance', 'StockrotationRepatriation', 'ReturnToHome', 'ReturnToHolding', 'RotatingCollection', 'Reserve', 'LostReserve', 'CancelReserve', 'Recall', 'CancelRecall') }); >+ >+ NewVersion( $DBversion, 19532, "Add Recall and CancelReserve ENUM options to branchtransfers.reason" ); >+} >diff --git a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_flags.perl b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_flags.perl >new file mode 100644 >index 0000000000..5ece22846e >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_flags.perl >@@ -0,0 +1,7 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q{ INSERT IGNORE INTO userflags (bit, flag, flagdesc, defaulton) VALUES (27, 'recalls', 'Recalls', 0) }); >+ $dbh->do(q{ INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (27, 'manage_recalls', 'Manage recalls for patrons') }); >+ >+ NewVersion( $DBversion, 19532, "Add recalls user flag and manage_recalls user permission" ); >+} >diff --git a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_notices.perl b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_notices.perl >new file mode 100644 >index 0000000000..d3921778df >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_notices.perl >@@ -0,0 +1,36 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q{ >+ INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`) VALUES >+ ('circulation','RETURN_RECALLED_ITEM','','Notification to return a recalled item','0','Notification to return a recalled item','Date: <<today>> >+ >+<<borrowers.firstname>> <<borrowers.surname>>, >+ >+A recall has been placed on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>). The due date has been updated, and is now <<issues.date_due>>. Please return the item before the due date. >+ >+Thank you!','email'), >+ ('circulation','PICKUP_RECALLED_ITEM','','Recalled item awaiting pickup','0','Recalled item awaiting pickup','Date: <<today>> >+ >+<<borrowers.firstname>> <<borrowers.surname>>, >+ >+A recall that you requested on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>) is now ready for you to pick up at <<recalls.branchcode>>. Please pick up your item by <<recalls.expirationdate>>. >+ >+Thank you!','email'), >+ ('circulation','RECALL_REQUESTER_DET','','Details of patron who recalled item',0,'Details of patron who recalled item','Date: <<today>> >+ >+Recall for pickup at <<branches.branchname>> >+<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>) >+<<borrowers.phone>> >+<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>> >+<<borrowers.email>> >+ >+ITEM RECALLED >+<<biblio.title>> by <<biblio.author>> >+Barcode: <<items.barcode>> >+Callnumber: <<items.itemcallnumber>> >+Waiting since: <<recalls.waitingdate>> >+Notes: <<recalls.recallnotes>>', 'print') >+ }); >+ >+ NewVersion( $DBversion, 19532, "Add recalls notices: RETURN_RECALLED_ITEM, PICKUP_RECALLED_ITEM, RECALL_REQUESTER_DET" ); >+} >diff --git a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_sysprefs.perl b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_sysprefs.perl >new file mode 100644 >index 0000000000..c5d48271e7 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_sysprefs.perl >@@ -0,0 +1,11 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q{ >+ INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES >+ ('RecallsLog','1',NULL,'If ON, log create/cancel/expire/fulfill actions on recalls','YesNo'), >+ ('RecallsMaxPickUpDelay','7',NULL,'Define the maximum time a recall can be awaiting pickup','Integer'), >+ ('UseRecalls','0',NULL,'Enable or disable recalls','YesNo') >+ }); >+ >+ NewVersion( $DBversion, 19532, "Add RecallsLog, RecallsMaxPickUpDelay and UseRecalls system preferences"); >+} >diff --git a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_table.perl b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_table.perl >new file mode 100644 >index 0000000000..57aaabd3ad >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_19532-add_recalls_table.perl >@@ -0,0 +1,34 @@ >+$DBversion = 'XXX'; >+if( CheckVersion( $DBversion ) ) { >+ $dbh->do(q{ DROP TABLE IF EXISTS recalls }); >+ $dbh->do(q{ >+ CREATE TABLE recalls ( >+ recall_id int(11) NOT NULL auto_increment, >+ borrowernumber int(11) NOT NULL DEFAULT 0, >+ recalldate datetime DEFAULT NULL, >+ biblionumber int(11) NOT NULL DEFAULT 0, >+ branchcode varchar(10) DEFAULT NULL, >+ cancellationdate datetime DEFAULT NULL, >+ recallnotes mediumtext, >+ priority smallint(6) DEFAULT NULL, >+ status varchar(1) DEFAULT NULL, >+ timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, >+ itemnumber int(11) DEFAULT NULL, >+ waitingdate datetime DEFAULT NULL, >+ expirationdate datetime DEFAULT NULL, >+ old TINYINT(1) DEFAULT NULL, >+ item_level_recall TINYINT(1) NOT NULL DEFAULT 0, >+ PRIMARY KEY (recall_id), >+ KEY borrowernumber (borrowernumber), >+ KEY biblionumber (biblionumber), >+ KEY itemnumber (itemnumber), >+ KEY branchcode (branchcode), >+ CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; >+ }); >+ >+ NewVersion( $DBversion, 19532, "Add recalls table" ); >+} >diff --git a/installer/data/mysql/en/mandatory/sample_notices.yml b/installer/data/mysql/en/mandatory/sample_notices.yml >index 48e1f030bf..5ca0331e91 100644 >--- a/installer/data/mysql/en/mandatory/sample_notices.yml >+++ b/installer/data/mysql/en/mandatory/sample_notices.yml >@@ -1574,3 +1574,61 @@ tables: > - "This item must be renewed at the library." > - "[% END %]" > - "[% END %]" >+ >+ - module: circulation >+ code: RETURN_RECALLED_ITEM >+ branchcode: "" >+ name: "Notification to return a recalled item" >+ is_html: 0 >+ title: "Notification to return a recalled item" >+ message_transport_type: email >+ lang: default >+ content: >+ - "Date: <<today>>" >+ - "" >+ - "<<borrowers.firstname>> <<borrowers.surname>>," >+ - "" >+ - "A recall has been placed on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>). The due date has been updated, and is now <<issues.date_due>>. Please return the item before the due date." >+ - "" >+ - "Thank you!" >+ >+ - module: circulation >+ code: PICKUP_RECALLED_ITEM >+ branchcode: "" >+ name: "Recalled item awaiting pickup" >+ is_html: 0 >+ title: "Recalled item awaiting pickup" >+ message_transport_type: email >+ lang: default >+ content: >+ - "Date: <<today>>" >+ - "" >+ - "<<borrowers.firstname>> <<borrowers.surname>>," >+ - "" >+ - "A recall that you requested on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>) is now ready for you to pick up at <<recalls.branchcode>>. Please pick up your item by <<recalls.expirationdate>>." >+ - "" >+ - "Thank you!" >+ >+ - module: circulation >+ code: RECALL_REQUESTER_DET >+ branchcode: "" >+ name: "Details of patron who recalled item" >+ is_html: 0 >+ title: "Details of patron who recalled item" >+ message_transport_type: print >+ lang: default >+ content: >+ - "Date: <<today>>" >+ - "" >+ - "Recall for pickup at <<branches.branchname>>" >+ - "<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)" >+ - "<<borrowers.phone>>" >+ - "<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>" >+ - "<<borrowers.email>>" >+ - "" >+ - "ITEM RECALLED" >+ - "<<biblio.title>> by <<biblio.author>>" >+ - "Barcode: <<items.barcode>>" >+ - "Callnumber: <<items.itemcallnumber>>" >+ - "Waiting since: <<recalls.waitingdate>>" >+ - "Notes: <<recalls.recallnotes>>" >diff --git a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql b/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql >index 7712ab46ac..e5686f3559 100644 >--- a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql >+++ b/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql >@@ -217,7 +217,35 @@ INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title` > ('circulation', 'AR_SLIP', '', 'Article request - print slip', 0, 'Article request', 'Article request:\r\n\r\n<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>),\r\n\r\nTitle: <<biblio.title>>\r\nBarcode: <<items.barcode>>\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\nFormat: [% IF article_request.format == \'PHOTOCOPY\' %]Copy[% ELSIF article_request.format == \'SCAN\' %]Scan[% END %]\r\n', 'print'), > ('circulation', 'AR_PROCESSING', '', 'Article request - processing', 0, 'Article request processing', 'Dear <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>),\r\n\r\nWe are now processing your request for an article from <<biblio.title>> (<<items.barcode>>).\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\nFormat: [% IF article_request.format == \'PHOTOCOPY\' %]Copy[% ELSIF article_request.format == \'SCAN\' %]Scan[% END %]\r\n\r\nThank you!', 'email'), > ('circulation', 'AR_REQUESTED', '', 'Article request - new', 0, 'Article request received', 'Dear <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>),\r\n\r\nWe have received your request for an article from <<biblio.title>> (<<items.barcode>>)..\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\nFormat: [% IF article_request.format == \'PHOTOCOPY\' %]Copy[% ELSIF article_request.format == \'SCAN\' %]Scan[% END %]\r\n\r\nThank you!', 'email'), >-('circulation', 'CHECKOUT_NOTE', '', 'Checkout note on item set by patron', '0', 'Checkout note', '<<borrowers.firstname>> <<borrowers.surname>> has added a note to the item <<biblio.title>> - <<biblio.author>> (<<biblio.biblionumber>>).','email'); >+('circulation', 'CHECKOUT_NOTE', '', 'Checkout note on item set by patron', '0', 'Checkout note', '<<borrowers.firstname>> <<borrowers.surname>> has added a note to the item <<biblio.title>> - <<biblio.author>> (<<biblio.biblionumber>>).','email'), >+('circulation','RETURN_RECALLED_ITEM','','Notification to return a recalled item','0','Notification to return a recalled item','Date: <<today>> >+ >+<<borrowers.firstname>> <<borrowers.surname>>, >+ >+A recall has been placed on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>). The due date has been updated, and is now <<issues.date_due>>. Please return the item before the due date. >+ >+Thank you!','email'), >+('circulation','PICKUP_RECALLED_ITEM','','Recalled item awaiting pickup','0','Recalled item awaiting pickup','Date: <<today>> >+ >+<<borrowers.firstname>> <<borrowers.surname>>, >+ >+A recall that you requested on the following item: <<biblio.title>> / <<biblio.author>> (<<items.barcode>>) is now ready for you to pick up at <<recalls.branchcode>>. Please pick up your item by <<recalls.expirationdate>>. >+ >+Thank you!','email'), >+('circulation','RECALL_REQUESTER_DET','','Details of patron who recalled item',0,'Date: <<today>> >+ >+Recall for pickup at <<branches.branchname>> >+<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>) >+<<borrowers.phone>> >+<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>> >+<<borrowers.email>> >+ >+ITEM RECALLED >+<<biblio.title>> by <<biblio.author>> >+Barcode: <<items.barcode>> >+Callnumber: <<items.itemcallnumber>> >+Waiting since: <<recalls.waitingdate>> >+Notes: <<recalls.recallnotes>>', 'print'); > > INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES > ('circulation', 'ACCOUNT_PAYMENT', '', 'Account payment', 0, 'Account payment', '[%- USE Price -%]\r\nA payment of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis payment affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default'), >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index a309cea736..ac9a1707e0 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -1552,8 +1552,8 @@ CREATE TABLE `branchtransfers` ( > `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled', > `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to', > `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer', >- `reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','TransferCancellation') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer', >- `cancellation_reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','ItemLost','WrongTransfer') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer cancellation', >+ `reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','TransferCancellation','Recall','CancelRecall') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer', >+ `cancellation_reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','ItemLost', 'WrongTransfer','Recall','CancelRecall') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer cancellation', > PRIMARY KEY (`branchtransfer_id`), > KEY `frombranch` (`frombranch`), > KEY `tobranch` (`tobranch`), >@@ -4272,6 +4272,38 @@ CREATE TABLE `ratings` ( > ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; > /*!40101 SET character_set_client = @saved_cs_client */; > >+-- >+-- Table structure for table `recalls` >+-- >+ >+DROP TABLE IF EXISTS recalls; >+CREATE TABLE recalls ( -- information related to recalls in Koha >+ recall_id int(11) NOT NULL auto_increment, -- primary key >+ borrowernumber int(11) NOT NULL DEFAULT 0, -- foreign key from the borrowers table defining which patron requested a recall >+ recalldate datetime DEFAULT NULL, -- the date the recall request was placed >+ biblionumber int(11) NOT NULL DEFAULT 0, -- foreign key from the biblio table defining which bib record this request is for >+ branchcode varchar(10) DEFAULT NULL, -- foreign key from the branches table defining which branch the patron wishes to pick up their recall from >+ cancellationdate datetime DEFAULT NULL, -- the date this recall was cancelled >+ recallnotes mediumtext, -- notes related to this recall >+ priority smallint(6) DEFAULT NULL, -- where in the queue the patron sits >+ status varchar(1) DEFAULT NULL, -- a one letter code defining the status of the recall. R=requested, O=overdue, W=awaiting pickup, T=in transit, E=expired, C=cancelled, F=finished/completed >+ timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- the date and time this recall was last updated >+ itemnumber int(11) DEFAULT NULL, -- foreign key from the items table defining the specific item the recall request was placed on >+ waitingdate datetime DEFAULT NULL, -- the date the item was marked as waiting for the patron at the library >+ expirationdate datetime DEFAULT NULL, -- the date the recall expires >+ old TINYINT(1) DEFAULT NULL, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed >+ item_level_recall TINYINT(1) NOT NULL DEFAULT 0, -- flag if item-level recall >+ PRIMARY KEY (recall_id), >+ KEY borrowernumber (borrowernumber), >+ KEY biblionumber (biblionumber), >+ KEY itemnumber (itemnumber), >+ KEY branchcode (branchcode), >+ CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE >+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; >+ > -- > -- Table structure for table `repeatable_holidays` > -- >diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql >index 1384649444..ff3cededa6 100644 >--- a/installer/data/mysql/mandatory/sysprefs.sql >+++ b/installer/data/mysql/mandatory/sysprefs.sql >@@ -549,7 +549,8 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('QueryWeightFields','1',NULL,'If ON, enables field weighting','YesNo'), > ('QuoteOfTheDay','','intranet,opac','Enable or disable display of Quote of the Day on the OPAC and staff interface home page','multiple'), > ('RandomizeHoldsQueueWeight','0',NULL,'if ON, the holds queue in circulation will be randomized, either based on all location codes, or by the location codes specified in StaticHoldsQueueWeight','YesNo'), >-('RecordStaffUserOnCheckout','0',NULL,'If ON, when an item is checked out, the user who checked out the item is recorded','YesNo'), >+('RecallsLog','1',NULL,'If ON, log create/cancel/expire/fulfill actions on recalls','YesNo'), >+('RecallsMaxPickUpDelay','7',NULL,'Define the maximum time a recall can be awaiting pickup','Integer'), > ('RecordLocalUseOnReturn','0',NULL,'If ON, statistically record returns of unissued items as local use, instead of return','YesNo'), > ('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free'), > ('RefundLostOnReturnControl','CheckinLibrary','CheckinLibrary|ItemHomeBranch|ItemHoldingBranch','If a lost item is returned, choose which branch to pick rules for refunding.','Choice'), >@@ -722,6 +723,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('useDischarge','0','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'), > ('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo'), > ('UseICUStyleQuotes','0','1','Tell Koha whether to use ICU style quotes ({) or default (") when tracing subjects .','YesNo'), >+('UseRecalls','0',NULL,'Enable or disable recalls','YesNo'), > ('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'), > ('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'), > ('viewISBD','1','','Allow display of ISBD view of bibiographic records','YesNo'), >diff --git a/installer/data/mysql/mandatory/userflags.sql b/installer/data/mysql/mandatory/userflags.sql >index 82acf496d3..8697a7f48e 100644 >--- a/installer/data/mysql/mandatory/userflags.sql >+++ b/installer/data/mysql/mandatory/userflags.sql >@@ -23,5 +23,6 @@ INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES > (23,'self_check','Self check modules',0), > (24, 'stockrotation', 'Manage stockrotation operations', 0), > (25, 'cash_management', 'Cash management', 0), >-(26, 'problem_reports', 'Manage problem reports', 0) >+(26, 'problem_reports', 'Manage problem reports', 0), >+(27, 'recalls', 'Recalls', 0) > ; >diff --git a/installer/data/mysql/mandatory/userpermissions.sql b/installer/data/mysql/mandatory/userpermissions.sql >index f070e501d8..e69ba19720 100644 >--- a/installer/data/mysql/mandatory/userpermissions.sql >+++ b/installer/data/mysql/mandatory/userpermissions.sql >@@ -137,5 +137,6 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (25, 'anonymous_refund', 'Perform refund actions from cash registers'), > (25, 'cashup', 'Perform cash register cashup action'), > (25, 'takepayment', 'Access the point of sale page and take payments'), >- (26, 'manage_problem_reports', 'Manage OPAC problem reports') >+ (26, 'manage_problem_reports', 'Manage OPAC problem reports'), >+ (27, 'manage_recalls', 'Manage recalls for patrons') > ; >diff --git a/installer/onboarding.pl b/installer/onboarding.pl >index 727bc93eea..7c15b74c5b 100755 >--- a/installer/onboarding.pl >+++ b/installer/onboarding.pl >@@ -288,6 +288,12 @@ if ( $step == 5 ) { > reservesallowed => $reservesallowed, > suspension_chargeperiod => undef, > decreaseloanholds => undef, >+ recalls_allowed => undef, >+ recalls_per_record => undef, >+ on_shelf_recalls => undef, >+ recall_due_date_interval => undef, >+ recall_overdue_fine => undef, >+ recall_shelf_time => undef, > } > }; > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc >index cbbe30fbc1..4c54d74c3a 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc >@@ -75,6 +75,9 @@ > [%- CASE 'problem_reports' -%] > <span class="main_permission problem_reports_permission">OPAC problem reports management</span> > <span class="permissioncode">([% name | html %])</span> >+ [%- CASE 'recalls' -%] >+ <span class="main_permission recalls_permission">Recalls</span> >+ <span class="permissioncode">([% name | html %])</span> > [%- END -%] > [%- END -%] > >@@ -783,5 +786,11 @@ > Manage OPAC problem reports > </span> > <span class="permissioncode">([% name | html %])</span> >+ [%# recalls %] >+ [%- CASE 'manage_recalls' -%] >+ <span class="sub_permission place_recalls_subpermission"> >+ Manage recalls for patrons >+ </span> >+ <span class="permissioncode">([% name | html %])</span> > [%- END -%] > [%- END -%] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >index 6c2a33bc6c..da69c92545 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >@@ -1271,3 +1271,16 @@ Circulation: > class: integer > - days. > - <span class="hint">This system preference is used by the cleanup_database.pl cronjob.</span> >+ >+ Recalls: >+ - >+ - Mark a recall as problematic if it has been waiting to be picked up for >+ - pref: RecallsMaxPickUpDelay >+ - class: integer >+ - days. >+ - >+ - pref: UseRecalls >+ choices: >+ yes: Use >+ no: "Don't use" >+ - recalls. Make sure you configure <a href="/cgi-bin/koha/admin/smart-rules.pl">circulation and fines rules</a> for recalls once enabled. >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref >index 25849eac0b..cff4d3f6ff 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref >@@ -108,6 +108,13 @@ Logging: > 1: Log > 0: "Don't log" > - " changes to news entries and other contents managed in the news tool." >+ - >+ - pref: RecallsLog >+ choices: >+ on: Log >+ off: "Don't log" >+ - any actions on recalls (create, cancel, expire, fulfill). >+ > Debugging: > - > - pref: DumpTemplateVarsIntranet >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 2d24283cbc..1d14caab00 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 >@@ -142,6 +142,14 @@ > <th>OPAC item level holds</th> > <th>Article requests</th> > <th>Rental discount (%)</th> >+ [% IF Koha.Preference('UseRecalls') %] >+ <th>Recalls allowed (total)</th> >+ <th>Recalls per record (count)</th> >+ <th>On shelf recalls allowed</th> >+ <th>Recall due date interval (day)</th> >+ <th>Recall overdue fine amount</th> >+ <th>Recall pickup period (day)</th> >+ [% END %] > <th class="noExport">Actions</th> > </tr> > </thead> >@@ -183,8 +191,14 @@ > [% SET article_requests = all_rules.$c.$i.article_requests %] > [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %] > [% SET decreaseloanholds = all_rules.$c.$i.decreaseloanholds %] >+ [% SET recalls_allowed = all_rules.$c.$i.recalls_allowed %] >+ [% SET recalls_per_record = all_rules.$c.$i.recalls_per_record %] >+ [% SET on_shelf_recalls = all_rules.$c.$i.on_shelf_recalls %] >+ [% SET recall_due_date_interval = all_rules.$c.$i.recall_due_date_interval %] >+ [% SET recall_overdue_fine = all_rules.$c.$i.recall_overdue_fine %] >+ [% SET recall_shelf_time = all_rules.$c.$i.recall_shelf_time %] > >- [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || unseenrenewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount || decreaseloanholds %] >+ [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || unseenrenewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount || decreaseloanholds || recalls_allowed || recalls_per_record || on_shelf_recalls || recall_due_date_interval || recall_overdue_fine || recall_shelf_time %] > [% IF show_rule %] > [% SET row_count = row_count + 1 %] > <tr row_countd="row_[% row_count | html %]"> >@@ -344,6 +358,20 @@ > [% END %] > </td> > <td>[% rentaldiscount | html %]</td> >+ [% IF Koha.Preference('UseRecalls') %] >+ <td>[% recalls_allowed | html %]</td> >+ <td>[% recalls_per_record | html %]</td> >+ <td> >+ [% IF on_shelf_recalls == 'all' %] >+ <span>If all unavailable</span> >+ [% ELSE %] >+ <span>If any unavailable</span> >+ [% END %] >+ </td> >+ <td>[% recall_due_date_interval | html %]</td> >+ <td>[% recall_overdue_fine FILTER format("%.2f") %]</td> >+ <td>[% recall_shelf_time | html %]</td> >+ [% END %] > <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 || '*' | uri %]&categorycode=[% c || '*' | uri %]&branch=[% current_branch | uri %]"><i class="fa fa-trash"></i> Delete</a> >@@ -473,6 +501,19 @@ > </select> > </td> > <td><input type="text" name="rentaldiscount" id="rentaldiscount" size="2" /></td> >+ [% IF Koha.Preference('UseRecalls') %] >+ <td><input type="text" name="recalls_allowed" id="recalls_allowed" size="3"></td> >+ <td><input type="text" name="recalls_per_record" id="recalls_per_record" size="3"></td> >+ <td> >+ <select name="on_shelf_recalls" id="on_shelf_recalls"> >+ <option value="any">If any unavailable</option> >+ <option value="all">If all unavailable</option> >+ </select> >+ </td> >+ <td><input type="text" name="recall_due_date_interval" id="recall_due_date_interval" size="3"></td> >+ <td><input type="text" name="recall_overdue_fine" id="recall_overdue_fine" size="6"></td> >+ <td><input type="text" name="recall_shelf_time" id="recall_shelf_time" size="3"></td> >+ [% END %] > <td class="actions"> > <input type="hidden" name="branch" value="[% current_branch | html %]"/> > <button type="submit" class="btn btn-default btn-xs"><i class="fa fa-save"></i> Save</button> >@@ -519,6 +560,14 @@ > <th>OPAC item level holds</th> > <th>Article requests</th> > <th>Rental discount (%)</th> >+ [% IF Koha.Preference('UseRecalls') %] >+ <th>Recalls allowed (total)</th> >+ <th>Recalls per record (count)</th> >+ <th>On shelf recalls allowed</th> >+ <th>Recall due date interval (day)</th> >+ <th>Recall overdue fine amount</th> >+ <th>Recall pickup period (day)</th> >+ [% END %] > <th> </th> > </tr> > </tfoot> >-- >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 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