}
# find recall
- my $recall = Koha::Recalls->find({ itemnumber => $itemnumber, status => 'T' });
+ my $recall = Koha::Recalls->find({ itemnumber => $itemnumber, status => 'in_transit' });
if ( defined $recall and C4::Context->preference('UseRecalls') ) {
# do a transfer if the recall branch is different to the item holding branch
if ( $recall->branchcode eq $fbr ) {
$request->status('RET') if $request;
}
- my $transfer_recall = Koha::Recalls->find({ itemnumber => $item->itemnumber, status => 'T' }); # all recalls that have triggered a transfer will have an allocated itemnumber
+ my $transfer_recall = Koha::Recalls->find({ itemnumber => $item->itemnumber, status => 'in_transit' }); # all recalls that have triggered a transfer will have an allocated itemnumber
if ( $transfer_recall and
$transfer_recall->branchcode eq $branch and
C4::Context->preference('UseRecalls') ) {
# check if item has been recalled. recall should have been marked Overdue by cronjob, so only look at overdue recalls
# only charge using recall_overdue_fine if there is an item-level recall for this particular item, OR a biblio-level recall
- my @recalls = Koha::Recalls->search({ biblionumber => $item->{biblionumber}, old => undef, status => 'O' })->as_list;
+ my @recalls = Koha::Recalls->search({ biblionumber => $item->{biblionumber}, old => undef, status => 'overdue' })->as_list;
my $bib_level_recall = 0;
$bib_level_recall = 1 if scalar @recalls > 0;
foreach my $recall ( @recalls ) {
my $status;
my $substatus = '';
- my $recalls = Koha::Recalls->search({ itemnumber => $item->itemnumber, status => 'W' });
+ my $recalls = Koha::Recalls->search({ itemnumber => $item->itemnumber, status => 'waiting' });
if ( $recalls->count ) {
# recalls take priority over holds
sub check_recalls {
my ( $self ) = @_;
- my @recalls = Koha::Recalls->search({ biblionumber => $self->biblionumber, itemnumber => [ $self->itemnumber, undef ], status => [ 'R','O','W','T' ] }, { order_by => { -asc => 'recalldate' } })->as_list;
+ my @recalls =
+ Koha::Recalls->search( { biblionumber => $self->biblionumber, itemnumber => [ $self->itemnumber, undef ], status => [ 'requested', 'overdue', 'waiting', 'in_transit' ] },
+ { order_by => { -asc => 'recalldate' } } )->as_list;
my $recall;
# iterate through relevant recalls to find the best one.
sub requested {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'R';
+ return $self->status eq 'requested';
}
=head3 waiting
sub waiting {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'W';
+ return $self->status eq 'waiting';
}
=head3 overdue
sub overdue {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'O';
+ return $self->status eq 'overdue';
}
=head3 in_transit
sub in_transit {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'T';
+ return $self->status eq 'in_transit';
}
=head3 expired
sub expired {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'E';
+ return $self->status eq 'expired';
}
=head3 cancelled
sub cancelled {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'C';
+ return $self->status eq 'cancelled';
}
-=head3 finished
+=head3 fulfilled
- if ( $recall->finished )
+ if ( $recall->fulfilled )
- [% IF recall.finished %]
+ [% IF recall.fulfilled %]
-Return true if recall is finished and has been fulfilled.
+Return true if the recall has been fulfilled.
=cut
-sub finished {
+sub fulfilled {
my ( $self ) = @_;
- my $status = $self->status;
- return $status && $status eq 'F';
+ return $self->status eq 'fulfilled';
}
=head3 calc_expirationdate
if ( $self->item_level_recall ) {
# already has an itemnumber
- $self->update({ status => 'T' });
+ $self->update({ status => 'in_transit' });
} else {
my $itemnumber = $params->{item}->itemnumber;
- $self->update({ status => 'T', itemnumber => $itemnumber });
+ $self->update({ status => 'in_transit', itemnumber => $itemnumber });
}
my ( $dotransfer, $messages ) = C4::Circulation::transferbook({ to_branch => $self->branchcode, from_branch => $self->item->holdingbranch, barcode => $self->item->barcode, trigger => 'Recall' });
my ( $self ) = @_;
if ( $self->item_level_recall ) {
- $self->update({ status => 'R' });
+ $self->update({ status => 'requested' });
} else {
- $self->update({ status => 'R', itemnumber => undef });
+ $self->update({ status => 'requested', itemnumber => undef });
}
return $self;
=head3 set_waiting
- $recall->set_waiting({
- expirationdate => $expirationdate,
- item => $item_object
- });
+ $recall->set_waiting(
+ { expirationdate => $expirationdate,
+ item => $item_object
+ }
+ );
Set the recall as waiting and update expiration date.
Notify the recall requester.
my $itemnumber;
if ( $self->item_level_recall ) {
$itemnumber = $self->itemnumber;
- $self->update({ status => 'W', waitingdate => dt_from_string, expirationdate => $params->{expirationdate} });
+ $self->update({ status => 'waiting', waitingdate => dt_from_string, expirationdate => $params->{expirationdate} });
} else {
# biblio-level recall with no itemnumber. need to set itemnumber
$itemnumber = $params->{item}->itemnumber;
- $self->update({ status => 'W', waitingdate => dt_from_string, expirationdate => $params->{expirationdate}, itemnumber => $itemnumber });
+ $self->update({ status => 'waiting', waitingdate => dt_from_string, expirationdate => $params->{expirationdate}, itemnumber => $itemnumber });
}
# send notice to recaller to pick up item
sub revert_waiting {
my ( $self ) = @_;
if ( $self->item_level_recall ){
- $self->update({ status => 'R', waitingdate => undef });
+ $self->update({ status => 'requested', waitingdate => undef });
} else {
- $self->update({ status => 'R', waitingdate => undef, itemnumber => undef });
+ $self->update({ status => 'requested', waitingdate => undef, itemnumber => undef });
}
return $self;
}
sub set_overdue {
my ( $self, $params ) = @_;
my $interface = $params->{interface} || 'COMMANDLINE';
- $self->update({ status => 'O' });
+ $self->update({ status => 'overdue' });
C4::Log::logaction( 'RECALLS', 'OVERDUE', $self->recall_id, "Recall status set to overdue", $interface ) if ( C4::Context->preference('RecallsLog') );
return $self;
}
sub set_expired {
my ( $self, $params ) = @_;
my $interface = $params->{interface} || 'COMMANDLINE';
- $self->update({ status => 'E', old => 1, expirationdate => dt_from_string });
+ $self->update({ status => 'expired', old => 1, expirationdate => dt_from_string });
C4::Log::logaction( 'RECALLS', 'EXPIRE', $self->recall_id, "Recall expired", $interface ) if ( C4::Context->preference('RecallsLog') );
return $self;
}
sub set_cancelled {
my ( $self ) = @_;
- $self->update({ status => 'C', old => 1, cancellationdate => dt_from_string });
+ $self->update({ status => 'cancelled', old => 1, cancellationdate => dt_from_string });
C4::Log::logaction( 'RECALLS', 'CANCEL', $self->recall_id, "Recall cancelled", 'INTRANET' ) if ( C4::Context->preference('RecallsLog') );
return $self;
}
-=head3 set_finished
+=head3 set_fulfilled
- $recall->set_finished;
+ $recall->set_fulfilled;
Set a recall as finished. This should only be called when the item allocated to a recall is checked out to the borrower who requested the recall.
=cut
-sub set_finished {
+sub set_fulfilled {
my ( $self ) = @_;
- $self->update({ status => 'F', old => 1 });
+ $self->update({ status => 'fulfilled', old => 1 });
C4::Log::logaction( 'RECALLS', 'FULFILL', $self->recall_id, "Recall fulfilled", 'INTRANET' ) if ( C4::Context->preference('RecallsLog') );
return $self;
}
=head1 API
-=head2 Internal methods
-
-=cut
+=head2 Class methods
=head3 add_recall
recalldate => dt_from_string(),
biblionumber => $biblio->biblionumber,
branchcode => $branchcode,
- status => 'R',
+ status => 'requested',
itemnumber => defined $itemnumber ? $itemnumber : undef,
expirationdate => $expirationdate,
item_level_recall => defined $itemnumber ? 1 : 0,
borrowernumber => $borrowernumber,
});
-A patron is attempting to check out an item that has been recalled by another patron. If the recall is requested/overdue, they have the option of cancelling the recall. If the recall is waiting, they also have the option of reverting the waiting status.
+A patron is attempting to check out an item that has been recalled by another patron.
+If the recall is requested/overdue, they have the option of cancelling the recall.
+If the recall is waiting, they also have the option of reverting the waiting status.
We can also fulfill the recall here if the recall is placed by this borrower.
if ( $message eq 'no action provided' and $item and $item->biblionumber and $borrowernumber ) {
# move_recall was not called to revert or cancel, but was called to fulfill
- my $recall = Koha::Recalls->search({ borrowernumber => $borrowernumber, biblionumber => $item->biblionumber, itemnumber => [ $item->itemnumber, undef ], old => undef }, { order_by => { -asc => 'recalldate' } })->next;
+ my $recall = Koha::Recalls->search(
+ {
+ borrowernumber => $borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => [ $item->itemnumber, undef ],
+ old => undef
+ },
+ { order_by => { -asc => 'recalldate' } }
+ )->next;
if ( $recall ) {
- $recall->set_finished;
+ $recall->set_fulfilled;
$message = 'fulfilled';
}
}
return $message;
}
+=head2 Internal methods
+
=head3 _type
=cut
--- /dev/null
+use Modern::Perl;
+
+return {
+ bug_number => "19532",
+ description => "Make recalls.status an enum",
+ up => sub {
+ my ($args) = @_;
+ my ($dbh) = @$args{qw(dbh)};
+
+ $dbh->do(q{
+ ALTER TABLE recalls
+ MODIFY COLUMN
+ status ENUM('requested','overdue','waiting','in_transit','cancelled','expired','fulfilled') DEFAULT 'requested' COMMENT "Request status"
+ });
+ },
+};
cancellationdate datetime DEFAULT NULL, -- the date this recall was cancelled
recallnotes mediumtext, -- notes related to this recall
priority smallint(6) DEFAULT NULL, -- where in the queue the patron sits
- status varchar(1) DEFAULT NULL, -- a one letter code defining the status of the recall. R=requested, O=overdue, W=awaiting pickup, T=in transit, E=expired, C=cancelled, F=finished/completed
+ status ENUM('requested','overdue','waiting','in_transit','cancelled','expired','fulfilled') DEFAULT 'requested' COMMENT "Request status",
timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- the date and time this recall was last updated
itemnumber int(11) DEFAULT NULL, -- foreign key from the items table defining the specific item the recall request was placed on
waitingdate datetime DEFAULT NULL, -- the date the item was marked as waiting for the patron at the library
expirationdate datetime DEFAULT NULL, -- the date the recall expires
- old TINYINT(1) DEFAULT NULL, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed
+ old TINYINT(1) DEFAULT 0, -- flag if the recall is old and no longer active, i.e. expired, cancelled or completed
item_level_recall TINYINT(1) NOT NULL DEFAULT 0, -- flag if item-level recall
PRIMARY KEY (recall_id),
KEY borrowernumber (borrowernumber),
borrowernumber => $recall_borrower->borrowernumber,
branchcode => $recall_borrower->branchcode,
item_level_recall => 1,
- status => 'R',
})->store;
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber );
is( $error, 'recalled', 'Cannot renew item that has been recalled' );
borrowernumber => $recall_borrower->borrowernumber,
branchcode => $recall_borrower->branchcode,
item_level_recall => 0,
- status => 'R',
})->store;
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber );
is( $error, 'recalled', 'Cannot renew item if biblio is recalled and has no item allocated' );
borrowernumber => $recall_borrower->borrowernumber,
branchcode => $recall_borrower->branchcode,
item_level_recall => 1,
- status => 'R',
})->store;
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber );
is( $renewokay, 1, 'Can renew item if item-level recall on biblio is not on this item' );
borrowernumber => $recall_borrower->borrowernumber,
branchcode => $recall_borrower->branchcode,
item_level_recall => 0,
- status => 'R',
})->store;
$recall->set_waiting({ item => $recall_item1 });
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber );
});
# checking out item that they have recalled
- my $recall1 = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => $item->itemnumber,
- item_level_recall => 1,
- branchcode => $patron1->branchcode,
- status => 'R',
- })->store;
+ my $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => $item->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron1->branchcode,
+ }
+ )->store;
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall1->recall_id } );
$recall1 = Koha::Recalls->find( $recall1->recall_id );
- is( $recall1->finished, 1, 'Recall was fulfilled when patron checked out item' );
+ is( $recall1->fulfilled, 1, 'Recall was fulfilled when patron checked out item' );
AddReturn( $item->barcode, $item->homebranch );
# this item is has a recall request. cancel recall
- my $recall2 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => $item->itemnumber,
- item_level_recall => 1,
- branchcode => $patron2->branchcode,
- status => 'R',
- })->store;
+ my $recall2 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => $item->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron2->branchcode,
+ }
+ )->store;
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall2->recall_id, cancel_recall => 'cancel' } );
$recall2 = Koha::Recalls->find( $recall2->recall_id );
is( $recall2->cancelled, 1, 'Recall was cancelled when patron checked out item' );
AddReturn( $item->barcode, $item->homebranch );
# this item is waiting to fulfill a recall. revert recall
- my $recall3 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => $item->itemnumber,
- item_level_recall => 1,
- branchcode => $patron2->branchcode,
- status => 'R',
- })->store;
+ my $recall3 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => $item->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron2->branchcode,
+ }
+ )->store;
$recall3->set_waiting;
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall3->recall_id, cancel_recall => 'revert' } );
$recall3 = Koha::Recalls->find( $recall3->recall_id );
});
# item-level recall
- my $recall = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => $item->itemnumber,
- item_level_recall => 1,
- branchcode => $patron1->branchcode,
- status => 'R',
- })->store;
+ my $recall = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => $item->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron1->branchcode,
+ }
+ )->store;
my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef );
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed an item-level recall on this item" );
$recall->set_cancelled;
# biblio-level recall
- $recall = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => undef,
- item_level_recall => 0,
- branchcode => $patron1->branchcode,
- status => 'R',
- })->store;
+ $recall = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => undef,
+ item_level_recall => 0,
+ branchcode => $patron1->branchcode,
+ }
+ )->store;
( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef );
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed a biblio-level recall and this item is eligible to fill it" );
$recall->set_cancelled;
# biblio-level recall
- $recall = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- biblionumber => $item->biblionumber,
- itemnumber => undef,
- item_level_recall => 0,
- branchcode => $patron1->branchcode,
- status => 'R',
- })->store;
- $recall->set_waiting({ item => $item, expirationdate => dt_from_string() });
+ $recall = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ biblionumber => $item->biblionumber,
+ itemnumber => undef,
+ item_level_recall => 0,
+ branchcode => $patron1->branchcode,
+ }
+ )->store;
+ $recall->set_waiting( { item => $item, expirationdate => dt_from_string() } );
my ( undef, undef, undef, $messages ) = CanBookBeIssued( $patron1, $item->barcode, undef, undef, undef, undef );
is( $messages->{RECALLED}, $recall->recall_id, "This book can be issued by this patron and they have placed a recall" );
# this item can fill a recall with pickup at this branch
AddIssue( $patron1->unblessed, $item1->barcode );
- my $recall1 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- biblionumber => $item1->biblionumber,
- itemnumber => $item1->itemnumber,
- item_level_recall => 1,
- branchcode => $item1->homebranch,
- status => 'R',
- })->store;
+ my $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ biblionumber => $item1->biblionumber,
+ itemnumber => $item1->itemnumber,
+ item_level_recall => 1,
+ branchcode => $item1->homebranch,
+ }
+ )->store;
my ( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch );
is( $messages->{RecallFound}->recall_id, $recall1->recall_id, "Recall found" );
$recall1->set_cancelled;
# this item can fill a recall but needs transfer
AddIssue( $patron1->unblessed, $item1->barcode );
- $recall1 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- biblionumber => $item1->biblionumber,
- itemnumber => $item1->itemnumber,
- item_level_recall => 1,
- branchcode => $patron2->branchcode,
- status => 'R',
- })->store;
+ $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ biblionumber => $item1->biblionumber,
+ itemnumber => $item1->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron2->branchcode,
+ }
+ )->store;
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch );
is( $messages->{RecallNeedsTransfer}, $item1->homebranch, "Recall requiring transfer found" );
$recall1->set_cancelled;
# this item is already in transit, do not ask to transfer
AddIssue( $patron1->unblessed, $item1->barcode );
- $recall1 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- biblionumber => $item1->biblionumber,
- itemnumber => $item1->itemnumber,
- item_level_recall => 1,
- branchcode => $patron2->branchcode,
- status => 'R',
- })->store;
+ $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ biblionumber => $item1->biblionumber,
+ itemnumber => $item1->itemnumber,
+ item_level_recall => 1,
+ branchcode => $patron2->branchcode,
+ }
+ )->store;
$recall1->start_transfer;
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $patron2->branchcode );
is( $messages->{TransferredRecall}->recall_id, $recall1->recall_id, "In transit recall found" );
recalldate => dt_from_string,
biblionumber => $item->biblionumber,
branchcode => $branch->{branchcode},
- status => 'R',
itemnumber => $item->itemnumber,
expirationdate => undef,
item_level_recall => 1
my ($amount) = CalcFine( $item->unblessed, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
is( int($amount), 25, 'Use recall fine amount specified in circulation rules' );
- $recall->set_finished;
+ $recall->set_fulfilled;
($amount) = CalcFine( $item->unblessed, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
is( int($amount), 5, 'With no recall, use normal fine amount' );
# recalls
t::lib::Mocks::mock_preference('UseRecalls', 1);
- my $recall = Koha::Recall->new({
- biblionumber => $item->biblionumber,
- itemnumber => $item->itemnumber,
- item_level_recall => 1,
- borrowernumber => $patron->borrowernumber,
- branchcode => $library->branchcode,
- status => 'R',
- })->store;
+ my $recall = Koha::Recall->new(
+ { biblionumber => $item->biblionumber,
+ itemnumber => $item->itemnumber,
+ item_level_recall => 1,
+ borrowernumber => $patron->borrowernumber,
+ branchcode => $library->branchcode,
+ }
+ )->store;
( $recall, $dotransfer, $messages ) = $recall->start_transfer;
is( $dotransfer, 0, 'Do not transfer recalled item, it has already arrived' );
is( $messages->{RecallPlacedAtHoldingBranch}, 1, "We found the recall");
my $item2 = $builder->build_object({ class => 'Koha::Items' }); # this item will have a different holding branch to the pickup branch
- $recall = Koha::Recall->new({
- biblionumber => $item2->biblionumber,
- itemnumber => $item2->itemnumber,
- item_level_recall => 1,
- borrowernumber => $patron->borrowernumber,
- branchcode => $library->branchcode,
- status => 'R',
- })->store;
+ $recall = Koha::Recall->new(
+ { biblionumber => $item2->biblionumber,
+ itemnumber => $item2->itemnumber,
+ item_level_recall => 1,
+ borrowernumber => $patron->borrowernumber,
+ branchcode => $library->branchcode,
+ }
+ )->store;
( $recall, $dotransfer, $messages ) = $recall->start_transfer;
is( $dotransfer, 1, 'Transfer of recalled item succeeded' );
is( $messages->{RecallFound}->recall_id, $recall->recall_id, "We found the recall");
plan tests => 12;
$schema->storage->txn_begin;
+
my $item1 = $builder->build_sample_item;
my $biblio = $item1->biblio;
my $branchcode = $item1->holdingbranch;
my $item2 = $builder->build_object({ class => 'Koha::Items', value => { holdingbranch => $branchcode, homebranch => $branchcode, biblionumber => $biblio->biblionumber, itype => $item1->effective_itemtype } });
t::lib::Mocks::mock_userenv({ patron => $patron1 });
- my $recall1 = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => $item1->itemnumber,
- expirationdate => undef,
- item_level_recall => 1
- })->store;
- my $recall2 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => undef,
- expirationdate => undef,
- item_level_recall => 0
- })->store;
- my $recall3 = Koha::Recall->new({
- borrowernumber => $patron3->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => $item1->itemnumber,
- expirationdate => undef,
- item_level_recall => 1
- })->store;
+ my $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => $item1->itemnumber,
+ expirationdate => undef,
+ item_level_recall => 1
+ }
+ )->store;
+ my $recall2 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => undef,
+ expirationdate => undef,
+ item_level_recall => 0
+ }
+ )->store;
+ my $recall3 = Koha::Recall->new(
+ { borrowernumber => $patron3->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => $item1->itemnumber,
+ expirationdate => undef,
+ item_level_recall => 1
+ }
+ )->store;
my $recalls_count = $biblio->recalls->count;
is( $recalls_count, 3, 'Correctly get number of active recalls for biblio' );
my $patron1 = $builder->build_object({ class => 'Koha::Patrons', value => { branchcode => $branchcode } });
my $patron2 = $builder->build_object({ class => 'Koha::Patrons', value => { branchcode => $branchcode } });
my $patron3 = $builder->build_object({ class => 'Koha::Patrons', value => { branchcode => $branchcode } });
- my $item2 = $builder->build_object({ class => 'Koha::Items', value => { holdingbranch => $branchcode, homebranch => $branchcode, biblionumber => $biblio->biblionumber, itype => $item1->effective_itemtype } });
- t::lib::Mocks::mock_userenv({ patron => $patron1 });
+ my $item2 = $builder->build_object(
+ { class => 'Koha::Items',
+ value => { holdingbranch => $branchcode, homebranch => $branchcode, biblionumber => $biblio->biblionumber, itype => $item1->effective_itemtype }
+ }
+ );
- my $recall1 = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => $item1->itemnumber,
- expirationdate => undef,
- item_level_recall => 1
- })->store;
- my $recall2 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => $item1->itemnumber,
- expirationdate => undef,
- item_level_recall =>1
- })->store;
+ t::lib::Mocks::mock_userenv( { patron => $patron1 } );
+
+ my $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => $item1->itemnumber,
+ expirationdate => undef,
+ item_level_recall => 1
+ }
+ )->store;
+ my $recall2 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => $item1->itemnumber,
+ expirationdate => undef,
+ item_level_recall => 1
+ }
+ )->store;
is( $item1->recall->borrowernumber, $patron1->borrowernumber, 'Correctly returns most relevant recall' );
C4::Circulation::AddIssue( $patron2->unblessed, $item1->barcode );
is( $item1->can_be_recalled({ patron => $patron1 }), 1, "Can recall item" );
- $recall1 = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => undef,
- expirationdate => undef,
- item_level_recall => 0
- })->store;
+ $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => undef,
+ expirationdate => undef,
+ item_level_recall => 0
+ }
+ )->store;
# Patron2 has Item1 checked out. Patron1 has placed a biblio-level recall on Biblio1, so check if Item1 can fulfill Patron1's recall.
# check_recalls tests
- $recall1 = Koha::Recall->new({
- borrowernumber => $patron2->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => $item1->itemnumber,
- expirationdate => undef,
- item_level_recall => 1
- })->store;
- $recall2 = Koha::Recall->new({
- borrowernumber => $patron1->borrowernumber,
- recalldate => Koha::DateUtils::dt_from_string,
- biblionumber => $biblio->biblionumber,
- branchcode => $branchcode,
- status => 'R',
- itemnumber => undef,
- expirationdate => undef,
- item_level_recall => 0
- })->store;
- $recall2->set_waiting({ item => $item1 });
+ $recall1 = Koha::Recall->new(
+ { borrowernumber => $patron2->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => $item1->itemnumber,
+ expirationdate => undef,
+ item_level_recall => 1
+ }
+ )->store;
+ $recall2 = Koha::Recall->new(
+ { borrowernumber => $patron1->borrowernumber,
+ recalldate => \'NOW()',
+ biblionumber => $biblio->biblionumber,
+ branchcode => $branchcode,
+ itemnumber => undef,
+ expirationdate => undef,
+ item_level_recall => 0
+ }
+ )->store;
+ $recall2->set_waiting( { item => $item1 } );
# return a waiting recall
my $check_recall = $item1->check_recalls;
my $biblio2 = $builder->build_object({ class => 'Koha::Biblios' });
my $item2 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $biblio2->biblionumber } });
- Koha::Recall->new({
- biblionumber => $biblio1->biblionumber,
- borrowernumber => $patron->borrowernumber,
- itemnumber => $item1->itemnumber,
- branchcode => $patron->branchcode,
- recalldate => dt_from_string,
- status => 'R',
- item_level_recall => 1,
- })->store;
- Koha::Recall->new({
- biblionumber => $biblio2->biblionumber,
- borrowernumber => $patron->borrowernumber,
- itemnumber => $item2->itemnumber,
- branchcode => $patron->branchcode,
- recalldate => dt_from_string,
- status => 'R',
- item_level_recall => 1,
- })->store;
- Koha::Recall->new({
- biblionumber => $biblio1->biblionumber,
- borrowernumber => $patron->borrowernumber,
- itemnumber => undef,
- branchcode => $patron->branchcode,
- recalldate => dt_from_string,
- status => 'R',
- item_level_recall => 0,
- })->store;
- my $recall = Koha::Recall->new({
- biblionumber => $biblio1->biblionumber,
- borrowernumber => $patron->borrowernumber,
- itemnumber => undef,
- branchcode => $patron->branchcode,
- recalldate => dt_from_string,
- status => 'R',
- item_level_recall => 0,
- })->store;
+ Koha::Recall->new(
+ { biblionumber => $biblio1->biblionumber,
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $item1->itemnumber,
+ branchcode => $patron->branchcode,
+ recalldate => \'NOW()',
+ item_level_recall => 1,
+ }
+ )->store;
+ Koha::Recall->new(
+ { biblionumber => $biblio2->biblionumber,
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $item2->itemnumber,
+ branchcode => $patron->branchcode,
+ recalldate => \'NOW()',
+ item_level_recall => 1,
+ }
+ )->store;
+ Koha::Recall->new(
+ { biblionumber => $biblio1->biblionumber,
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => undef,
+ branchcode => $patron->branchcode,
+ recalldate => \'NOW()',
+ item_level_recall => 0,
+ }
+ )->store;
+ my $recall = Koha::Recall->new(
+ { biblionumber => $biblio1->biblionumber,
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => undef,
+ branchcode => $patron->branchcode,
+ recalldate => \'NOW()',
+ item_level_recall => 0,
+ }
+ )->store;
$recall->set_cancelled;
is( $patron->recalls->count, 3, "Correctly gets this patron's active recalls" );
recalldate => dt_from_string,
biblionumber => $biblio1->biblionumber,
branchcode => $branch1,
- status => 'R',
+ status => 'requested',
itemnumber => $item1->itemnumber,
expirationdate => undef,
item_level_recall => 1
is( $recall1->patron->categorycode, $category1, "Recall patron relationship correctly linked" );
is( $recall1->library->branchname, Koha::Libraries->find( $branch1 )->branchname, "Recall library relationship correctly linked" );
is( $recall1->checkout->itemnumber, $item1->itemnumber, "Recall checkout relationship correctly linked" );
-is( $recall1->requested, 1, "Recall has been requested" );
+ok( $recall1->requested, "Recall has been requested" );
is( $recall1->should_be_overdue, 1, "Correctly calculated that recall should be marked overdue" );
$recall1->set_overdue({ interface => 'COMMANDLINE' });
-is( $recall1->overdue, 1, "Recall is overdue" );
+ok( $recall1->overdue, "Recall is overdue" );
$recall1->set_cancelled;
-is( $recall1->cancelled, 1, "Recall is cancelled" );
+ok( $recall1->cancelled, "Recall is cancelled" );
my $recall2 = Koha::Recall->new({
borrowernumber => $patron1->borrowernumber,
recalldate => dt_from_string,
biblionumber => $biblio1->biblionumber,
branchcode => $branch1,
- status => 'R',
itemnumber => $item1->itemnumber,
expirationdate => undef,
item_level_recall => 1
recalldate => dt_from_string,
biblionumber => $biblio1->biblionumber,
branchcode => $branch1,
- status => 'R',
itemnumber => $item1->itemnumber,
expirationdate => undef,
item_level_recall => 1
# test that recall gets T status
$recall3->start_transfer;
-is( $recall3->in_transit, 1, "Recall is in transit" );
+ok( $recall3->in_transit, "Recall is in transit" );
$recall3->revert_transfer;
-is( $recall3->requested, 1, "Recall transfer has been cancelled and the status reverted" );
+ok( $recall3->requested, "Recall transfer has been cancelled and the status reverted" );
is( $recall3->itemnumber, $item1->itemnumber, "Item persists for item-level recall" );
# for testing purposes, pretend the item gets checked out
-$recall3->set_finished;
-is( $recall3->finished, 1, "Recall has been fulfilled" );
+$recall3->set_fulfilled;
+ok( $recall3->fulfilled, "Recall has been fulfilled" );
C4::Circulation::AddIssue( $patron2->unblessed, $item1->barcode );
my $recall4 = Koha::Recall->new({
recalldate => dt_from_string,
biblionumber => $biblio1->biblionumber,
branchcode => $branch1,
- status => 'R',
itemnumber => undef,
expirationdate => undef,
item_level_recall => 0,
});
$message = Koha::Recalls->move_recall({ recall_id => $recall->recall_id, item => $item2, borrowernumber => $patron1->borrowernumber });
$recall = Koha::Recalls->find( $recall->recall_id );
-ok( $recall->finished, "Recall fulfilled with move_recall" );
+ok( $recall->fulfilled, "Recall fulfilled with move_recall" );
$schema->storage->txn_rollback();
biblionumber => $item->biblionumber,
itemnumber => $item->itemnumber,
branchcode => $item->holdingbranch,
- status => 'R',
}});
$recall->set_waiting;
$xml = C4::XSLT::buildKohaItemsNamespace( $item->biblionumber,[]);