Bugzilla – Attachment 6540 Details for
Bug 5877
Offline circulation improvements : upload all files, apply at once
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
[PATCH] [SIGNED-OFF] Bug 5877 : Offline circulation improvements : upload all files, apply at once
Bug-5877--Offline-circulation-improvements--upload.patch (text/plain), 17.83 KB, created by
Sophie MEYNIEUX
on 2011-12-02 16:14:16 UTC
(
hide
)
Description:
[PATCH] [SIGNED-OFF] Bug 5877 : Offline circulation improvements : upload all files, apply at once
Filename:
MIME Type:
Creator:
Sophie MEYNIEUX
Created:
2011-12-02 16:14:16 UTC
Size:
17.83 KB
patch
obsolete
>From a44dc1f931a9d1bfe648ad94e0a6ee3fb89844e3 Mon Sep 17 00:00:00 2001 >From: Sophie Meynieux <sophie.meynieux@biblibre.com> >Date: Fri, 2 Dec 2011 14:31:51 +0100 >Subject: [PATCH] Bug 5877 : Offline circulation improvements : upload all > files, apply at once > >Offline circ : You now can upload all offline files from the Firefox extension. >Once all circ desks have uploaded the file, the librarian can apply all of them, sorted by date. >This avoid the problem of someone issuing an item on desk A, returning it on desk B. >Before this improvement, if desk B uploaded the file before A, the return was applied before the issue, >resulting in the items reamining issued. > >Signed-off-by: Sophie Meynieux <sophie.meynieux@biblibre.com> >--- > C4/Circulation.pm | 118 ++++++++++++++++++++ > 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, 403 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 > >diff --git a/C4/Circulation.pm b/C4/Circulation.pm >index debef01..e86bee5 100644 >--- a/C4/Circulation.pm >+++ b/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 >@@ -3043,6 +3052,115 @@ sub LostItem{ > } > } > >+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} ); >+ unless ($itemnumber) { >+ return "barcode not found"; >+ } >+ 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; > >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index 452173d..6ebe536 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -1476,6 +1476,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` > -- > >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 9ae0060..61a296d 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -4571,6 +4571,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 > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt >index 2383599..6e7ae45 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt >@@ -53,6 +53,7 @@ > <h5>Offline Circulation</h5> > <ul> > <li><a href="/cgi-bin/koha/offline_circ/process_koc.pl">Offline Circulation File (.koc) Uploader</a></li> >+ <li><a href="/cgi-bin/koha/offline_circ/list.pl">Offline Circulation</a> (Firefox module: https://addons.mozilla.org/fr/firefox/addon/koct/)</li> > </ul> > </div> > </div> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt >new file mode 100644 >index 0000000..7afa22f >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/offline_circ/list.tt >@@ -0,0 +1,97 @@ >+ [% INCLUDE "doc-head-open.inc" %] >+ <title>Koha › Circulation › Offline Circulation</title> >+ [% INCLUDE "doc-head-close.inc" %] >+ <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script> >+ <script type="text/javascript" language="javascript"> >+ $(document).ready(function() { >+ $('#checkall').click(function() { >+ $(":checkbox").attr('checked', $('#checkall').is(':checked')); >+ }); >+ $('#process,#delete').click(function() { >+ var action = $(this).attr("id"); >+ $(":checkbox[name=operationid]:checked").each(function() { >+ var cb = $(this); >+ $.ajax({ >+ url: "process.pl", >+ data: { 'action': action, 'operationid': this.value }, >+ async: false, >+ dataType: "text", >+ success: function(data) { >+ cb.replaceWith(data); >+ }}); >+ }); >+ if( $('#operations tbody :checkbox').size() == 0 ) { >+ $('#actions').hide(); >+ } >+ }); >+ }); >+ </script> >+</head> >+<body> >+ [% INCLUDE 'header.inc' %] >+ [% INCLUDE 'circ-search.inc' %] >+ >+ <div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/circ/circulation-home.pl">Circulation</a> › Offline Circulation</div> >+ >+ <div id="doc" class="yui-t7"> >+ >+ <div id="bd"> >+ >+ <h2>Offline Circulation</h2> >+ >+ [% IF ( pending_operations ) %] >+ >+ <form> >+ >+ <table id="operations"> >+ <thead> >+ <tr> >+ <th><input type="checkbox" name="checkall" id="checkall" /></th> >+ <th>Date</th> >+ <th>Action</th> >+ <th>Barcode</th> >+ <th>Cardnumber</th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH operation IN pending_operations %] >+ <tr class="oc-[% operation.action %]"> >+ <td><input type="checkbox" name="operationid" value="[% operation.operationid %]" /></td> >+ <td>[% operation.timestamp %]</td> >+ <td>[% operation.action %]</td> >+ <td> >+ [% IF ( biblionumber ) %] >+ <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% operation.biblionumber %]" title="[% operation.bibliotitle %]">[% operation.barcode %]</a> >+ [% ELSE %] >+ <span class="error">[% operation.barcode %]</span> >+ [% END %] >+ </td> >+ <td> >+ [% IF ( operation.actionissue ) %] >+ [% IF ( operation.borrowernumber ) %] >+ <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% operation.borrowernumber %]" title="[% operation.borrower %]">[% operation.cardnumber %]</a> >+ [% ELSE %] >+ <span class="error">[% operation.cardnumber %]</span> >+ [% END %] >+ [% END %] >+ </td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> >+ >+ <p id="actions">For the selected operations: >+ <input type="button" id="process" value="Process" /> >+ <input type="button" id="delete" value="Delete" /></p> >+ >+ </form> >+ >+ [% ELSE %] >+ >+ <p>There is no pending offline operations.</p> >+ >+ [% END %] >+ >+ </div> >+ >+ [% INCLUDE 'intranet-bottom.inc' %] >diff --git a/offline_circ/list.pl b/offline_circ/list.pl >new file mode 100755 >index 0000000..47f9646 >--- /dev/null >+++ b/offline_circ/list.pl >@@ -0,0 +1,56 @@ >+#!/usr/bin/perl >+ >+# 2009 BibLibre <jeanandre.santoni@biblibre.com> >+ >+# 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; >+ >diff --git a/offline_circ/process.pl b/offline_circ/process.pl >new file mode 100755 >index 0000000..e1d1acd >--- /dev/null >+++ b/offline_circ/process.pl >@@ -0,0 +1,48 @@ >+#!/usr/bin/perl >+ >+# 2009 BibLibre <jeanandre.santoni@biblibre.com> >+ >+# 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; >+ >diff --git a/offline_circ/service.pl b/offline_circ/service.pl >new file mode 100755 >index 0000000..40bd4c7 >--- /dev/null >+++ b/offline_circ/service.pl >@@ -0,0 +1,60 @@ >+#!/usr/bin/perl >+ >+# 2009 BibLibre <jeanandre.santoni@biblibre.com> >+ >+# 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; >+ >-- >1.7.5.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 5877
:
3315
|
3400
|
4661
|
4861
|
4862
|
5681
|
5683
|
6540
|
7218
|
7250
|
7618
|
7715
|
7716
|
7717
|
7718
|
7812
|
7960