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

(-)a/C4/Biblio.pm (+45 lines)
Lines 3183-3188 sub ModBiblioMarc { Link Here
3183
    $m_rs->metadata( $record->as_xml_record($encoding) );
3183
    $m_rs->metadata( $record->as_xml_record($encoding) );
3184
    $m_rs->store;
3184
    $m_rs->store;
3185
3185
3186
    UpdateItemsBundles($biblionumber, $record);
3187
3186
    ModZebra( $biblionumber, "specialUpdate", "biblioserver" );
3188
    ModZebra( $biblionumber, "specialUpdate", "biblioserver" );
3187
3189
3188
    return $biblionumber;
3190
    return $biblionumber;
Lines 3418-3423 sub RemoveAllNsb { Link Here
3418
    return $record;
3420
    return $record;
3419
}
3421
}
3420
3422
3423
=head2 UpdateItemsBundles
3424
3425
Remove from items bundle the items that were removed from the MARC record (keep
3426
the table in sync with the MARC record)
3427
3428
This is called by ModBiblio
3429
3430
    UpdateItemsBundles($biblionumber, $record)
3431
3432
=cut
3433
3434
sub UpdateItemsBundles {
3435
    my ($biblionumber, $record) = @_;
3436
3437
    my $schema = Koha::Database->new()->schema();
3438
    my $items_bundle_rs = $schema->resultset('ItemsBundle');
3439
    my $items_rs = $schema->resultset('Item');
3440
    my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblionumber });
3441
    return unless $items_bundle;
3442
3443
    my $tag = C4::Context->preference('marcflavour') eq 'UNIMARC' ? '462' : '774';
3444
    my @fields = $record->field($tag);
3445
    my %fields_by_itemnumber = map { (scalar $_->subfield('9')) // '' => $_ } @fields;
3446
3447
    foreach my $items_bundle_item ($items_bundle->items_bundle_items) {
3448
        my $itemnumber = $items_bundle_item->get_column('itemnumber');
3449
        if (not exists $fields_by_itemnumber{$itemnumber}) {
3450
            $items_bundle_item->itemnumber->update({ withdrawn => 0 });
3451
            $items_bundle_item->delete();
3452
        }
3453
    }
3454
3455
    my $items_count = $items_bundle->items_bundle_items->count();
3456
    # If bundle is empty, delete it
3457
    if ($items_count == 0) {
3458
        $items_bundle->delete();
3459
    }
3460
3461
    my $materials = $items_count || undef;
3462
    $items_rs->search({ biblionumber => $biblionumber })
3463
        ->update_all({ materials => $materials });
3464
}
3465
3421
1;
3466
1;
3422
3467
3423
3468
(-)a/C4/Items.pm (+6 lines)
Lines 468-473 sub GetItemsForInventory { Link Here
468
    my $minlocation  = $parameters->{'minlocation'}  // '';
468
    my $minlocation  = $parameters->{'minlocation'}  // '';
469
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
469
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
470
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
470
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
471
    my $items_bundle = $parameters->{'items_bundle'} // '';
471
    my $location     = $parameters->{'location'}     // '';
472
    my $location     = $parameters->{'location'}     // '';
472
    my $itemtype     = $parameters->{'itemtype'}     // '';
473
    my $itemtype     = $parameters->{'itemtype'}     // '';
473
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
474
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
Lines 513-518 sub GetItemsForInventory { Link Here
513
        push @bind_params, $max_cnsort;
514
        push @bind_params, $max_cnsort;
514
    }
515
    }
515
516
517
    if ($items_bundle) {
518
        push @where_strings, 'items.itemnumber IN (SELECT itemnumber FROM items_bundle_item WHERE items_bundle_id = ?)';
519
        push @bind_params, $items_bundle;
520
    }
521
516
    if ($datelastseen) {
522
    if ($datelastseen) {
517
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
523
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
518
        push @where_strings, '(datelastseen < ? OR datelastseen IS NULL)';
524
        push @where_strings, '(datelastseen < ? OR datelastseen IS NULL)';
(-)a/Koha/Template/Plugin/Biblio.pm (+9 lines)
Lines 63-66 sub CanArticleRequest { Link Here
63
    return $biblio ? $biblio->can_article_request( $borrower ) : 0;
63
    return $biblio ? $biblio->can_article_request( $borrower ) : 0;
64
}
64
}
65
65
66
sub IsItemsBundle {
67
    my ($self, $biblionumber) = @_;
68
69
    my $items_bundle_rs = Koha::Database->new()->schema()->resultset('ItemsBundle');
70
    my $count = $items_bundle_rs->search({ biblionumber => $biblionumber })->count;
71
72
    return $count > 0;
73
}
74
66
1;
75
1;
(-)a/admin/columns_settings.yml (+10 lines)
Lines 294-299 modules: Link Here
294
        -
294
        -
295
          columnname: checkin_on
295
          columnname: checkin_on
296
296
297
    items-bundle-contents:
298
      items-bundle-contents-table:
299
        - columnname: title
300
        - columnname: author
301
        - columnname: ccode
302
        - columnname: itemtype
303
        - columnname: callnumber
304
        - columnname: barcode
305
        - columnname: status
306
297
  cataloguing:
307
  cataloguing:
298
    additem:
308
    additem:
299
      itemst:
309
      itemst:
(-)a/catalogue/detail.pl (+10 lines)
Lines 43-54 use C4::CourseReserves qw(GetItemCourseReservesInfo); Link Here
43
use C4::Acquisition qw(GetOrdersByBiblionumber);
43
use C4::Acquisition qw(GetOrdersByBiblionumber);
44
use Koha::AuthorisedValues;
44
use Koha::AuthorisedValues;
45
use Koha::Biblios;
45
use Koha::Biblios;
46
use Koha::Database;
46
use Koha::Items;
47
use Koha::Items;
47
use Koha::ItemTypes;
48
use Koha::ItemTypes;
48
use Koha::Patrons;
49
use Koha::Patrons;
49
use Koha::Virtualshelves;
50
use Koha::Virtualshelves;
50
use Koha::Plugins;
51
use Koha::Plugins;
51
52
53
my $schema = Koha::Database->new()->schema();
54
52
my $query = CGI->new();
55
my $query = CGI->new();
53
56
54
my $analyze = $query->param('analyze');
57
my $analyze = $query->param('analyze');
Lines 382-387 foreach my $item (@items) { Link Here
382
        }
385
        }
383
    }
386
    }
384
387
388
    my $items_bundle_item = $schema->resultset('ItemsBundleItem')->find({ itemnumber => $item->{itemnumber} });
389
    if ($items_bundle_item) {
390
        $itemfields{items_bundle} = 1;
391
        $item->{items_bundle} = $items_bundle_item->items_bundle;
392
    }
393
385
    if ($currentbranch and C4::Context->preference('SeparateHoldings')) {
394
    if ($currentbranch and C4::Context->preference('SeparateHoldings')) {
386
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
395
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
387
            push @itemloop, $item;
396
            push @itemloop, $item;
Lines 418-423 $template->param( Link Here
418
    itemdata_publisheddate => $itemfields{publisheddate},
427
    itemdata_publisheddate => $itemfields{publisheddate},
419
    volinfo                => $itemfields{enumchron},
428
    volinfo                => $itemfields{enumchron},
420
        itemdata_itemnotes  => $itemfields{itemnotes},
429
        itemdata_itemnotes  => $itemfields{itemnotes},
430
    itemdata_items_bundle => $itemfields{items_bundle},
421
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
431
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
422
    z3950_search_params    => C4::Search::z3950_search_args($dat),
432
    z3950_search_params    => C4::Search::z3950_search_args($dat),
423
        hostrecords         => $hostrecords,
433
        hostrecords         => $hostrecords,
(-)a/catalogue/items-bundle-contents.pl (+53 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
use Modern::Perl;
19
20
use CGI qw(-utf8);
21
use C4::Auth;
22
use C4::Output;
23
24
use Koha::Database;
25
use Koha::Biblios;
26
use Koha::Items;
27
28
my $schema = Koha::Database->new()->schema();
29
30
my $cgi = CGI->new();
31
32
my ($template, $borrowernumber, $cookie) = get_template_and_user({
33
    template_name => 'catalogue/items-bundle-contents.tt',
34
    query => $cgi,
35
    type => 'intranet',
36
    authnotrequired => 0,
37
    flagsrequired => { catalogue => 1 },
38
});
39
40
my $biblionumber = $cgi->param('biblionumber');
41
my $biblio = Koha::Biblios->find($biblionumber);
42
43
my $items_bundle_rs = $schema->resultset('ItemsBundle');
44
my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblionumber });
45
my @items = map { scalar Koha::Items->find($_->get_column('itemnumber')) } $items_bundle->items_bundle_items;
46
47
$template->param(
48
    biblionumber => $biblionumber,
49
    biblio => $biblio,
50
    items => \@items,
51
);
52
53
output_html_with_http_headers $cgi, $cookie, $template->output;
(-)a/cataloguing/linkelements.pl (+144 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
use Modern::Perl;
19
20
use CGI qw ( -utf8 );
21
use Encode;
22
use List::MoreUtils qw/uniq/;
23
use MARC::Record;
24
25
use Koha::Biblios;
26
use Koha::Items;
27
use Koha::Database;
28
29
use C4::Auth;
30
use C4::Output;
31
use C4::Biblio;
32
use C4::Context;
33
use C4::Items;
34
35
my $cgi = new CGI;
36
37
my ($template, $loggedinuser, $cookie) = get_template_and_user({
38
    template_name => 'cataloguing/linkelements.tt',
39
    query => $cgi,
40
    type => 'intranet',
41
    authnotrequired => 0,
42
    flagsrequired => { editcatalogue => 'edit_catalogue' },
43
});
44
45
my $biblionumber = $cgi->param('biblionumber');
46
my $sessionId = $cgi->cookie('CGISESSID');
47
my $session = C4::Auth::get_session($sessionId);
48
my $schema = Koha::Database->new()->schema();
49
my $items_bundle_rs = $schema->resultset('ItemsBundle');
50
my $items_bundle_item_rs = $schema->resultset('ItemsBundleItem');
51
52
if ($cgi->request_method() eq 'POST') {
53
    my $barcodelist = $cgi->param('barcodelist');
54
    my $withdrawn = $cgi->param('withdrawn');
55
    my @barcodes = uniq( split(/\s*\n\s*/, $barcodelist) );
56
    my @items;
57
    my @notfound_barcodes;
58
    my @found_barcodes;
59
    my @alreadylinked_barcodes;
60
    foreach my $barcode (@barcodes) {
61
        my $item = Koha::Items->find( { barcode => $barcode } );
62
        if ($item) {
63
            my $items_bundle_item = $items_bundle_item_rs->find({ itemnumber => $item->itemnumber });
64
            if ($items_bundle_item && $items_bundle_item->items_bundle->get_column('biblionumber') ne $biblionumber) {
65
                # This item is already linked to another biblio
66
                push @alreadylinked_barcodes, $barcode
67
            } else {
68
                push @items, $item;
69
                push @found_barcodes, $barcode;
70
            }
71
        } else {
72
            push @notfound_barcodes, $barcode;
73
        }
74
    }
75
76
    if (@items) {
77
        my $biblio = Koha::Biblios->find($biblionumber);
78
        my $record = GetMarcBiblio({ biblionumber => $biblionumber });
79
        my $tag = C4::Context->preference('marcflavour') eq 'UNIMARC' ? '462' : '774';
80
        foreach my $item (@items) {
81
            # Remove fields that references the same itemnumber
82
            # to avoid duplicates
83
            my @fields = $record->field($tag);
84
            my @duplicate_fields = grep {
85
                $_->subfield('9') eq $item->itemnumber;
86
            } @fields;
87
            $record->delete_fields(@duplicate_fields);
88
89
            my $field = MARC::Field->new($tag, '', '',
90
                't' => $item->biblio->title,
91
                '0' => $item->biblionumber,
92
                '9' => $item->itemnumber);
93
            $record->insert_fields_ordered($field);
94
95
            my $items_bundle = $items_bundle_rs->find_or_create({ biblionumber => $biblionumber });
96
            $items_bundle_item_rs->find_or_create({
97
                items_bundle_id => $items_bundle->items_bundle_id,
98
                itemnumber => $item->itemnumber,
99
            });
100
101
            if (defined $withdrawn and $withdrawn ne '') {
102
                $item->withdrawn($withdrawn)->store();
103
            }
104
        }
105
        ModBiblio($record, $biblionumber, $biblio->frameworkcode);
106
    }
107
108
    # Store barcodes in the session to display messages after the redirect
109
    $session->param('linkelements_notfound_barcodes', \@notfound_barcodes);
110
    $session->param('linkelements_found_barcodes', \@found_barcodes);
111
    $session->param('linkelements_alreadylinked_barcodes', \@alreadylinked_barcodes);
112
    $session->flush();
113
114
    print $cgi->redirect('/cgi-bin/koha/cataloguing/linkelements.pl?biblionumber=' . $biblionumber);
115
    exit;
116
}
117
118
my @notfound_barcodes = map {
119
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
120
} @{ $session->param('linkelements_notfound_barcodes') // [] };
121
122
my @found_barcodes = map {
123
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
124
} @{ $session->param('linkelements_found_barcodes') // [] };
125
126
my @alreadylinked_barcodes = map {
127
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
128
} @{ $session->param('linkelements_alreadylinked_barcodes') // [] };
129
130
$session->clear([
131
    'linkelements_notfound_barcodes',
132
    'linkelements_found_barcodes',
133
    'linkelements_alreadylinked_barcodes',
134
]);
135
$session->flush();
136
137
$template->param(
138
    biblionumber => $biblionumber,
139
    notfound_barcodes => \@notfound_barcodes,
140
    found_barcodes => \@found_barcodes,
141
    alreadylinked_barcodes => \@alreadylinked_barcodes,
142
);
143
144
output_html_with_http_headers $cgi, $cookie, $template->output;
(-)a/circ/returns.pl (+31 lines)
Lines 287-292 if ($barcode) { Link Here
287
            additional_materials => $materials,
287
            additional_materials => $materials,
288
            issue            => $checkout,
288
            issue            => $checkout,
289
        );
289
        );
290
291
        my $items_bundle_rs = Koha::Database->new->schema->resultset('ItemsBundle');
292
        my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblio->biblionumber });
293
        if ($items_bundle) {
294
            my @items_bundle_items = map {
295
                scalar Koha::Items->find($_->get_column('itemnumber'))
296
            } $items_bundle->items_bundle_items;
297
298
            my $confirm = $query->param('confirm_items_bundle_return');
299
            unless ($confirm) {
300
                $template->param(
301
                    items_bundle_return_confirmation => 1,
302
                    items_bundle_items => \@items_bundle_items,
303
                );
304
305
                output_html_with_http_headers $query, $cookie, $template->output;
306
                exit;
307
            }
308
309
            my $mark_missing_items_as_lost = $query->param('confirm_items_bundle_mark_missing_items_as_lost');
310
            if ($mark_missing_items_as_lost) {
311
                my $barcodes = $query->param('verify-items-bundle-contents-barcodes');
312
                my $lost = $query->param('verify-items-bundle-contents-lost');
313
                my @barcodes = map { s/^\s+|\s+$//gr } (split /\n/, $barcodes);
314
                foreach my $item (@items_bundle_items) {
315
                    unless (grep { $_ eq $item->barcode } @barcodes) {
316
                        $item->itemlost($lost)->store();
317
                    }
318
                }
319
            }
320
        }
290
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
321
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
291
322
292
    my %input = (
323
    my %input = (
(-)a/installer/data/mysql/atomicupdate/bug-24023-items-bundles.perl (+37 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{
4
        CREATE TABLE IF NOT EXISTS items_bundle (
5
            items_bundle_id SERIAL,
6
            biblionumber INT NOT NULL,
7
            CONSTRAINT pk_items_bundle_items_bundle_id
8
                PRIMARY KEY (items_bundle_id),
9
            CONSTRAINT fk_items_bundle_biblio_biblionumber
10
                FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber)
11
                ON DELETE CASCADE ON UPDATE CASCADE,
12
            CONSTRAINT uniq_items_bundle_biblionumber
13
                UNIQUE KEY (biblionumber)
14
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
15
    });
16
17
    $dbh->do(q{
18
        CREATE TABLE IF NOT EXISTS items_bundle_item (
19
            items_bundle_item_id SERIAL,
20
            items_bundle_id BIGINT UNSIGNED NOT NULL,
21
            itemnumber INT NOT NULL,
22
            CONSTRAINT pk_items_bundle_item_items_bundle_item_id
23
                PRIMARY KEY (items_bundle_item_id),
24
            CONSTRAINT fk_items_bundle_item_itemnumber
25
                FOREIGN KEY (itemnumber) REFERENCES items (itemnumber)
26
                ON DELETE CASCADE ON UPDATE CASCADE,
27
            CONSTRAINT fk_items_bundle_item_items_bundle_id
28
                FOREIGN KEY (items_bundle_id) REFERENCES items_bundle (items_bundle_id)
29
                ON DELETE CASCADE ON UPDATE CASCADE,
30
            CONSTRAINT uniq_items_bundle_item_itemnumber
31
                UNIQUE KEY (itemnumber)
32
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
33
    });
34
35
    SetVersion( $DBversion );
36
    print "Upgrade to $DBversion done (Bug 24023 - Items bundles)\n";
37
}
(-)a/installer/data/mysql/kohastructure.sql (+38 lines)
Lines 4420-4425 CREATE TABLE return_claims ( Link Here
4420
    CONSTRAINT `rc_resolved_by_ibfk` FOREIGN KEY (`resolved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
4420
    CONSTRAINT `rc_resolved_by_ibfk` FOREIGN KEY (`resolved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
4421
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4421
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4422
4422
4423
--
4424
-- Table structure for table items_bundle
4425
--
4426
4427
DROP TABLE IF EXISTS items_bundle;
4428
CREATE TABLE items_bundle (
4429
    items_bundle_id SERIAL,
4430
    biblionumber INT NOT NULL,
4431
    CONSTRAINT pk_items_bundle_items_bundle_id
4432
        PRIMARY KEY (items_bundle_id),
4433
    CONSTRAINT fk_items_bundle_biblio_biblionumber
4434
        FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber)
4435
        ON DELETE CASCADE ON UPDATE CASCADE,
4436
    CONSTRAINT uniq_items_bundle_biblionumber
4437
        UNIQUE KEY (biblionumber)
4438
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4439
4440
--
4441
-- Table structure for table items_bundle_item
4442
--
4443
4444
DROP TABLE IF EXISTS items_bundle_item;
4445
CREATE TABLE items_bundle_item (
4446
    items_bundle_item_id SERIAL,
4447
    items_bundle_id BIGINT UNSIGNED NOT NULL,
4448
    itemnumber INT NOT NULL,
4449
    CONSTRAINT pk_items_bundle_item_items_bundle_item_id
4450
        PRIMARY KEY (items_bundle_item_id),
4451
    CONSTRAINT fk_items_bundle_item_itemnumber
4452
        FOREIGN KEY (itemnumber) REFERENCES items (itemnumber)
4453
        ON DELETE CASCADE ON UPDATE CASCADE,
4454
    CONSTRAINT fk_items_bundle_item_items_bundle_id
4455
        FOREIGN KEY (items_bundle_id) REFERENCES items_bundle (items_bundle_id)
4456
        ON DELETE CASCADE ON UPDATE CASCADE,
4457
    CONSTRAINT uniq_items_bundle_item_itemnumber
4458
        UNIQUE KEY (itemnumber)
4459
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4460
4423
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4461
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4424
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4462
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4425
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
4463
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/biblio-view-menu.inc (+7 lines)
Lines 1-5 Link Here
1
[% USE Koha %]
1
[% USE Koha %]
2
[% USE Biblio %]
2
[% USE Biblio %]
3
[% PROCESS 'i18n.inc' %]
3
[% SET biblio_object_id = object || biblionumber || biblio.biblionumber %]
4
[% SET biblio_object_id = object || biblionumber || biblio.biblionumber %]
4
5
5
<div id="menu">
6
<div id="menu">
Lines 41-45 Link Here
41
<a href="/cgi-bin/koha/catalogue/issuehistory.pl?biblionumber=[% biblio_object_id | url  %]" >Checkout history</a></li>
42
<a href="/cgi-bin/koha/catalogue/issuehistory.pl?biblionumber=[% biblio_object_id | url  %]" >Checkout history</a></li>
42
[% IF ( CAN_user_tools_view_system_logs ) %][% IF ( logview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/tools/viewlog.pl?do_it=1&amp;modules=CATALOGUING&amp;action=MODIFY&amp;object=[% biblio_object_id | url  %]&amp;object_type=biblio">Modification log</a> </li>[% END %]
43
[% IF ( CAN_user_tools_view_system_logs ) %][% IF ( logview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/tools/viewlog.pl?do_it=1&amp;modules=CATALOGUING&amp;action=MODIFY&amp;object=[% biblio_object_id | url  %]&amp;object_type=biblio">Modification log</a> </li>[% END %]
43
[% IF ( CAN_user_stockrotation_manage_rota_items && Koha.Preference('StockRotation') ) %][% IF ( stockrotationview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/catalogue/stockrotation.pl?biblionumber=[% biblio_object_id | uri %]">Rota</a> </li>[% END %]
44
[% IF ( CAN_user_stockrotation_manage_rota_items && Koha.Preference('StockRotation') ) %][% IF ( stockrotationview ) %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/catalogue/stockrotation.pl?biblionumber=[% biblio_object_id | uri %]">Rota</a> </li>[% END %]
45
46
[% IF Biblio.IsItemsBundle(biblio_object_id) %]
47
    [% IF items_bundle_contents_view %]<li class="active">[% ELSE %]<li>[% END %]
48
        <a href="/cgi-bin/koha/catalogue/items-bundle-contents.pl?biblionumber=[% biblio_object_id | uri %]">[% t('Item bundle contents') | html %]</a>
49
    </li>
50
[% END %]
44
</ul>
51
</ul>
45
</div>
52
</div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc (+1 lines)
Lines 62-67 CAN_user_serials_create_subscription ) %] Link Here
62
62
63
            [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]
63
            [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]
64
                <li><a id="duplicatebiblio" href="/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% biblionumber | html %]&amp;op=duplicate">Edit as new (duplicate)</a></li>
64
                <li><a id="duplicatebiblio" href="/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% biblionumber | html %]&amp;op=duplicate">Edit as new (duplicate)</a></li>
65
                <li><a id="linkelements" href="/cgi-bin/koha/cataloguing/linkelements.pl?biblionumber=[% biblionumber | html %]&amp;frameworkcode=[% current_framework | html %]">Link elements</a></li>
65
                <li><a href="#" id="z3950copy">Replace record via Z39.50/SRU</a></li>
66
                <li><a href="#" id="z3950copy">Replace record via Z39.50/SRU</a></li>
66
            [% END %]
67
            [% END %]
67
68
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/item-status.inc (+84 lines)
Line 0 Link Here
1
[% USE AuthorisedValues %]
2
[% USE Branches %]
3
[% USE Koha %]
4
[% USE KohaDates %]
5
[% PROCESS 'i18n.inc' %]
6
[% transfer = item.get_transfer() %]
7
[% IF item.checkout %]
8
    <span class="datedue">
9
        [% IF item.checkout.onsite_checkout %]
10
            [% t('Currently in local use by') | html %]
11
        [% ELSE %]
12
            [% t('Checked out to') | html %]
13
        [% END %]
14
        [% INCLUDE 'patron-title.inc' patron=item.checkout.patron hide_patron_infos_if_needed=1 %]
15
        : [% tx('due {date_due}', { date_due = item.checkout.date_due }) | html %]
16
    </span>
17
[% ELSIF transfer %]
18
    [% datesent = BLOCK %][% transfer.datesent | $KohaDates %][% END %]
19
    <span class="intransit">[% tx('In transit from {frombranch} to {tobranch} since {datesent}', { frombranch = Branches.GetName(transfer.frombranch), tobranch = Branches.GetName(transfer.tobranch), datesent = datesent }) %]</span>
20
[% END %]
21
22
[% IF item.itemlost %]
23
    [% itemlost_description = AuthorisedValues.GetDescriptionByKohaField({ kohafield = 'items.itemlost', authorised_value = item.itemlost }) %]
24
    [% IF itemlost_description %]
25
        <span class="lost">[% itemlost_description | html %]</span>
26
    [% ELSE %]
27
        <span class="lost">[% t('Unavailable (lost or missing)') | html %]</span>
28
    [% END %]
29
[% END %]
30
31
[% IF item.withdrawn %]
32
    [% withdrawn_description = AuthorisedValues.GetDescriptionByKohaField({ kohafield = 'items.withdrawn', authorised_value = item.withdrawn }) %]
33
    [% IF withdrawn_description %]
34
        <span class="wdn">[% withdrawn_description | html %]</span>
35
    [% ELSE %]
36
        <span class="wdn">[% t('Withdrawn') | html %]</span>
37
    [% END %]
38
[% END %]
39
40
[% IF item.damaged %]
41
    [% damaged_description = AuthorisedValues.GetDescriptionByKohaField({ kohafield = 'items.damaged', authorised_value = item.damaged }) %]
42
    [% IF damaged_description %]
43
        <span class="dmg">[% damaged_description | html %]</span>
44
    [% ELSE %]
45
        <span class="dmg">[% t('Damaged') | html %]</span>
46
    [% END %]
47
[% END %]
48
49
[% IF item.notforloan || item.effective_itemtype.notforloan %]
50
    <span>
51
        [% t('Not for loan') | html %]
52
        [% notforloan_description = AuthorisedValues.GetDescriptionByKohaField({ kohafield = 'items.notforloan', authorised_value = item.notforloan }) %]
53
        [% IF notforloan_description %]
54
            ([% notforloan_description | html %])
55
        [% END %]
56
    </span>
57
[% END %]
58
59
[% hold = item.holds.next %]
60
[% IF hold %]
61
    <span>
62
        [% IF hold.waitingdate %]
63
            Waiting at [% Branches.GetName(hold.get_column('branchcode')) | html %] since [% hold.waitingdate | $KohaDates %].
64
        [% ELSE %]
65
            Item-level hold (placed [% hold.reservedate | $KohaDates %]) for delivery at [% Branches.GetName(hold.get_column('branchcode')) | html %].
66
        [% END %]
67
        [% IF Koha.Preference('canreservefromotherbranches') %]
68
            [% t('Hold for:') | html %]
69
            [% INCLUDE 'patron-title.inc' patron=hold.borrower hide_patron_infos_if_needed=1 %]
70
        [% END %]
71
    </span>
72
[% END %]
73
[% UNLESS item.notforloan || item.effective_itemtype.notforloan || item.onloan || item.itemlost || item.withdrawn || item.damaged || transfer || hold %]
74
    <span>[% t('Available') | html %]</span>
75
[% END %]
76
77
[% IF ( item.restricted ) %]
78
    [% restricted_description = AuthorisedValues.GetDescriptionByKohaField({ kohafield = 'items.restricted', authorised_value = item.restricted }) %]
79
    [% IF restricted_description %]
80
        <span class="restricted">([% restricted_description | html %])</span>
81
    [% ELSE %]
82
        <span class="restricted">[% t('Restricted') | html %]</span>
83
    [% END %]
84
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt (+9 lines)
Lines 249-254 Link Here
249
                [% IF ( hostrecords ) %]<th>Host records</th>[% END %]
249
                [% IF ( hostrecords ) %]<th>Host records</th>[% END %]
250
                [% IF ( analyze ) %]<th>Used in</th><th></th>[% END %]
250
                [% IF ( analyze ) %]<th>Used in</th><th></th>[% END %]
251
                [% IF ( ShowCourseReserves ) %]<th>Course Reserves</th>[% END %]
251
                [% IF ( ShowCourseReserves ) %]<th>Course Reserves</th>[% END %]
252
                [% IF itemdata_items_bundle %]<th>Items bundle</th>[% END %]
252
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th class="NoSort">Spine label</th>[% END %]
253
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th class="NoSort">Spine label</th>[% END %]
253
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th class="NoSort">&nbsp;</th>[% END %]
254
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th class="NoSort">&nbsp;</th>[% END %]
254
            </tr>
255
            </tr>
Lines 458-463 Note that permanent location is a code, and location may be an authval. Link Here
458
                    </td>
459
                    </td>
459
                [% END %]
460
                [% END %]
460
461
462
                [% IF itemdata_items_bundle %]
463
                    <td>
464
                        [% INCLUDE 'biblio-default-view.inc' biblionumber = item.items_bundle.biblionumber.biblionumber %]
465
                            [% item.items_bundle.biblionumber.title | html %]
466
                        </a>
467
                    </td>
468
                [% END %]
469
461
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
470
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
462
                    <td><a class="btn btn-default btn-xs print-label" href="/cgi-bin/koha/labels/spinelabel-print.pl?barcode=[% item.barcode | uri %]"><i class="fa fa-print"></i> Print label</a></td>
471
                    <td><a class="btn btn-default btn-xs print-label" href="/cgi-bin/koha/labels/spinelabel-print.pl?barcode=[% item.barcode | uri %]"><i class="fa fa-print"></i> Print label</a></td>
463
                [% END %]
472
                [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/items-bundle-contents.tt (+79 lines)
Line 0 Link Here
1
[% USE raw %]
2
[% USE Asset %]
3
[% USE AuthorisedValues %]
4
[% USE ItemTypes %]
5
[% USE ColumnsSettings %]
6
7
[% INCLUDE 'doc-head-open.inc' %]
8
<title>Koha &rsaquo; Catalog &rsaquo; Items bundle contents for [% INCLUDE 'biblio-title-head.inc' %]</title>
9
[% INCLUDE 'doc-head-close.inc' %]
10
</head>
11
12
<body id="catalog_items_bundle_contents" class="catalog">
13
14
[% INCLUDE 'header.inc' %]
15
[% INCLUDE 'cat-search.inc' %]
16
17
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/catalogue/search.pl">Catalog</a>  &rsaquo; Items bundle contents for <i>[% INCLUDE 'biblio-title.inc' %]</i></div>
18
19
<div class="main container-fluid">
20
    <div class="row">
21
        <div class="col-sm-10 col-sm-push-2">
22
            [% INCLUDE 'cat-toolbar.inc' %]
23
24
            <h1>Items bundle contents for [% INCLUDE 'biblio-title.inc' %]</h1>
25
26
            <main>
27
                <table id="items-bundle-contents-table">
28
                    <thead>
29
                        <tr>
30
                            <th>Title</th>
31
                            <th>Author</th>
32
                            <th>Collection code</th>
33
                            <th>Item type</th>
34
                            <th>Callnumber</th>
35
                            <th>Barcode</th>
36
                            <th>Status</th>
37
                        </tr>
38
                    </thead>
39
                    <tbody>
40
                        [% FOREACH item IN items %]
41
                            <tr>
42
                                <td>[% INCLUDE 'biblio-default-view.inc' biblionumber=item.biblionumber %][% INCLUDE 'biblio-title.inc' biblio=item.biblio %]</a></td>
43
                                <td>[% item.biblio.author | html %]</td>
44
                                <td>[% AuthorisedValues.GetByCode('CCODE', item.ccode) | html %]</td>
45
                                <td>[% ItemTypes.GetDescription(item.itype) | html %]</td>
46
                                <td>[% item.itemcallnumber | html %]</td>
47
                                <td>[% item.barcode | html %]</td>
48
                                <td>[% INCLUDE 'item-status.inc' item=item %]</td>
49
                            </tr>
50
                        [% END %]
51
                    </tbody>
52
                </table>
53
            </main>
54
        </div>
55
56
        <div class="col-sm-2 col-sm-pull-10">
57
            <aside>
58
                [% INCLUDE 'biblio-view-menu.inc' items_bundle_contents_view = 1 %]
59
            </aside>
60
        </div>
61
     </div>
62
63
    [% Asset.js('js/table_filters.js') | $raw %]
64
    [% Asset.js('lib/jquery/plugins/jquery.dataTables.columnFilter.js') | $raw %]
65
    [% INCLUDE 'datatables.inc' %]
66
    [% INCLUDE 'columns_settings.inc' %]
67
    <script>
68
        $(document).ready(function () {
69
            var columns_settings = [% ColumnsSettings.GetColumns('catalogue', 'items-bundle-contents', 'items-bundle-contents-table', 'json') | $raw %];
70
            KohaTable('items-bundle-contents-table', {
71
                dom: '<"pager"<"table_entries"ilp><"table_controls"B>>tr',
72
                pagingType: 'full',
73
                autoWidth: false,
74
            }, columns_settings, true);
75
            activate_filters('items-bundle-contents-table');
76
        });
77
    </script>
78
79
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/linkelements.tt (+91 lines)
Line 0 Link Here
1
[% USE AuthorisedValues %]
2
[% PROCESS 'i18n.inc' %]
3
[% INCLUDE 'doc-head-open.inc' %]
4
<title>Link elements together</title>
5
[% INCLUDE 'doc-head-close.inc' %]
6
</head>
7
<body id="tools_batchMod" class="tools">
8
[% INCLUDE 'header.inc' %]
9
[% INCLUDE 'cat-search.inc' %]
10
11
<div id="breadcrumbs">
12
    <a href="/cgi-bin/koha/mainpage.pl">[% t('Home') | html %]</a> &rsaquo;
13
    <a href="/cgi-bin/koha/cataloguing/addbooks.pl">[% t('Cataloguing') | html %]</a> &rsaquo;
14
    [% t('Link elements to the biblio') | html %]
15
</div>
16
17
[% BLOCK barcodes_table %]
18
    <table>
19
        <thead>
20
            <tr>
21
                <th>[% t('Barcode') | html %]</th>
22
            </tr>
23
        </thead>
24
        <tbody>
25
            [% FOREACH barcode IN barcodes %]
26
                <tr>
27
                    <td>[% barcode | html %]</td>
28
                </tr>
29
            [% END %]
30
        </tbody>
31
    </table>
32
[% END %]
33
34
<div class="main container-fluid">
35
    <div class="row">
36
        <div class="col-sm-10 col-sm-push-2">
37
            <main>
38
                <h1>[% t('Link elements to the biblio') | html %]</h1>
39
40
                [% IF ( notfound_barcodes ) %]
41
                    <div class="dialog alert">
42
                        <p>[% t('Warning: the following barcodes were not found:') | html %]</p>
43
                        [% PROCESS barcodes_table barcodes = notfound_barcodes %]
44
                    </div>
45
                [% END %]
46
47
                [% IF ( alreadylinked_barcodes ) %]
48
                    <div class="dialog alert">
49
                        <p>[% t('Warning: the following barcodes are already linked to another biblio') | html %]</p>
50
                        [% PROCESS barcodes_table barcodes = alreadylinked_barcodes %]
51
                    </div>
52
                [% END %]
53
54
                [% IF found_barcodes %]
55
                    <div class="dialog message">
56
                        <p>[% t('The following barcodes were linked:') | html %]</p>
57
58
                        [% PROCESS barcodes_table barcodes = found_barcodes %]
59
                    </div>
60
                [% END %]
61
62
                <form method="post" action="/cgi-bin/koha/cataloguing/linkelements.pl">
63
                    <fieldset class="rows">
64
                        <legend>[% t('Items') | html %]</legend>
65
                        <ol>
66
                            <li>
67
                              <label for="barcodelist">[% t('Barcode list (one barcode per line):') | html %] </label>
68
                              <textarea rows="10" cols="30" id="barcodelist" name="barcodelist"></textarea>
69
                            </li>
70
                            <li>
71
                                <label for="withdrawn">[% t('Change withdrawn status to') | html %]</label>
72
                                <select id="withdrawn" name="withdrawn">
73
                                    <option value=""></option>
74
                                    [% FOREACH av IN AuthorisedValues.Get('WITHDRAWN') %]
75
                                        <option value="[% av.authorised_value | html %]">[% av.lib | html %]</option>
76
                                    [% END %]
77
                                </select>
78
                            </li>
79
                        </ol>
80
                        <input type="hidden" name="biblionumber" value="[% biblionumber | html %]" />
81
                    </fieldset>
82
83
                    <fieldset class="action">
84
                        <input type="submit" value="Continue" class="button" />
85
                        <a class="cancel" href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% biblionumber | url %]">Cancel</a>
86
                    </fieldset>
87
                </form>
88
            </main>
89
        </div>
90
    </div>
91
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (+92 lines)
Lines 6-11 Link Here
6
[% USE ItemTypes %]
6
[% USE ItemTypes %]
7
[% USE AuthorisedValues %]
7
[% USE AuthorisedValues %]
8
[% USE ColumnsSettings %]
8
[% USE ColumnsSettings %]
9
[% PROCESS 'i18n.inc' %]
9
[% SET footerjs = 1 %]
10
[% SET footerjs = 1 %]
10
[% BLOCK display_bormessagepref %]
11
[% BLOCK display_bormessagepref %]
11
    [% IF ( bormessagepref ) %]
12
    [% IF ( bormessagepref ) %]
Lines 666-671 Link Here
666
                            [% INCLUDE all_checkin_messages %]
667
                            [% INCLUDE all_checkin_messages %]
667
                        </div>
668
                        </div>
668
669
670
                        [% IF items_bundle_return_confirmation %]
671
                            <div class="dialog alert">[% t('The returned item is an items bundle and needs confirmation') | html %]</div>
672
673
                            <table class="table table-condensed table-bordered" id="items-bundle-contents-table">
674
                                <thead>
675
                                    <tr>
676
                                        <th>[% t('Title') | html %]</th>
677
                                        <th>[% t('Author') | html %]</th>
678
                                        <th>[% t('Collection code') | html %]</th>
679
                                        <th>[% t('Item type') | html %]</th>
680
                                        <th>[% t('Callnumber') | html %]</th>
681
                                        <th>[% t('Barcode') | html %]</th>
682
                                        <th>[% t('Status') | html %]</th>
683
                                    </tr>
684
                                </thead>
685
                                <tbody>
686
                                    [% FOREACH item IN items_bundle_items %]
687
                                        <tr data-barcode="[% item.barcode | html %]">
688
                                            <td>[% INCLUDE 'biblio-default-view.inc' biblionumber=item.biblionumber %][% INCLUDE 'biblio-title.inc' biblio=item.biblio %]</a></td>
689
                                            <td>[% item.biblio.author | html %]</td>
690
                                            <td>[% AuthorisedValues.GetByCode('CCODE', item.ccode) | html %]</td>
691
                                            <td>[% ItemTypes.GetDescription(item.itype) | html %]</td>
692
                                            <td>[% item.itemcallnumber | html %]</td>
693
                                            <td>[% item.barcode | html %]</td>
694
                                            <td>[% INCLUDE 'item-status.inc' item=item %]</td>
695
                                        </tr>
696
                                    [% END %]
697
                                </tbody>
698
                            </table>
699
700
                            <div id="items-bundle-confirmation-action">
701
                                <form method="post">
702
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
703
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
704
                                    <button class="btn btn-default" type="submit"><i class="fa fa-check"></i> [% t('Confirm checkin without verifying') | html %]</button>
705
                                </form>
706
707
                                <button id="verify-items-bundle-contents-button" class="btn btn-default">[% t('Verify items bundle contents') | html %]</button>
708
                            </div>
709
710
                            <div id="verify-items-bundle-contents-form-wrapper">
711
                                <form method="post">
712
                                    <div class="form-group">
713
                                        <label for="verify-items-bundle-contents-barcodes">Barcodes</label>
714
                                        <textarea autocomplete="off" id="verify-items-bundle-contents-barcodes" name="verify-items-bundle-contents-barcodes" class="form-control"></textarea>
715
                                        <div class="help-block">[% t('Scan barcodes found in the items bundle and compare it to the table above') | html %]</div>
716
                                    </div>
717
718
                                    <div class="form-group">
719
                                        <label for="verify-items-bundle-contents-lost">[% t('Lost status') | html %]</label>
720
                                        <select id="verify-items-bundle-contents-lost" name="verify-items-bundle-contents-lost" class="form-control">
721
                                            [% FOREACH av IN AuthorisedValues.Get('LOST') %]
722
                                                <option value="[% av.authorised_value | html %]">[% av.lib | html %]</option>
723
                                            [% END %]
724
                                        </select>
725
                                        <div class="help-block">[% t('If some items are missing, they will be marked as lost with this status') | html %]</div>
726
                                    </div>
727
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
728
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
729
                                    <input type="hidden" name="confirm_items_bundle_mark_missing_items_as_lost" value="1">
730
                                    <button type="submit" class="btn btn-default"><i class="fa fa-check"></i> [% t('Confirm checkin and mark missing items as lost') | html %]</button>
731
                                    <button type="button" class="btn btn-default" id="verify-items-bundle-contents-cancel-button"><i class="fa fa-close"></i> [% t('Cancel') | html %]</button>
732
                                </form>
733
                            </div>
734
                        [% END %]
735
669
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
736
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
670
                            <fieldset id="circ_returns_checkin">
737
                            <fieldset id="circ_returns_checkin">
671
                                <div class="show_checkin_dialog" style="float:right;display:none"><button type="button" class="btn btn-default btn-sm" data-toggle="tooltip" title="Show the last checkin message"><i class="fa fa-info"></i></button></div>
738
                                <div class="show_checkin_dialog" style="float:right;display:none"><button type="button" class="btn btn-default btn-sm" data-toggle="tooltip" title="Show the last checkin message"><i class="fa fa-info"></i></button></div>
Lines 1078-1083 Link Here
1078
            $('[data-toggle="tooltip"]').tooltip();
1145
            $('[data-toggle="tooltip"]').tooltip();
1079
        });
1146
        });
1080
    </script>
1147
    </script>
1148
1149
    <script>
1150
        $(document).ready(function () {
1151
            $('#verify-items-bundle-contents-form-wrapper').hide();
1152
            $('#verify-items-bundle-contents-button').on('click', function () {
1153
                $('#verify-items-bundle-contents-form-wrapper').show();
1154
                $('#items-bundle-confirmation-action').hide();
1155
            });
1156
            $('#verify-items-bundle-contents-cancel-button').on('click', function () {
1157
                $('#verify-items-bundle-contents-form-wrapper').hide();
1158
                $('#items-bundle-confirmation-action').show();
1159
            });
1160
            $('#verify-items-bundle-contents-barcodes').on('input', function (ev) {
1161
                const barcodes = ev.target.value.split('\n').map(function(s) { return s.trim() });
1162
                $('#items-bundle-contents-table tr').each(function () {
1163
                    const barcode = this.getAttribute('data-barcode');
1164
                    if (barcodes.includes(barcode)) {
1165
                        this.classList.add('ok');
1166
                    } else {
1167
                        this.classList.remove('ok');
1168
                    }
1169
                })
1170
            });
1171
        });
1172
    </script>
1081
[% END %]
1173
[% END %]
1082
1174
1083
[% INCLUDE 'intranet-bottom.inc' %]
1175
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tt (-1 / +19 lines)
Lines 93-98 Link Here
93
            [% END %]
93
            [% END %]
94
            </select>
94
            </select>
95
          </li>
95
          </li>
96
        [% IF items_bundles.size > 0 %]
97
            <li>
98
                <label for="items_bundle">Items bundle:</label>
99
                <select id="items_bundle" name="items_bundle">
100
                    <option value=""></option>
101
                    [% FOREACH items_bundle IN items_bundles %]
102
                        <option value="[% items_bundle.items_bundle_id | html %]">[% items_bundle.biblionumber.title | html %]</option>
103
                    [% END %]
104
                </select>
105
            </li>
106
        [% END %]
96
    </ol>
107
    </ol>
97
    </fieldset>
108
    </fieldset>
98
109
Lines 283-289 Link Here
283
                    $('#locationloop').val() ||
294
                    $('#locationloop').val() ||
284
                    $('#minlocation').val()  ||
295
                    $('#minlocation').val()  ||
285
                    $('#maxlocation').val()  ||
296
                    $('#maxlocation').val()  ||
286
                    $('#statuses input:checked').length
297
                    $('#statuses input:checked').length ||
298
                    $('#items_bundle').val()
287
                ) ) {
299
                ) ) {
288
                    return confirm(
300
                    return confirm(
289
                        _("You have not selected any catalog filters and are about to compare a file of barcodes to your entire catalog.") + "\n\n" +
301
                        _("You have not selected any catalog filters and are about to compare a file of barcodes to your entire catalog.") + "\n\n" +
Lines 402-407 Link Here
402
            });
414
            });
403
        });
415
        });
404
    </script>
416
    </script>
417
    [% INCLUDE 'select2.inc' %]
418
    <script>
419
        $(document).ready(function () {
420
            $('#items_bundle').select2();
421
        });
422
    </script>
405
[% END %]
423
[% END %]
406
424
407
[% INCLUDE 'intranet-bottom.inc' %]
425
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/tools/inventory.pl (-1 / +10 lines)
Lines 47-52 my $minlocation=$input->param('minlocation') || ''; Link Here
47
my $maxlocation=$input->param('maxlocation');
47
my $maxlocation=$input->param('maxlocation');
48
my $class_source=$input->param('class_source');
48
my $class_source=$input->param('class_source');
49
$maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
49
$maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
50
my $items_bundle = $input->param('items_bundle');
50
my $location=$input->param('location') || '';
51
my $location=$input->param('location') || '';
51
my $ignoreissued=$input->param('ignoreissued');
52
my $ignoreissued=$input->param('ignoreissued');
52
my $ignore_waiting_holds = $input->param('ignore_waiting_holds');
53
my $ignore_waiting_holds = $input->param('ignore_waiting_holds');
Lines 68-73 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
68
    }
69
    }
69
);
70
);
70
71
72
my $schema = Koha::Database->new()->schema();
73
my $items_bundle_rs = $schema->resultset('ItemsBundle');
74
my @items_bundles = $items_bundle_rs->search(undef, {
75
    order_by => { -asc => ['biblionumber.title'] },
76
    join => ['biblionumber'],
77
});
71
my @authorised_value_list;
78
my @authorised_value_list;
72
my $authorisedvalue_categories = '';
79
my $authorisedvalue_categories = '';
73
80
Lines 125-130 my $pref_class = C4::Context->preference("DefaultClassificationSource"); Link Here
125
132
126
$template->param(
133
$template->param(
127
    authorised_values        => \@authorised_value_list,
134
    authorised_values        => \@authorised_value_list,
135
    items_bundles            => \@items_bundles,
128
    today                    => dt_from_string,
136
    today                    => dt_from_string,
129
    minlocation              => $minlocation,
137
    minlocation              => $minlocation,
130
    maxlocation              => $maxlocation,
138
    maxlocation              => $maxlocation,
Lines 237-242 if ( $op && ( !$uploadbarcodes || $compareinv2barcd )) { Link Here
237
      minlocation  => $minlocation,
245
      minlocation  => $minlocation,
238
      maxlocation  => $maxlocation,
246
      maxlocation  => $maxlocation,
239
      class_source => $class_source,
247
      class_source => $class_source,
248
      items_bundle => $items_bundle,
240
      location     => $location,
249
      location     => $location,
241
      ignoreissued => $ignoreissued,
250
      ignoreissued => $ignoreissued,
242
      datelastseen => $datelastseen,
251
      datelastseen => $datelastseen,
Lines 254-259 if( @scanned_items ) { Link Here
254
      maxlocation  => $maxlocation,
263
      maxlocation  => $maxlocation,
255
      class_source => $class_source,
264
      class_source => $class_source,
256
      location     => $location,
265
      location     => $location,
266
      items_bundle => $items_bundle,
257
      ignoreissued => undef,
267
      ignoreissued => undef,
258
      datelastseen => undef,
268
      datelastseen => undef,
259
      branchcode   => $branchcode,
269
      branchcode   => $branchcode,
260
- 

Return to bug 24023