"Fossies" - the Fresh Open Source Software Archive

Member "koha-19.11.15/C4/SIP/ILS/Transaction/Checkout.pm" (23 Feb 2021, 5781 Bytes) of package /linux/misc/koha-19.11.15.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "Checkout.pm" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 20.05.06_vs_20.11.00.

    1 #
    2 # An object to handle checkout status
    3 #
    4 
    5 package C4::SIP::ILS::Transaction::Checkout;
    6 
    7 use warnings;
    8 use strict;
    9 
   10 use POSIX qw(strftime);
   11 use Sys::Syslog qw(syslog);
   12 use Data::Dumper;
   13 use CGI qw ( -utf8 );
   14 
   15 use C4::SIP::ILS::Transaction;
   16 
   17 use C4::Context;
   18 use C4::Circulation;
   19 use C4::Members;
   20 use C4::Reserves qw(ModReserveFill);
   21 use C4::Debug;
   22 use Koha::DateUtils;
   23 
   24 use parent qw(C4::SIP::ILS::Transaction);
   25 
   26 our $debug;
   27 
   28 
   29 # Most fields are handled by the Transaction superclass
   30 my %fields = (
   31           security_inhibit => 0,
   32           due              => undef,
   33           renew_ok         => 0,
   34     );
   35 
   36 sub new {
   37     my $class = shift;;
   38     my $self = $class->SUPER::new();
   39     foreach my $element (keys %fields) {
   40         $self->{_permitted}->{$element} = $fields{$element};
   41     }
   42     @{$self}{keys %fields} = values %fields;
   43 #    $self->{'due'} = time() + (60*60*24*14); # two weeks hence
   44     $debug and warn "new ILS::Transaction::Checkout : " . Dumper $self;
   45     return bless $self, $class;
   46 }
   47 
   48 sub do_checkout {
   49     my $self = shift;
   50     syslog('LOG_DEBUG', "ILS::Transaction::Checkout performing checkout...");
   51     my $shelf          = $self->{item}->hold_shelf;
   52     my $barcode        = $self->{item}->id;
   53     my $patron         = Koha::Patrons->find($self->{patron}->{borrowernumber});
   54     my $overridden_duedate; # usually passed as undef to AddIssue
   55     $debug and warn "do_checkout borrower: . " . $patron->borrowernumber;
   56     my ($issuingimpossible, $needsconfirmation) = _can_we_issue($patron, $barcode,
   57         C4::Context->preference("AllowItemsOnHoldCheckoutSIP")
   58     );
   59 
   60     my $noerror=1;  # If set to zero we block the issue
   61     if (keys %{$issuingimpossible}) {
   62         foreach (keys %{$issuingimpossible}) {
   63             # do something here so we pass these errors
   64             $self->screen_msg("Issue failed : $_");
   65             $noerror = 0;
   66             last;
   67         }
   68     } else {
   69         foreach my $confirmation (keys %{$needsconfirmation}) {
   70             if ($confirmation eq 'RENEW_ISSUE'){
   71                 $self->screen_msg("Item already checked out to you: renewing item.");
   72             } elsif ($confirmation eq 'RESERVED' or $confirmation eq 'RESERVE_WAITING') {
   73                 my $x = $self->{item}->available($patron->borrowernumber);
   74                 if ($x) {
   75                     $self->screen_msg("Item was reserved for you.");
   76                 } else {
   77                     $self->screen_msg("Item is reserved for another patron upon return.");
   78                     $noerror = 0;
   79                 }
   80             } elsif ($confirmation eq 'ISSUED_TO_ANOTHER') {
   81                 $self->screen_msg("Item already checked out to another patron.  Please return item for check-in.");
   82                 $noerror = 0;
   83                 last;
   84             } elsif ($confirmation eq 'DEBT') {
   85                 $self->screen_msg('Outstanding Fines block issue');
   86                 $noerror = 0;
   87                 last;
   88             } elsif ($confirmation eq 'HIGHHOLDS') {
   89                 $overridden_duedate = $needsconfirmation->{$confirmation}->{returndate};
   90                 $self->screen_msg('Loan period reduced for high-demand item');
   91             } elsif ($confirmation eq 'RENTALCHARGE') {
   92                 if ($self->{fee_ack} ne 'Y') {
   93                     $noerror = 0;
   94                     last;
   95                 }
   96              } elsif ($confirmation eq 'PREVISSUE') {
   97                 $self->screen_msg("This item was previously checked out by you");
   98                 last;
   99             } else {
  100                 # We've been returned a case other than those above
  101                 $self->screen_msg("Item cannot be issued: $confirmation");
  102                 $noerror = 0;
  103                 syslog('LOG_DEBUG', "Blocking checkout Reason:$confirmation");
  104                 last;
  105             }
  106         }
  107     }
  108     my $itemnumber = $self->{item}->{itemnumber};
  109     foreach (@$shelf) {
  110         $debug and warn sprintf( "shelf has (%s for %s). this is (%is, %s)", $_->{itemnumber}, $_->{borrowernumber}, $itemnumber, $patron->borrowernumber );
  111         ($_->{itemnumber} eq $itemnumber) or next;    # skip it if not this item
  112         ($_->{borrowernumber} == $patron->borrowernumber) and last;
  113             # if item was waiting for this patron, we're done.  AddIssue takes care of the "W" hold.
  114         $debug and warn "Item is on hold shelf for another patron.";
  115         $self->screen_msg("Item is on hold shelf for another patron.");
  116         $noerror = 0;
  117     }
  118     my ($fee, undef) = GetIssuingCharges($itemnumber, $patron->borrowernumber);
  119     if ( $fee > 0 ) {
  120         $self->{sip_fee_type} = '06';
  121         $self->{fee_amount} = sprintf '%.2f', $fee;
  122         if ($self->{fee_ack} eq 'N' ) {
  123             $noerror = 0;
  124         }
  125     }
  126     unless ($noerror) {
  127         $debug and warn "cannot issue: " . Dumper($issuingimpossible) . "\n" . Dumper($needsconfirmation);
  128         $self->ok(0);
  129         return $self;
  130     }
  131     # can issue
  132     $debug and warn sprintf("do_checkout: calling AddIssue(%s, %s, %s, 0)\n", $patron->borrowernumber, $barcode, $overridden_duedate)
  133         . "w/ C4::Context->userenv: " . Dumper(C4::Context->userenv);
  134     my $issue = AddIssue( $patron->unblessed, $barcode, $overridden_duedate, 0 );
  135     $self->{due} = $self->duedatefromissue($issue, $itemnumber);
  136 
  137     $self->ok(1);
  138     return $self;
  139 }
  140 
  141 sub _can_we_issue {
  142     my ( $patron, $barcode, $pref ) = @_;
  143 
  144     my ( $issuingimpossible, $needsconfirmation, $alerts ) =
  145       CanBookBeIssued( $patron, $barcode, undef, 0, $pref );
  146     for my $href ( $issuingimpossible, $needsconfirmation ) {
  147 
  148         # some data is returned using lc keys we only
  149         foreach my $key ( keys %{$href} ) {
  150             if ( $key =~ m/[^A-Z_]/ ) {
  151                 delete $href->{$key};
  152             }
  153         }
  154     }
  155     return ( $issuingimpossible, $needsconfirmation );
  156 }
  157 
  158 1;
  159 __END__