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

(-)a/C4/Circulation.pm (+23 lines)
Lines 3679-3684 sub LostItem{ Link Here
3679
3679
3680
        MarkIssueReturned($borrowernumber,$itemnumber,undef,undef,$patron->privacy) if $mark_returned;
3680
        MarkIssueReturned($borrowernumber,$itemnumber,undef,undef,$patron->privacy) if $mark_returned;
3681
    }
3681
    }
3682
3683
    my $transfers = GetTransfers($itemnumber);
3684
    if ( C4::Context->preference('LostItemCancelOutstandingTransfers') && $transfers ) {
3685
         my $deletedtransfer = DeleteTransfer($itemnumber);
3686
    }
3687
3688
    my ( $restype, $res ) = C4::Reserves::CheckReserves( $itemnumber );
3689
    my $LostItemLevelHold;
3690
    if ( $restype eq "Waiting" || $restype eq "Reserved" ) {
3691
        if ( $res->{originalholdtype} eq "B" ) {
3692
            #originalholdtype equalling "B" means this is a bib level hold
3693
            C4::Reserves::RevertWaitingStatus({itemnumber => $itemnumber});
3694
3695
            #If the LostBibLevelHoldsRevert syspref is enabled then revert the allocated reserve back to an unallocated bib-level hold
3696
            if ( C4::Context->preference('LostBibLevelHoldsRevert')) {
3697
                C4::Reserves::RevertItemLevelHoldToBibLevelHold({ reserveid => $res->{reserve_id} });
3698
            }
3699
        } else {
3700
            #Otherwise originalholdtype equals "I" and is an item level hold
3701
            $LostItemLevelHold = 1;
3702
        }
3703
    }
3704
    return $LostItemLevelHold;
3682
}
3705
}
3683
3706
3684
sub GetOfflineOperations {
3707
sub GetOfflineOperations {
(-)a/C4/Reserves.pm (-22 / +87 lines)
Lines 130-135 BEGIN { Link Here
130
        &AlterPriority
130
        &AlterPriority
131
        &ToggleLowestPriority
131
        &ToggleLowestPriority
132
132
133
        &RevertWaitingStatus
134
        &RevertItemLevelHoldToBibLevelHold
133
        &ReserveSlip
135
        &ReserveSlip
134
        &ToggleSuspend
136
        &ToggleSuspend
135
        &SuspendAll
137
        &SuspendAll
Lines 198-220 sub AddReserve { Link Here
198
    # Don't add itemtype limit if specific item is selected
200
    # Don't add itemtype limit if specific item is selected
199
    $itemtype = undef if $checkitem;
201
    $itemtype = undef if $checkitem;
200
202
201
    # updates take place here
203
    # Create reserves with with originalholdtype="B" if biblio level hold and "I" if item level hold
202
    my $hold = Koha::Hold->new(
204
    my $hold;
203
        {
205
    if (!($checkitem)) {
204
            borrowernumber => $borrowernumber,
206
        # updates take place here
205
            biblionumber   => $biblionumber,
207
        $hold = Koha::Hold->new(
206
            reservedate    => $resdate,
208
         {
207
            branchcode     => $branch,
209
           borrowernumber => $borrowernumber,
208
            priority       => $priority,
210
           biblionumber   => $biblionumber,
209
            reservenotes   => $notes,
211
           reservedate    => $resdate,
210
            itemnumber     => $checkitem,
212
           branchcode     => $branch,
211
            found          => $found,
213
           priority       => $priority,
212
            waitingdate    => $waitingdate,
214
           reservenotes   => $notes,
213
            expirationdate => $expdate,
215
           itemnumber     => $checkitem,
214
            itemtype       => $itemtype,
216
           found          => $found,
215
        }
217
           waitingdate    => $waitingdate,
216
    )->store();
218
           expirationdate => $expdate,
217
    $hold->set_waiting() if $found eq 'W';
219
           itemtype       => $itemtype,
220
           originalholdtype => 'B',
221
         }
222
        )->store();
223
        $hold->set_waiting() if $found eq 'W';
224
    } else {
225
        # updates take place here
226
        $hold = Koha::Hold->new(
227
         {
228
          borrowernumber => $borrowernumber,
229
          biblionumber   => $biblionumber,
230
          reservedate    => $resdate,
231
          branchcode     => $branch,
232
          priority       => $priority,
233
          reservenotes   => $notes,
234
          itemnumber     => $checkitem,
235
          found          => $found,
236
          waitingdate    => $waitingdate,
237
          expirationdate => $expdate,
238
          itemtype       => $itemtype,
239
          originalholdtype  => 'I',
240
         }
241
        )->store();
242
        $hold->set_waiting() if $found eq 'W';
243
    }
218
244
219
    logaction( 'HOLDS', 'CREATE', $hold->id, Dumper($hold->unblessed) )
245
    logaction( 'HOLDS', 'CREATE', $hold->id, Dumper($hold->unblessed) )
220
        if C4::Context->preference('HoldsLog');
246
        if C4::Context->preference('HoldsLog');
Lines 1391-1401 sub _FixPriority { Link Here
1391
        $hold = Koha::Holds->find( $reserve_id );
1417
        $hold = Koha::Holds->find( $reserve_id );
1392
        return unless $hold;
1418
        return unless $hold;
1393
    }
1419
    }
1394
1395
    unless ( $biblionumber ) { # FIXME This is a very weird API
1420
    unless ( $biblionumber ) { # FIXME This is a very weird API
1396
        $biblionumber = $hold->biblionumber;
1421
        $biblionumber = $hold->biblionumber;
1397
    }
1422
    }
1398
1399
    if ( $rank eq "del" ) { # FIXME will crash if called without $hold
1423
    if ( $rank eq "del" ) { # FIXME will crash if called without $hold
1400
        $hold->cancel;
1424
        $hold->cancel;
1401
    }
1425
    }
Lines 1507-1513 sub _Findgroupreserve { Link Here
1507
               biblioitems.biblioitemnumber AS biblioitemnumber,
1531
               biblioitems.biblioitemnumber AS biblioitemnumber,
1508
               reserves.itemnumber          AS itemnumber,
1532
               reserves.itemnumber          AS itemnumber,
1509
               reserves.reserve_id          AS reserve_id,
1533
               reserves.reserve_id          AS reserve_id,
1510
               reserves.itemtype            AS itemtype
1534
               reserves.itemtype            AS itemtype,
1535
               reserves.originalholdtype    AS originalholdtype
1511
        FROM reserves
1536
        FROM reserves
1512
        JOIN biblioitems USING (biblionumber)
1537
        JOIN biblioitems USING (biblionumber)
1513
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
1538
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
Lines 1542-1548 sub _Findgroupreserve { Link Here
1542
               biblioitems.biblioitemnumber AS biblioitemnumber,
1567
               biblioitems.biblioitemnumber AS biblioitemnumber,
1543
               reserves.itemnumber          AS itemnumber,
1568
               reserves.itemnumber          AS itemnumber,
1544
               reserves.reserve_id          AS reserve_id,
1569
               reserves.reserve_id          AS reserve_id,
1545
               reserves.itemtype            AS itemtype
1570
               reserves.itemtype            AS itemtype,
1571
               reserves.originalholdtype    AS originalholdtype
1546
        FROM reserves
1572
        FROM reserves
1547
        JOIN biblioitems USING (biblionumber)
1573
        JOIN biblioitems USING (biblionumber)
1548
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
1574
        JOIN hold_fill_targets USING (biblionumber, borrowernumber)
Lines 1576-1582 sub _Findgroupreserve { Link Here
1576
               reserves.timestamp                  AS timestamp,
1602
               reserves.timestamp                  AS timestamp,
1577
               reserves.itemnumber                 AS itemnumber,
1603
               reserves.itemnumber                 AS itemnumber,
1578
               reserves.reserve_id                 AS reserve_id,
1604
               reserves.reserve_id                 AS reserve_id,
1579
               reserves.itemtype                   AS itemtype
1605
               reserves.itemtype                   AS itemtype,
1606
               reserves.originalholdtype           AS originalholdtype
1580
        FROM reserves
1607
        FROM reserves
1581
        WHERE reserves.biblionumber = ?
1608
        WHERE reserves.biblionumber = ?
1582
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1609
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
Lines 1896-1901 sub RevertWaitingStatus { Link Here
1896
    _FixPriority( { biblionumber => $reserve->{biblionumber} } );
1923
    _FixPriority( { biblionumber => $reserve->{biblionumber} } );
1897
}
1924
}
1898
1925
1926
1927
=head2 RevertItemLevelHoldToBibLevelHold
1928
1929
  RevertItemLevelHoldToBibLevelHold({ reserveid => $reserveid });
1930
1931
  Reverts a item level hold (which was originally a bib-level hold, which is determined by the value of reserves.originalholdtype) back to a bib-level hold.
1932
1933
=cut
1934
1935
sub RevertItemLevelHoldToBibLevelHold {
1936
    my ( $params ) = @_;
1937
    my $reserve_id = $params->{'reserveid'};
1938
1939
    return unless ( $reserve_id );
1940
    my $dbh = C4::Context->dbh;
1941
1942
    #Get the waiting reserve we want to revert
1943
    my $query = "
1944
        SELECT * FROM reserves
1945
        WHERE reserve_id = ?
1946
        AND itemnumber IS NOT NULL
1947
    ";
1948
     my $sth = $dbh->prepare( $query );
1949
     $sth->execute( $reserve_id );
1950
     my $reserve = $sth->fetchrow_hashref();
1951
1952
     ## Set the itemnumber to 'NULL'
1953
     $query = "
1954
         UPDATE reserves
1955
         SET
1956
         itemnumber = NULL
1957
         WHERE
1958
         reserve_id =  ?
1959
     ";
1960
     $sth = $dbh->prepare( $query );
1961
     $sth->execute( $reserve_id );
1962
}
1963
1899
=head2 ReserveSlip
1964
=head2 ReserveSlip
1900
1965
1901
ReserveSlip(
1966
ReserveSlip(
(-)a/Koha/Schema/Result/OldReserve.pm (-2 / +10 lines)
Lines 137-142 __PACKAGE__->table("old_reserves"); Link Here
137
  is_nullable: 1
137
  is_nullable: 1
138
  size: 10
138
  size: 10
139
139
140
=head2 originalholdtype
141
142
  data_type: 'varchar'
143
  is_nullable: 1
144
  size: 1
145
140
=cut
146
=cut
141
147
142
__PACKAGE__->add_columns(
148
__PACKAGE__->add_columns(
Lines 192-197 __PACKAGE__->add_columns( Link Here
192
  },
198
  },
193
  "itemtype",
199
  "itemtype",
194
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
200
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
201
  "originalholdtype",
202
  { data_type => "varchar", is_nullable => 1, size => 1 },
195
);
203
);
196
204
197
=head1 PRIMARY KEY
205
=head1 PRIMARY KEY
Lines 289-296 __PACKAGE__->belongs_to( Link Here
289
);
297
);
290
298
291
299
292
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2018-02-16 17:54:54
300
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2018-09-02 09:48:38
293
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ynb6NtiTN8ZZur2YCvxlNg
301
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cc4o9r7wLXapCJJ3WfDy4g
294
302
295
303
296
# You can replace this text with custom content, and it will be preserved on regeneration
304
# You can replace this text with custom content, and it will be preserved on regeneration
(-)a/Koha/Schema/Result/Reserve.pm (-2 / +10 lines)
Lines 141-146 __PACKAGE__->table("reserves"); Link Here
141
  is_nullable: 1
141
  is_nullable: 1
142
  size: 10
142
  size: 10
143
143
144
=head2 originalholdtype
145
146
  data_type: 'varchar'
147
  is_nullable: 1
148
  size: 1
149
144
=cut
150
=cut
145
151
146
__PACKAGE__->add_columns(
152
__PACKAGE__->add_columns(
Lines 206-211 __PACKAGE__->add_columns( Link Here
206
  },
212
  },
207
  "itemtype",
213
  "itemtype",
208
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
214
  { data_type => "varchar", is_foreign_key => 1, is_nullable => 1, size => 10 },
215
  "originalholdtype",
216
  { data_type => "varchar", is_nullable => 1, size => 1 },
209
);
217
);
210
218
211
=head1 PRIMARY KEY
219
=head1 PRIMARY KEY
Lines 313-320 __PACKAGE__->belongs_to( Link Here
313
);
321
);
314
322
315
323
316
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2018-02-16 17:54:54
324
# Created by DBIx::Class::Schema::Loader v0.07042 @ 2018-08-25 12:05:26
317
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:2GCET9quFpUvzuN7MUWZNw
325
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YIZXhPQwRJXrzYkdmVQH7Q
318
326
319
__PACKAGE__->belongs_to(
327
__PACKAGE__->belongs_to(
320
  "item",
328
  "item",
(-)a/catalogue/moredetail.pl (+7 lines)
Lines 71-76 my $itemnumber = $query->param('itemnumber'); Link Here
71
my $data = &GetBiblioData($biblionumber);
71
my $data = &GetBiblioData($biblionumber);
72
my $dewey = $data->{'dewey'};
72
my $dewey = $data->{'dewey'};
73
my $showallitems = $query->param('showallitems');
73
my $showallitems = $query->param('showallitems');
74
my $lostitemlevelhold = $query->param('LostItemLevelHold');
75
my $lostitemnumber = $query->param('lostitemnumber');
76
my $itemlost = $query->param('itemlost');
77
78
if ($lostitemlevelhold && $itemlost) {
79
    $template->param(LostItemLevelHold => $lostitemlevelhold, itemlost => $itemlost, lostitemnumber => $lostitemnumber, biblionumber => $biblionumber);
80
}
74
81
75
#coping with subscriptions
82
#coping with subscriptions
76
my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
83
my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
(-)a/catalogue/updateitem.pl (-2 / +21 lines)
Lines 26-31 use C4::Items; Link Here
26
use C4::Output;
26
use C4::Output;
27
use C4::Circulation;
27
use C4::Circulation;
28
use C4::Reserves;
28
use C4::Reserves;
29
use Data::Dumper;
29
30
30
my $cgi= new CGI;
31
my $cgi= new CGI;
31
32
Lines 39-44 my $itemnotes=$cgi->param('itemnotes'); Link Here
39
my $itemnotes_nonpublic=$cgi->param('itemnotes_nonpublic');
40
my $itemnotes_nonpublic=$cgi->param('itemnotes_nonpublic');
40
my $withdrawn=$cgi->param('withdrawn');
41
my $withdrawn=$cgi->param('withdrawn');
41
my $damaged=$cgi->param('damaged');
42
my $damaged=$cgi->param('damaged');
43
my $cancelhold = $cgi->param('CancelHold');
44
my $retainhold = $cgi->param('RetainHold');
42
45
43
my $confirm=$cgi->param('confirm');
46
my $confirm=$cgi->param('confirm');
44
my $dbh = C4::Context->dbh;
47
my $dbh = C4::Context->dbh;
Lines 53-60 for ($damaged,$itemlost,$withdrawn) { Link Here
53
    }
56
    }
54
}
57
}
55
58
59
if ($cancelhold) {
60
    my ($restype, $res ) = C4::Reserves::CheckReserves( $itemnumber );
61
    my $hold = Koha::Holds->find($res->{reserve_id});
62
    $hold->cancel;
63
}
64
65
#Assigning variables for use in cancelling item level holds when item marked as 'Lost'
66
my $LostItemLevelHold;
67
my $originalitemnumber = $itemnumber;
68
56
# modify MARC item if input differs from items table.
69
# modify MARC item if input differs from items table.
57
my $item_changes = {};
70
my $item_changes = {};
71
58
if (defined $itemnotes_nonpublic) { # i.e., itemnotes_nonpublic parameter passed from form
72
if (defined $itemnotes_nonpublic) { # i.e., itemnotes_nonpublic parameter passed from form
59
    checkauth($cgi, 0, {editcatalogue => 'edit_items'}, 'intranet');
73
    checkauth($cgi, 0, {editcatalogue => 'edit_items'}, 'intranet');
60
    if ((not defined  $item_data_hashref->{'itemnotes_nonpublic'}) or $itemnotes_nonpublic ne $item_data_hashref->{'itemnotes_nonpublic'}) {
74
    if ((not defined  $item_data_hashref->{'itemnotes_nonpublic'}) or $itemnotes_nonpublic ne $item_data_hashref->{'itemnotes_nonpublic'}) {
Lines 79-85 elsif (defined $itemnotes) { # i.e., itemnotes parameter passed from form Link Here
79
}
93
}
80
94
81
ModItem($item_changes, $biblionumber, $itemnumber);
95
ModItem($item_changes, $biblionumber, $itemnumber);
96
$LostItemLevelHold = LostItem($itemnumber, 'moredetail') if $itemlost;
97
98
if ( $LostItemLevelHold) {
99
    print $cgi->redirect("moredetail.pl?biblionumber=$biblionumber&LostItemLevelHold=$LostItemLevelHold&itemlost=$itemlost&lostitemnumber=$itemnumber#item$itemnumber");
100
} else {
101
    print $cgi->redirect("moredetail.pl?biblionumber=$biblionumber&itemnumber=$itemnumber#item$itemnumber");
102
}
82
103
83
LostItem($itemnumber, 'moredetail') if $itemlost;
84
104
85
print $cgi->redirect("moredetail.pl?biblionumber=$biblionumber&itemnumber=$itemnumber#item$itemnumber");
(-)a/cataloguing/additem.pl (-3 / +31 lines)
Lines 40-46 use C4::Search; Link Here
40
use Storable qw(thaw freeze);
40
use Storable qw(thaw freeze);
41
use URI::Escape;
41
use URI::Escape;
42
use C4::Members;
42
use C4::Members;
43
43
use Data::Dumper;
44
use MARC::File::XML;
44
use MARC::File::XML;
45
use URI::Escape;
45
use URI::Escape;
46
46
Lines 385-393 my $fa_barcode = $input->param('barcode'); Link Here
385
my $fa_branch             = $input->param('branch');
385
my $fa_branch             = $input->param('branch');
386
my $fa_stickyduedate      = $input->param('stickyduedate');
386
my $fa_stickyduedate      = $input->param('stickyduedate');
387
my $fa_duedatespec        = $input->param('duedatespec');
387
my $fa_duedatespec        = $input->param('duedatespec');
388
388
my $cancelhold            = $input->param('CancelHold');
389
my $retainhold            = $input->param('RetainHold');
389
my $frameworkcode = &GetFrameworkCode($biblionumber);
390
my $frameworkcode = &GetFrameworkCode($biblionumber);
390
391
392
if ($cancelhold || $retainhold) {
393
    $op ='';
394
}
395
396
#Assigning variables for use in cancelling item level holds when item marked as 'Lost'
397
my $LostItemLevelHold;
398
my $originalitemnumber = $itemnumber;
399
391
# Defining which userflag is needing according to the framework currently used
400
# Defining which userflag is needing according to the framework currently used
392
my $userflags;
401
my $userflags;
393
if (defined $input->param('frameworkcode')) {
402
if (defined $input->param('frameworkcode')) {
Lines 692-697 if ($op eq "additem") { Link Here
692
    # check that the barcode don't exist already
701
    # check that the barcode don't exist already
693
    my $addedolditem = TransformMarcToKoha($itemtosave);
702
    my $addedolditem = TransformMarcToKoha($itemtosave);
694
    my $exist_itemnumber = get_item_from_barcode($addedolditem->{'barcode'});
703
    my $exist_itemnumber = get_item_from_barcode($addedolditem->{'barcode'});
704
    my $lostitemnumber;
695
    if ($exist_itemnumber && $exist_itemnumber != $itemnumber) {
705
    if ($exist_itemnumber && $exist_itemnumber != $itemnumber) {
696
        push @errors,"barcode_not_unique";
706
        push @errors,"barcode_not_unique";
697
    } else {
707
    } else {
Lines 700-708 if ($op eq "additem") { Link Here
700
        $itemnumber = q{};
710
        $itemnumber = q{};
701
        my $olditemlost = $item->{itemlost};
711
        my $olditemlost = $item->{itemlost};
702
        my $newitemlost = $newitem->{itemlost};
712
        my $newitemlost = $newitem->{itemlost};
703
        LostItem( $item->{itemnumber}, 'additem' )
713
        $LostItemLevelHold = LostItem( $item->{itemnumber}, 'additem' )
704
            if $newitemlost && $newitemlost ge '1' && !$olditemlost;
714
            if $newitemlost && $newitemlost ge '1' && !$olditemlost;
705
    }
715
    }
716
717
    if ($LostItemLevelHold) {
718
        $lostitemnumber = $originalitemnumber;
719
    }
720
    $template->param( LostItemLevelHold  => $LostItemLevelHold, lostitemnumber => $lostitemnumber );
706
    $nextop="additem";
721
    $nextop="additem";
707
} elsif ($op eq "delinkitem"){
722
} elsif ($op eq "delinkitem"){
708
    my $analyticfield = '773';
723
    my $analyticfield = '773';
Lines 720-725 if ($op eq "additem") { Link Here
720
	my $modbibresult = ModBiblio($record, $biblionumber,'');
735
	my $modbibresult = ModBiblio($record, $biblionumber,'');
721
}
736
}
722
737
738
if ($cancelhold) {
739
    my ( $restype, $res ) = C4::Reserves::CheckReserves( $originalitemnumber );
740
    my $hold = Koha::Holds->find($res->{reserve_id});
741
    $hold->cancel;
742
}
743
723
#
744
#
724
#-------------------------------------------------------------------------------
745
#-------------------------------------------------------------------------------
725
# build screen with existing items. and "new" one
746
# build screen with existing items. and "new" one
Lines 905-910 foreach my $tag ( keys %{$tagslib}){ Link Here
905
926
906
my $item = Koha::Items->find($itemnumber); # We certainly want to fetch it earlier
927
my $item = Koha::Items->find($itemnumber); # We certainly want to fetch it earlier
907
928
929
#If you are trying to mark an item as lost which has an item level hold on it return $originalitemnumber
930
if ($LostItemLevelHold) {
931
    $template->param( itemnumber => $originalitemnumber);
932
} else {
933
    $template->param( itemnumber => $itemnumber );
934
}
935
908
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
936
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
909
$template->param(
937
$template->param(
910
    biblionumber => $biblionumber,
938
    biblionumber => $biblionumber,
(-)a/installer/data/mysql/atomicupdate/bug_20844-added-holdtype-field-to-reserves.sql (+3 lines)
Line 0 Link Here
1
ALTER TABLE reserves ADD originalholdtype VARCHAR(1);
2
ALTER TABLE old_reserves ADD originalholdtype VARCHAR(1);
3
INSERT INTO systempreferences (variable, value, options, explanation, type) VALUES ('LostBibLevelHoldsRevert', 1, 'Enable|Disable', 'If the item which has an allocated hold on it which was originally a bib-level hold then when the item is marked as lost revert the hold to a bib-level hold', 'YesNo');
(-)a/installer/data/mysql/atomicupdate/bug_20844-cancel_outstanding_branch_transfers_when_marked_as_lost_syspref.sql (+1 lines)
Line 0 Link Here
1
INSERT INTO systempreferences (variable, value, options, explanation, type) VALUES ('LostItemCancelOutstandingTransfers', 0, 'Enable|Disable', 'When an item marked as lost has a outstanding branch transfer, cancel the outstanding transfer', 'YesNo');
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+12 lines)
Lines 596-601 Circulation: Link Here
596
              class: integer
596
              class: integer
597
            - days.
597
            - days.
598
        -
598
        -
599
            - If the item which has an allocated hold on it which was originally a bib-level hold is marked as lost then revert the hold to a bib-level hold
600
            - pref: LostBibLevelHoldsRevert
601
              choices:
602
                  yes: "Enable"
603
                  no: "Disable"
604
        -
605
            - pref: LostItemCancelOutstandingTransfers
606
              choices:
607
                  yes: "Enable"
608
                  no: "Disable"
609
            - When an item marked as lost has a outstanding branch transfer, cancel the outstanding transfer
610
        -
599
            - pref: ExpireReservesMaxPickUpDelay
611
            - pref: ExpireReservesMaxPickUpDelay
600
              choices:
612
              choices:
601
                  yes: Allow
613
                  yes: Allow
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt (-2 / +17 lines)
Lines 42-55 Link Here
42
<a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% biblionumber | html %]&amp;showallitems=1">Show all items</a>[% END %]</li>
42
<a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% biblionumber | html %]&amp;showallitems=1">Show all items</a>[% END %]</li>
43
    </ol>
43
    </ol>
44
44
45
45
    <br clear="all" />
46
    <br clear="all" />
46
    [% IF ( ONLY_ONE ) %]
47
    [% IF ( ONLY_ONE ) %]
47
        <div class="dialog message">You are only viewing one item.  <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% biblionumber | html %]&amp;bi=[% biblioitemnumber | html %]#item[% itemnumber | html %]">View All</a></div>
48
        <div class="dialog message">You are only viewing one item.  <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% biblionumber | html %]&amp;bi=[% biblioitemnumber | html %]#item[% itemnumber | html %]">View All</a></div>
48
    [% END %]
49
    [% END %]
50
49
    [% FOREACH ITEM_DAT IN ITEM_DATA %]
51
    [% FOREACH ITEM_DAT IN ITEM_DATA %]
50
    <div class="yui-g">
52
    <div class="yui-g">
51
        <h3 id="item[% ITEM_DAT.itemnumber | html %]">Barcode [% ITEM_DAT.barcode | html %]  [% IF ( ITEM_DAT.notforloantext ) %][% ITEM_DAT.notforloantext | html %] [% END %]</h3>
53
         <h3 id="item[% ITEM_DAT.itemnumber %]">Barcode [% ITEM_DAT.barcode %]  [% IF ( ITEM_DAT.notforloantext ) %][% ITEM_DAT.notforloantext %] [% END %]</h3>
52
        <div class="listgroup"><h4>Item information [% IF ( CAN_user_editcatalogue_edit_catalogue ) %][% UNLESS ( ITEM_DAT.nomod ) %]
54
        [% IF ((ITEM_DAT.itemnumber == lostitemnumber) && (LostItemLevelHold)) %]
55
        <div class="alert alert-warning">
56
            <form id="DeallocateLostItemLevelHold" method="post" action="updateitem.pl" name="DeallocateLostItemLevelHold">
57
                <input type="hidden" name="biblionumber" value="[% biblionumber %]"/>
58
                <input type="hidden" name="itemnumber" value="[% lostitemnumber %]"/>
59
                <input type="hidden" name="itemlost" value="[% itemlost %]"/>
60
                This item has an item-level hold on it:
61
                <input type="submit" name="RetainHold" value="Retain Hold"/>
62
                <input type="submit" name="CancelHold" value="Cancel Hold"/>
63
            </form>
64
        </div>
65
    [% END %]
66
67
    <div class="listgroup"><h4>Item information [% IF ( CAN_user_editcatalogue_edit_catalogue ) %][% UNLESS ( ITEM_DAT.nomod ) %]
53
         [% IF ( CAN_user_editcatalogue_edit_items ) %]
68
         [% IF ( CAN_user_editcatalogue_edit_items ) %]
54
         <a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=[% ITEM_DAT.biblionumber | html %]&amp;itemnumber=[% ITEM_DAT.itemnumber | html %]">[Edit Item]</a>
69
         <a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=[% ITEM_DAT.biblionumber | html %]&amp;itemnumber=[% ITEM_DAT.itemnumber | html %]">[Edit Item]</a>
55
         [% END %]
70
         [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt (+14 lines)
Lines 258-263 function confirm_deletion() { Link Here
258
    [% ELSE %]
258
    [% ELSE %]
259
        <h2 id="edititem">Edit Item #[% itemnumber | html %][% IF ( barcode ) %] / Barcode [% barcode | html %][% END %]</h2>
259
        <h2 id="edititem">Edit Item #[% itemnumber | html %][% IF ( barcode ) %] / Barcode [% barcode | html %][% END %]</h2>
260
    [% END %]
260
    [% END %]
261
262
263
    [% IF (LostItemLevelHold) %]
264
        <div class="alert alert-warning">
265
            <form id="DeallocateLostItemLevelHold" method="post" action="/cgi-bin/koha/cataloguing/additem.pl" name="DeallocateLostItemLevelHold">
266
                <input type="hidden" id="itemnumber" name="itemnumber" value="[% lostitemnumber | html %]"/>
267
                This item has an item-level hold on it:
268
                <input type="submit" name="RetainHold" value="Retain Hold"/>
269
                <input type="submit" name="CancelHold" value="Cancel hold"/>
270
            </form>
271
        </div>
272
    [% END %]
273
274
261
	<fieldset class="rows">
275
	<fieldset class="rows">
262
	<ol>
276
	<ol>
263
        [% FOREACH ite IN item %]
277
        [% FOREACH ite IN item %]
(-)a/t/db_dependent/Holds/RevertWaitingStatus.t (-2 / +63 lines)
Lines 16-22 Link Here
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
17
18
use Modern::Perl;
18
use Modern::Perl;
19
use Test::More tests => 3;
19
use Test::More tests => 12;
20
use MARC::Record;
20
use MARC::Record;
21
21
22
use Koha::Libraries;
22
use Koha::Libraries;
Lines 109-114 ok( scalar @$priorities == 2, 'Only 2 holds remain in the reserves table' ); Link Here
109
ok( $priorities->[0]->[0] == 1, 'First hold has a priority of 1' );
109
ok( $priorities->[0]->[0] == 1, 'First hold has a priority of 1' );
110
ok( $priorities->[1]->[0] == 2, 'Second hold has a priority of 2' );
110
ok( $priorities->[1]->[0] == 2, 'Second hold has a priority of 2' );
111
111
112
#Bug 20844
113
#Test reverting the waiting status of holds when the reserved items are set to lost
114
115
#Create bib-level hold and test what happens when the item an allocated bib-level hold is allocated on is lost when the LostBibLevelHoldsRevert syspref is enabled
116
my $hold_id = C4::Reserves::AddReserve(
117
    $branchcode,
118
    4,
119
    $biblionumber,
120
    my $bibitems   = q{},
121
    my $priority,
122
    my $resdate,
123
    my $expdate,
124
    my $notes = q{},
125
    $title,
126
    my $checkitem,
127
    my $found,
128
);
129
130
my $hold = Koha::Holds->find($hold_id);
131
is( $hold->originalholdtype, 'B', 'Holds originalholdtype is "B" which is correct' );
132
ModReserveAffect($itemnumber, 4, 0); #Confirm the hold - now it's an allocated bib-level hold on $itemnumber and has status is 'W'
133
$hold = Koha::Holds->find($hold_id);
134
is( $hold->found, 'W', 'Hold status is "W" (waiting) which is correct' );
135
is( $hold->itemnumber, $itemnumber, 'Bib-level hold is allocated and has an itemnumber' );
136
t::lib::Mocks::mock_preference( 'LostBibLevelHoldsRevert', 1 );
137
138
if (C4::Context->preference('LostBibLevelHoldsRevert') ) {
139
    #When item is set to lost revert hold to bib-level (i.e. remove the itemnumber in hold record) and change reserves.found to ''
140
    RevertWaitingStatus({ itemnumber => $itemnumber });
141
    RevertItemLevelHoldToBibLevelHold({ reserveid => $hold_id });
142
}
143
$hold = Koha::Holds->find($hold_id);
144
is( $hold->found, undef, 'reserve.found reverted to undef now item is lost' );
145
is( $hold->itemnumber, undef, 'Hold reverted back to unallocated bib level hold' );
146
147
#Create item-level hold and test what happens when the reserved item is set to lost
148
$hold_id = C4::Reserves::AddReserve(
149
     $branchcode,
150
     4,
151
     $biblionumber,
152
     $bibitems   = q{},
153
     $priority,
154
     $resdate,
155
     $expdate,
156
     $notes = q{},
157
     $title,
158
     $itemnumber,
159
     $found,
160
);
161
162
$hold = Koha::Holds->find($hold_id);
163
is( $hold->itemnumber, $itemnumber, 'This is an item-level hold' );
164
165
is( $hold->originalholdtype, 'I', 'Holds originalholdtype is correct' );
166
ModReserveAffect($itemnumber, 4, 0); #Confirm the hold - now it's a waiting item-level hold with a reserves.found value of 'W'
167
$hold = Koha::Holds->find($hold_id);
168
is( $hold->found, 'W', 'Hold status is waiting' );
169
170
RevertWaitingStatus({ itemnumber => $itemnumber });
171
$hold = Koha::Holds->find($hold_id);
172
is( $hold->found, undef, 'Reserves found value is reverted to undef as the reserved item has been lost' );
173
112
$schema->storage->txn_rollback;
174
$schema->storage->txn_rollback;
113
175
114
# Helper method to set up a Biblio.
176
# Helper method to set up a Biblio.
115
- 

Return to bug 20844