@@ -, +, @@
---
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 ++++++++++++++++
offline_circ/list.pl | 56 ++++++++++
offline_circ/process.pl | 48 ++++++++
offline_circ/service.pl | 60 ++++++++++
8 files changed, 402 insertions(+), 0 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
@@ -2943,6 +2952,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
@@ -1463,6 +1463,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
@@ -4446,6 +4446,12 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
SetVersion($DBversion);
}
+$DBversion = "3.05.00.XXX";
+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
--- 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 ) %]
+
+
+
+ [% ELSE %]
+
+
There is no pending offline operations.
+
+ [% END %]
+
+
+
+ [% INCLUDE 'intranet-bottom.inc' %]
--- 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;
+
--