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

(-)a/C4/Letters.pm (-1 / +7 lines)
Lines 1817-1823 sub _get_tt_params { Link Here
1817
            singular => 'illrequest',
1817
            singular => 'illrequest',
1818
            plural   => 'illrequests',
1818
            plural   => 'illrequests',
1819
            pk       => 'illrequest_id'
1819
            pk       => 'illrequest_id'
1820
        }
1820
        },
1821
        preservation_train_items => {
1822
            module   => 'Koha::Preservation::Train::Items',
1823
            singular => 'train_item',
1824
            plural   => 'train_items',
1825
            pk       => 'train_item_id'
1826
        },
1821
    };
1827
    };
1822
1828
1823
    foreach my $table ( keys %$tables ) {
1829
    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 166-171 Link Here
166
            - items.attributes
166
            - items.attributes
167
            - items.attributes+strings
167
            - items.attributes+strings
168
            - items.attributes.processing_attribute
168
            - items.attributes.processing_attribute
169
            - items.processing
169
            - default_processing
170
            - default_processing
170
            - default_processing.attributes
171
            - default_processing.attributes
171
        collectionFormat: csv
172
        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 4795-4800 DROP TABLE IF EXISTS `preservation_processings`; Link Here
4795
CREATE TABLE `preservation_processings` (
4795
CREATE TABLE `preservation_processings` (
4796
  `processing_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
4796
  `processing_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
4797
  `name` varchar(80) NOT NULL COMMENT 'name of the processing',
4797
  `name` varchar(80) NOT NULL COMMENT 'name of the processing',
4798
  `letter_code` varchar(20) DEFAULT NULL COMMENT 'Foreign key to the letters table',
4798
  PRIMARY KEY (`processing_id`)
4799
  PRIMARY KEY (`processing_id`)
4799
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4800
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4800
/*!40101 SET character_set_client = @saved_cs_client */;
4801
/*!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 24-29 Link Here
24
                            {{ processing.name }}
24
                            {{ processing.name }}
25
                        </span>
25
                        </span>
26
                    </li>
26
                    </li>
27
                    <li v-if="notice_template">
28
                        <label
29
                            >{{
30
                                $__("Letter template for printing slip")
31
                            }}:</label
32
                        >
33
                        <span>
34
                            {{ notice_template.name }}
35
                            <a
36
                                :href="`/cgi-bin/koha/tools/letter.pl?op=add_form&module=preservation&code=${notice_template.code}`"
37
                                ><i class="fa fa-edit"></i>
38
                                {{ $__("Edit this template") }}</a
39
                            >
40
                        </span>
41
                    </li>
27
                </ol>
42
                </ol>
28
            </fieldset>
43
            </fieldset>
29
            <fieldset class="rows">
44
            <fieldset class="rows">
Lines 77-90 export default { Link Here
77
        const { setConfirmationDialog, setMessage } = inject("mainStore")
92
        const { setConfirmationDialog, setMessage } = inject("mainStore")
78
93
79
        return {
94
        return {
95
            notice_templates,
80
            setConfirmationDialog,
96
            setConfirmationDialog,
81
            setMessage,
97
            setMessage,
82
        }
98
        }
83
    },
99
    },
100
    computed: {
101
        notice_template() {
102
            return this.notice_templates.find(
103
                n => n.id == this.processing.letter_code
104
            )
105
        },
106
    },
84
    data() {
107
    data() {
85
        return {
108
        return {
86
            processing: {
109
            processing: {
87
                processing_id: null,
110
                processing_id: null,
111
                letter_code: null,
88
                name: "",
112
                name: "",
89
                attributes: [],
113
                attributes: [],
90
            },
114
            },
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/components/Preservation/TrainsShow.vue (-2 / +32 lines)
Lines 437-442 export default { Link Here
437
                }
437
                }
438
            )
438
            )
439
        },
439
        },
440
        printSlip(train_item_id) {
441
            window.open(
442
                "/cgi-bin/koha/preservation/print_slip.pl?train_item_id=" +
443
                    train_item_id,
444
                "_blank"
445
            )
446
        },
440
        selectTrainForCopy(train_item_id) {
447
        selectTrainForCopy(train_item_id) {
441
            this.show_modal = true
448
            this.show_modal = true
442
            this.train_item_id_to_copy = train_item_id
449
            this.train_item_id_to_copy = train_item_id
Lines 469-474 export default { Link Here
469
            let item_table = this.item_table
476
            let item_table = this.item_table
470
            let removeItem = this.removeItem
477
            let removeItem = this.removeItem
471
            let editItem = this.editItem
478
            let editItem = this.editItem
479
            let printSlip = this.printSlip
472
            let selectTrainForCopy = this.selectTrainForCopy
480
            let selectTrainForCopy = this.selectTrainForCopy
473
            let train = this.train
481
            let train = this.train
474
482
Lines 481-488 export default { Link Here
481
                    var api = new $.fn.dataTable.Api(settings)
489
                    var api = new $.fn.dataTable.Api(settings)
482
                    $.each($(this).find("td.actions"), function (index, e) {
490
                    $.each($(this).find("td.actions"), function (index, e) {
483
                        let tr = $(this).parent()
491
                        let tr = $(this).parent()
484
                        let train_item_id = api.row(tr).data()
492
                        let train_item = api.row(tr).data().item
485
                            .item.train_item_id
493
                        let train_item_id = train_item.train_item_id
486
494
487
                        let editButton = createVNode(
495
                        let editButton = createVNode(
488
                            "a",
496
                            "a",
Lines 547-552 export default { Link Here
547
                            )
555
                            )
548
                        }
556
                        }
549
557
558
                        if (train_item.processing.letter_code !== null) {
559
                            let printButton = createVNode(
560
                                "a",
561
                                {
562
                                    class: "btn btn-default btn-xs",
563
                                    role: "button",
564
                                    onClick: () => {
565
                                        printSlip(train_item_id)
566
                                    },
567
                                },
568
                                [
569
                                    createVNode("i", {
570
                                        class: "fa fa-print",
571
                                        "aria-hidden": "true",
572
                                    }),
573
                                    __("Print slip"),
574
                                ]
575
                            )
576
                            buttons.push(" ")
577
                            buttons.push(printButton)
578
                        }
579
550
                        let n = createVNode("span", {}, buttons)
580
                        let n = createVNode("span", {}, buttons)
551
                        render(n, e)
581
                        render(n, e)
552
                    })
582
                    })
(-)a/koha-tmpl/intranet-tmpl/prog/js/vue/fetch/preservation-api-client.js (-1 / +1 lines)
Lines 23-29 export class PreservationAPIClient extends HttpClient { Link Here
23
                    endpoint: "trains/" + id,
23
                    endpoint: "trains/" + id,
24
                    headers: {
24
                    headers: {
25
                        "x-koha-embed":
25
                        "x-koha-embed":
26
                            "default_processing,default_processing.attributes,items,items.attributes,items.attributes+strings,items.attributes.processing_attribute",
26
                            "default_processing,default_processing.attributes,items,items.attributes,items.attributes+strings,items.attributes.processing_attribute,items.processing",
27
                    },
27
                    },
28
                }),
28
                }),
29
            getAll: (query = {}) =>
29
            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