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

(-)a/C4/Biblio.pm (+45 lines)
Lines 3115-3120 sub ModBiblioMarc { Link Here
3115
    $m_rs->metadata( $record->as_xml_record($encoding) );
3115
    $m_rs->metadata( $record->as_xml_record($encoding) );
3116
    $m_rs->store;
3116
    $m_rs->store;
3117
3117
3118
    UpdateItemsBundles($biblionumber, $record);
3119
3118
    my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
3120
    my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
3119
    $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" );
3121
    $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" );
3120
3122
Lines 3351-3356 sub RemoveAllNsb { Link Here
3351
    return $record;
3353
    return $record;
3352
}
3354
}
3353
3355
3356
=head2 UpdateItemsBundles
3357
3358
Remove from items bundle the items that were removed from the MARC record (keep
3359
the table in sync with the MARC record)
3360
3361
This is called by ModBiblio
3362
3363
    UpdateItemsBundles($biblionumber, $record)
3364
3365
=cut
3366
3367
sub UpdateItemsBundles {
3368
    my ($biblionumber, $record) = @_;
3369
3370
    my $schema = Koha::Database->new()->schema();
3371
    my $items_bundle_rs = $schema->resultset('ItemsBundle');
3372
    my $items_rs = $schema->resultset('Item');
3373
    my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblionumber });
3374
    return unless $items_bundle;
3375
3376
    my $tag = C4::Context->preference('marcflavour') eq 'UNIMARC' ? '462' : '774';
3377
    my @fields = $record->field($tag);
3378
    my %fields_by_itemnumber = map { (scalar $_->subfield('9')) // '' => $_ } @fields;
3379
3380
    foreach my $items_bundle_item ($items_bundle->items_bundle_items) {
3381
        my $itemnumber = $items_bundle_item->get_column('itemnumber');
3382
        if (not exists $fields_by_itemnumber{$itemnumber}) {
3383
            $items_bundle_item->itemnumber->update({ withdrawn => 0 });
3384
            $items_bundle_item->delete();
3385
        }
3386
    }
3387
3388
    my $items_count = $items_bundle->items_bundle_items->count();
3389
    # If bundle is empty, delete it
3390
    if ($items_count == 0) {
3391
        $items_bundle->delete();
3392
    }
3393
3394
    my $materials = $items_count || undef;
3395
    $items_rs->search({ biblionumber => $biblionumber })
3396
        ->update_all({ materials => $materials });
3397
}
3398
3354
1;
3399
1;
3355
3400
3356
3401
(-)a/C4/Items.pm (+6 lines)
Lines 510-515 sub GetItemsForInventory { Link Here
510
    my $minlocation  = $parameters->{'minlocation'}  // '';
510
    my $minlocation  = $parameters->{'minlocation'}  // '';
511
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
511
    my $maxlocation  = $parameters->{'maxlocation'}  // '';
512
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
512
    my $class_source = $parameters->{'class_source'}  // C4::Context->preference('DefaultClassificationSource');
513
    my $items_bundle = $parameters->{'items_bundle'} // '';
513
    my $location     = $parameters->{'location'}     // '';
514
    my $location     = $parameters->{'location'}     // '';
514
    my $itemtype     = $parameters->{'itemtype'}     // '';
515
    my $itemtype     = $parameters->{'itemtype'}     // '';
515
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
516
    my $ignoreissued = $parameters->{'ignoreissued'} // '';
Lines 555-560 sub GetItemsForInventory { Link Here
555
        push @bind_params, $max_cnsort;
556
        push @bind_params, $max_cnsort;
556
    }
557
    }
557
558
559
    if ($items_bundle) {
560
        push @where_strings, 'items.itemnumber IN (SELECT itemnumber FROM items_bundle_item WHERE items_bundle_id = ?)';
561
        push @bind_params, $items_bundle;
562
    }
563
558
    if ($datelastseen) {
564
    if ($datelastseen) {
559
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
565
        $datelastseen = output_pref({ str => $datelastseen, dateformat => 'iso', dateonly => 1 });
560
        push @where_strings, '(datelastseen < ? OR datelastseen IS NULL)';
566
        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 (+11 lines)
Lines 428-433 modules: Link Here
428
            -
428
            -
429
              columnname: checkin_on
429
              columnname: checkin_on
430
430
431
    items-bundle-contents:
432
      items-bundle-contents-table:
433
        columns:
434
          - columnname: title
435
          - columnname: author
436
          - columnname: ccode
437
          - columnname: itemtype
438
          - columnname: callnumber
439
          - columnname: barcode
440
          - columnname: status
441
431
  cataloguing:
442
  cataloguing:
432
    additem:
443
    additem:
433
      itemst:
444
      itemst:
(-)a/catalogue/detail.pl (+10 lines)
Lines 44-49 use Koha::AuthorisedValues; Link Here
44
use Koha::Biblios;
44
use Koha::Biblios;
45
use Koha::CoverImages;
45
use Koha::CoverImages;
46
use Koha::Illrequests;
46
use Koha::Illrequests;
47
use Koha::Database;
47
use Koha::Items;
48
use Koha::Items;
48
use Koha::ItemTypes;
49
use Koha::ItemTypes;
49
use Koha::Patrons;
50
use Koha::Patrons;
Lines 51-56 use Koha::Virtualshelves; Link Here
51
use Koha::Plugins;
52
use Koha::Plugins;
52
use Koha::SearchEngine::Search;
53
use Koha::SearchEngine::Search;
53
54
55
my $schema = Koha::Database->new()->schema();
56
54
my $query = CGI->new();
57
my $query = CGI->new();
55
58
56
my $analyze = $query->param('analyze');
59
my $analyze = $query->param('analyze');
Lines 411-416 foreach my $item (@items) { Link Here
411
        $item->{cover_images} = $item_object->cover_images;
414
        $item->{cover_images} = $item_object->cover_images;
412
    }
415
    }
413
416
417
    my $items_bundle_item = $schema->resultset('ItemsBundleItem')->find({ itemnumber => $item->{itemnumber} });
418
    if ($items_bundle_item) {
419
        $itemfields{items_bundle} = 1;
420
        $item->{items_bundle} = $items_bundle_item->items_bundle;
421
    }
422
414
    if ($currentbranch and C4::Context->preference('SeparateHoldings')) {
423
    if ($currentbranch and C4::Context->preference('SeparateHoldings')) {
415
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
424
        if ($itembranchcode and $itembranchcode eq $currentbranch) {
416
            push @itemloop, $item;
425
            push @itemloop, $item;
Lines 448-453 $template->param( Link Here
448
    itemdata_publisheddate => $itemfields{publisheddate},
457
    itemdata_publisheddate => $itemfields{publisheddate},
449
    volinfo                => $itemfields{enumchron},
458
    volinfo                => $itemfields{enumchron},
450
        itemdata_itemnotes  => $itemfields{itemnotes},
459
        itemdata_itemnotes  => $itemfields{itemnotes},
460
    itemdata_items_bundle => $itemfields{items_bundle},
451
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
461
        itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic},
452
    z3950_search_params    => C4::Search::z3950_search_args($dat),
462
    z3950_search_params    => C4::Search::z3950_search_args($dat),
453
        hostrecords         => $hostrecords,
463
        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 281-286 if ($barcode) { Link Here
281
            additional_materials => $materials,
281
            additional_materials => $materials,
282
            issue                => $checkout,
282
            issue                => $checkout,
283
        );
283
        );
284
285
        my $items_bundle_rs = Koha::Database->new->schema->resultset('ItemsBundle');
286
        my $items_bundle = $items_bundle_rs->find({ biblionumber => $biblio->biblionumber });
287
        if ($items_bundle) {
288
            my @items_bundle_items = map {
289
                scalar Koha::Items->find($_->get_column('itemnumber'))
290
            } $items_bundle->items_bundle_items;
291
292
            my $confirm = $query->param('confirm_items_bundle_return');
293
            unless ($confirm) {
294
                $template->param(
295
                    items_bundle_return_confirmation => 1,
296
                    items_bundle_items => \@items_bundle_items,
297
                );
298
299
                output_html_with_http_headers $query, $cookie, $template->output;
300
                exit;
301
            }
302
303
            my $mark_missing_items_as_lost = $query->param('confirm_items_bundle_mark_missing_items_as_lost');
304
            if ($mark_missing_items_as_lost) {
305
                my $barcodes = $query->param('verify-items-bundle-contents-barcodes');
306
                my $lost = $query->param('verify-items-bundle-contents-lost');
307
                my @barcodes = map { s/^\s+|\s+$//gr } (split /\n/, $barcodes);
308
                foreach my $item (@items_bundle_items) {
309
                    unless (grep { $_ eq $item->barcode } @barcodes) {
310
                        $item->itemlost($lost)->store();
311
                    }
312
                }
313
            }
314
        }
284
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
315
    } # FIXME else we should not call AddReturn but set BadBarcode directly instead
285
316
286
    my %input = (
317
    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 4652-4657 CREATE TABLE background_jobs ( Link Here
4652
    PRIMARY KEY (id)
4652
    PRIMARY KEY (id)
4653
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4653
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4654
4654
4655
--
4656
-- Table structure for table items_bundle
4657
--
4658
4659
DROP TABLE IF EXISTS items_bundle;
4660
CREATE TABLE items_bundle (
4661
    items_bundle_id SERIAL,
4662
    biblionumber INT NOT NULL,
4663
    CONSTRAINT pk_items_bundle_items_bundle_id
4664
        PRIMARY KEY (items_bundle_id),
4665
    CONSTRAINT fk_items_bundle_biblio_biblionumber
4666
        FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber)
4667
        ON DELETE CASCADE ON UPDATE CASCADE,
4668
    CONSTRAINT uniq_items_bundle_biblionumber
4669
        UNIQUE KEY (biblionumber)
4670
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4671
4672
--
4673
-- Table structure for table items_bundle_item
4674
--
4675
4676
DROP TABLE IF EXISTS items_bundle_item;
4677
CREATE TABLE items_bundle_item (
4678
    items_bundle_item_id SERIAL,
4679
    items_bundle_id BIGINT UNSIGNED NOT NULL,
4680
    itemnumber INT NOT NULL,
4681
    CONSTRAINT pk_items_bundle_item_items_bundle_item_id
4682
        PRIMARY KEY (items_bundle_item_id),
4683
    CONSTRAINT fk_items_bundle_item_itemnumber
4684
        FOREIGN KEY (itemnumber) REFERENCES items (itemnumber)
4685
        ON DELETE CASCADE ON UPDATE CASCADE,
4686
    CONSTRAINT fk_items_bundle_item_items_bundle_id
4687
        FOREIGN KEY (items_bundle_id) REFERENCES items_bundle (items_bundle_id)
4688
        ON DELETE CASCADE ON UPDATE CASCADE,
4689
    CONSTRAINT uniq_items_bundle_item_itemnumber
4690
        UNIQUE KEY (itemnumber)
4691
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4692
4655
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4693
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
4656
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4694
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
4657
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
4695
/*!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 63-68 CAN_user_serials_create_subscription ) %] Link Here
63
63
64
            [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]
64
            [% IF ( CAN_user_editcatalogue_edit_catalogue ) %]
65
                <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="duplicatebiblio" href="/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% biblionumber | html %]&amp;op=duplicate">Edit as new (duplicate)</a></li>
66
                <li><a id="linkelements" href="/cgi-bin/koha/cataloguing/linkelements.pl?biblionumber=[% biblionumber | html %]&amp;frameworkcode=[% current_framework | html %]">Link elements</a></li>
66
                <li><a href="#" id="z3950copy">Replace record via Z39.50/SRU</a></li>
67
                <li><a href="#" id="z3950copy">Replace record via Z39.50/SRU</a></li>
67
            [% END %]
68
            [% END %]
68
69
(-)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 (+7 lines)
Lines 312-317 Link Here
312
                [% IF ( hostrecords ) %]<th id="[% tab | html %]_hostrecord" data-colname="[% tab | html %]_hostrecord">Host records</th>[% END %]
312
                [% IF ( hostrecords ) %]<th id="[% tab | html %]_hostrecord" data-colname="[% tab | html %]_hostrecord">Host records</th>[% END %]
313
                [% IF ( analyze ) %]<th id="[% tab | html %]_usedin" data-colname="[% tab | html %]_usedin">Used in</th><th></th>[% END %]
313
                [% IF ( analyze ) %]<th id="[% tab | html %]_usedin" data-colname="[% tab | html %]_usedin">Used in</th><th></th>[% END %]
314
                [% IF ( ShowCourseReserves ) %]<th id="[% tab | html %]_course_reserves" data-colname="[% tab | html %]_course_reserves">Course reserves</th>[% END %]
314
                [% IF ( ShowCourseReserves ) %]<th id="[% tab | html %]_course_reserves" data-colname="[% tab | html %]_course_reserves">Course reserves</th>[% END %]
315
                [% IF itemdata_items_bundle %]<th id="[% tab | html %]_items_bundle" data-colname="[% tab | html %]_items_bundle">Items bundle</th>[% END %]
315
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th id="[% tab | html %]_spinelabel" data-colname="[% tab | html %]_spinelabel" class="NoSort">Spine label</th>[% END %]
316
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]<th id="[% tab | html %]_spinelabel" data-colname="[% tab | html %]_spinelabel" class="NoSort">Spine label</th>[% END %]
316
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th id="[% tab | html %]_actions" data-colname="[% tab | html %]_actions"class="NoSort">&nbsp;</th>[% END %]
317
                [% IF ( CAN_user_editcatalogue_edit_items ) %]<th id="[% tab | html %]_actions" data-colname="[% tab | html %]_actions"class="NoSort">&nbsp;</th>[% END %]
317
            </tr>
318
            </tr>
Lines 543-548 Note that permanent location is a code, and location may be an authval. Link Here
543
                    </td>
544
                    </td>
544
                [% END %]
545
                [% END %]
545
546
547
                [% IF itemdata_items_bundle %]
548
                    <td>
549
                        [% INCLUDE 'biblio-title.inc' biblio = item.items_bundle.biblionumber link = 1 %]
550
                    </td>
551
                [% END %]
552
546
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
553
                [% IF ( SpineLabelShowPrintOnBibDetails ) %]
547
                    <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>
554
                    <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>
548
                [% END %]
555
                [% 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 TablesSettings %]
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-title.inc' biblio=item.biblio link = 1 %]</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 = [% TablesSettings.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 TablesSettings %]
8
[% USE TablesSettings %]
9
[% PROCESS 'i18n.inc' %]
9
[% PROCESS 'member-display-address-style.inc' %]
10
[% PROCESS 'member-display-address-style.inc' %]
10
[% SET footerjs = 1 %]
11
[% SET footerjs = 1 %]
11
[% BLOCK display_bormessagepref %]
12
[% BLOCK display_bormessagepref %]
Lines 699-704 Link Here
699
                            [% INCLUDE all_checkin_messages %]
700
                            [% INCLUDE all_checkin_messages %]
700
                        </div>
701
                        </div>
701
702
703
                        [% IF items_bundle_return_confirmation %]
704
                            <div class="dialog alert">[% t('The returned item is an items bundle and needs confirmation') | html %]</div>
705
706
                            <table class="table table-condensed table-bordered" id="items-bundle-contents-table">
707
                                <thead>
708
                                    <tr>
709
                                        <th>[% t('Title') | html %]</th>
710
                                        <th>[% t('Author') | html %]</th>
711
                                        <th>[% t('Collection code') | html %]</th>
712
                                        <th>[% t('Item type') | html %]</th>
713
                                        <th>[% t('Callnumber') | html %]</th>
714
                                        <th>[% t('Barcode') | html %]</th>
715
                                        <th>[% t('Status') | html %]</th>
716
                                    </tr>
717
                                </thead>
718
                                <tbody>
719
                                    [% FOREACH item IN items_bundle_items %]
720
                                        <tr data-barcode="[% item.barcode | html %]">
721
                                            <td>[% INCLUDE 'biblio-title.inc' biblio=item.biblio link = 1 %]</td>
722
                                            <td>[% item.biblio.author | html %]</td>
723
                                            <td>[% AuthorisedValues.GetByCode('CCODE', item.ccode) | html %]</td>
724
                                            <td>[% ItemTypes.GetDescription(item.itype) | html %]</td>
725
                                            <td>[% item.itemcallnumber | html %]</td>
726
                                            <td>[% item.barcode | html %]</td>
727
                                            <td>[% INCLUDE 'item-status.inc' item=item %]</td>
728
                                        </tr>
729
                                    [% END %]
730
                                </tbody>
731
                            </table>
732
733
                            <div id="items-bundle-confirmation-action">
734
                                <form method="post">
735
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
736
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
737
                                    <button class="btn btn-default" type="submit"><i class="fa fa-check"></i> [% t('Confirm checkin without verifying') | html %]</button>
738
                                </form>
739
740
                                <button id="verify-items-bundle-contents-button" class="btn btn-default">[% t('Verify items bundle contents') | html %]</button>
741
                            </div>
742
743
                            <div id="verify-items-bundle-contents-form-wrapper">
744
                                <form method="post">
745
                                    <div class="form-group">
746
                                        <label for="verify-items-bundle-contents-barcodes">Barcodes</label>
747
                                        <textarea autocomplete="off" id="verify-items-bundle-contents-barcodes" name="verify-items-bundle-contents-barcodes" class="form-control"></textarea>
748
                                        <div class="help-block">[% t('Scan barcodes found in the items bundle and compare it to the table above') | html %]</div>
749
                                    </div>
750
751
                                    <div class="form-group">
752
                                        <label for="verify-items-bundle-contents-lost">[% t('Lost status') | html %]</label>
753
                                        <select id="verify-items-bundle-contents-lost" name="verify-items-bundle-contents-lost" class="form-control">
754
                                            [% FOREACH av IN AuthorisedValues.Get('LOST') %]
755
                                                <option value="[% av.authorised_value | html %]">[% av.lib | html %]</option>
756
                                            [% END %]
757
                                        </select>
758
                                        <div class="help-block">[% t('If some items are missing, they will be marked as lost with this status') | html %]</div>
759
                                    </div>
760
                                    <input type="hidden" name="barcode" value="[% itembarcode | html %]">
761
                                    <input type="hidden" name="confirm_items_bundle_return" value="1">
762
                                    <input type="hidden" name="confirm_items_bundle_mark_missing_items_as_lost" value="1">
763
                                    <button type="submit" class="btn btn-default"><i class="fa fa-check"></i> [% t('Confirm checkin and mark missing items as lost') | html %]</button>
764
                                    <button type="button" class="btn btn-default" id="verify-items-bundle-contents-cancel-button"><i class="fa fa-close"></i> [% t('Cancel') | html %]</button>
765
                                </form>
766
                            </div>
767
                        [% END %]
768
702
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
769
                        <form id="checkin-form" method="post" action="/cgi-bin/koha/circ/returns.pl" autocomplete="off" >
703
                            <fieldset id="circ_returns_checkin">
770
                            <fieldset id="circ_returns_checkin">
704
                                <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>
771
                                <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 1116-1121 Link Here
1116
            $('[data-toggle="tooltip"]').tooltip();
1183
            $('[data-toggle="tooltip"]').tooltip();
1117
        });
1184
        });
1118
    </script>
1185
    </script>
1186
1187
    <script>
1188
        $(document).ready(function () {
1189
            $('#verify-items-bundle-contents-form-wrapper').hide();
1190
            $('#verify-items-bundle-contents-button').on('click', function () {
1191
                $('#verify-items-bundle-contents-form-wrapper').show();
1192
                $('#items-bundle-confirmation-action').hide();
1193
            });
1194
            $('#verify-items-bundle-contents-cancel-button').on('click', function () {
1195
                $('#verify-items-bundle-contents-form-wrapper').hide();
1196
                $('#items-bundle-confirmation-action').show();
1197
            });
1198
            $('#verify-items-bundle-contents-barcodes').on('input', function (ev) {
1199
                const barcodes = ev.target.value.split('\n').map(function(s) { return s.trim() });
1200
                $('#items-bundle-contents-table tr').each(function () {
1201
                    const barcode = this.getAttribute('data-barcode');
1202
                    if (barcodes.includes(barcode)) {
1203
                        this.classList.add('ok');
1204
                    } else {
1205
                        this.classList.remove('ok');
1206
                    }
1207
                })
1208
            });
1209
        });
1210
    </script>
1119
[% END %]
1211
[% END %]
1120
1212
1121
[% INCLUDE 'intranet-bottom.inc' %]
1213
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tt (-1 / +19 lines)
Lines 107-112 Link Here
107
            [% END %]
107
            [% END %]
108
            </select>
108
            </select>
109
          </li>
109
          </li>
110
        [% IF items_bundles.size > 0 %]
111
            <li>
112
                <label for="items_bundle">Items bundle:</label>
113
                <select id="items_bundle" name="items_bundle">
114
                    <option value=""></option>
115
                    [% FOREACH items_bundle IN items_bundles %]
116
                        <option value="[% items_bundle.items_bundle_id | html %]">[% items_bundle.biblionumber.title | html %]</option>
117
                    [% END %]
118
                </select>
119
            </li>
120
        [% END %]
110
    </ol>
121
    </ol>
111
    </fieldset>
122
    </fieldset>
112
123
Lines 300-306 Link Here
300
                    $('#locationloop').val() ||
311
                    $('#locationloop').val() ||
301
                    $('#minlocation').val()  ||
312
                    $('#minlocation').val()  ||
302
                    $('#maxlocation').val()  ||
313
                    $('#maxlocation').val()  ||
303
                    $('#statuses input:checked').length
314
                    $('#statuses input:checked').length ||
315
                    $('#items_bundle').val()
304
                ) ) {
316
                ) ) {
305
                    return confirm(
317
                    return confirm(
306
                        _("You have not selected any catalog filters and are about to compare a file of barcodes to your entire catalog.") + "\n\n" +
318
                        _("You have not selected any catalog filters and are about to compare a file of barcodes to your entire catalog.") + "\n\n" +
Lines 432-437 Link Here
432
            });
444
            });
433
        });
445
        });
434
    </script>
446
    </script>
447
    [% INCLUDE 'select2.inc' %]
448
    <script>
449
        $(document).ready(function () {
450
            $('#items_bundle').select2();
451
        });
452
    </script>
435
[% END %]
453
[% END %]
436
454
437
[% INCLUDE 'intranet-bottom.inc' %]
455
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/tools/inventory.pl (-1 / +10 lines)
Lines 48-53 my $minlocation=$input->param('minlocation') || ''; Link Here
48
my $maxlocation=$input->param('maxlocation');
48
my $maxlocation=$input->param('maxlocation');
49
my $class_source=$input->param('class_source');
49
my $class_source=$input->param('class_source');
50
$maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
50
$maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
51
my $items_bundle = $input->param('items_bundle');
51
my $location=$input->param('location') || '';
52
my $location=$input->param('location') || '';
52
my $ignoreissued=$input->param('ignoreissued');
53
my $ignoreissued=$input->param('ignoreissued');
53
my $ignore_waiting_holds = $input->param('ignore_waiting_holds');
54
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 239-244 if ( $op && ( !$uploadbarcodes || $compareinv2barcd )) { Link Here
239
      minlocation  => $minlocation,
247
      minlocation  => $minlocation,
240
      maxlocation  => $maxlocation,
248
      maxlocation  => $maxlocation,
241
      class_source => $class_source,
249
      class_source => $class_source,
250
      items_bundle => $items_bundle,
242
      location     => $location,
251
      location     => $location,
243
      ignoreissued => $ignoreissued,
252
      ignoreissued => $ignoreissued,
244
      datelastseen => $datelastseen,
253
      datelastseen => $datelastseen,
Lines 256-261 if( @scanned_items ) { Link Here
256
      maxlocation  => $maxlocation,
265
      maxlocation  => $maxlocation,
257
      class_source => $class_source,
266
      class_source => $class_source,
258
      location     => $location,
267
      location     => $location,
268
      items_bundle => $items_bundle,
259
      ignoreissued => undef,
269
      ignoreissued => undef,
260
      datelastseen => undef,
270
      datelastseen => undef,
261
      branchcode   => $branchcode,
271
      branchcode   => $branchcode,
262
- 

Return to bug 24023