X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FSIP%2FILS%2FTransaction%2FCheckout.pm;h=da7a1b09571ba9f4596fa0ff6802ae7df6576547;hb=537c746dc41748a5045f9c60dd4d32b8abdef07c;hp=07d55ea1f607fd1ee943e34fd6ede62d2d1ba5e4;hpb=cb1ec158c0632ca6177057ba867a59cdd0566ea4;p=koha.git diff --git a/C4/SIP/ILS/Transaction/Checkout.pm b/C4/SIP/ILS/Transaction/Checkout.pm index 07d55ea1f6..da7a1b0957 100644 --- a/C4/SIP/ILS/Transaction/Checkout.pm +++ b/C4/SIP/ILS/Transaction/Checkout.pm @@ -9,85 +9,133 @@ use strict; use POSIX qw(strftime); use Sys::Syslog qw(syslog); +use Data::Dumper; +use CGI; use ILS; use ILS::Transaction; +use C4::Context; use C4::Circulation; use C4::Members; +use C4::Reserves qw(ModReserveFill); +use C4::Debug; -our @ISA = qw(ILS::Transaction); +use vars qw($VERSION @ISA $debug); + +BEGIN { + $VERSION = 3.07.00.049; + @ISA = qw(ILS::Transaction); +} # Most fields are handled by the Transaction superclass my %fields = ( security_inhibit => 0, due => undef, renew_ok => 0, - ); + ); sub new { my $class = shift;; my $self = $class->SUPER::new(); - my $element; - - foreach $element (keys %fields) { + foreach my $element (keys %fields) { $self->{_permitted}->{$element} = $fields{$element}; } - @{$self}{keys %fields} = values %fields; - # $self->{'due'} = time() + (60*60*24*14); # two weeks hence -# use Data::Dumper; -# warn Dumper $self; + $debug and warn "new ILS::Transaction::Checkout : " . Dumper $self; return bless $self, $class; } sub do_checkout { my $self = shift; syslog('LOG_DEBUG', "ILS::Transaction::Checkout performing checkout..."); - my $barcode = $self->{item}->id; + my $pending = $self->{item}->pending_queue; + my $shelf = $self->{item}->hold_shelf; + my $barcode = $self->{item}->id; my $patron_barcode = $self->{patron}->id; - warn $patron_barcode; - my $borrower = GetMember( $patron_barcode, 'cardnumber' ); -# use Data::Dumper; -# warn Dumper $borrower; - my ($issuingimpossible,$needsconfirmation) = CanBookBeIssued ( $borrower, $barcode ); + my $overridden_duedate; # usually passed as undef to AddIssue + $debug and warn "do_checkout: patron (" . $patron_barcode . ")"; + my $borrower = $self->{patron}->getmemberdetails_object(); + $debug and warn "do_checkout borrower: . " . Dumper $borrower; + my ($issuingimpossible,$needsconfirmation) = CanBookBeIssued( + $borrower, + $barcode, + undef, + 0, + C4::Context->preference("AllowItemsOnHoldCheckout") + ); my $noerror=1; - foreach my $impossible ( keys %$issuingimpossible ) { - # do something here so we pass these errors - $self->screen_msg($issuingimpossible->{$impossible}); - $noerror = 0; - } - foreach my $confirmation ( keys %$needsconfirmation ) { - if ($confirmation eq 'RENEW_ISSUE'){ - if (!CanBookBeRenewed($borrower->{borrowernumber},$self->{item}->{itemnumber})){ - $noerror = 0; - warn "cant renew $borrower->{borrowernumber} $self->{item}->{itemnumber}"; - } - } - else { - $self->screen_msg($needsconfirmation->{$confirmation}); - $noerror = 0; - } - } - - - if ($noerror){ - warn "can issue"; - # we can issue - my $datedue = AddIssue( $borrower, $barcode, undef, 0 ); - $self->{'due'} = $datedue; - $self->ok(1); - } - else { - warn "cant issue"; - use Data::Dumper; - warn Dumper $issuingimpossible; - warn Dumper $needsconfirmation; + if (scalar keys %$issuingimpossible) { + foreach (keys %$issuingimpossible) { + # do something here so we pass these errors + $self->screen_msg($_ . ': ' . $issuingimpossible->{$_}); + $noerror = 0; + } + } else { + foreach my $confirmation (keys %{$needsconfirmation}) { + if ($confirmation eq 'RENEW_ISSUE'){ + $self->screen_msg("Item already checked out to you: renewing item."); + } elsif ($confirmation eq 'RESERVED' or $confirmation eq 'RESERVE_WAITING') { + my $x = $self->{item}->available($patron_barcode); + if ($x) { + $self->screen_msg("Item was reserved for you."); + } else { + $self->screen_msg("Item is reserved for another patron upon return."); + # $noerror = 0; + } + } elsif ($confirmation eq 'ISSUED_TO_ANOTHER') { + $self->screen_msg("Item already checked out to another patron. Please return item for check-in."); + $noerror = 0; + } elsif ($confirmation eq 'DEBT') { # don't do anything, it's the minor debt, and alarms fire elsewhere + } elsif ($confirmation eq 'HIGHHOLDS') { + $overridden_duedate = $needsconfirmation->{$confirmation}->{returndate}; + $self->screen_msg('Loan period reduced for high-demand item'); + } else { + $self->screen_msg($needsconfirmation->{$confirmation}); + $noerror = 0; + } + } + } + my $itemnumber = $self->{item}->{itemnumber}; + foreach (@$shelf) { + $debug and warn "shelf has ($_->{itemnumber} for $_->{borrowernumber}). this is ($itemnumber, $self->{patron}->{borrowernumber})"; + ($_->{itemnumber} eq $itemnumber) or next; # skip it if not this item + ($_->{borrowernumber} == $self->{patron}->{borrowernumber}) and last; + # if item was waiting for this patron, we're done. AddIssue takes care of the "W" hold. + $debug and warn "Item is on hold shelf for another patron."; + $self->screen_msg("Item is on hold shelf for another patron."); + $noerror = 0; + } + unless ($noerror) { + $debug and warn "cannot issue: " . Dumper($issuingimpossible) . "\n" . Dumper($needsconfirmation); $self->ok(0); + return $self; } + # Fill any reserves the patron had on the item. + # TODO: this logic should be pulled internal to AddIssue for all Koha. + $debug and warn "pending_queue: " . (@$pending) ? Dumper($pending) : '[]'; + foreach (grep {$_->{borrowernumber} eq $self->{patron}->{borrowernumber}} @$pending) { + $debug and warn "Filling reserve (borrowernumber,biblionumber,reservedate): " + . sprintf("(%s,%s,%s)\n",$_->{borrowernumber},$_->{biblionumber},$_->{reservedate}); + ModReserveFill($_); + # TODO: adjust representation in $self->item + } + # can issue + $debug and warn "do_checkout: calling AddIssue(\$borrower,$barcode, $overridden_duedate, 0)\n" + # . "w/ \$borrower: " . Dumper($borrower) + . "w/ C4::Context->userenv: " . Dumper(C4::Context->userenv); + my $due_dt = AddIssue($borrower, $barcode, $overridden_duedate, 0); + if ($due_dt) { + $self->{due} = $due_dt->clone(); + } else { + $self->{due} = undef; + } + + #$self->{item}->due_date($due); + $self->ok(1); return $self; - } 1; +__END__