@@ -, +, @@ --- C4/Circulation.pm | 117 ++++++++++++++++++++ installer/data/mysql/kohastructure.sql | 17 +++ installer/data/mysql/updatedatabase.pl | 6 + .../prog/en/modules/circ/circulation-home.tt | 1 + .../prog/en/modules/offline_circ/list.tt | 97 ++++++++++++++++ kohaversion.pl | 2 +- offline_circ/list.pl | 56 ++++++++++ offline_circ/process.pl | 48 ++++++++ offline_circ/service.pl | 60 ++++++++++ 9 files changed, 403 insertions(+), 1 deletions(-) create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt create mode 100755 offline_circ/list.pl create mode 100755 offline_circ/process.pl create mode 100755 offline_circ/service.pl --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -99,6 +99,15 @@ BEGIN { &CreateBranchTransferLimit &DeleteBranchTransferLimits ); + + # subs to deal with offline circulation + push @EXPORT, qw( + &GetOfflineOperations + &GetOfflineOperation + &AddOfflineOperation + &DeleteOfflineOperation + &ProcessOfflineOperation + ); } =head1 NAME @@ -2942,6 +2951,114 @@ sub DeleteBranchTransferLimits { $sth->execute(); } +sub GetOfflineOperations { + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT * FROM pending_offline_operations WHERE branchcode=? ORDER BY timestamp"); + $sth->execute(C4::Context->userenv->{'branch'}); + my $results = $sth->fetchall_arrayref({}); + $sth->finish; + return $results; +} + +sub GetOfflineOperation { + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT * FROM pending_offline_operations WHERE operationid=?"); + $sth->execute( shift ); + my $result = $sth->fetchrow_hashref; + $sth->finish; + return $result; +} + +sub AddOfflineOperation { + my $dbh = C4::Context->dbh; + warn Data::Dumper::Dumper(@_); + my $sth = $dbh->prepare("INSERT INTO pending_offline_operations VALUES('',?,?,?,?,?,?)"); + $sth->execute( @_ ); + return "Added."; +} + +sub DeleteOfflineOperation { + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("DELETE FROM pending_offline_operations WHERE operationid=?"); + $sth->execute( shift ); + return "Deleted."; +} + +sub ProcessOfflineOperation { + my $operation = shift; + + my $report; + if ( $operation->{action} eq 'return' ) { + $report = ProcessOfflineReturn( $operation ); + } elsif ( $operation->{action} eq 'issue' ) { + $report = ProcessOfflineIssue( $operation ); + } + + DeleteOfflineOperation( $operation->{operationid} ) if $operation->{operationid}; + + return $report; +} + +sub ProcessOfflineReturn { + my $operation = shift; + + my $itemnumber = C4::Items::GetItemnumberFromBarcode( $operation->{barcode} ); + + if ( $itemnumber ) { + my $issue = GetOpenIssue( $itemnumber ); + if ( $issue ) { + MarkIssueReturned( + $issue->{borrowernumber}, + $itemnumber, + undef, + $operation->{timestamp}, + ); + ModItem( + { renewals => 0, onloan => undef }, + $issue->{'biblionumber'}, + $itemnumber + ); + return "Success."; + } else { + return "Item not issued."; + } + } else { + return "Item not found."; + } +} + +sub ProcessOfflineIssue { + my $operation = shift; + + my $borrower = C4::Members::GetMemberDetails( undef, $operation->{cardnumber} ); # Get borrower from operation cardnumber + + if ( $borrower->{borrowernumber} ) { + my $itemnumber = C4::Items::GetItemnumberFromBarcode( $operation->{barcode} ); + my $issue = GetOpenIssue( $itemnumber ); + + if ( $issue and ( $issue->{borrowernumber} ne $borrower->{borrowernumber} ) ) { # Item already issued to another borrower, mark it returned + MarkIssueReturned( + $issue->{borrowernumber}, + $itemnumber, + undef, + $operation->{timestamp}, + ); + } + AddIssue( + $borrower, + $operation->{'barcode'}, + undef, + 1, + $operation->{timestamp}, + undef, + ); + return "Success."; + } else { + return "Borrower not found."; + } +} + + 1; --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -1455,6 +1455,23 @@ CREATE TABLE `patronimage` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- +-- Table structure for table `pending_offline_operations` +-- +-- this table is MyISAM, InnoDB tables are growing only and this table is filled/emptied/filled/emptied... +-- so MyISAM is better in this case + +CREATE TABLE `pending_offline_operations` ( + `operationid` int(11) NOT NULL AUTO_INCREMENT, + `userid` varchar(30) NOT NULL, + `branchcode` varchar(10) NOT NULL, + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `action` varchar(10) NOT NULL, + `barcode` varchar(20) NOT NULL, + `cardnumber` varchar(16) DEFAULT NULL, + PRIMARY KEY (`operationid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -- Table structure for table `printers` -- --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -4370,6 +4370,12 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.05.00.005"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + $dbh->do("CREATE TABLE `pending_offline_operations` ( `operationid` int(11) NOT NULL AUTO_INCREMENT, `userid` varchar(30) NOT NULL, `branchcode` varchar(10) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `action` varchar(10) NOT NULL, `barcode` varchar(20) NOT NULL, `cardnumber` varchar(16) DEFAULT NULL, PRIMARY KEY (`operationid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); + print "Upgrade to $DBversion done ( adding offline operations table )\n"; + SetVersion($DBversion); +} =head1 FUNCTIONS =head2 DropAllForeignKeys($table) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt @@ -53,6 +53,7 @@
Offline Circulation
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt @@ -0,0 +1,97 @@ + [% INCLUDE "doc-head-open.inc" %] + Koha › Circulation › Offline Circulation + [% INCLUDE "doc-head-close.inc" %] + + + + + [% INCLUDE 'header.inc' %] + [% INCLUDE 'circ-search.inc' %] + + + +
+ +
+ +

Offline Circulation

+ + [% IF ( pending_operations ) %] + +
+ + + + + + + + + + + + + [% FOREACH operation IN pending_operations %] + + + + + + + + [% END %] + +
DateActionBarcodeCardnumber
[% operation.timestamp %][% operation.action %] + [% IF ( biblionumber ) %] + [% operation.barcode %] + [% ELSE %] + [% operation.barcode %] + [% END %] + + [% IF ( operation.actionissue ) %] + [% IF ( operation.borrowernumber ) %] + [% operation.cardnumber %] + [% ELSE %] + [% operation.cardnumber %] + [% END %] + [% END %] +
+ +

For the selected operations: + +

+ +
+ + [% ELSE %] + +

There is no pending offline operations.

+ + [% END %] + +
+ + [% INCLUDE 'intranet-bottom.inc' %] --- a/kohaversion.pl +++ a/kohaversion.pl @@ -16,7 +16,7 @@ the kohaversion is divided in 4 parts : use strict; sub kohaversion { - our $VERSION = '3.05.00.004'; + our $VERSION = '3.05.00.005'; # version needs to be set this way # so that it can be picked up by Makefile.PL # during install --- a/offline_circ/list.pl +++ a/offline_circ/list.pl @@ -0,0 +1,56 @@ +#!/usr/bin/perl + +# 2009 BibLibre + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA +# + +use CGI; +use C4::Output; +use C4::Auth; +use C4::Koha; +use C4::Context; +use C4::Circulation; +use C4::Branch; +use C4::Members; +use C4::Biblio; + +my $query = CGI->new; + +my ($template, $loggedinuser, $cookie) = get_template_and_user({ + template_name => "offline_circ/list.tmpl", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { circulate => "circulate_remaining_permissions" }, +}); + +my $operations = GetOfflineOperations; + +for (@$operations) { + my $biblio = GetBiblioFromItemNumber(undef, $_->{'barcode'}); + $_->{'bibliotitle'} = $biblio->{'title'}; + $_->{'biblionumber'} = $biblio->{'biblionumber'}; + my $borrower = GetMemberDetails(undef,$_->{'cardnumber'}); + $_->{'borrowernumber'} = $borrower->{'borrowernumber'}; + $_->{'borrower'} = join(' ', $borrower->{'firstname'}, $borrower->{'surname'}); + $_->{'actionissue'} = $_->{'action'} eq 'issue'; + $_->{'actionreturn'} = $_->{'action'} eq 'return'; +} +$template->param(pending_operations => $operations); + +output_html_with_http_headers $query, $cookie, $template->output; + --- a/offline_circ/process.pl +++ a/offline_circ/process.pl @@ -0,0 +1,48 @@ +#!/usr/bin/perl + +# 2009 BibLibre + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA +# + +use CGI; +use C4::Auth; +use C4::Circulation; + +my $query = CGI->new; + +my ($template, $loggedinuser, $cookie) = get_template_and_user({ + template_name => "offline_circ/list.tmpl", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { circulate => "circulate_remaining_permissions" }, +}); + +my $operationid = $query->param('operationid'); +my $action = $query->param('action'); +my $result; + +if ( $action eq 'process' ) { + my $operation = GetOfflineOperation( $operationid ); + $result = ProcessOfflineOperation( $operation ); +} elsif ( $action eq 'delete' ) { + $result = DeleteOfflineOperation( $operationid ); +} + +print CGI::header('-type'=>'text/plain', '-charset'=>'utf-8'); +print $result; + --- a/offline_circ/service.pl +++ a/offline_circ/service.pl @@ -0,0 +1,60 @@ +#!/usr/bin/perl + +# 2009 BibLibre + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA +# + +use CGI; +use C4::Auth; +use C4::Circulation; + +my $cgi = CGI->new; + +# get the status of the user, this will check his credentials and rights +my ($status, $cookie, $sessionId) = C4::Auth::check_api_auth($cgi, undef); + +my $result; + +if ($status eq 'ok') { # if authentication is ok + if ( $cgi->param('pending') eq 'true' ) { # if the 'pending' flag is true, we store the operation in the db instead of directly processing them + $result = AddOfflineOperation( + $cgi->param('userid') || '', + $cgi->param('branchcode') || '', + $cgi->param('timestamp') || '', + $cgi->param('action') || '', + $cgi->param('barcode') || '', + $cgi->param('cardnumber') || '', + ); + } else { + $result = ProcessOfflineOperation( + { + 'userid' => $cgi->param('userid'), + 'branchcode' => $cgi->param('branchcode'), + 'timestamp' => $cgi->param('timestamp'), + 'action' => $cgi->param('action'), + 'barcode' => $cgi->param('barcode'), + 'cardnumber' => $cgi->param('cardnumber'), + } + ); + } +} else { + $result = "Authentication failed." +} + +print CGI::header('-type'=>'text/plain', '-charset'=>'utf-8'); +print $result; + --