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

(-)a/C4/Letters.pm (-1 / +7 lines)
Lines 1812-1818 sub _get_tt_params { Link Here
1812
            singular => 'illrequest',
1812
            singular => 'illrequest',
1813
            plural   => 'illrequests',
1813
            plural   => 'illrequests',
1814
            pk       => 'illrequest_id'
1814
            pk       => 'illrequest_id'
1815
        }
1815
        },
1816
        preservation_train_items => {
1817
            module   => 'Koha::Preservation::Train::Items',
1818
            singular => 'train_item',
1819
            plural   => 'train_items',
1820
            pk       => 'train_item_id'
1821
        },
1816
    };
1822
    };
1817
1823
1818
    foreach my $table ( keys %$tables ) {
1824
    foreach my $table ( keys %$tables ) {
(-)a/Koha/Preservation/Train/Item.pm (+12 lines)
Lines 62-67 sub catalogue_item { Link Here
62
    return Koha::Item->_new_from_dbic($item_rs);
62
    return Koha::Item->_new_from_dbic($item_rs);
63
}
63
}
64
64
65
=head3 train
66
67
Return the train object for this item
68
69
=cut
70
71
sub train {
72
    my ( $self ) = @_;
73
    my $rs = $self->_result->train;
74
    return Koha::Preservation::Train->_new_from_dbic($rs);
75
}
76
65
=head3 attributes
77
=head3 attributes
66
78
67
Getter and setter for the attributes
79
Getter and setter for the attributes
(-)a/api/v1/swagger/definitions/preservation_processing.yaml (+5 lines)
Lines 8-13 properties: Link Here
8
  name:
8
  name:
9
    description: name of the processing
9
    description: name of the processing
10
    type: string
10
    type: string
11
  letter_code:
12
    description: Letter code of the letter to use for printing slips
13
    type:
14
      - string
15
      - "null"
11
  attributes:
16
  attributes:
12
    description: attributes of the processing
17
    description: attributes of the processing
13
    items:
18
    items:
(-)a/api/v1/swagger/paths/preservation_trains.yaml (+1 lines)
Lines 167-172 Link Here
167
            - items.attributes
167
            - items.attributes
168
            - items.attributes+strings
168
            - items.attributes+strings
169
            - items.attributes.processing_attribute
169
            - items.attributes.processing_attribute
170
            - items.processing
170
            - default_processing
171
            - default_processing
171
            - default_processing.attributes
172
            - default_processing.attributes
172
        collectionFormat: csv
173
        collectionFormat: csv
(-)a/debian/templates/apache-shared-intranet.conf (+1 lines)
Lines 21-26 RewriteRule ^/issn/([^\/]*)/?$ /search?q=issn:$1 [PT] Link Here
21
RewriteRule ^(.*)_[0-9]{2}\.[0-9]{7}\.(js|css)$ $1.$2 [L]
21
RewriteRule ^(.*)_[0-9]{2}\.[0-9]{7}\.(js|css)$ $1.$2 [L]
22
22
23
RewriteRule ^/cgi-bin/koha/erm/.*$ /cgi-bin/koha/erm/erm.pl [PT]
23
RewriteRule ^/cgi-bin/koha/erm/.*$ /cgi-bin/koha/erm/erm.pl [PT]
24
RewriteCond %{REQUEST_URI} !^/cgi-bin/koha/preservation/.*.pl$
24
RewriteRule ^/cgi-bin/koha/preservation/.*$ /cgi-bin/koha/preservation/home.pl [PT]
25
RewriteRule ^/cgi-bin/koha/preservation/.*$ /cgi-bin/koha/preservation/home.pl [PT]
25
26
26
Alias "/api" "/usr/share/koha/api"
27
Alias "/api" "/usr/share/koha/api"
(-)a/installer/data/mysql/atomicupdate/bug_33547.pl (+37 lines)
Line 0 Link Here
1
use Modern::Perl;
2
3
return {
4
    bug_number => "33547",
5
    description => "Add a new notice template 'PRES_TRAIN_ITEM'",
6
    up => sub {
7
        my ($args) = @_;
8
        my ($dbh, $out) = @$args{qw(dbh out)};
9
10
        unless ( column_exists('preservation_processings', 'letter_code') ) {
11
            $dbh->do(q{
12
                ALTER TABLE preservation_processings
13
                ADD COLUMN `letter_code` varchar(20) DEFAULT NULL COMMENT 'Foreign key to the letters table' AFTER `name`
14
            });
15
        }
16
17
        my $notice_template = q{[%~ SET train = train_item.train ~%]
18
[%~ SET item = train_item.catalogue_item ~%]
19
Train name: [% train.name %]
20
Sent on: [% train.sent_on | $KohaDates %]
21
22
[% train.default_processing.name %]
23
24
Item number #[% train_item.user_train_item_id %]
25
26
[% FOREACH item_attribute IN train_item.attributes %]
27
    [% item_attribute.processing_attribute.name %]: [% item_attribute.value %]
28
[% END %]};
29
30
        $dbh->do(q{
31
            INSERT IGNORE INTO letter
32
            (module,code,branchcode,name,is_html,title,content,message_transport_type,lang)
33
            VALUES
34
            ('preservation','PRES_TRAIN_ITEM','','Train item slip',0,'Train item slip',?, 'print','default')}, undef, $notice_template);
35
        say $out "Added new letter 'PRES_TRAIN_ITEM' (print)";
36
    },
37
};
(-)a/installer/data/mysql/en/mandatory/sample_notices.yml (+22 lines)
Lines 2361-2363 tables: Link Here
2361
            - "[% IF ( biblio.items.count > 0 ) %]<br>Items: <ul>[% FOREACH item IN biblio.items %]<li>[% Branches.GetName( item.holdingbranch ) | html %]"
2361
            - "[% IF ( biblio.items.count > 0 ) %]<br>Items: <ul>[% FOREACH item IN biblio.items %]<li>[% Branches.GetName( item.holdingbranch ) | html %]"
2362
            - "[% IF ( item.location ) %], [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.location', authorised_value => item.location ) | html %][% END %][% IF item.itemcallnumber %]([% item.itemcallnumber | html %])[% END %][% item.barcode | html %]</li>[% END %]</ul>[% END %]"
2362
            - "[% IF ( item.location ) %], [% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.location', authorised_value => item.location ) | html %][% END %][% IF item.itemcallnumber %]([% item.itemcallnumber | html %])[% END %][% item.barcode | html %]</li>[% END %]</ul>[% END %]"
2363
            - "<hr></li>[% END %]</ol>"
2363
            - "<hr></li>[% END %]</ol>"
2364
2365
        - module: preservation
2366
          code: PRES_TRAIN_ITEM
2367
          branchcode: ""
2368
          name: "Train item slip"
2369
          is_html: 0
2370
          title: "Train item slip"
2371
          message_transport_type: print
2372
          lang: default
2373
          content:
2374
            - "[%~ SET train = train_item.train ~%]"
2375
            - "[%~ SET item = train_item.catalogue_item ~%]"
2376
            - "Train name: [% train.name %]"
2377
            - "Sent on: [% train.sent_on | $KohaDates %]"
2378
            - ""
2379
            - "[% train.default_processing.name %]"
2380
            - ""
2381
            - "Item number #[% train_item.user_train_item_id %]"
2382
            - ""
2383
            - "[% FOREACH item_attribute IN train_item.attributes %]"
2384
            - "    [% item_attribute.processing_attribute.name %]: [% item_attribute.value %]"
2385
            - "[% END %]"
(-)a/installer/data/mysql/kohastructure.sql (+1 lines)
Lines 4776-4781 DROP TABLE IF EXISTS `preservation_processings`; Link Here
4776
CREATE TABLE `preservation_processings` (
4776
CREATE TABLE `preservation_processings` (
4777
  `processing_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
4777
  `processing_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
4778
  `name` varchar(80) NOT NULL COMMENT 'name of the processing',
4778
  `name` varchar(80) NOT NULL COMMENT 'name of the processing',
4779
  `letter_code` varchar(20) DEFAULT NULL COMMENT 'Foreign key to the letters table',
4779
  PRIMARY KEY (`processing_id`)
4780
  PRIMARY KEY (`processing_id`)
4780
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4781
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4781
/*!40101 SET character_set_client = @saved_cs_client */;
4782
/*!40101 SET character_set_client = @saved_cs_client */;
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/preservation/home.tt (+1 lines)
Lines 33-38 Link Here
33
        const authorised_value_categories = [% To.json(AuthorisedValues.GetCategories()) | $raw %].map(c => c.category);
33
        const authorised_value_categories = [% To.json(AuthorisedValues.GetCategories()) | $raw %].map(c => c.category);
34
        const db_columns = [% To.json(db_columns) | $raw %];
34
        const db_columns = [% To.json(db_columns) | $raw %];
35
        const api_mappings = [% To.json(api_mappings) | $raw %];
35
        const api_mappings = [% To.json(api_mappings) | $raw %];
36
        const notice_templates = [% To.json(notice_templates || []) | $raw %];
36
37
37
    </script>
38
    </script>
38
39
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tt (+7 lines)
Lines 155-160 Link Here
155
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=ill">Interlibrary loans</a></li>
155
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=ill">Interlibrary loans</a></li>
156
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=orderacquisition">Order acquisition</a></li>
156
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=orderacquisition">Order acquisition</a></li>
157
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=members">Patrons</a></li>
157
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=members">Patrons</a></li>
158
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=preservation">Preservation</a></li>
158
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=serial">Serials (new issue)</a></li>
159
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=serial">Serials (new issue)</a></li>
159
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=suggestions">Suggestions</a></li>
160
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=suggestions">Suggestions</a></li>
160
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=pos">Point of sale</a></li>
161
                                <li><a href="/cgi-bin/koha/tools/letter.pl?op=add_form&amp;module=pos">Point of sale</a></li>
Lines 212-217 Link Here
212
                                                    [% CASE 'reserves' %]<span>Holds</span>
213
                                                    [% CASE 'reserves' %]<span>Holds</span>
213
                                                    [% CASE 'ill' %]<span>Interlibrary loans</span>
214
                                                    [% CASE 'ill' %]<span>Interlibrary loans</span>
214
                                                    [% CASE 'members' %]<span>Patrons</span>
215
                                                    [% CASE 'members' %]<span>Patrons</span>
216
                                                    [% CASE 'preservation' %]<span>Preservation</span>
215
                                                    [% CASE 'serial' %]<span>Serials (new issue)</span>
217
                                                    [% CASE 'serial' %]<span>Serials (new issue)</span>
216
                                                    [% CASE 'suggestions' %]<span>Suggestions</span>
218
                                                    [% CASE 'suggestions' %]<span>Suggestions</span>
217
                                                    [% CASE 'pos' %]<span>Point of sale</span>
219
                                                    [% CASE 'pos' %]<span>Point of sale</span>
Lines 376-381 Link Here
376
                                        [% ELSE %]
378
                                        [% ELSE %]
377
                                            <option value="members">Patrons</option>
379
                                            <option value="members">Patrons</option>
378
                                        [% END %]
380
                                        [% END %]
381
                                        [% IF ( module == "preservation" ) %]
382
                                            <option value="preservation" selected="selected">Preservation</option>
383
                                        [% ELSE %]
384
                                            <option value="preservation">Preservation</option>
385
                                        [% END %]
379
                                        [% IF ( module == "serial" ) %]
386
                                        [% IF ( module == "serial" ) %]
380
                                            <option value="serial" selected="selected">Serials (new issue)</option>
387
                                            <option value="serial" selected="selected">Serials (new issue)</option>
381
                                        [% ELSE %]
388
                                        [% ELSE %]
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Preservation/SettingsProcessingsFormAdd.vue (+15 lines)
Lines 21-26 Link Here
21
                            />
21
                            />
22
                            <span class="required">{{ $__("Required") }}</span>
22
                            <span class="required">{{ $__("Required") }}</span>
23
                        </li>
23
                        </li>
24
                        <li>
25
                            <label for="letter_code"
26
                                >{{
27
                                    $__("Letter template for printing slip")
28
                                }}:</label
29
                            >
30
                            <v-select
31
                                id="letter_code"
32
                                label="name"
33
                                v-model="processing.letter_code"
34
                                :options="notice_templates"
35
                                :reduce="n => n.code"
36
                            />
37
                        </li>
24
                    </ol>
38
                    </ol>
25
                </fieldset>
39
                </fieldset>
26
                <fieldset class="rows">
40
                <fieldset class="rows">
Lines 199-204 export default { Link Here
199
            setWarning,
213
            setWarning,
200
            authorised_value_categories,
214
            authorised_value_categories,
201
            db_column_options,
215
            db_column_options,
216
            notice_templates,
202
        }
217
        }
203
    },
218
    },
204
    data() {
219
    data() {
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Preservation/SettingsProcessingsShow.vue (+24 lines)
Lines 21-26 Link Here
21
                            {{ processing.name }}
21
                            {{ processing.name }}
22
                        </span>
22
                        </span>
23
                    </li>
23
                    </li>
24
                    <li v-if="notice_template">
25
                        <label
26
                            >{{
27
                                $__("Letter template for printing slip")
28
                            }}:</label
29
                        >
30
                        <span>
31
                            {{ notice_template.name }}
32
                            <a
33
                                :href="`/cgi-bin/koha/tools/letter.pl?op=add_form&module=preservation&code=${notice_template.code}`"
34
                                ><i class="fa fa-edit"></i>
35
                                {{ $__("Edit this template") }}</a
36
                            >
37
                        </span>
38
                    </li>
24
                </ol>
39
                </ol>
25
            </fieldset>
40
            </fieldset>
26
            <fieldset class="rows">
41
            <fieldset class="rows">
Lines 74-87 export default { Link Here
74
        const { setConfirmationDialog, setMessage } = inject("mainStore")
89
        const { setConfirmationDialog, setMessage } = inject("mainStore")
75
90
76
        return {
91
        return {
92
            notice_templates,
77
            setConfirmationDialog,
93
            setConfirmationDialog,
78
            setMessage,
94
            setMessage,
79
        }
95
        }
80
    },
96
    },
97
    computed: {
98
        notice_template() {
99
            return this.notice_templates.find(
100
                n => n.id == this.processing.letter_code
101
            )
102
        },
103
    },
81
    data() {
104
    data() {
82
        return {
105
        return {
83
            processing: {
106
            processing: {
84
                processing_id: null,
107
                processing_id: null,
108
                letter_code: null,
85
                name: "",
109
                name: "",
86
                attributes: [],
110
                attributes: [],
87
            },
111
            },
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Preservation/TrainsShow.vue (-2 / +32 lines)
Lines 427-432 export default { Link Here
427
                }
427
                }
428
            )
428
            )
429
        },
429
        },
430
        printSlip(train_item_id) {
431
            window.open(
432
                "/cgi-bin/koha/preservation/print_slip.pl?train_item_id=" +
433
                    train_item_id,
434
                "_blank"
435
            )
436
        },
430
        selectTrainForCopy(train_item_id) {
437
        selectTrainForCopy(train_item_id) {
431
            this.show_modal = true
438
            this.show_modal = true
432
            this.train_item_id_to_copy = train_item_id
439
            this.train_item_id_to_copy = train_item_id
Lines 459-464 export default { Link Here
459
            let item_table = this.item_table
466
            let item_table = this.item_table
460
            let removeItem = this.removeItem
467
            let removeItem = this.removeItem
461
            let editItem = this.editItem
468
            let editItem = this.editItem
469
            let printSlip = this.printSlip
462
            let selectTrainForCopy = this.selectTrainForCopy
470
            let selectTrainForCopy = this.selectTrainForCopy
463
            let train = this.train
471
            let train = this.train
464
472
Lines 471-478 export default { Link Here
471
                    var api = new $.fn.dataTable.Api(settings)
479
                    var api = new $.fn.dataTable.Api(settings)
472
                    $.each($(this).find("td.actions"), function (index, e) {
480
                    $.each($(this).find("td.actions"), function (index, e) {
473
                        let tr = $(this).parent()
481
                        let tr = $(this).parent()
474
                        let train_item_id = api.row(tr).data()
482
                        let train_item = api.row(tr).data().item
475
                            .item.train_item_id
483
                        let train_item_id = train_item.train_item_id
476
484
477
                        let editButton = createVNode(
485
                        let editButton = createVNode(
478
                            "a",
486
                            "a",
Lines 537-542 export default { Link Here
537
                            )
545
                            )
538
                        }
546
                        }
539
547
548
                        if (train_item.processing.letter_code !== null) {
549
                            let printButton = createVNode(
550
                                "a",
551
                                {
552
                                    class: "btn btn-default btn-xs",
553
                                    role: "button",
554
                                    onClick: () => {
555
                                        printSlip(train_item_id)
556
                                    },
557
                                },
558
                                [
559
                                    createVNode("i", {
560
                                        class: "fa fa-print",
561
                                        "aria-hidden": "true",
562
                                    }),
563
                                    __("Print slip"),
564
                                ]
565
                            )
566
                            buttons.push(" ")
567
                            buttons.push(printButton)
568
                        }
569
540
                        let n = createVNode("span", {}, buttons)
570
                        let n = createVNode("span", {}, buttons)
541
                        render(n, e)
571
                        render(n, e)
542
                    })
572
                    })
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/preservation-api-client.js (-1 / +1 lines)
Lines 14-20 export class PreservationAPIClient extends HttpClient { Link Here
14
                    endpoint: "trains/" + id,
14
                    endpoint: "trains/" + id,
15
                    headers: {
15
                    headers: {
16
                        "x-koha-embed":
16
                        "x-koha-embed":
17
                            "default_processing,default_processing.attributes,items,items.attributes,items.attributes+strings,items.attributes.processing_attribute",
17
                            "default_processing,default_processing.attributes,items,items.attributes,items.attributes+strings,items.attributes.processing_attribute,items.processing",
18
                    },
18
                    },
19
                }),
19
                }),
20
            getAll: (query = {}) =>
20
            getAll: (query = {}) =>
(-)a/preservation/home.pl (+5 lines)
Lines 22-27 use C4::Auth qw( get_template_and_user ); Link Here
22
use C4::Output qw( output_html_with_http_headers );
22
use C4::Output qw( output_html_with_http_headers );
23
23
24
use Koha::Database::Columns;
24
use Koha::Database::Columns;
25
use Koha::Notice::Templates;
25
26
26
my $query = CGI->new;
27
my $query = CGI->new;
27
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
28
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
Lines 47-52 $template->param( Link Here
47
        biblioitems => Koha::Biblioitem->to_api_mapping,
48
        biblioitems => Koha::Biblioitem->to_api_mapping,
48
        biblio => Koha::Biblio->to_api_mapping,
49
        biblio => Koha::Biblio->to_api_mapping,
49
    },
50
    },
51
    notice_templates =>
52
      [ map { { id => $_->id, code => $_->code, name => $_->name } }
53
          Koha::Notice::Templates->search( { module => 'preservation' } )
54
          ->as_list ],
50
);
55
);
51
56
52
output_html_with_http_headers $query, $cookie, $template->output;
57
output_html_with_http_headers $query, $cookie, $template->output;
(-)a/preservation/print_slip.pl (+75 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
9
#
10
# Koha is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18
19
use Modern::Perl;
20
use CGI qw ( -utf8 );
21
use C4::Context;
22
use C4::Auth qw( get_template_and_user );
23
use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers );
24
use C4::Letters;
25
use Koha::Patrons;
26
use Koha::Preservation::Train::Items;
27
28
my $input = CGI->new;
29
my $train_item_id = $input->param('train_item_id');
30
31
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
32
    {
33
        template_name   => "circ/printslip.tt",
34
        query           => $input,
35
        type            => "intranet",
36
        flagsrequired   => { preservation => '*' },
37
    }
38
);
39
40
my $logged_in_user = Koha::Patrons->find($loggedinuser);
41
my $branch = C4::Context->userenv->{'branch'};
42
43
my $train_item = Koha::Preservation::Train::Items->find($train_item_id);
44
45
unless ($train_item){
46
    print $input->redirect("/cgi-bin/koha/errors/404.pl");
47
    exit;
48
}
49
50
my $train = $train_item->train;
51
52
my $letter = C4::Letters::GetPreparedLetter(
53
    module      => 'preservation',
54
    letter_code => $train_item->processing->letter_code,
55
    branchcode  => $branch,
56
    lang        => $logged_in_user->lang,
57
    tables      => {
58
        preservation_train_items => $train_item_id,
59
    },
60
    message_transport_type => 'print'
61
);
62
63
my $slip    = $letter->{content};
64
my $is_html = $letter->{is_html};
65
66
$template->param(
67
    slip => $slip,
68
    plain => !$is_html,
69
    caller => 'preservation',
70
    stylesheet => C4::Context->preference("SlipCSS"),
71
);
72
73
$template->param( IntranetSlipPrinterJS => C4::Context->preference('IntranetSlipPrinterJS' ) );
74
75
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/t/db_dependent/Koha/Preservation/Trains.t (-2 / +5 lines)
Lines 53-59 subtest 'default_processing' => sub { Link Here
53
};
53
};
54
54
55
subtest 'add_items & items' => sub {
55
subtest 'add_items & items' => sub {
56
    plan tests => 14;
56
    plan tests => 15;
57
57
58
    $schema->storage->txn_begin;
58
    $schema->storage->txn_begin;
59
59
Lines 99-104 subtest 'add_items & items' => sub { Link Here
99
    is( $item_2->get_from_storage->notforloan, 0 );
99
    is( $item_2->get_from_storage->notforloan, 0 );
100
    is( $item_3->get_from_storage->notforloan, $not_for_loan_train_in );
100
    is( $item_3->get_from_storage->notforloan, $not_for_loan_train_in );
101
101
102
    is( ref( $item_train_1->train ),
103
        'Koha::Preservation::Train',
104
        'Train::Item->train returns a Koha::Preservation::Train object' );
105
102
    warning_is {
106
    warning_is {
103
        $train->add_item( { item_id => $item_2->itemnumber }, { skip_waiting_list_check => 1 } );
107
        $train->add_item( { item_id => $item_2->itemnumber }, { skip_waiting_list_check => 1 } );
104
    } '';
108
    } '';
105
- 

Return to bug 33547