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

(-)a/C4/Biblio.pm (+45 lines)
Lines 3175-3180 sub ModBiblioMarc { Link Here
3175
    $m_rs->metadata( $record->as_xml_record($encoding) );
3175
    $m_rs->metadata( $record->as_xml_record($encoding) );
3176
    $m_rs->store;
3176
    $m_rs->store;
3177
3177
3178
    UpdateItemsBundles($biblionumber, $record);
3179
3178
    ModZebra( $biblionumber, "specialUpdate", "biblioserver" );
3180
    ModZebra( $biblionumber, "specialUpdate", "biblioserver" );
3179
3181
3180
    return $biblionumber;
3182
    return $biblionumber;
Lines 3430-3435 sub RemoveAllNsb { Link Here
3430
    return $record;
3432
    return $record;
3431
}
3433
}
3432
3434
3435
=head2 UpdateItemsBundles
3436
3437
Remove from items bundle the items that were removed from the MARC record (keep
3438
the table in sync with the MARC record)
3439
3440
This is called by ModBiblio
3441
3442
    UpdateItemsBundles($biblionumber, $record)
3443
3444
=cut
3445
3446
sub UpdateItemsBundles {
3447
    my ($biblionumber, $record) = @_;
3448
3449
    my $schema = Koha::Database->new()->schema();
3450
    my $items_bundle_rs = $schema->resultset('ItemsBundle');
3451
    my $items_rs = $schema->resultset('Item');
3452
    my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblionumber });
3453
    return unless $items_bundle;
3454
3455
    my $tag = C4::Context->preference('marcflavour') eq 'UNIMARC' ? '462' : '774';
3456
    my @fields = $record->field($tag);
3457
    my %fields_by_itemnumber = map { (scalar $_->subfield('9')) // '' => $_ } @fields;
3458
3459
    foreach my $items_bundle_item ($items_bundle->items_bundle_items) {
3460
        my $itemnumber = $items_bundle_item->get_column('itemnumber');
3461
        if (not exists $fields_by_itemnumber{$itemnumber}) {
3462
            $items_bundle_item->itemnumber->update({ withdrawn => 0, uri => undef });
3463
            $items_bundle_item->delete();
3464
        }
3465
    }
3466
3467
    my $items_count = $items_bundle->items_bundle_items->count();
3468
    # If bundle is empty, delete it
3469
    if ($items_count == 0) {
3470
        $items_bundle->delete();
3471
    }
3472
3473
    my $materials = $items_count || undef;
3474
    $items_rs->search({ biblionumber => $biblionumber })
3475
        ->update_all({ materials => $materials });
3476
}
3477
3433
1;
3478
1;
3434
3479
3435
3480
(-)a/C4/Items.pm (+6 lines)
Lines 746-751 sub GetItemsForInventory { Link Here
746
    my $minlocation  = $parameters->{'minlocation'}  // '';
746
    my $minlocation  = $parameters->{'minlocation'}  // '';
747
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
747
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
748
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
748
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
749
    my $items_bundle = $parameters->{'items_bundle'} // '';
749
    my $location     = $parameters->{'location'}     // '';
750
    my $location     = $parameters->{'location'}     // '';
750
    my $itemtype     = $parameters->{'itemtype'}     // '';
751
    my $itemtype     = $parameters->{'itemtype'}     // '';
751
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
752
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
Lines 791-796 sub GetItemsForInventory { Link Here
791
        push @bind_params, $max_cnsort;
792
        push @bind_params, $max_cnsort;
792
    }
793
    }
793
794
795
    if ($items_bundle) {
796
        push @where_strings, 'items.itemnumber IN (SELECT itemnumber FROM items_bundle_item WHERE items_bundle_id = ?)';
797
        push @bind_params, $items_bundle;
798
    }
799
794
    if ($datelastseen) {
800
    if ($datelastseen) {
795
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
801
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
796
        push @where_strings, '(datelastseen < ? OR datelastseen IS NULL)';
802
        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 258-263 modules: Link Here
258
        -
258
        -
259
          columnname: checkin_on
259
          columnname: checkin_on
260
260
261
    items-bundle-contents:
262
      items-bundle-contents-table:
263
        - columnname: title
264
        - columnname: author
265
        - columnname: ccode
266
        - columnname: itemtype
267
        - columnname: callnumber
268
        - columnname: barcode
269
        - columnname: status
270
261
  cataloguing:
271
  cataloguing:
262
    additem:
272
    additem:
263
      itemst:
273
      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 373-378 foreach my $item (@items) { Link Here
373
        }
376
        }
374
    }
377
    }
375
378
379
    my $items_bundle_item = $schema->resultset('ItemsBundleItem')->find({ itemnumber => $item->{itemnumber} });
380
    if ($items_bundle_item) {
381
        $itemfields{items_bundle} = 1;
382
        $item->{items_bundle} = $items_bundle_item->items_bundle;
383
    }
384
376
    if ($currentbranch and $currentbranch ne "NO_LIBRARY_SET"
385
    if ($currentbranch and $currentbranch ne "NO_LIBRARY_SET"
377
    and C4::Context->preference('SeparateHoldings')) {
386
    and C4::Context->preference('SeparateHoldings')) {
378
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
387
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
Lines 409-414 $template->param( Link Here
409
    itemdata_stocknumber => $itemfields{stocknumber},
418
    itemdata_stocknumber => $itemfields{stocknumber},
410
    volinfo                => $itemfields{enumchron},
419
    volinfo                => $itemfields{enumchron},
411
        itemdata_itemnotes  => $itemfields{itemnotes},
420
        itemdata_itemnotes  => $itemfields{itemnotes},
421
    itemdata_items_bundle => $itemfields{items_bundle},
412
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
422
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
413
    z3950_search_params    => C4::Search::z3950_search_args($dat),
423
    z3950_search_params    => C4::Search::z3950_search_args($dat),
414
        hostrecords         => $hostrecords,
424
        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 (+147 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
            # Adding biblionumber to items
96
            ModItem({uri => $biblionumber}, $item->biblionumber, $item->itemnumber);
97
98
            my $items_bundle = $items_bundle_rs->find_or_create({ biblionumber => $biblionumber });
99
            $items_bundle_item_rs->find_or_create({
100
                items_bundle_id => $items_bundle->items_bundle_id,
101
                itemnumber => $item->itemnumber,
102
            });
103
104
            if (defined $withdrawn and $withdrawn ne '') {
105
                $item->withdrawn($withdrawn)->store();
106
            }
107
        }
108
        ModBiblio($record, $biblionumber, $biblio->frameworkcode);
109
    }
110
111
    # Store barcodes in the session to display messages after the redirect
112
    $session->param('linkelements_notfound_barcodes', \@notfound_barcodes);
113
    $session->param('linkelements_found_barcodes', \@found_barcodes);
114
    $session->param('linkelements_alreadylinked_barcodes', \@alreadylinked_barcodes);
115
    $session->flush();
116
117
    print $cgi->redirect('/cgi-bin/koha/cataloguing/linkelements.pl?biblionumber=' . $biblionumber);
118
    exit;
119
}
120
121
my @notfound_barcodes = map {
122
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
123
} @{ $session->param('linkelements_notfound_barcodes') // [] };
124
125
my @found_barcodes = map {
126
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
127
} @{ $session->param('linkelements_found_barcodes') // [] };
128
129
my @alreadylinked_barcodes = map {
130
    Encode::is_utf8($_) ? $_ : Encode::decode('UTF-8', $_)
131
} @{ $session->param('linkelements_alreadylinked_barcodes') // [] };
132
133
$session->clear([
134
    'linkelements_notfound_barcodes',
135
    'linkelements_found_barcodes',
136
    'linkelements_alreadylinked_barcodes',
137
]);
138
$session->flush();
139
140
$template->param(
141
    biblionumber => $biblionumber,
142
    notfound_barcodes => \@notfound_barcodes,
143
    found_barcodes => \@found_barcodes,
144
    alreadylinked_barcodes => \@alreadylinked_barcodes,
145
);
146
147
output_html_with_http_headers $cgi, $cookie, $template->output;
(-)a/circ/returns.pl (+31 lines)
Lines 294-299 if ($barcode) { Link Here
294
            additional_materials => $materials,
294
            additional_materials => $materials,
295
            issue            => $checkout,
295
            issue            => $checkout,
296
        );
296
        );
297
298
        my $items_bundle_rs = Koha::Database->new->schema->resultset('ItemsBundle');
299
        my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblio->biblionumber });
300
        if ($items_bundle) {
301
            my @items_bundle_items = map {
302
                scalar Koha::Items->find($_->get_column('itemnumber'))
303
            } $items_bundle->items_bundle_items;
304
305
            my $confirm = $query->param('confirm_items_bundle_return');
306
            unless ($confirm) {
307
                $template->param(
308
                    items_bundle_return_confirmation => 1,
309
                    items_bundle_items => \@items_bundle_items,
310
                );
311
312
                output_html_with_http_headers $query, $cookie, $template->output;
313
                exit;
314
            }
315
316
            my $mark_missing_items_as_lost = $query->param('confirm_items_bundle_mark_missing_items_as_lost');
317
            if ($mark_missing_items_as_lost) {
318
                my $barcodes = $query->param('verify-items-bundle-contents-barcodes');
319
                my $lost = $query->param('verify-items-bundle-contents-lost');
320
                my @barcodes = map { s/^\s+|\s+$//gr } (split /\n/, $barcodes);
321
                foreach my $item (@items_bundle_items) {
322
                    unless (grep { $_ eq $item->barcode } @barcodes) {
323
                        $item->itemlost($lost)->store();
324
                    }
325
                }
326
            }
327
        }
297
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
328
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
298
329
299
    my %input = (
330
    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 4448-4453 CREATE TABLE return_claims ( Link Here
4448
    CONSTRAINT `rc_resolved_by_ibfk` FOREIGN KEY (`resolved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
4448
    CONSTRAINT `rc_resolved_by_ibfk` FOREIGN KEY (`resolved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
4449
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4449
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4450
4450
4451
--
4452
-- Table structure for table items_bundle
4453
--
4454
4455
DROP TABLE IF EXISTS items_bundle;
4456
CREATE TABLE items_bundle (
4457
    items_bundle_id SERIAL,
4458
    biblionumber INT NOT NULL,
4459
    CONSTRAINT pk_items_bundle_items_bundle_id
4460
        PRIMARY KEY (items_bundle_id),
4461
    CONSTRAINT fk_items_bundle_biblio_biblionumber
4462
        FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber)
4463
        ON DELETE CASCADE ON UPDATE CASCADE,
4464
    CONSTRAINT uniq_items_bundle_biblionumber
4465
        UNIQUE KEY (biblionumber)
4466
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4467
4468
--
4469
-- Table structure for table items_bundle_item
4470
--
4471
4472
DROP TABLE IF EXISTS items_bundle_item;
4473
CREATE TABLE items_bundle_item (
4474
    items_bundle_item_id SERIAL,
4475
    items_bundle_id BIGINT UNSIGNED NOT NULL,
4476
    itemnumber INT NOT NULL,
4477
    CONSTRAINT pk_items_bundle_item_items_bundle_item_id
4478
        PRIMARY KEY (items_bundle_item_id),
4479
    CONSTRAINT fk_items_bundle_item_itemnumber
4480
        FOREIGN KEY (itemnumber) REFERENCES items (itemnumber)
4481
        ON DELETE CASCADE ON UPDATE CASCADE,
4482
    CONSTRAINT fk_items_bundle_item_items_bundle_id
4483
        FOREIGN KEY (items_bundle_id) REFERENCES items_bundle (items_bundle_id)
4484
        ON DELETE CASCADE ON UPDATE CASCADE,
4485
    CONSTRAINT uniq_items_bundle_item_itemnumber
4486
        UNIQUE KEY (itemnumber)
4487
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4488
4451
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4489
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4452
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4490
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4453
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
4491
/*!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  %]">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  %]">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 237-242 Link Here
237
                [% IF ( hostrecords ) %]<th>Host records</th>[% END %]
237
                [% IF ( hostrecords ) %]<th>Host records</th>[% END %]
238
                [% IF ( analyze ) %]<th>Used in</th><th></th>[% END %]
238
                [% IF ( analyze ) %]<th>Used in</th><th></th>[% END %]
239
                [% IF ( ShowCourseReserves ) %]<th>Course Reserves</th>[% END %]
239
                [% IF ( ShowCourseReserves ) %]<th>Course Reserves</th>[% END %]
240
                [% IF itemdata_items_bundle %]<th>Items bundle</th>[% END %]
240
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th class="NoSort">Spine label</th>[% END %]
241
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th class="NoSort">Spine label</th>[% END %]
241
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th class="NoSort">&nbsp;</th>[% END %]
242
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th class="NoSort">&nbsp;</th>[% END %]
242
            </tr>
243
            </tr>
Lines 423-428 Link Here
423
                    </td>
424
                    </td>
424
                [% END %]
425
                [% END %]
425
426
427
                [% IF itemdata_items_bundle %]
428
                    <td>
429
                        [% INCLUDE 'biblio-default-view.inc' biblionumber = item.items_bundle.biblionumber.biblionumber %]
430
                            [% item.items_bundle.biblionumber.title | html %]
431
                        </a>
432
                    </td>
433
                [% END %]
434
426
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
435
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
427
                    <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>
436
                    <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>
428
                [% END %]
437
                [% 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 7-12 Link Here
7
[% USE ItemTypes %]
7
[% USE ItemTypes %]
8
[% USE AuthorisedValues %]
8
[% USE AuthorisedValues %]
9
[% USE ColumnsSettings %]
9
[% USE ColumnsSettings %]
10
[% PROCESS 'i18n.inc' %]
10
[% SET footerjs = 1 %]
11
[% SET footerjs = 1 %]
11
[% BLOCK display_bormessagepref %]
12
[% BLOCK display_bormessagepref %]
12
    [% IF ( bormessagepref ) %]
13
    [% IF ( bormessagepref ) %]
Lines 664-669 Link Here
664
                            [% INCLUDE all_checkin_messages %]
665
                            [% INCLUDE all_checkin_messages %]
665
                        </div>
666
                        </div>
666
667
668
                        [% IF items_bundle_return_confirmation %]
669
                            <div class="dialog alert">[% t('The returned item is an items bundle and needs confirmation') | html %]</div>
670
671
                            <table class="table table-condensed table-bordered" id="items-bundle-contents-table">
672
                                <thead>
673
                                    <tr>
674
                                        <th>[% t('Title') | html %]</th>
675
                                        <th>[% t('Author') | html %]</th>
676
                                        <th>[% t('Collection code') | html %]</th>
677
                                        <th>[% t('Item type') | html %]</th>
678
                                        <th>[% t('Callnumber') | html %]</th>
679
                                        <th>[% t('Barcode') | html %]</th>
680
                                        <th>[% t('Status') | html %]</th>
681
                                    </tr>
682
                                </thead>
683
                                <tbody>
684
                                    [% FOREACH item IN items_bundle_items %]
685
                                        <tr data-barcode="[% item.barcode | html %]">
686
                                            <td>[% INCLUDE 'biblio-default-view.inc' biblionumber=item.biblionumber %][% INCLUDE 'biblio-title.inc' biblio=item.biblio %]</a></td>
687
                                            <td>[% item.biblio.author | html %]</td>
688
                                            <td>[% AuthorisedValues.GetByCode('CCODE', item.ccode) | html %]</td>
689
                                            <td>[% ItemTypes.GetDescription(item.itype) | html %]</td>
690
                                            <td>[% item.itemcallnumber | html %]</td>
691
                                            <td>[% item.barcode | html %]</td>
692
                                            <td>[% INCLUDE 'item-status.inc' item=item %]</td>
693
                                        </tr>
694
                                    [% END %]
695
                                </tbody>
696
                            </table>
697
698
                            <div id="items-bundle-confirmation-action">
699
                                <form method="post">
700
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
701
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
702
                                    <button class="btn btn-default" type="submit"><i class="fa fa-check"></i> [% t('Confirm checkin without verifying') | html %]</button>
703
                                </form>
704
705
                                <button id="verify-items-bundle-contents-button" class="btn btn-default">[% t('Verify items bundle contents') | html %]</button>
706
                            </div>
707
708
                            <div id="verify-items-bundle-contents-form-wrapper">
709
                                <form method="post">
710
                                    <div class="form-group">
711
                                        <label for="verify-items-bundle-contents-barcodes">Barcodes</label>
712
                                        <textarea autocomplete="off" id="verify-items-bundle-contents-barcodes" name="verify-items-bundle-contents-barcodes" class="form-control"></textarea>
713
                                        <div class="help-block">[% t('Scan barcodes found in the items bundle and compare it to the table above') | html %]</div>
714
                                    </div>
715
716
                                    <div class="form-group">
717
                                        <label for="verify-items-bundle-contents-lost">[% t('Lost status') | html %]</label>
718
                                        <select id="verify-items-bundle-contents-lost" name="verify-items-bundle-contents-lost" class="form-control">
719
                                            [% FOREACH av IN AuthorisedValues.Get('LOST') %]
720
                                                <option value="[% av.authorised_value | html %]">[% av.lib | html %]</option>
721
                                            [% END %]
722
                                        </select>
723
                                        <div class="help-block">[% t('If some items are missing, they will be marked as lost with this status') | html %]</div>
724
                                    </div>
725
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
726
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
727
                                    <input type="hidden" name="confirm_items_bundle_mark_missing_items_as_lost" value="1">
728
                                    <button type="submit" class="btn btn-default"><i class="fa fa-check"></i> [% t('Confirm checkin and mark missing items as lost') | html %]</button>
729
                                    <button type="button" class="btn btn-default" id="verify-items-bundle-contents-cancel-button"><i class="fa fa-close"></i> [% t('Cancel') | html %]</button>
730
                                </form>
731
                            </div>
732
                        [% END %]
733
667
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
734
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
668
                            <fieldset id="circ_returns_checkin">
735
                            <fieldset id="circ_returns_checkin">
669
                                <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>
736
                                <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 1076-1081 Link Here
1076
            $('[data-toggle="tooltip"]').tooltip();
1143
            $('[data-toggle="tooltip"]').tooltip();
1077
        });
1144
        });
1078
    </script>
1145
    </script>
1146
1147
    <script>
1148
        $(document).ready(function () {
1149
            $('#verify-items-bundle-contents-form-wrapper').hide();
1150
            $('#verify-items-bundle-contents-button').on('click', function () {
1151
                $('#verify-items-bundle-contents-form-wrapper').show();
1152
                $('#items-bundle-confirmation-action').hide();
1153
            });
1154
            $('#verify-items-bundle-contents-cancel-button').on('click', function () {
1155
                $('#verify-items-bundle-contents-form-wrapper').hide();
1156
                $('#items-bundle-confirmation-action').show();
1157
            });
1158
            $('#verify-items-bundle-contents-barcodes').on('input', function (ev) {
1159
                const barcodes = ev.target.value.split('\n').map(function(s) { return s.trim() });
1160
                $('#items-bundle-contents-table tr').each(function () {
1161
                    const barcode = this.getAttribute('data-barcode');
1162
                    if (barcodes.includes(barcode)) {
1163
                        this.classList.add('ok');
1164
                    } else {
1165
                        this.classList.remove('ok');
1166
                    }
1167
                })
1168
            });
1169
        });
1170
    </script>
1079
[% END %]
1171
[% END %]
1080
1172
1081
[% INCLUDE 'intranet-bottom.inc' %]
1173
[% 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 401-406 Link Here
401
            });
413
            });
402
        });
414
        });
403
    </script>
415
    </script>
416
    [% INCLUDE 'select2.inc' %]
417
    <script>
418
        $(document).ready(function () {
419
            $('#items_bundle').select2();
420
        });
421
    </script>
404
[% END %]
422
[% END %]
405
423
406
[% INCLUDE 'intranet-bottom.inc' %]
424
[% 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