Bug 4506: Add links to other editions, some minor corrections
[koha.git] / offline_circ / process_koc.pl
index 5b3d749..5f0d9ff 100755 (executable)
@@ -47,8 +47,8 @@ my ($template, $loggedinuser, $cookie)
   = get_template_and_user( { template_name => "offline_circ/process_koc.tmpl",
                                query => $query,
                                type => "intranet",
-                               authnotrequired => 1,
-                               debug => 1,
+                               authnotrequired => 0,
+                                flagsrequired   => { circulate => "circulate_remaining_permissions" },
                                });
 
 
@@ -115,7 +115,11 @@ if ($completedJobID) {
     my $header_line = shift @input_lines;
     my $file_info   = parse_header_line($header_line);
     if ($file_info->{'Version'} ne $FILE_VERSION) {
-        push( @output, { message => "Warning: This file is version '$file_info->{'Version'}', but I only know how to import version '$FILE_VERSION'. I'll try my best." } );
+      push( @output, { message => 1,
+      ERROR_file_version => 1,
+      upload_version => $file_info->{'Version'},
+      current_version => $FILE_VERSION
+      } );
     }
     
     
@@ -154,12 +158,14 @@ if ($completedJobID) {
 
 output_html_with_http_headers $query, $cookie, $template->output;
 
-=head3 parse_header_line
+=head1 FUNCTIONS
+
+=head2 parse_header_line
 
 parses the header line from a .koc file. This is the line that
 specifies things such as the file version, and the name and version of
 the offline circulation tool that generated the file. See
-L<http://wiki.koha.org/doku.php?id=koha_offline_circulation_file_format>
+L<http://wiki.koha-community.org/wiki/Koha_offline_circulation_file_format>
 for more information.
 
 pass in a string containing the header line (the first line from th
@@ -172,20 +178,22 @@ returns a hashref containing the information from the header.
 sub parse_header_line {
     my $header_line = shift;
     chomp($header_line);
+    $header_line =~ s/\r//g;
 
     my @fields = split( /\t/, $header_line );
     my %header_info = map { split( /=/, $_ ) } @fields;
     return \%header_info;
 }
 
-=head3 parse_command_line
+=head2 parse_command_line
 
 =cut
 
 sub parse_command_line {
     my $command_line = shift;
     chomp($command_line);
-
+    $command_line =~ s/\r//g;
+    
     my ( $timestamp, $command, @args ) = split( /\t/, $command_line );
     my ( $date,      $time,    $id )   = split( /\s/, $timestamp );
 
@@ -204,7 +212,7 @@ sub parse_command_line {
 
 }
 
-=head3 arguments_for_command
+=head2 arguments_for_command
 
 fetches the names of the columns (and function arguments) found in the
 .koc file for a particular command name. For instance, the C<issue>
@@ -233,8 +241,9 @@ sub arguments_for_command {
 sub kocIssueItem {
   my $circ = shift;
 
+  $circ->{ 'barcode' } = barcodedecode($circ->{'barcode'}) if( $circ->{'barcode'} && C4::Context->preference('itemBarcodeInputFilter'));
   my $branchcode = C4::Context->userenv->{branch};
-  my $borrower = GetMember( $circ->{ 'cardnumber' }, 'cardnumber' );
+  my $borrower = GetMember( 'cardnumber'=>$circ->{ 'cardnumber' } );
   my $item = GetBiblioFromItemNumber( undef, $circ->{ 'barcode' } );
   my $issue = GetItemIssue( $item->{'itemnumber'} );
 
@@ -243,11 +252,11 @@ sub kocIssueItem {
   my ( $year, $month, $day ) = split( /-/, $circ->{'date'} );
   ( $year, $month, $day ) = Add_Delta_Days( $year, $month, $day, $issuelength );
   my $date_due = sprintf("%04d-%02d-%02d", $year, $month, $day);
-  
+
   if ( $issue->{ 'date_due' } ) { ## Item is currently checked out to another person.
 #warn "Item Currently Issued.";
     my $issue = GetOpenIssue( $item->{'itemnumber'} );
-
+    
     if ( $issue->{'borrowernumber'} eq $borrower->{'borrowernumber'} ) { ## Issued to this person already, renew it.
 #warn "Item issued to this member already, renewing.";
     
@@ -260,7 +269,16 @@ sub kocIssueItem {
         $circ->{'date'},               # issuedate
     ) unless ($DEBUG);
 
-      push( @output, { message => "Renewed $item->{ 'title' } ( $item->{ 'barcode' } ) to $borrower->{ 'firstname' } $borrower->{ 'surename' } ( $borrower->{'cardnumber'} ) : $circ->{ 'datetime' }\n" } );
+      push( @output, { renew => 1,
+    title => $item->{ 'title' },
+    biblionumber => $item->{'biblionumber'},
+    barcode => $item->{ 'barcode' },
+    firstname => $borrower->{ 'firstname' },
+    surname => $borrower->{ 'surname' },
+    borrowernumber => $borrower->{'borrowernumber'},
+    cardnumber => $borrower->{'cardnumber'},
+    datetime => $circ->{ 'datetime' }
+    } );
 
     } else {
 #warn "Item issued to a different member.";
@@ -272,7 +290,16 @@ sub kocIssueItem {
       if ( Date_to_Days( $i_y, $i_m, $i_d ) < Date_to_Days( $c_y, $c_m, $c_d ) ) { ## Current issue to a different persion is older than this issue, return and issue.
         my $date_due_object = C4::Dates->new($date_due ,'iso');
         C4::Circulation::AddIssue( $borrower, $circ->{'barcode'}, $date_due_object ) unless ( DEBUG );
-        push( @output, { message => "Issued $item->{ 'title' } ( $item->{ 'barcode' } ) to $borrower->{ 'firstname' } $borrower->{ 'surename' } ( $borrower->{'cardnumber'} ) : $circ->{ 'datetime' }\n" } );
+        push( @output, { issue => 1,
+    title => $item->{ 'title' },
+    biblionumber => $item->{'biblionumber'},
+    barcode => $item->{ 'barcode' },
+    firstname => $borrower->{ 'firstname' },
+    surname => $borrower->{ 'surname' },
+    borrowernumber => $borrower->{'borrowernumber'},
+    cardnumber => $borrower->{'cardnumber'},
+    datetime => $circ->{ 'datetime' }
+    } );
 
       } else { ## Current issue is *newer* than this issue, write a 'returned' issue, as the item is most likely in the hands of someone else now.
 #warn "Current issue to another member is newer. Doing nothing";
@@ -284,34 +311,65 @@ sub kocIssueItem {
   } else { ## Item is not checked out to anyone at the moment, go ahead and issue it
       my $date_due_object = C4::Dates->new($date_due ,'iso');
       C4::Circulation::AddIssue( $borrower, $circ->{'barcode'}, $date_due_object ) unless ( DEBUG );
-    push( @output, { message => "Issued $item->{ 'title' } ( $item->{ 'barcode' } ) to $borrower->{ 'firstname' } $borrower->{ 'surename' } ( $borrower->{'cardnumber'} ) : $circ->{ 'datetime' }\n" } );
-  }  
+    push( @output, { issue => 1,
+    title => $item->{ 'title' },
+    biblionumber => $item->{'biblionumber'},
+    barcode => $item->{ 'barcode' },
+    firstname => $borrower->{ 'firstname' },
+    surname => $borrower->{ 'surname' },
+    borrowernumber => $borrower->{'borrowernumber'},
+    cardnumber => $borrower->{'cardnumber'},
+    datetime =>$circ->{ 'datetime' }
+    } );
+        }  
 }
 
 sub kocReturnItem {
   my ( $circ ) = @_;
+  $circ->{'barcode'} = barcodedecode($circ->{'barcode'}) if( $circ->{'barcode'} && C4::Context->preference('itemBarcodeInputFilter'));
   my $item = GetBiblioFromItemNumber( undef, $circ->{ 'barcode' } );
   #warn( Data::Dumper->Dump( [ $circ, $item ], [ qw( circ item ) ] ) );
   my $borrowernumber = _get_borrowernumber_from_barcode( $circ->{'barcode'} );
-  unless ( $borrowernumber ) {
-      push( @output, { message => "Warning: unable to determine borrower from item ($item->{'barcode'}). Cannot mark returned\n" } );
-  }
-  C4::Circulation::MarkIssueReturned( $borrowernumber,
+  if ( $borrowernumber ) {
+  my $borrower = GetMember( 'borrowernumber' =>$borrowernumber );
+    C4::Circulation::MarkIssueReturned( $borrowernumber,
                                       $item->{'itemnumber'},
                                       undef,
                                       $circ->{'date'} );
   
-  push( @output, { message => "Returned $item->{ 'title' } ( $item->{ 'barcode' } ) From borrower number $borrowernumber : $circ->{ 'datetime' }\n" } ); 
+  push( @output, { return => 1,
+    title => $item->{ 'title' },
+    biblionumber => $item->{'biblionumber'},
+    barcode => $item->{ 'barcode' },
+    borrowernumber => $borrower->{'borrowernumber'},
+    firstname => $borrower->{'firstname'},
+    surname => $borrower->{'surname'},
+    cardnumber => $borrower->{'cardnumber'},
+    datetime => $circ->{ 'datetime' }
+    } ); 
+  } else {
+    push( @output, { ERROR_no_borrower_from_item => 1,
+    badbarcode => $circ->{'barcode'}
+    } );
+  
+  }
+
 }
 
 sub kocMakePayment {
   my ( $circ ) = @_;
-  my $borrower = GetMember( $circ->{ 'cardnumber' }, 'cardnumber' );
+  my $borrower = GetMember( 'cardnumber'=>$circ->{ 'cardnumber' } );
   recordpayment( $borrower->{'borrowernumber'}, $circ->{'amount'} );
-  push( @output, { message => "accepted payment ($circ->{'amount'}) from cardnumber ($circ->{'cardnumber'}), borrower ($borrower->{'borrowernumber'})" } );
+  push( @output, { payment => 1,
+    amount => $circ->{'amount'},
+    firstname => $borrower->{'firstname'},
+    surname => $borrower->{'surname'},
+    cardnumber => $circ->{'cardnumber'},
+    borrower => $borrower->{'borrowernumber'}
+    } );
 }
 
-=head3 _get_borrowernumber_from_barcode
+=head2 _get_borrowernumber_from_barcode
 
 pass in a barcode
 get back the borrowernumber of the patron who has it checked out.