View | Details | Raw Unified | Return to bug 19532
Collapse All | Expand All

(-)a/C4/Auth.pm (+1 lines)
Lines 335-340 sub get_template_and_user { Link Here
335
            $template->param( CAN_user_stockrotation    => 1 );
335
            $template->param( CAN_user_stockrotation    => 1 );
336
            $template->param( CAN_user_cash_management  => 1 );
336
            $template->param( CAN_user_cash_management  => 1 );
337
            $template->param( CAN_user_problem_reports  => 1 );
337
            $template->param( CAN_user_problem_reports  => 1 );
338
            $template->param( CAN_user_recalls          => 1 );
338
339
339
            foreach my $module ( keys %$all_perms ) {
340
            foreach my $module ( keys %$all_perms ) {
340
                foreach my $subperm ( keys %{ $all_perms->{$module} } ) {
341
                foreach my $subperm ( keys %{ $all_perms->{$module} } ) {
(-)a/C4/InstallAuth.pm (+1 lines)
Lines 142-147 sub get_template_and_user { Link Here
142
            $template->param( CAN_user_serials          => 1 );
142
            $template->param( CAN_user_serials          => 1 );
143
            $template->param( CAN_user_reports          => 1 );
143
            $template->param( CAN_user_reports          => 1 );
144
            $template->param( CAN_user_problem_reports   => 1 );
144
            $template->param( CAN_user_problem_reports   => 1 );
145
            $template->param( CAN_user_recalls          => 1 );
145
        }
146
        }
146
147
147
        my $minPasswordLength = C4::Context->preference('minPasswordLength');
148
        my $minPasswordLength = C4::Context->preference('minPasswordLength');
(-)a/Koha/CirculationRules.pm (+18 lines)
Lines 174-179 our $RULE_KINDS = { Link Here
174
    decreaseloanholds => {
174
    decreaseloanholds => {
175
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
175
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
176
    },
176
    },
177
    recalls_allowed => {
178
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
179
    },
180
    recalls_per_record => {
181
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
182
    },
183
    on_shelf_recalls => {
184
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
185
    },
186
    recall_due_date_interval => {
187
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
188
    },
189
    recall_overdue_fine => {
190
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
191
    },
192
    recall_shelf_time => {
193
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
194
    },
177
    # Not included (deprecated?):
195
    # Not included (deprecated?):
178
    #   * accountsent
196
    #   * accountsent
179
    #   * reservecharge
197
    #   * reservecharge
(-)a/Makefile.PL (+1 lines)
Lines 352-357 my $target_map = { Link Here
352
  './patron_lists'              => 'INTRANET_CGI_DIR',
352
  './patron_lists'              => 'INTRANET_CGI_DIR',
353
  './plugins'                   => 'INTRANET_CGI_DIR',
353
  './plugins'                   => 'INTRANET_CGI_DIR',
354
  './pos'                       => 'INTRANET_CGI_DIR',
354
  './pos'                       => 'INTRANET_CGI_DIR',
355
  './recalls'                   => 'INTRANET_CGI_DIR',
355
  './reports'                   => 'INTRANET_CGI_DIR',
356
  './reports'                   => 'INTRANET_CGI_DIR',
356
  './reserve'                   => 'INTRANET_CGI_DIR',
357
  './reserve'                   => 'INTRANET_CGI_DIR',
357
  './reviews'                   => 'INTRANET_CGI_DIR',
358
  './reviews'                   => 'INTRANET_CGI_DIR',
(-)a/admin/smart-rules.pl (+18 lines)
Lines 109-114 if ($op eq 'delete') { Link Here
109
                cap_fine_to_replacement_price    => undef,
109
                cap_fine_to_replacement_price    => undef,
110
                article_requests                 => undef,
110
                article_requests                 => undef,
111
                note                             => undef,
111
                note                             => undef,
112
                recalls_allowed                  => undef,
113
                recalls_per_record               => undef,
114
                on_shelf_recalls                 => undef,
115
                recall_due_date_interval         => undef,
116
                recall_overdue_fine              => undef,
117
                recall_shelf_time                => undef,
112
            }
118
            }
113
        }
119
        }
114
    );
120
    );
Lines 287-292 elsif ($op eq 'add') { Link Here
287
    my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on';
293
    my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on';
288
    my $note = $input->param('note');
294
    my $note = $input->param('note');
289
    my $decreaseloanholds = $input->param('decreaseloanholds') || undef;
295
    my $decreaseloanholds = $input->param('decreaseloanholds') || undef;
296
    my $recalls_allowed = $input->param('recalls_allowed');
297
    my $recalls_per_record = $input->param('recalls_per_record');
298
    my $on_shelf_recalls = $input->param('on_shelf_recalls');
299
    my $recall_due_date_interval = $input->param('recall_due_date_interval');
300
    my $recall_overdue_fine = $input->param('recall_overdue_fine');
301
    my $recall_shelf_time = $input->param('recall_shelf_time');
290
302
291
    my $rules = {
303
    my $rules = {
292
        maxissueqty                   => $maxissueqty,
304
        maxissueqty                   => $maxissueqty,
Lines 321-326 elsif ($op eq 'add') { Link Here
321
        article_requests              => $article_requests,
333
        article_requests              => $article_requests,
322
        note                          => $note,
334
        note                          => $note,
323
        decreaseloanholds             => $decreaseloanholds,
335
        decreaseloanholds             => $decreaseloanholds,
336
        recalls_allowed               => $recalls_allowed,
337
        recalls_per_record            => $recalls_per_record,
338
        on_shelf_recalls              => $on_shelf_recalls,
339
        recall_due_date_interval      => $recall_due_date_interval,
340
        recall_overdue_fine           => $recall_overdue_fine,
341
        recall_shelf_time             => $recall_shelf_time,
324
    };
342
    };
325
343
326
    Koha::CirculationRules->set_rules(
344
    Koha::CirculationRules->set_rules(
(-)a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_enum_branchtransfers.perl (+6 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{ ALTER TABLE branchtransfers MODIFY COLUMN reason ENUM('Manual', 'StockrotationAdvance', 'StockrotationRepatriation', 'ReturnToHome', 'ReturnToHolding', 'RotatingCollection', 'Reserve', 'LostReserve', 'CancelReserve', 'Recall', 'CancelRecall') });
4
5
    NewVersion( $DBversion, 19532, "Add Recall and CancelReserve ENUM options to branchtransfers.reason" );
6
}
(-)a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_flags.perl (+7 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{ INSERT IGNORE INTO userflags (bit, flag, flagdesc, defaulton) VALUES (27, 'recalls', 'Recalls', 0) });
4
    $dbh->do(q{ INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (27, 'manage_recalls', 'Manage recalls for patrons') });
5
6
    NewVersion( $DBversion, 19532, "Add recalls user flag and manage_recalls user permission" );
7
}
(-)a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_notices.perl (+36 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{
4
        INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`) VALUES
5
        ('circulation','RETURN_RECALLED_ITEM','','Notification to return a recalled item','0','Notification to return a recalled item','Date: <<today>>
6
7
<<borrowers.firstname>> <<borrowers.surname>>,
8
9
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.
10
11
Thank you!','email'),
12
        ('circulation','PICKUP_RECALLED_ITEM','','Recalled item awaiting pickup','0','Recalled item awaiting pickup','Date: <<today>>
13
14
<<borrowers.firstname>> <<borrowers.surname>>,
15
16
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>>.
17
18
Thank you!','email'),
19
        ('circulation','RECALL_REQUESTER_DET','','Details of patron who recalled item',0,'Details of patron who recalled item','Date: <<today>>
20
21
Recall for pickup at <<branches.branchname>>
22
<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)
23
<<borrowers.phone>>
24
<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>
25
<<borrowers.email>>
26
27
ITEM RECALLED
28
<<biblio.title>> by <<biblio.author>>
29
Barcode: <<items.barcode>>
30
Callnumber: <<items.itemcallnumber>>
31
Waiting since: <<recalls.waitingdate>>
32
Notes: <<recalls.recallnotes>>', 'print')
33
    });
34
35
    NewVersion( $DBversion, 19532, "Add recalls notices: RETURN_RECALLED_ITEM, PICKUP_RECALLED_ITEM, RECALL_REQUESTER_DET" );
36
}
(-)a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_sysprefs.perl (+11 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{
4
        INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
5
        ('RecallsLog','1',NULL,'If ON, log create/cancel/expire/fulfill actions on recalls','YesNo'),
6
        ('RecallsMaxPickUpDelay','7',NULL,'Define the maximum time a recall can be awaiting pickup','Integer'),
7
        ('UseRecalls','0',NULL,'Enable or disable recalls','YesNo')
8
    });
9
10
    NewVersion( $DBversion, 19532, "Add RecallsLog, RecallsMaxPickUpDelay and UseRecalls system preferences");
11
}
(-)a/installer/data/mysql/atomicupdate/bug_19532-add_recalls_table.perl (+34 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{ DROP TABLE IF EXISTS recalls });
4
    $dbh->do(q{
5
        CREATE TABLE recalls (
6
            recall_id int(11) NOT NULL auto_increment,
7
            borrowernumber int(11) NOT NULL DEFAULT 0,
8
            recalldate datetime DEFAULT NULL,
9
            biblionumber int(11) NOT NULL DEFAULT 0,
10
            branchcode varchar(10) DEFAULT NULL,
11
            cancellationdate datetime DEFAULT NULL,
12
            recallnotes mediumtext,
13
            priority smallint(6) DEFAULT NULL,
14
            status varchar(1) DEFAULT NULL,
15
            timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
16
            itemnumber int(11) DEFAULT NULL,
17
            waitingdate datetime DEFAULT NULL,
18
            expirationdate datetime DEFAULT NULL,
19
            old TINYINT(1) DEFAULT NULL,
20
            item_level_recall TINYINT(1) NOT NULL DEFAULT 0,
21
            PRIMARY KEY (recall_id),
22
            KEY borrowernumber (borrowernumber),
23
            KEY biblionumber (biblionumber),
24
            KEY itemnumber (itemnumber),
25
            KEY branchcode (branchcode),
26
            CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
27
            CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
28
            CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE,
29
            CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
30
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
31
    });
32
33
    NewVersion( $DBversion, 19532, "Add recalls table" );
34
}
(-)a/installer/data/mysql/en/mandatory/sample_notices.yml (+58 lines)
Lines 1574-1576 tables: Link Here
1574
            - "This item must be renewed at the library."
1574
            - "This item must be renewed at the library."
1575
            - "[% END %]"
1575
            - "[% END %]"
1576
            - "[% END %]"
1576
            - "[% END %]"
1577
1578
        - module: circulation
1579
          code: RETURN_RECALLED_ITEM
1580
          branchcode: ""
1581
          name: "Notification to return a recalled item"
1582
          is_html: 0
1583
          title: "Notification to return a recalled item"
1584
          message_transport_type: email
1585
          lang: default
1586
          content:
1587
            - "Date: <<today>>"
1588
            - ""
1589
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1590
            - ""
1591
            - "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."
1592
            - ""
1593
            - "Thank you!"
1594
1595
        - module: circulation
1596
          code: PICKUP_RECALLED_ITEM
1597
          branchcode: ""
1598
          name: "Recalled item awaiting pickup"
1599
          is_html: 0
1600
          title: "Recalled item awaiting pickup"
1601
          message_transport_type: email
1602
          lang: default
1603
          content:
1604
            - "Date: <<today>>"
1605
            - ""
1606
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1607
            - ""
1608
            - "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>>."
1609
            - ""
1610
            - "Thank you!"
1611
1612
        - module: circulation
1613
          code: RECALL_REQUESTER_DET
1614
          branchcode: ""
1615
          name: "Details of patron who recalled item"
1616
          is_html: 0
1617
          title: "Details of patron who recalled item"
1618
          message_transport_type: print
1619
          lang: default
1620
          content:
1621
            - "Date: <<today>>"
1622
            - ""
1623
            - "Recall for pickup at <<branches.branchname>>"
1624
            - "<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)"
1625
            - "<<borrowers.phone>>"
1626
            - "<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>"
1627
            - "<<borrowers.email>>"
1628
            - ""
1629
            - "ITEM RECALLED"
1630
            - "<<biblio.title>> by <<biblio.author>>"
1631
            - "Barcode: <<items.barcode>>"
1632
            - "Callnumber: <<items.itemcallnumber>>"
1633
            - "Waiting since: <<recalls.waitingdate>>"
1634
            - "Notes: <<recalls.recallnotes>>"
(-)a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql (-1 / +29 lines)
Lines 217-223 INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title` Link Here
217
('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'),
217
('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'),
218
('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'),
218
('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'),
219
('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'),
219
('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'),
220
('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');
220
('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'),
221
('circulation','RETURN_RECALLED_ITEM','','Notification to return a recalled item','0','Notification to return a recalled item','Date: <<today>>
222
223
<<borrowers.firstname>> <<borrowers.surname>>,
224
225
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.
226
227
Thank you!','email'),
228
('circulation','PICKUP_RECALLED_ITEM','','Recalled item awaiting pickup','0','Recalled item awaiting pickup','Date: <<today>>
229
230
<<borrowers.firstname>> <<borrowers.surname>>,
231
232
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>>.
233
234
Thank you!','email'),
235
('circulation','RECALL_REQUESTER_DET','','Details of patron who recalled item',0,'Date: <<today>>
236
237
Recall for pickup at <<branches.branchname>>
238
<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)
239
<<borrowers.phone>>
240
<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>
241
<<borrowers.email>>
242
243
ITEM RECALLED
244
<<biblio.title>> by <<biblio.author>>
245
Barcode: <<items.barcode>>
246
Callnumber: <<items.itemcallnumber>>
247
Waiting since: <<recalls.waitingdate>>
248
Notes: <<recalls.recallnotes>>', 'print');
221
249
222
INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES
250
INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES
223
('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'),
251
('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'),
(-)a/installer/data/mysql/kohastructure.sql (-2 / +34 lines)
Lines 1552-1559 CREATE TABLE `branchtransfers` ( Link Here
1552
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1552
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1553
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1553
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1554
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1554
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1555
  `reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','TransferCancellation') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer',
1555
  `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',
1556
  `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',
1556
  `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',
1557
  PRIMARY KEY (`branchtransfer_id`),
1557
  PRIMARY KEY (`branchtransfer_id`),
1558
  KEY `frombranch` (`frombranch`),
1558
  KEY `frombranch` (`frombranch`),
1559
  KEY `tobranch` (`tobranch`),
1559
  KEY `tobranch` (`tobranch`),
Lines 4272-4277 CREATE TABLE `ratings` ( Link Here
4272
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4272
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4273
/*!40101 SET character_set_client = @saved_cs_client */;
4273
/*!40101 SET character_set_client = @saved_cs_client */;
4274
4274
4275
--
4276
-- Table structure for table `recalls`
4277
--
4278
4279
DROP TABLE IF EXISTS recalls;
4280
CREATE TABLE recalls ( -- information related to recalls in Koha
4281
    recall_id int(11) NOT NULL auto_increment, -- primary key
4282
    borrowernumber int(11) NOT NULL DEFAULT 0, -- foreign key from the borrowers table defining which patron requested a recall
4283
    recalldate datetime DEFAULT NULL, -- the date the recall request was placed
4284
    biblionumber int(11) NOT NULL DEFAULT 0, -- foreign key from the biblio table defining which bib record this request is for
4285
    branchcode varchar(10) DEFAULT NULL, -- foreign key from the branches table defining which branch the patron wishes to pick up their recall from
4286
    cancellationdate datetime DEFAULT NULL, -- the date this recall was cancelled
4287
    recallnotes mediumtext, -- notes related to this recall
4288
    priority smallint(6) DEFAULT NULL, -- where in the queue the patron sits
4289
    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
4290
    timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- the date and time this recall was last updated
4291
    itemnumber int(11) DEFAULT NULL, -- foreign key from the items table defining the specific item the recall request was placed on
4292
    waitingdate datetime DEFAULT NULL, -- the date the item was marked as waiting for the patron at the library
4293
    expirationdate datetime DEFAULT NULL, -- the date the recall expires
4294
    old TINYINT(1) DEFAULT NULL, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed
4295
    item_level_recall TINYINT(1) NOT NULL DEFAULT 0, -- flag if item-level recall
4296
     PRIMARY KEY (recall_id),
4297
     KEY borrowernumber (borrowernumber),
4298
     KEY biblionumber (biblionumber),
4299
     KEY itemnumber (itemnumber),
4300
     KEY branchcode (branchcode),
4301
     CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
4302
     CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
4303
     CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE,
4304
     CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
4305
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4306
4275
--
4307
--
4276
-- Table structure for table `repeatable_holidays`
4308
-- Table structure for table `repeatable_holidays`
4277
--
4309
--
(-)a/installer/data/mysql/mandatory/sysprefs.sql (-1 / +3 lines)
Lines 549-555 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
549
('QueryWeightFields','1',NULL,'If ON, enables field weighting','YesNo'),
549
('QueryWeightFields','1',NULL,'If ON, enables field weighting','YesNo'),
550
('QuoteOfTheDay','','intranet,opac','Enable or disable display of Quote of the Day on the OPAC and staff interface home page','multiple'),
550
('QuoteOfTheDay','','intranet,opac','Enable or disable display of Quote of the Day on the OPAC and staff interface home page','multiple'),
551
('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'),
551
('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'),
552
('RecordStaffUserOnCheckout','0',NULL,'If ON, when an item is checked out, the user who checked out the item is recorded','YesNo'),
552
('RecallsLog','1',NULL,'If ON, log create/cancel/expire/fulfill actions on recalls','YesNo'),
553
('RecallsMaxPickUpDelay','7',NULL,'Define the maximum time a recall can be awaiting pickup','Integer'),
553
('RecordLocalUseOnReturn','0',NULL,'If ON, statistically record returns of unissued items as local use, instead of return','YesNo'),
554
('RecordLocalUseOnReturn','0',NULL,'If ON, statistically record returns of unissued items as local use, instead of return','YesNo'),
554
('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free'),
555
('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free'),
555
('RefundLostOnReturnControl','CheckinLibrary','CheckinLibrary|ItemHomeBranch|ItemHoldingBranch','If a lost item is returned, choose which branch to pick rules for refunding.','Choice'),
556
('RefundLostOnReturnControl','CheckinLibrary','CheckinLibrary|ItemHomeBranch|ItemHoldingBranch','If a lost item is returned, choose which branch to pick rules for refunding.','Choice'),
Lines 722-727 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
722
('useDischarge','0','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'),
723
('useDischarge','0','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'),
723
('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo'),
724
('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo'),
724
('UseICUStyleQuotes','0','1','Tell Koha whether to use ICU style quotes ({) or default (") when tracing subjects .','YesNo'),
725
('UseICUStyleQuotes','0','1','Tell Koha whether to use ICU style quotes ({) or default (") when tracing subjects .','YesNo'),
726
('UseRecalls','0',NULL,'Enable or disable recalls','YesNo'),
725
('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'),
727
('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'),
726
('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'),
728
('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'),
727
('viewISBD','1','','Allow display of ISBD view of bibiographic records','YesNo'),
729
('viewISBD','1','','Allow display of ISBD view of bibiographic records','YesNo'),
(-)a/installer/data/mysql/mandatory/userflags.sql (-1 / +2 lines)
Lines 23-27 INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES Link Here
23
(23,'self_check','Self check modules',0),
23
(23,'self_check','Self check modules',0),
24
(24, 'stockrotation', 'Manage stockrotation operations', 0),
24
(24, 'stockrotation', 'Manage stockrotation operations', 0),
25
(25, 'cash_management', 'Cash management', 0),
25
(25, 'cash_management', 'Cash management', 0),
26
(26, 'problem_reports', 'Manage problem reports', 0)
26
(26, 'problem_reports', 'Manage problem reports', 0),
27
(27, 'recalls', 'Recalls', 0)
27
;
28
;
(-)a/installer/data/mysql/mandatory/userpermissions.sql (-1 / +2 lines)
Lines 137-141 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
137
   (25, 'anonymous_refund', 'Perform refund actions from cash registers'),
137
   (25, 'anonymous_refund', 'Perform refund actions from cash registers'),
138
   (25, 'cashup', 'Perform cash register cashup action'),
138
   (25, 'cashup', 'Perform cash register cashup action'),
139
   (25, 'takepayment', 'Access the point of sale page and take payments'),
139
   (25, 'takepayment', 'Access the point of sale page and take payments'),
140
   (26, 'manage_problem_reports', 'Manage OPAC problem reports')
140
   (26, 'manage_problem_reports', 'Manage OPAC problem reports'),
141
   (27, 'manage_recalls', 'Manage recalls for patrons')
141
;
142
;
(-)a/installer/onboarding.pl (+6 lines)
Lines 288-293 if ( $step == 5 ) { Link Here
288
                reservesallowed                  => $reservesallowed,
288
                reservesallowed                  => $reservesallowed,
289
                suspension_chargeperiod          => undef,
289
                suspension_chargeperiod          => undef,
290
                decreaseloanholds                => undef,
290
                decreaseloanholds                => undef,
291
                recalls_allowed                  => undef,
292
                recalls_per_record               => undef,
293
                on_shelf_recalls                 => undef,
294
                recall_due_date_interval         => undef,
295
                recall_overdue_fine              => undef,
296
                recall_shelf_time                => undef,
291
              }
297
              }
292
        };
298
        };
293
299
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc (+9 lines)
Lines 75-80 Link Here
75
    [%- CASE 'problem_reports' -%]
75
    [%- CASE 'problem_reports' -%]
76
        <span class="main_permission problem_reports_permission">OPAC problem reports management</span>
76
        <span class="main_permission problem_reports_permission">OPAC problem reports management</span>
77
        <span class="permissioncode">([% name | html %])</span>
77
        <span class="permissioncode">([% name | html %])</span>
78
    [%- CASE 'recalls' -%]
79
        <span class="main_permission recalls_permission">Recalls</span>
80
        <span class="permissioncode">([% name | html %])</span>
78
    [%- END -%]
81
    [%- END -%]
79
[%- END -%]
82
[%- END -%]
80
83
Lines 783-787 Link Here
783
            Manage OPAC problem reports
786
            Manage OPAC problem reports
784
        </span>
787
        </span>
785
        <span class="permissioncode">([% name | html %])</span>
788
        <span class="permissioncode">([% name | html %])</span>
789
  [%# recalls %]
790
    [%- CASE 'manage_recalls' -%]
791
        <span class="sub_permission place_recalls_subpermission">
792
            Manage recalls for patrons
793
        </span>
794
        <span class="permissioncode">([% name | html %])</span>
786
  [%- END -%]
795
  [%- END -%]
787
[%- END -%]
796
[%- END -%]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+13 lines)
Lines 1271-1273 Circulation: Link Here
1271
              class: integer
1271
              class: integer
1272
            - days.
1272
            - days.
1273
            - <span class="hint">This system preference is used by the cleanup_database.pl cronjob.</span>
1273
            - <span class="hint">This system preference is used by the cleanup_database.pl cronjob.</span>
1274
1275
    Recalls:
1276
        -
1277
            - Mark a recall as problematic if it has been waiting to be picked up for
1278
            - pref: RecallsMaxPickUpDelay
1279
            - class: integer
1280
            - days.
1281
        -
1282
            - pref: UseRecalls
1283
              choices:
1284
                  yes: Use
1285
                  no: "Don't use"
1286
            - recalls. Make sure you configure <a href="/cgi-bin/koha/admin/smart-rules.pl">circulation and fines rules</a> for recalls once enabled.
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref (+7 lines)
Lines 108-113 Logging: Link Here
108
                  1: Log
108
                  1: Log
109
                  0: "Don't log"
109
                  0: "Don't log"
110
            - " changes to news entries and other contents managed in the news tool."
110
            - " changes to news entries and other contents managed in the news tool."
111
        -
112
            - pref: RecallsLog
113
              choices:
114
                  on: Log
115
                  off: "Don't log"
116
            - any actions on recalls (create, cancel, expire, fulfill).
117
111
    Debugging:
118
    Debugging:
112
        -
119
        -
113
            - pref: DumpTemplateVarsIntranet
120
            - pref: DumpTemplateVarsIntranet
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt (-2 / +50 lines)
Lines 142-147 Link Here
142
                <th>OPAC item level holds</th>
142
                <th>OPAC item level holds</th>
143
                <th>Article requests</th>
143
                <th>Article requests</th>
144
                <th>Rental discount (%)</th>
144
                <th>Rental discount (%)</th>
145
                [% IF Koha.Preference('UseRecalls') %]
146
                    <th>Recalls allowed (total)</th>
147
                    <th>Recalls per record (count)</th>
148
                    <th>On shelf recalls allowed</th>
149
                    <th>Recall due date interval (day)</th>
150
                    <th>Recall overdue fine amount</th>
151
                    <th>Recall pickup period (day)</th>
152
                [% END %]
145
                <th class="noExport">Actions</th>
153
                <th class="noExport">Actions</th>
146
            </tr>
154
            </tr>
147
            </thead>
155
            </thead>
Lines 183-190 Link Here
183
                        [% SET article_requests = all_rules.$c.$i.article_requests %]
191
                        [% SET article_requests = all_rules.$c.$i.article_requests %]
184
                        [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %]
192
                        [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %]
185
                        [% SET decreaseloanholds = all_rules.$c.$i.decreaseloanholds %]
193
                        [% SET decreaseloanholds = all_rules.$c.$i.decreaseloanholds %]
194
                        [% SET recalls_allowed = all_rules.$c.$i.recalls_allowed %]
195
                        [% SET recalls_per_record = all_rules.$c.$i.recalls_per_record %]
196
                        [% SET on_shelf_recalls = all_rules.$c.$i.on_shelf_recalls %]
197
                        [% SET recall_due_date_interval = all_rules.$c.$i.recall_due_date_interval %]
198
                        [% SET recall_overdue_fine = all_rules.$c.$i.recall_overdue_fine %]
199
                        [% SET recall_shelf_time = all_rules.$c.$i.recall_shelf_time %]
186
200
187
                        [% 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 %]
201
                        [% 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 %]
188
                        [% IF show_rule %]
202
                        [% IF show_rule %]
189
                            [% SET row_count = row_count + 1 %]
203
                            [% SET row_count = row_count + 1 %]
190
                            <tr row_countd="row_[% row_count | html %]">
204
                            <tr row_countd="row_[% row_count | html %]">
Lines 344-349 Link Here
344
                                        [% END %]
358
                                        [% END %]
345
                                    </td>
359
                                    </td>
346
                                    <td>[% rentaldiscount | html %]</td>
360
                                    <td>[% rentaldiscount | html %]</td>
361
                                    [% IF Koha.Preference('UseRecalls') %]
362
                                        <td>[% recalls_allowed | html %]</td>
363
                                        <td>[% recalls_per_record | html %]</td>
364
                                        <td>
365
                                            [% IF on_shelf_recalls == 'all' %]
366
                                                <span>If all unavailable</span>
367
                                            [% ELSE %]
368
                                                <span>If any unavailable</span>
369
                                            [% END %]
370
                                        </td>
371
                                        <td>[% recall_due_date_interval | html %]</td>
372
                                        <td>[% recall_overdue_fine FILTER format("%.2f") %]</td>
373
                                        <td>[% recall_shelf_time | html %]</td>
374
                                    [% END %]
347
                                    <td class="actions">
375
                                    <td class="actions">
348
                                      <a href="#" class="editrule btn btn-default btn-xs"><i class="fa fa-pencil"></i> Edit</a>
376
                                      <a href="#" class="editrule btn btn-default btn-xs"><i class="fa fa-pencil"></i> Edit</a>
349
                                      <a class="btn btn-default btn-xs delete" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&amp;itemtype=[% i || '*' | uri %]&amp;categorycode=[% c || '*' | uri %]&amp;branch=[% current_branch | uri %]"><i class="fa fa-trash"></i> Delete</a>
377
                                      <a class="btn btn-default btn-xs delete" href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&amp;itemtype=[% i || '*' | uri %]&amp;categorycode=[% c || '*' | uri %]&amp;branch=[% current_branch | uri %]"><i class="fa fa-trash"></i> Delete</a>
Lines 473-478 Link Here
473
                        </select>
501
                        </select>
474
                    </td>
502
                    </td>
475
                    <td><input type="text" name="rentaldiscount" id="rentaldiscount" size="2" /></td>
503
                    <td><input type="text" name="rentaldiscount" id="rentaldiscount" size="2" /></td>
504
                    [% IF Koha.Preference('UseRecalls') %]
505
                        <td><input type="text" name="recalls_allowed" id="recalls_allowed" size="3"></td>
506
                        <td><input type="text" name="recalls_per_record" id="recalls_per_record" size="3"></td>
507
                        <td>
508
                            <select name="on_shelf_recalls" id="on_shelf_recalls">
509
                                <option value="any">If any unavailable</option>
510
                                <option value="all">If all unavailable</option>
511
                            </select>
512
                        </td>
513
                        <td><input type="text" name="recall_due_date_interval" id="recall_due_date_interval" size="3"></td>
514
                        <td><input type="text" name="recall_overdue_fine" id="recall_overdue_fine" size="6"></td>
515
                        <td><input type="text" name="recall_shelf_time" id="recall_shelf_time" size="3"></td>
516
                    [% END %]
476
                    <td class="actions">
517
                    <td class="actions">
477
                        <input type="hidden" name="branch" value="[% current_branch | html %]"/>
518
                        <input type="hidden" name="branch" value="[% current_branch | html %]"/>
478
                        <button type="submit" class="btn btn-default btn-xs"><i class="fa fa-save"></i> Save</button>
519
                        <button type="submit" class="btn btn-default btn-xs"><i class="fa fa-save"></i> Save</button>
Lines 519-524 Link Here
519
                      <th>OPAC item level holds</th>
560
                      <th>OPAC item level holds</th>
520
                      <th>Article requests</th>
561
                      <th>Article requests</th>
521
                      <th>Rental discount (%)</th>
562
                      <th>Rental discount (%)</th>
563
                      [% IF Koha.Preference('UseRecalls') %]
564
                        <th>Recalls allowed (total)</th>
565
                        <th>Recalls per record (count)</th>
566
                        <th>On shelf recalls allowed</th>
567
                        <th>Recall due date interval (day)</th>
568
                        <th>Recall overdue fine amount</th>
569
                        <th>Recall pickup period (day)</th>
570
                      [% END %]
522
                      <th>&nbsp;</th>
571
                      <th>&nbsp;</th>
523
                    </tr>
572
                    </tr>
524
                  </tfoot>
573
                  </tfoot>
525
- 

Return to bug 19532