From 38ba227a6a7f0240f612aa3d854e729495620a72 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Wed, 15 May 2013 17:33:06 +0200 Subject: [PATCH] Bug 10860: In-House Use This patch implements the In-House Use feature for Koha. It adds: - 2 new sysprefs: 'In-House Use' to enable/disable this feature 'In-House Use Forced' to enable/disable the feature for *all* users. - 2 new columns issues.inhouse_use and old_issues.inhouse_use - 1 new script misc/cronjobs/bulk_transfers.pl - Datatable on the circulation history pages (readingrec) at the OPAC and the intranet. A new checkbox in the Circulation tab. If checked, the issue become a in-house use (in the statistics and issues tables). When you check it, the due date changes to the today date. The syspref "In-House Use Force" allows to force the in-house use to permit the checkout even if the borrower is debarred or others problems. In the issue table, a new string (in red) marks the issue as "in-house use". The circulation history contains 3 tabs : "all", "checkout" and "in-house use" (OPAC and intranet). The cronjob script: If AutomaticItemReturn if off, a library would like not to do a transit operation manually. This script (to launch each night) do returns for a specific branches. Test plan: 1/ Execute the updatedatabase entry 2/ Enable the 'In-House Use' pref. 3/ Checkout a biblio for a patron and check the 'in-house use' checkbox. 4/ Check that the due date is the today date (with 23:59) and is not modifiable. 5/ Click on the check out button and check that the new check out appears in the table bellow with the "(In-house use)" string. 6/ Go on the circulation history pages (readingrec and opac-readingrec) and try the 3 tabs. In the last one, your last checkout should appear. 7/ Check in. 8/ Check readingrec pages. 9/ Choose a debarred patron and check that you cannot checkout a biblio for him. 10/ Switch on the 'In-House Use Forced' pref 11/ You are now allowed to checkout a biblio for the debarred patron. --- C4/Circulation.pm | 18 +- C4/Items.pm | 6 + circ/circulation.pl | 27 ++- installer/data/mysql/kohastructure.sql | 2 + installer/data/mysql/sysprefs.sql | 2 + installer/data/mysql/updatedatabase.pl | 24 +++ .../intranet-tmpl/prog/en/css/staff-global.css | 15 ++ koha-tmpl/intranet-tmpl/prog/en/js/datatables.js | 18 +- .../en/modules/admin/preferences/circulation.pref | 12 ++ .../prog/en/modules/catalogue/detail.tt | 8 + .../prog/en/modules/circ/circulation.tt | 84 +++++++-- .../prog/en/modules/members/readingrec.tt | 124 ++++++++----- koha-tmpl/opac-tmpl/prog/en/css/datatables.css | 194 ++++++++++---------- .../opac-tmpl/prog/en/includes/item-status.inc | 8 + koha-tmpl/opac-tmpl/prog/en/js/datatables.js | 2 +- .../prog/en/modules/opac-readingrecord.tt | 105 +++++++---- koha-tmpl/opac-tmpl/prog/images/next-disabled.png | Bin 0 -> 866 bytes koha-tmpl/opac-tmpl/prog/images/next.png | Bin 0 -> 736 bytes koha-tmpl/opac-tmpl/prog/images/prev-disabled.png | Bin 0 -> 862 bytes koha-tmpl/opac-tmpl/prog/images/prev.png | Bin 0 -> 745 bytes misc/cronjobs/bulk_transferts.pl | 105 +++++++++++ 21 files changed, 534 insertions(+), 220 deletions(-) create mode 100644 koha-tmpl/opac-tmpl/prog/images/next-disabled.png create mode 100644 koha-tmpl/opac-tmpl/prog/images/next.png create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev-disabled.png create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev.png create mode 100644 misc/cronjobs/bulk_transferts.pl diff --git a/C4/Circulation.pm b/C4/Circulation.pm index df3245d..9733bf0 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -1177,9 +1177,12 @@ AddIssue does the following things : =cut sub AddIssue { - my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_; + my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode, $params ) = @_; + my $inhouse_use = $params->{inhouse_use}; my $dbh = C4::Context->dbh; - my $barcodecheck=CheckValidBarcode($barcode); + my $barcodecheck=CheckValidBarcode($barcode); + $inhouse_use = ( $inhouse_use ? 1 : 0 ); + if ($datedue && ref $datedue ne 'DateTime') { $datedue = dt_from_string($datedue); } @@ -1247,8 +1250,8 @@ sub AddIssue { my $sth = $dbh->prepare( "INSERT INTO issues - (borrowernumber, itemnumber,issuedate, date_due, branchcode) - VALUES (?,?,?,?,?)" + (borrowernumber, itemnumber,issuedate, date_due, branchcode, inhouse_use) + VALUES (?,?,?,?,?,?)" ); unless ($datedue) { my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'}; @@ -1256,12 +1259,14 @@ sub AddIssue { } $datedue->truncate( to => 'minute'); + $sth->execute( $borrower->{'borrowernumber'}, # borrowernumber $item->{'itemnumber'}, # itemnumber $issuedate->strftime('%Y-%m-%d %H:%M:00'), # issuedate $datedue->strftime('%Y-%m-%d %H:%M:00'), # date_due - C4::Context->userenv->{'branch'} # branchcode + C4::Context->userenv->{'branch'}, # branchcode + $inhouse_use, ); if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart. CartToShelf( $item->{'itemnumber'} ); @@ -1302,7 +1307,8 @@ sub AddIssue { # Record the fact that this book was issued. &UpdateStats( C4::Context->userenv->{'branch'}, - 'issue', $charge, + ( $inhouse_use ? 'inhouse_use' : 'issue' ), + $charge, ($sipmode ? "SIP-$sipmode" : ''), $item->{'itemnumber'}, $item->{'itype'}, $borrower->{'borrowernumber'}, undef, $item->{'ccode'} ); diff --git a/C4/Items.pm b/C4/Items.pm index 4a98712..b67fe30 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -1227,6 +1227,10 @@ sub GetItemsInfo { holding.branchurl, holding.branchname, holding.opac_info as branch_opac_info + "; + $query .= ", issues.inhouse_use" + if C4::Context->preference("In-House Use"); + $query .= " FROM items LEFT JOIN branches AS holding ON items.holdingbranch = holding.branchcode LEFT JOIN branches AS home ON items.homebranch=home.branchcode @@ -1234,6 +1238,8 @@ sub GetItemsInfo { LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber LEFT JOIN itemtypes ON itemtypes.itemtype = " . (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype'); + $query .= " LEFT JOIN issues ON issues.itemnumber = items.itemnumber" + if C4::Context->preference("In-House Use"); $query .= " WHERE items.biblionumber = ? ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ; my $sth = $dbh->prepare($query); $sth->execute($biblionumber); diff --git a/circ/circulation.pl b/circ/circulation.pl index efd533e..1589e5f 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -25,6 +25,8 @@ use strict; use warnings; use CGI; +use DateTime; +use DateTime::Duration; use C4::Output; use C4::Print; use C4::Auth qw/:DEFAULT get_session/; @@ -323,13 +325,15 @@ if ($barcode) { } } - delete $question->{'DEBT'} if ($debt_confirmed); - foreach my $impossible ( keys %$error ) { - $template->param( - $impossible => $$error{$impossible}, - IMPOSSIBLE => 1 - ); - $blocker = 1; + unless( $query->param('inhouse_use') and C4::Context->preference("In-House Use Force") ) { + delete $question->{'DEBT'} if ($debt_confirmed); + foreach my $impossible ( keys %$error ) { + $template->param( + $impossible => $$error{$impossible}, + IMPOSSIBLE => 1 + ); + $blocker = 1; + } } if( !$blocker ){ my $confirm_required = 0; @@ -345,13 +349,15 @@ if ($barcode) { $needsconfirmation => $$question{$needsconfirmation}, getTitleMessageIteminfo => $getmessageiteminfo->{'title'}, getBarcodeMessageIteminfo => $getmessageiteminfo->{'barcode'}, - NEEDSCONFIRMATION => 1 + NEEDSCONFIRMATION => 1, + inhouse_use => $query->param('inhouse_use'), ); $confirm_required = 1; } } unless($confirm_required) { - AddIssue( $borrower, $barcode, $datedue, $cancelreserve ); + my $inhouse_use = $query->param('inhouse_use'); + AddIssue( $borrower, $barcode, $datedue, $cancelreserve, undef, undef, { inhouse_use => $inhouse_use } ); $inprocess = 1; } } @@ -780,6 +786,9 @@ $template->param( export_remove_fields => C4::Context->preference("ExportRemoveFields"), export_with_csv_profile => C4::Context->preference("ExportWithCsvProfile"), canned_bor_notes_loop => $canned_notes, + todaysdate => dt_from_string()->set(hour => 23)->set(minute => 59), + inhouse_use_feature => C4::Context->preference("In-House Use"), + inhouse_use_forced => C4::Context->preference("In-House Use Force"), ); output_html_with_http_headers $query, $cookie, $template->output; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 3214ad9..90d1772 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -1095,6 +1095,7 @@ CREATE TABLE `issues` ( -- information related to check outs or issues `renewals` tinyint(4) default NULL, -- lists the number of times the item was renewed `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- the date and time this record was last touched `issuedate` datetime default NULL, -- date the item was checked out or issued + `inhouse_use` int(1) NOT NULL default 0, -- in house use flag KEY `issuesborridx` (`borrowernumber`), KEY `itemnumber_idx` (`itemnumber`), KEY `branchcode_idx` (`branchcode`), @@ -1555,6 +1556,7 @@ CREATE TABLE `old_issues` ( -- lists items that were checked out and have been r `renewals` tinyint(4) default NULL, -- lists the number of times the item was renewed `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- the date and time this record was last touched `issuedate` datetime default NULL, -- date the item was checked out or issued + `inhouse_use` int(1) NOT NULL default 0, -- in house use flag KEY `old_issuesborridx` (`borrowernumber`), KEY `old_issuesitemidx` (`itemnumber`), KEY `branchcode_idx` (`branchcode`), diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index e8ca401..0f2bbfd 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -132,6 +132,8 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('ImageLimit','5','','Limit images stored in the database by the Patron Card image manager to this number.','Integer'), ('IncludeSeeFromInSearches','0','','Include see-from references in searches.','YesNo'), ('IndependentBranches','0',NULL,'If ON, increases security between libraries','YesNo'), +('In-House use','0','','Enable/Disable the in-house use feature','YesNo'), +('In-House use Force','0','','Enable/Disable the in-house for all cases (Even if a user is debarred, etc.)','YesNo'), ('InProcessingToShelvingCart','0','','If set, when any item with a location code of PROC is \'checked in\', it\'s location code will be changed to CART.','YesNo'), ('INTRAdidyoumean',NULL,NULL,'Did you mean? configuration for the Intranet. Do not change, as this is controlled by /cgi-bin/koha/admin/didyoumean.pl.','Free'), ('IntranetBiblioDefaultView','normal','normal|marc|isbd|labeled_marc','Choose the default detail view in the staff interface; choose between normal, labeled_marc, marc or isbd','Choice'), diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index ddcc455..631658c 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -7104,6 +7104,30 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } + + +$DBversion = "3.13.00.XXX"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do(q{ + INSERT IGNORE INTO systempreferences + (variable,value,explanation,options,type) + VALUES('In-House use','0','Enable/Disable the in-house use feature','','YesNo'); + }); + $dbh->do(q{ + INSERT IGNORE INTO systempreferences + (variable,value,explanation,options,type) + VALUES('In-House use Force','0','Enable/Disable the in-house for all cases (Even if a user is debarred, etc.)','','YesNo'); + }); + $dbh->do(q{ + ALTER TABLE issues ADD COLUMN inhouse_use INT(1) NOT NULL DEFAULT 0 AFTER issuedate; + }); + $dbh->do(q{ + ALTER TABLE old_issues ADD COLUMN inhouse_use INT(1) NOT NULL DEFAULT 0 AFTER issuedate; + }); + print "Upgrade to $DBversion done (Bug 10860: Add new system preference In-House use + fields [old_]issues.inhouse_use)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css index 9d4446c..54c2e85 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -974,6 +974,17 @@ tr.highlight th[scope=row] { padding : 1px; } +.inhouse_use-select { + font-size : 85%; + font-weight: normal; + padding-top : .3em; +} +#circ_circulation_issue .inhouse_use-select label, +.inhouse_use-select label { + font-size : inherit; + font-weight: normal; +} + tr.expired td { color : #999999; } @@ -2655,3 +2666,7 @@ span.browse-button { float: right; padding-right: 1em; } + +span.inhouse_use { + color: red; +} diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js b/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js index fc24036..c274c8f 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js +++ b/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js @@ -173,9 +173,13 @@ function dt_add_type_uk_date() { jQuery.fn.dataTableExt.oSort['uk_date-asc'] = function(a,b) { var re = /(\d{2}\/\d{2}\/\d{4})/; - a.match(re); + if ( !a.match(re) ) { + return 1; + } var ukDatea = RegExp.$1.split("/"); - b.match(re); + if ( !b.match(re) ) { + return -1; + } var ukDateb = RegExp.$1.split("/"); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; @@ -186,9 +190,13 @@ function dt_add_type_uk_date() { jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) { var re = /(\d{2}\/\d{2}\/\d{4})/; - a.match(re); + if ( !a.match(re) ) { + return -1; + } var ukDatea = RegExp.$1.split("/"); - b.match(re); + if ( !b.match(re) ) { + return 1 + } var ukDateb = RegExp.$1.split("/"); var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1; @@ -537,4 +545,4 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { } }); -}()); \ No newline at end of file +}()); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 026b7fa..6195160 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -338,6 +338,18 @@ Circulation: no: "Don't" - calculate and update overdue charges when an item is returned. -
NOTE If you are doing hourly loans then you should have this on. + - + - pref: In-House use + choices: + yes: Enable + no: Disable + - the in-house use feature. + - + - pref: In-House use Force + choices: + yes: Enable + no: Disable + - the in-house for all cases (Even if a user is debarred, etc.). Holds Policy: - - pref: AllowHoldPolicyOverride diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt index a9c042d..182aef5 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt @@ -416,9 +416,17 @@ function verify_images() { [% IF ( item.datedue ) %] + [% IF inhouse_use %] + Currently in local use + [% ELSE %] Checked out + [% END %] [% UNLESS ( item.NOTSAMEBRANCH ) %] + [% IF inhouse_use %] + by + [% ELSE %] to + [% END %] [% IF ( item.hidepatronname ) %] [% item.cardnumber %] [% ELSE %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt index f19a8af..10004d1 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -176,11 +176,12 @@ var allcheckboxes = $(".checkboxed"); radioCheckBox($(this)); }); - $("#newduedate").datetimepicker({ + $("#newduedate").datepicker({ minDate: 1, // require that renewal date is after today hour: 23, minute: 59 }); + //function init_dtp_duedatespec $("#duedatespec").datetimepicker({ onClose: function(dateText, inst) { $("#barcode").focus(); }, hour: 23, @@ -191,6 +192,23 @@ var allcheckboxes = $(".checkboxed"); export_checkouts(export_format); return false; }) + + function toggle_inhouse_use(){ + if ( $("#inhouse_use").attr('checked') ) { + $("#duedatespec").val("[% todaysdate | $KohaDates with_hours => 1%]") + $("#duedatespec").datetimepicker('destroy'); + } else { + $("#duedatespec").datetimepicker({ + onClose: function(dateText, inst) { $("#barcode").focus(); }, + hour: 23, + minute: 59 + }); + } + } + toggle_inhouse_use(); + $("#inhouse_use").click(function(){ + toggle_inhouse_use(); + }); }); function export_checkouts(format) { @@ -435,6 +453,7 @@ function validate1(date) { [% ELSE %] [% END %] +
@@ -604,7 +623,7 @@ No patron matched [% message %] [% IF ( borrowernumber ) %]
-[% UNLESS ( noissues ) %] +[% IF !noissues || inhouse_use_forced %] [% IF ( flagged ) %]
[% ELSE %] @@ -641,7 +660,20 @@ No patron matched [% message %] [% END %] -
[% END %] +
+[% END %] + + [% IF inhouse_use_feature %] +
+ [% IF noissues %] + + + [% ELSE %] + + [% END %] +
+ [% END %] + @@ -656,17 +688,24 @@ No patron matched [% message %] [% IF ( noissues ) %]
[% ELSE %]
[% END %] - [% IF ( flagged ) %] - [% IF ( noissues ) %] -

Checking out to [% INCLUDE 'patron-title.inc' %]

-
- [% ELSE %] + [% IF flagged %] + [% IF NOT noissues || ( noissues && inhouse_use_forced ) %]
- [% END %] + [% ELSE %] +

Checking out to [% INCLUDE 'patron-title.inc' %]

+
+ [% END %] +

+ [% IF noissues %] + Cannot check out! + [% IF inhouse_use_forced %] + Only in-house use is allowed + [% END %] + [% ELSE %] + Attention: + [% END %] +

-

[% IF ( noissues ) %] - Cannot check out! - [% ELSE %]Attention:[% END %]

    [% IF ( warndeparture ) %] @@ -853,7 +892,12 @@ No patron matched [% message %] [% KohaAuthorisedValues.GetByCode( 'DAMAGED', todayissue.damaged ) %] [% END %] - [% todayissue.title |html %][% FOREACH subtitl IN todayissue.subtitle %] [% subtitl.subfield %][% END %][% IF ( todayissue.author ) %], by [% todayissue.author %][% END %][% IF ( todayissue.itemnotes ) %]- [% todayissue.itemnotes %][% END %] [% todayissue.barcode %] + + [% todayissue.title |html %][% FOREACH subtitl IN todayissue.subtitle %] [% subtitl.subfield %][% END %][% IF ( todayissue.author ) %], by [% todayissue.author %][% END %][% IF ( todayissue.itemnotes ) %]- [% todayissue.itemnotes %][% END %] [% todayissue.barcode %] + [% IF todayissue.inhouse_use %] + (In-house use) + [% END %] + [% UNLESS ( noItemTypeImages ) %] [% IF ( todayissue.itemtype_image ) %][% END %][% END %][% todayissue.itemtype %] [% todayissue.checkoutdate %] [% IF ( todayissue.multiple_borrowers ) %][% todayissue.firstname %] [% todayissue.surname %][% END %] @@ -940,7 +984,12 @@ No patron matched [% message %] [% KohaAuthorisedValues.GetByCode( 'DAMAGED', previssue.damaged ) %] [% END %] - [% previssue.title |html %][% FOREACH subtitl IN previssue.subtitle %] [% subtitl.subfield %][% END %][% IF ( previssue.author ) %], by [% previssue.author %][% END %] [% IF ( previssue.itemnotes ) %]- [% previssue.itemnotes %][% END %] [% previssue.barcode %] + + [% previssue.title |html %][% FOREACH subtitl IN previssue.subtitle %] [% subtitl.subfield %][% END %][% IF ( previssue.author ) %], by [% previssue.author %][% END %] [% IF ( previssue.itemnotes ) %]- [% previssue.itemnotes %][% END %] [% previssue.barcode %] + [% IF previssue.inhouse_use %] + (In-house use) + [% END %] + [% previssue.itemtype %] @@ -1078,7 +1127,12 @@ No patron matched [% message %] [% KohaAuthorisedValues.GetByCode( 'DAMAGED', relissue.damaged ) %] [% END %] - [% relissue.title |html %][% FOREACH subtitl IN relissue.subtitle %] [% subtitl.subfield %][% END %][% IF ( relissue.author ) %], by [% relissue.author %][% END %][% IF ( relissue.itemnotes ) %]- [% relissue.itemnotes %][% END %] [% relissue.barcode %] + + [% relissue.title |html %][% FOREACH subtitl IN relissue.subtitle %] [% subtitl.subfield %][% END %][% IF ( relissue.author ) %], by [% relissue.author %][% END %][% IF ( relissue.itemnotes ) %]- [% relissue.itemnotes %][% END %] [% relissue.barcode %] + [% IF relissue.inhouse_use %] + (In-house use) + [% END %] + [% UNLESS ( noItemTypeImages ) %] [% IF ( relissue.itemtype_image ) %][% END %][% END %][% relissue.itemtype %] [% relissue.displaydate %] [% relissue.issuingbranchname %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/readingrec.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/readingrec.tt index f36e254..5687fa3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/readingrec.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/readingrec.tt @@ -3,21 +3,22 @@ Circulation History for [% INCLUDE 'patron-title.inc' %] [% INCLUDE 'doc-head-close.inc' %] - + [% INCLUDE 'datatables-strings.inc' %] - + @@ -50,57 +63,74 @@ - - - - - - - - - - - - - -[% FOREACH issue IN loop_reading %] - [% IF issue.returndate %][% ELSE %][% END %] - - +
    + +
    +
    DateTitleAuthorCall no.BarcodeNumber of renewalsChecked out onChecked out fromDate dueReturn date
    - [% issue.issuestimestamp | $KohaDates %] - [% issue.title |html %]
    + + + + + + + + + + + + + + + [% FOREACH issue IN loop_reading %] + [% IF issue.returndate %][% ELSE %][% END %] + + + - + - - - + - - - - - - -[% END %] -
    TypeDateTitleAuthorCall no.BarcodeNumber of renewalsChecked out onChecked out fromDate dueReturn date
    + [% IF issue.inhouse_use %] + inhouse_use + [% ELSE %] + checkout + [% END %] + + [% issue.issuestimestamp | $KohaDates %] + [% issue.title |html %][% issue.author %][% issue.author %] + [% IF issue.classification %] [% issue.classification %] [% ELSE %] [% issue.itemcallnumber %] [% END %] - [% issue.barcode %] - [% issue.renewals %] - [% issue.issuedate | $KohaDates %] - [% issue.issuingbranch %][% IF issue.date_due %] - [% issue.date_due | $KohaDates %] - [% ELSE %] [% END %] - [% IF issue.returndate %] - [% issue.returndate | $KohaDates %] - [% ELSE %] - Checked Out - [% END %] -
    + [% issue.barcode %] + [% issue.renewals %] + [% issue.issuedate | $KohaDates %] + [% issue.issuingbranch %] + + [% IF issue.date_due %] + [% issue.date_due | $KohaDates %] + [% ELSE %] [% END %] + + + [% IF issue.returndate %] + [% issue.returndate | $KohaDates %] + [% ELSE %] + Checked Out + [% END %] + + + [% END %] + + +
+
[% ELSE %]
This patron has no circulation history.
[% END %] diff --git a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css index e7b11bd..5669543 100644 --- a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css +++ b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css @@ -3,23 +3,23 @@ input.search_init { } .sorting_asc { padding-right: 19px; - background: url("../../img/asc.gif") no-repeat scroll right center #EEEEEE; + background: url("../../images/asc.gif") no-repeat scroll right center #EEEEEE; } .sorting_desc { padding-right: 19px; - background: url("../../img/desc.gif") no-repeat scroll right center #EEEEEE; + background: url("../../images/desc.gif") no-repeat scroll right center #EEEEEE; } .sorting { padding-right: 19px; - background: url("../../img/ascdesc.gif") no-repeat scroll right center #EEEEEE; + background: url("../../images/ascdesc.gif") no-repeat scroll right center #EEEEEE; } .sorting_asc_disabled { padding-right: 19px; - background: url("../../img/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE; + background: url("../../images/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE; } .sorting_desc_disabled { padding-right: 19px; - background: url("../../img/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE; + background: url("../../images/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE; } .sorting_disabled { padding-right: 19px; @@ -64,12 +64,11 @@ div.dataTables_filter { } div.dataTables_paginate { background-color : #F4F4F4; - font-size: 110%; padding : 0; } -.paging_full_numbers span.paginate_button, -.paging_full_numbers span.paginate_active { +.paging_full_numbers a.paginate_button, +.paging_full_numbers a.paginate_active { border-right : 1px solid #AAA; border-left : 1px solid #FFF; display : block; @@ -79,48 +78,48 @@ div.dataTables_paginate { cursor: pointer; } -.paging_full_numbers span.paginate_button { +.paging_full_numbers a.paginate_button { color : #0000CC; } -.paging_full_numbers span.paginate_button.first { - background-image : url('../../img/first.png'); +.paging_full_numbers a.paginate_button.first { + background-image : url('../../images/first.png'); background-repeat: no-repeat; - background-position : 2px center; + background-position : 1% center; padding-left : 2em; } -.paging_full_numbers span.paginate_button.previous { - background-image : url('../../img/prev.png'); +.paging_full_numbers a.paginate_button.previous { + background-image : url('../../images/prev.png'); background-repeat: no-repeat; - background-position : 2px center; + background-position : 1% center; padding-left : 2em; } -.paging_full_numbers span.paginate_button.next { - background-image : url('../../img/next.png'); +.paging_full_numbers a.paginate_button.next { + background-image : url('../../images/next.png'); background-repeat: no-repeat; - background-position : right center; + background-position : 96% center; padding-right : 2em; } -.paging_full_numbers span.paginate_button.last { - background-image : url('../../img/last.png'); +.paging_full_numbers a.paginate_button.last { + background-image : url('../../images/last.png'); background-repeat: no-repeat; - background-position : right center; + background-position : 96% center; border-right : 1px solid #686868; padding-right : 2em; } -div.bottom.pager .paging_full_numbers span.paginate_button.last { +div.bottom.pager .paging_full_numbers a.paginate_button.last { border-right-width : 0; } -.paging_full_numbers span.paginate_active { +.paging_full_numbers a.paginate_active { background-color : #FFFFEA; color : #000; font-weight: bold; } -.paging_full_numbers span.paginate_button:hover { +.paging_full_numbers a.paginate_button:hover { background-color: #FFC; } -.paging_full_numbers span.paginate_button.paginate_button_disabled { +.paging_full_numbers a.paginate_button.paginate_button_disabled { color : #666; } @@ -131,7 +130,7 @@ div.dataTables_paginate.paging_four_button { background-color : transparent; border-right : 1px solid #686868; border-left : 1px solid #FFF; - line-height : 1.8em; + line-height : 2.5em; } .paginate_disabled_first, .paginate_enabled_first, @@ -141,55 +140,67 @@ div.dataTables_paginate.paging_four_button { .paginate_enabled_next, .paginate_disabled_last, .paginate_enabled_last { - float: left; - height: 16px; - margin: .5em; - width: 16px; + cursor: pointer; + *cursor: hand; + padding: .1em 0; +} + +.paginate_disabled_previous, +.paginate_enabled_previous, +.paginate_disabled_next, +.paginate_enabled_next { + color: #111 !important; +} + +.paginate_disabled_previous, +.paginate_enabled_previous { + padding-left: 23px; } +.paginate_disabled_next, +.paginate_enabled_next, +.paginate_disabled_last, +.paginate_enabled_last { + padding-right: 23px; + margin-left: 10px; + margin-right : .3em; +} + +.paging_four_button .paginate_disabled_first, +.paging_four_button .paginate_disabled_previous, +.paging_four_button .paginate_enabled_first, +.paging_four_button .paginate_enabled_previous { + margin-left : .3em; +} + .paginate_disabled_first { - background-image: url("../../img/first-disabled.png"); + background: transparent url("../../images/first-disabled.png") no-repeat 3px top; } .paginate_enabled_first { - background-image: url("../../img/first.png"); + background: transparent url("../../images/first.png") no-repeat 3px top; cursor: pointer; } .paginate_disabled_previous { - background-image: url("../../img/prev-disabled.png"); + background: transparent url("../../images/prev-disabled.png") no-repeat 3px top; } .paginate_enabled_previous { - background-image: url("../../img/prev.png"); + background: transparent url("../../images/prev.png") no-repeat 3px top; cursor: pointer; } .paginate_disabled_next { - background-image: url("../../img/next-disabled.png"); + background: transparent url("../../images/next-disabled.png") no-repeat right top; } .paginate_enabled_next { - background-image: url("../../img/next.png"); + background: transparent url("../../images/next.png") no-repeat right top; cursor: pointer; } .paginate_disabled_last { - background-image: url("../../img/last-disabled.png"); + background: transparent url("../../images/last-disabled.png") no-repeat right top; } .paginate_enabled_last { - background-image: url("../../img/last.png"); + background: transparent url("../../images/last.png") no-repeat right top; cursor: pointer; } - -/* -table.display { - width: 100%; -} -table.display thead th { - border-bottom: 1px solid black; - cursor: pointer; - font-weight: bold; - padding: 3px 18px 3px 10px; -} -.dataTables_wrapper { - clear: both; - position: relative; -} .dataTables_processing { background-color: white; border: 1px solid #DDDDDD; @@ -205,61 +216,44 @@ table.display thead th { top: 50%; width: 250px; } -.dataTables_info { - float: left; - width: 60%; -} -.dataTables_paginate { - float: right; - text-align: right; - width: 44px; -} -.paging_full_numbers { - height: 22px; - line-height: 22px; - width: 400px; -} -.paging_full_numbers span.paginate_button, - .paging_full_numbers span.paginate_active { - border: 1px solid #aaa; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - padding: 2px 5px; - margin: 0 3px; - cursor: pointer; - *cursor: hand; -} -.paging_full_numbers span.paginate_button { - background-color: #ddd; +tr.odd.selected td { + background-color: #D3D3D3; } -.paging_full_numbers span.paginate_button:hover { - background-color: #ccc; +tr.even.selected td { + background-color: #D3D3D3; } -.paging_full_numbers span.paginate_active { - background-color: #99B3FF; -} -.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { - float: left; - height: 19px; - margin-left: 3px; - width: 19px; +/* ColumnFilter */ +span.filter_column > input.text_filter { + font-size: 80%; + width: 100%; } -.paginate_disabled_previous { - background-image: url("../../img/datatables/back_disabled.jpg"); + +div.pager { + background-color : #E8E8E8; + border : 1px solid #BCBCBC; + -moz-border-radius : 5px; + border-radius : 5px; + display : inline-block; + font-size : 85%; + padding : .3em .5em .3em .5em; + margin : .4em 0; } -.paginate_enabled_previous { - background-image: url("../../img/datatables/back_enabled.jpg"); +div.pager img { + vertical-align : middle; } -.paginate_disabled_next { - background-image: url("../../img/datatables/forward_disabled.jpg"); + +div.pager img.last { + padding-right: 5px; } -.paginate_enabled_next { - background-image: url("../../img/datatables/forward_enabled.jpg"); +div.pager input.pagedisplay { + border : 0; + background-color : transparent; + font-weight: bold; + text-align : center; } -.spacer { - clear: both; - height: 20px; +div.pager p { + margin: 0; } diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/item-status.inc b/koha-tmpl/opac-tmpl/prog/en/includes/item-status.inc index 60fbe64..c51bda0 100644 --- a/koha-tmpl/opac-tmpl/prog/en/includes/item-status.inc +++ b/koha-tmpl/opac-tmpl/prog/en/includes/item-status.inc @@ -1,11 +1,19 @@ [% USE KohaAuthorisedValues %] [% IF ( item.datedue ) %] + [% IF inhouse_use %] + [% IF ( OPACShowCheckoutName ) %] + Currently in local use by [% item.cardnumber %] [% item.firstname %] [% item.surname %] + [% ELSE %] + Currently in local use + [% END %] + [% ELSE %] [% IF ( OPACShowCheckoutName ) %] Checked out to [% item.cardnumber %] [% item.firstname %] [% item.surname %] [% ELSE %] Checked out [% END %] + [% END %] [% ELSIF ( item.transfertwhen ) %] In transit from [% item.transfertfrom %] to [% item.transfertto %] since [% item.transfertwhen %] diff --git a/koha-tmpl/opac-tmpl/prog/en/js/datatables.js b/koha-tmpl/opac-tmpl/prog/en/js/datatables.js index 3c4ffdf..5f0892d 100644 --- a/koha-tmpl/opac-tmpl/prog/en/js/datatables.js +++ b/koha-tmpl/opac-tmpl/prog/en/js/datatables.js @@ -97,4 +97,4 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { } }); -}()); \ No newline at end of file +}()); diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-readingrecord.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-readingrecord.tt index 7ee7e12..1703766 100644 --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-readingrecord.tt +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-readingrecord.tt @@ -2,15 +2,37 @@ [% USE KohaDates %] [% INCLUDE 'doc-head-open.inc' %][% LibraryNameTitle or "Koha online" %] catalog › Your checkout history [% INCLUDE 'doc-head-close.inc' %] - + + +[% INCLUDE 'datatables-strings.inc' %] + @@ -30,43 +52,51 @@ $(document).ready(function(){ You have never borrowed anything from this library. [% ELSE %]
+

+ [% IF showfulllink %] + [% IF limit %] + Show All Items | Showing Last 50 Items + [% ELSE %] + Showing All Items | Show Last 50 Items Only + [% END %] + [% ELSE %] + Showing All Items + [% END %] +

+
-
-[% UNLESS ( limit ) %][% END %] -
- - -
- - - - - -[% IF ( OPACMySummaryHTML ) %] - -[% END %] - - -[% FOREACH issue IN READING_RECORD %] +
+ +
+
TitleItem typeCall no.DateLinks
+ + + + + + + + + [% IF ( OPACMySummaryHTML ) %] + + [% END %] + + + + [% FOREACH issue IN READING_RECORD %] + + -[% IF loop.even %][% ELSE %][% END %] [% END %] +
TypeTitleItem typeCall no.DateLinks
+ [% IF issue.inhouse_use %] + inhouse_use + [% ELSE %] + checkout + [% END %] +
[% IF OPACAmazonCoverImages %] [% IF issue.normalized_isbn %] @@ -129,6 +159,7 @@ You have never borrowed anything from this library.
[% END %] diff --git a/koha-tmpl/opac-tmpl/prog/images/next-disabled.png b/koha-tmpl/opac-tmpl/prog/images/next-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..58b03409bfbe94b6eca9d45b3442245664d4b754 GIT binary patch literal 866 zcmV-o1D*VdP)&y?y)kBv8+d+}zwRAUS{l0viC*3^d(P zM@Pp+TwFXtR8&-ro12?~gM)(sY5>ERFJBlQKYo1c)vH%4?%cVv2dMr$&^2EG0*D3b z5)F`Mpv^@}N=iIHn;Cxn`o-||>sPQOD=RC5n3xy?FE6j!-@kv0fSBR_{rlg6QfB}H zh*?-zSPE#X3s7USva+%yNb|F25O0DM{`>cj;p4}T48MQ>X5i!FV-OM&VgtHD66mU@ zhYufq3J^d{K&MDcN=j-0ZBPSg2Ktp@&YU@5C&R$(*|Wi}dGqEC11BdZgMxyB8qj-M zAiV$q!~_fjQJ{YfKz{!D^C#F=P`J#UI~S}8 zfuaf&+Ax2E0LTCkUbt`}!;c?7z-*8~ixw?n`0(Ka12Bd_Vj4gf@B;)8$O~{=Kr}2` znVFfv1_A>PEDqy?G=peRn1Iv*1Q5szAAz>q067ih3YcP$g5u(0a1?@K;m@Bx3?(Hc z3`|T+48XJiGUNu(o{sl7rh+t=mX?D33*v)p1Q`YjSS~IuhNn-T zg2XO>^a2DBv!|ygDBwhZSOpk3!oX-^FfuX%YX-RngdH6n!J1`cWWbt%(RT}|ehbim zQvdP)=>w?#3((86f$H}G zlk-i000O5(pyC@ZUcBH0h4`L5dm_};)zyHBi-Dh?A8ZKFU{EqPkh!I_TF$F*h9sL-j zNpc$weSXQZ6Gag%5kOy9HfA1@g zVA*&|VjFHeVhIV!`DzQM7F-a@NRTNvNlYYp4z%6NAQuJno^MeOJ!7dzy8e(=;etr6 z4q2h83Vb36o=G4!6u79$u)6u4LoN!;_)kItHmh9g5CP1HxVh+sSiS*Mlqx_uVfwL~ z+}p|}Y*;r1{g* z9DE4_W&SW~qUN5hWN@-RUJ#q3Ngxr&iJp;+4aEd;HM{A>I)B?7>yL4`Nc6h^we^ve z3YC6fwXTqAQWr8=Cd?emR={YnNptkhuSFVP{Q?6Lt^ zqF4A?)Arx1JpP&Pyh<4sUhXnam)AJ@xmkE-VuVGbg_|=vm|INb-=FD!zVlDxJ_uiv SXLQ>D0000yhD literal 0 HcmV?d00001 diff --git a/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png b/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..225c9a9ab8b4827ea16bde80eeb48b562e9564ad GIT binary patch literal 862 zcmV-k1EKthP)a2goHT| zYw_^#7_hOiX@KN^{P=O>^XJbOUc7j5?aiAvCxOau01f&A(gzSgU<06<4Rv*OUBt!3 zBSb|-)wsF288|pNz=nVS{+$760K=0fPj0<>^=if4yLa~h)t?6$0uVqfAO#?sL7IU! z7bz(z@c?aR`2G7g!`H80!3MCfurL4(X5i!FQ~Ue(ZxIkP+`oVSJ5cHjKmaj|h=@o5 zC0&3TlYv;0ot>TGSXo&$K(>PdYudDF zV5k54_mAP%uU}xzFqeS512O<;AvoNChVlah5XcK)#ULA)n3x#2xVXRyL41&NK`sLY zB1jE1z`+KCya{3h1Q5szAA!!i0Sa-TOBj-qlNo?%0BiurJDHi8U_QujkOolHzI*o$ zWHu>I4WNW=~H~ zkdsA#rmF}D2nYkC37lvQ3=F^;VE)(B(_@g9mS%YR^eMyP!-sDH^=tu(p8^OV=55=y zeLi&P(0`y4f4_eH+87kiz$k?WB*-hEKm!`i@a)+$hV9$8e*p&eY@qsmz?66sAb?n) zdE&k literal 0 HcmV?d00001 diff --git a/koha-tmpl/opac-tmpl/prog/images/prev.png b/koha-tmpl/opac-tmpl/prog/images/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..15d1584bdbb2c26a9fc4c8269aa54615a58a4657 GIT binary patch literal 745 zcmV1hlor z)=Ec^h7>5J3?Bj(D6|X+0|UcQj&m*_Qg!D|-c07sd7pF6opXl(U}#WhWg0W$d_xV%ATb~UcS*dC+@kfS*m{?64KBH-eM78JQAu#&2c z7TM!?0X98;&a@msh@1ehFDx4~_smCS0rm@Z$dv@5Y^ec>Jl}_`uDh5!i#cpZh5&_) z{y|~cgJzZ1d%`?CxkdJIg%by0u(~PqB0%Zdj?maMmYO=M!=;B#0>~5_5YO>&?w*4H z@LRbi!eNPrxg`gUUIeK8JG(3%R{o~|7so$K+8_qZe0Iz($pKd%d&oOhA&AGYXkKE` zO8~w=kN^smCS05H!-WT*2mpbXAJK6B{s*`+;U?8|s%XO8{Hs1d`DH6am$(L0coEX9 z)c+Ho)WS9-4?6~g4NrO@c2FaKCYmmR!DQ~YpfIn+s8pr^?KThtmU&}3Kr*7R^y^Rk z5Xsb_*=oc3w-9KI@B4=+yK6a8uQ@#oTkf1PnlL+NjAm=Zh)+xqld|idFEF=^(avw| z4U*w)Kx6;tnV0ZXQD@SHtHr7{`Y12 bpX>Y!%!CO%>C8GV00000NkvXXu0mjfJYGkQ literal 0 HcmV?d00001 diff --git a/misc/cronjobs/bulk_transferts.pl b/misc/cronjobs/bulk_transferts.pl new file mode 100644 index 0000000..45b4ea8 --- /dev/null +++ b/misc/cronjobs/bulk_transferts.pl @@ -0,0 +1,105 @@ +#!/usr/bin/perl + +# Copyright 2013 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Pod::Usage; +use Getopt::Long; + +use C4::Context; +use C4::Circulation; + +my ( $help, $verbose, $locations, $branch); +GetOptions( + 'h|help' => \$help, + 'v|verbose' => \$verbose, + 'locations:s' => \$locations, + 'branch:s' => \$branch, +); + +if ( $help or not $branch ) { + usage(); + exit; +} + +my $dbh = C4::Context->dbh; + +my @locations; +@locations = split /, /, $locations + if $locations =~ /, /; +@locations = split /[, ]/, $locations + unless @locations; + +my $query = q{ + SELECT barcode + FROM branchtransfers + LEFT JOIN items ON branchtransfers.itemnumber = items.itemnumber + WHERE tobranch = ? + AND branchtransfers.datearrived IS NULL +}; +$query .= q{AND items.location IN (} . ( "?, " x (scalar(@locations) - 1 )) . q{?)} + if @locations; + +my $sth = $dbh->prepare( $query ); + +$sth->execute( $branch, @locations ); + +while ( my $barcode = $sth->fetchrow ) { + # We force the return + say "Returning barcode $barcode" if $verbose; + C4::Circulation::AddReturn( $barcode, $branch, undef, undef, 1 ); +} + +sub usage { + pod2usage( -verbose => 2 ); + exit; +} + +=head1 NAME + +bulk_transfers.pl - Make a transfer for items of a specified branch. + +=head1 USAGE + +bulk_transfers.pl --branch [--locations -v -h] + +=head1 PARAMETERS + +=over + +=item B<-h> + +Print a brief help message + +=item B<--branch> + +The transfer is made for items going to this branch. + +=item B<--locations> + +List of item's locations. Filter to add to the branch parameter. + +=item B<-v> + +Verbose mode. + +=back + +=cut + -- 1.7.10.4