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

(-)a/C4/Auth.pm (+1 lines)
Lines 347-352 sub get_template_and_user { Link Here
347
            $template->param( CAN_user_stockrotation    => 1 );
347
            $template->param( CAN_user_stockrotation    => 1 );
348
            $template->param( CAN_user_cash_management  => 1 );
348
            $template->param( CAN_user_cash_management  => 1 );
349
            $template->param( CAN_user_problem_reports  => 1 );
349
            $template->param( CAN_user_problem_reports  => 1 );
350
            $template->param( CAN_user_recalls          => 1 );
350
351
351
            foreach my $module ( keys %$all_perms ) {
352
            foreach my $module ( keys %$all_perms ) {
352
                foreach my $subperm ( keys %{ $all_perms->{$module} } ) {
353
                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 177-182 our $RULE_KINDS = { Link Here
177
    decreaseloanholds => {
177
    decreaseloanholds => {
178
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
178
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
179
    },
179
    },
180
    recalls_allowed => {
181
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
182
    },
183
    recalls_per_record => {
184
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
185
    },
186
    on_shelf_recalls => {
187
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
188
    },
189
    recall_due_date_interval => {
190
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
191
    },
192
    recall_overdue_fine => {
193
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
194
    },
195
    recall_shelf_time => {
196
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
197
    },
180
    # Not included (deprecated?):
198
    # Not included (deprecated?):
181
    #   * accountsent
199
    #   * accountsent
182
    #   * reservecharge
200
    #   * 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 1576-1578 tables: Link Here
1576
            - "This item must be renewed at the library."
1576
            - "This item must be renewed at the library."
1577
            - "[% END %]"
1577
            - "[% END %]"
1578
            - "[% END %]"
1578
            - "[% END %]"
1579
1580
        - module: circulation
1581
          code: RETURN_RECALLED_ITEM
1582
          branchcode: ""
1583
          name: "Notification to return a recalled item"
1584
          is_html: 0
1585
          title: "Notification to return a recalled item"
1586
          message_transport_type: email
1587
          lang: default
1588
          content:
1589
            - "Date: <<today>>"
1590
            - ""
1591
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1592
            - ""
1593
            - "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."
1594
            - ""
1595
            - "Thank you!"
1596
1597
        - module: circulation
1598
          code: PICKUP_RECALLED_ITEM
1599
          branchcode: ""
1600
          name: "Recalled item awaiting pickup"
1601
          is_html: 0
1602
          title: "Recalled item awaiting pickup"
1603
          message_transport_type: email
1604
          lang: default
1605
          content:
1606
            - "Date: <<today>>"
1607
            - ""
1608
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1609
            - ""
1610
            - "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>>."
1611
            - ""
1612
            - "Thank you!"
1613
1614
        - module: circulation
1615
          code: RECALL_REQUESTER_DET
1616
          branchcode: ""
1617
          name: "Details of patron who recalled item"
1618
          is_html: 0
1619
          title: "Details of patron who recalled item"
1620
          message_transport_type: print
1621
          lang: default
1622
          content:
1623
            - "Date: <<today>>"
1624
            - ""
1625
            - "Recall for pickup at <<branches.branchname>>"
1626
            - "<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)"
1627
            - "<<borrowers.phone>>"
1628
            - "<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>"
1629
            - "<<borrowers.email>>"
1630
            - ""
1631
            - "ITEM RECALLED"
1632
            - "<<biblio.title>> by <<biblio.author>>"
1633
            - "Barcode: <<items.barcode>>"
1634
            - "Callnumber: <<items.itemcallnumber>>"
1635
            - "Waiting since: <<recalls.waitingdate>>"
1636
            - "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 1554-1561 CREATE TABLE `branchtransfers` ( Link Here
1554
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1554
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1555
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1555
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1556
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1556
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1557
  `reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','TransferCancellation') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer',
1557
  `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',
1558
  `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',
1558
  `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',
1559
  PRIMARY KEY (`branchtransfer_id`),
1559
  PRIMARY KEY (`branchtransfer_id`),
1560
  KEY `frombranch` (`frombranch`),
1560
  KEY `frombranch` (`frombranch`),
1561
  KEY `tobranch` (`tobranch`),
1561
  KEY `tobranch` (`tobranch`),
Lines 4277-4282 CREATE TABLE `ratings` ( Link Here
4277
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4277
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4278
/*!40101 SET character_set_client = @saved_cs_client */;
4278
/*!40101 SET character_set_client = @saved_cs_client */;
4279
4279
4280
--
4281
-- Table structure for table `recalls`
4282
--
4283
4284
DROP TABLE IF EXISTS recalls;
4285
CREATE TABLE recalls ( -- information related to recalls in Koha
4286
    recall_id int(11) NOT NULL auto_increment, -- primary key
4287
    borrowernumber int(11) NOT NULL DEFAULT 0, -- foreign key from the borrowers table defining which patron requested a recall
4288
    recalldate datetime DEFAULT NULL, -- the date the recall request was placed
4289
    biblionumber int(11) NOT NULL DEFAULT 0, -- foreign key from the biblio table defining which bib record this request is for
4290
    branchcode varchar(10) DEFAULT NULL, -- foreign key from the branches table defining which branch the patron wishes to pick up their recall from
4291
    cancellationdate datetime DEFAULT NULL, -- the date this recall was cancelled
4292
    recallnotes mediumtext, -- notes related to this recall
4293
    priority smallint(6) DEFAULT NULL, -- where in the queue the patron sits
4294
    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
4295
    timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- the date and time this recall was last updated
4296
    itemnumber int(11) DEFAULT NULL, -- foreign key from the items table defining the specific item the recall request was placed on
4297
    waitingdate datetime DEFAULT NULL, -- the date the item was marked as waiting for the patron at the library
4298
    expirationdate datetime DEFAULT NULL, -- the date the recall expires
4299
    old TINYINT(1) DEFAULT NULL, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed
4300
    item_level_recall TINYINT(1) NOT NULL DEFAULT 0, -- flag if item-level recall
4301
     PRIMARY KEY (recall_id),
4302
     KEY borrowernumber (borrowernumber),
4303
     KEY biblionumber (biblionumber),
4304
     KEY itemnumber (itemnumber),
4305
     KEY branchcode (branchcode),
4306
     CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
4307
     CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
4308
     CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE,
4309
     CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
4310
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4311
4280
--
4312
--
4281
-- Table structure for table `repeatable_holidays`
4313
-- Table structure for table `repeatable_holidays`
4282
--
4314
--
(-)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