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

(-)a/C4/Auth.pm (+1 lines)
Lines 333-338 sub get_template_and_user { Link Here
333
            $template->param( CAN_user_stockrotation    => 1 );
333
            $template->param( CAN_user_stockrotation    => 1 );
334
            $template->param( CAN_user_cash_management  => 1 );
334
            $template->param( CAN_user_cash_management  => 1 );
335
            $template->param( CAN_user_problem_reports  => 1 );
335
            $template->param( CAN_user_problem_reports  => 1 );
336
            $template->param( CAN_user_recalls          => 1 );
336
337
337
            foreach my $module ( keys %$all_perms ) {
338
            foreach my $module ( keys %$all_perms ) {
338
                foreach my $subperm ( keys %{ $all_perms->{$module} } ) {
339
                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 1571-1573 tables: Link Here
1571
            - "This item must be renewed at the library."
1571
            - "This item must be renewed at the library."
1572
            - "[% END %]"
1572
            - "[% END %]"
1573
            - "[% END %]"
1573
            - "[% END %]"
1574
1575
        - module: circulation
1576
          code: RETURN_RECALLED_ITEM
1577
          branchcode: ""
1578
          name: "Notification to return a recalled item"
1579
          is_html: 0
1580
          title: "Notification to return a recalled item"
1581
          message_transport_type: email
1582
          lang: default
1583
          content:
1584
            - "Date: <<today>>"
1585
            - ""
1586
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1587
            - ""
1588
            - "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."
1589
            - ""
1590
            - "Thank you!"
1591
1592
        - module: circulation
1593
          code: PICKUP_RECALLED_ITEM
1594
          branchcode: ""
1595
          name: "Recalled item awaiting pickup"
1596
          is_html: 0
1597
          title: "Recalled item awaiting pickup"
1598
          message_transport_type: email
1599
          lang: default
1600
          content:
1601
            - "Date: <<today>>"
1602
            - ""
1603
            - "<<borrowers.firstname>> <<borrowers.surname>>,"
1604
            - ""
1605
            - "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>>."
1606
            - ""
1607
            - "Thank you!"
1608
1609
        - module: circulation
1610
          code: RECALL_REQUESTER_DET
1611
          branchcode: ""
1612
          name: "Details of patron who recalled item"
1613
          is_html: 0
1614
          title: "Details of patron who recalled item"
1615
          message_transport_type: print
1616
          lang: default
1617
          content:
1618
            - "Date: <<today>>"
1619
            - ""
1620
            - "Recall for pickup at <<branches.branchname>>"
1621
            - "<<borrowers.surname>>, <<borrowers.firstname>> (<<borrowers.cardnumber>>)"
1622
            - "<<borrowers.phone>>"
1623
            - "<<borrowers.streetnumber>> <<borrowers.address>>, <<borrowers.address2>>, <<borrowers.city>> <<borrowers.zipcode>>"
1624
            - "<<borrowers.email>>"
1625
            - ""
1626
            - "ITEM RECALLED"
1627
            - "<<biblio.title>> by <<biblio.author>>"
1628
            - "Barcode: <<items.barcode>>"
1629
            - "Callnumber: <<items.itemcallnumber>>"
1630
            - "Waiting since: <<recalls.waitingdate>>"
1631
            - "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 1521-1528 CREATE TABLE `branchtransfers` ( Link Here
1521
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1521
  `datecancelled` datetime DEFAULT NULL COMMENT 'the date the transfer was cancelled',
1522
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1522
  `tobranch` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'the branch the transfer was going to',
1523
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1523
  `comments` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'any comments related to the transfer',
1524
  `reason` enum('Manual','StockrotationAdvance','StockrotationRepatriation','ReturnToHome','ReturnToHolding','RotatingCollection','Reserve','LostReserve','CancelReserve','TransferCancellation') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'what triggered the transfer',
1524
  `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',
1525
  `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',
1525
  `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',
1526
  PRIMARY KEY (`branchtransfer_id`),
1526
  PRIMARY KEY (`branchtransfer_id`),
1527
  KEY `frombranch` (`frombranch`),
1527
  KEY `frombranch` (`frombranch`),
1528
  KEY `tobranch` (`tobranch`),
1528
  KEY `tobranch` (`tobranch`),
Lines 4253-4258 CREATE TABLE `ratings` ( Link Here
4253
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4253
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4254
/*!40101 SET character_set_client = @saved_cs_client */;
4254
/*!40101 SET character_set_client = @saved_cs_client */;
4255
4255
4256
--
4257
-- Table structure for table `recalls`
4258
--
4259
4260
DROP TABLE IF EXISTS recalls;
4261
CREATE TABLE recalls ( -- information related to recalls in Koha
4262
    recall_id int(11) NOT NULL auto_increment, -- primary key
4263
    borrowernumber int(11) NOT NULL DEFAULT 0, -- foreign key from the borrowers table defining which patron requested a recall
4264
    recalldate datetime DEFAULT NULL, -- the date the recall request was placed
4265
    biblionumber int(11) NOT NULL DEFAULT 0, -- foreign key from the biblio table defining which bib record this request is for
4266
    branchcode varchar(10) DEFAULT NULL, -- foreign key from the branches table defining which branch the patron wishes to pick up their recall from
4267
    cancellationdate datetime DEFAULT NULL, -- the date this recall was cancelled
4268
    recallnotes mediumtext, -- notes related to this recall
4269
    priority smallint(6) DEFAULT NULL, -- where in the queue the patron sits
4270
    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
4271
    timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- the date and time this recall was last updated
4272
    itemnumber int(11) DEFAULT NULL, -- foreign key from the items table defining the specific item the recall request was placed on
4273
    waitingdate datetime DEFAULT NULL, -- the date the item was marked as waiting for the patron at the library
4274
    expirationdate datetime DEFAULT NULL, -- the date the recall expires
4275
    old TINYINT(1) DEFAULT NULL, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed
4276
    item_level_recall TINYINT(1) NOT NULL DEFAULT 0, -- flag if item-level recall
4277
     PRIMARY KEY (recall_id),
4278
     KEY borrowernumber (borrowernumber),
4279
     KEY biblionumber (biblionumber),
4280
     KEY itemnumber (itemnumber),
4281
     KEY branchcode (branchcode),
4282
     CONSTRAINT recalls_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
4283
     CONSTRAINT recalls_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
4284
     CONSTRAINT recalls_ibfk_3 FOREIGN KEY (itemnumber) REFERENCES items (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE,
4285
     CONSTRAINT recalls_ibfk_4 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
4286
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4287
4256
--
4288
--
4257
-- Table structure for table `repeatable_holidays`
4289
-- Table structure for table `repeatable_holidays`
4258
--
4290
--
(-)a/installer/data/mysql/mandatory/sysprefs.sql (-1 / +3 lines)
Lines 551-557 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
551
('QueryWeightFields','1',NULL,'If ON, enables field weighting','YesNo'),
551
('QueryWeightFields','1',NULL,'If ON, enables field weighting','YesNo'),
552
('QuoteOfTheDay','','intranet,opac','Enable or disable display of Quote of the Day on the OPAC and staff interface home page','multiple'),
552
('QuoteOfTheDay','','intranet,opac','Enable or disable display of Quote of the Day on the OPAC and staff interface home page','multiple'),
553
('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'),
553
('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'),
554
('RecordStaffUserOnCheckout','0',NULL,'If ON, when an item is checked out, the user who checked out the item is recorded','YesNo'),
554
('RecallsLog','1',NULL,'If ON, log create/cancel/expire/fulfill actions on recalls','YesNo'),
555
('RecallsMaxPickUpDelay','7',NULL,'Define the maximum time a recall can be awaiting pickup','Integer'),
555
('RecordLocalUseOnReturn','0',NULL,'If ON, statistically record returns of unissued items as local use, instead of return','YesNo'),
556
('RecordLocalUseOnReturn','0',NULL,'If ON, statistically record returns of unissued items as local use, instead of return','YesNo'),
556
('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free'),
557
('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free'),
557
('RefundLostOnReturnControl','CheckinLibrary','CheckinLibrary|ItemHomeBranch|ItemHoldingBranch','If a lost item is returned, choose which branch to pick rules for refunding.','Choice'),
558
('RefundLostOnReturnControl','CheckinLibrary','CheckinLibrary|ItemHomeBranch|ItemHoldingBranch','If a lost item is returned, choose which branch to pick rules for refunding.','Choice'),
Lines 723-728 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
723
('useDischarge','0','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'),
724
('useDischarge','0','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'),
724
('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo'),
725
('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo'),
725
('UseICUStyleQuotes','0','1','Tell Koha whether to use ICU style quotes ({) or default (") when tracing subjects .','YesNo'),
726
('UseICUStyleQuotes','0','1','Tell Koha whether to use ICU style quotes ({) or default (") when tracing subjects .','YesNo'),
727
('UseRecalls','0',NULL,'Enable or disable recalls','YesNo'),
726
('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'),
728
('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'),
727
('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'),
729
('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'),
728
('viewISBD','1','','Allow display of ISBD view of bibiographic records','YesNo'),
730
('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 136-140 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
136
   (25, 'anonymous_refund', 'Perform refund actions from cash registers'),
136
   (25, 'anonymous_refund', 'Perform refund actions from cash registers'),
137
   (25, 'cashup', 'Perform cash register cashup action'),
137
   (25, 'cashup', 'Perform cash register cashup action'),
138
   (25, 'takepayment', 'Access the point of sale page and take payments'),
138
   (25, 'takepayment', 'Access the point of sale page and take payments'),
139
   (26, 'manage_problem_reports', 'Manage OPAC problem reports')
139
   (26, 'manage_problem_reports', 'Manage OPAC problem reports'),
140
   (27, 'manage_recalls', 'Manage recalls for patrons')
140
;
141
;
(-)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 778-782 Link Here
778
            Manage OPAC problem reports
781
            Manage OPAC problem reports
779
        </span>
782
        </span>
780
        <span class="permissioncode">([% name | html %])</span>
783
        <span class="permissioncode">([% name | html %])</span>
784
  [%# recalls %]
785
    [%- CASE 'manage_recalls' -%]
786
        <span class="sub_permission place_recalls_subpermission">
787
            Manage recalls for patrons
788
        </span>
789
        <span class="permissioncode">([% name | html %])</span>
781
  [%- END -%]
790
  [%- END -%]
782
[%- END -%]
791
[%- 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