@@ -, +, @@ --- circ/checkout-notes.pl | 71 +++++++++ circ/circulation-home.pl | 3 + .../bug-17698_add-noteseen-column-to-issues.perl | 13 ++ ...698_add-permission-to-manage-checkout-notes.sql | 1 + installer/data/mysql/kohastructure.sql | 2 + installer/data/mysql/userpermissions.sql | 1 + .../intranet-tmpl/prog/en/includes/permissions.inc | 1 + .../prog/en/modules/circ/checkout-notes.tt | 164 +++++++++++++++++++++ .../prog/en/modules/circ/circulation-home.tt | 1 + .../intranet-tmpl/prog/en/modules/intranet-main.tt | 7 + mainpage.pl | 3 + opac/opac-issue-note.pl | 2 +- opac/svc/checkout_notes | 2 +- svc/checkout_notes | 63 ++++++++ 14 files changed, 332 insertions(+), 2 deletions(-) create mode 100755 circ/checkout-notes.pl create mode 100644 installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.perl create mode 100644 installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-checkout-notes.sql create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/circ/checkout-notes.tt create mode 100755 svc/checkout_notes --- a/circ/checkout-notes.pl +++ a/circ/checkout-notes.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl + +# Copyright 2016 Aleisha Amohia +# +# 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 3 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, see . + +use Modern::Perl; + +use CGI qw ( -utf8 ); +use C4::Context; +use C4::Output; +use C4::Auth; +use Koha::Checkouts; + +my $query = new CGI; + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "circ/checkout-notes.tt", + query => $query, + type => "intranet", + authnotrequired => 0, + flagsrequired => { circulation => "manage_checkout_notes" }, + } +); + +my $schema = Koha::Database->new()->schema(); +my @notes = $schema->resultset('Issue')->search({ 'me.note' => { '!=', undef } }, { prefetch => [ 'borrower', { item => 'biblionumber' } ] }); +$template->param( + notes => \@notes, +); + +my $action; +foreach (qw( seen notseen )) { + $action = $_ if ( $query->param("mark_selected-$_") ); +} +$action ||= 'none'; + +my @issue_ids = $query->multi_param('issue_ids'); + +if ( $action eq 'seen' ) { + foreach my $issue_id ( @issue_ids ) { + my $issue = Koha::Checkouts->find($issue_id); + $issue->set({ noteseen => 1 })->store; + } +} elsif ( $action eq 'notseen' ) { + foreach my $issue_id ( @issue_ids ) { + my $issue = Koha::Checkouts->find($issue_id); + $issue->set({ noteseen => 0 })->store; + } +} + +$template->param( + selected_count => scalar(@issue_ids), + action => $action, +); + +output_html_with_http_headers $query, $cookie, $template->output; --- a/circ/circulation-home.pl +++ a/circ/circulation-home.pl @@ -22,6 +22,7 @@ use C4::Auth; use C4::Output; use C4::Context; use Koha::BiblioFrameworks; +use Koha::Checkouts; my $query = new CGI; my ($template, $loggedinuser, $cookie, $flags) = get_template_and_user( @@ -39,5 +40,7 @@ $template->param( fast_cataloging => 1 ) if Koha::BiblioFrameworks->find( 'FA' ) $template->{'VARS'}->{'AllowOfflineCirculation'} = C4::Context->preference('AllowOfflineCirculation'); +my $pending_checkout_notes = Koha::Checkouts->search({ noteseen => 0 })->count; +$template->param( pending_checkout_notes => $pending_checkout_notes ); output_html_with_http_headers $query, $cookie, $template->output; --- a/installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.perl +++ a/installer/data/mysql/atomicupdate/bug-17698_add-noteseen-column-to-issues.perl @@ -0,0 +1,13 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + unless( column_exists( 'issues', 'noteseen' ) ) { + $dbh->do(q|ALTER TABLE issues ADD COLUMN noteseen int(1) default NULL AFTER notedate|); + } + + unless( column_exists( 'old_issues', 'noteseen' ) ) { + $dbh->do(q|ALTER TABLE old_issues ADD COLUMN noteseen int(1) default NULL AFTER notedate|); + } + + SetVersion( $DBversion ); + print "Upgrade to $DBversion done (Bug 17698: Add column issues.noteseen and old_issues.noteseen)\n"; +} --- a/installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-checkout-notes.sql +++ a/installer/data/mysql/atomicupdate/bug-17698_add-permission-to-manage-checkout-notes.sql @@ -0,0 +1, @@ +INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'manage_checkout_nots', 'Mark checkout notes as seen/not seen'); --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -1730,6 +1730,7 @@ CREATE TABLE `issues` ( -- information related to check outs or issues `onsite_checkout` int(1) NOT NULL default 0, -- in house use flag `note` LONGTEXT default NULL, -- issue note text `notedate` datetime default NULL, -- datetime of issue note (yyyy-mm-dd hh:mm::ss) + `noteseen` int(1) default NULL, -- describes whether checkout note has been seen 1, not been seen 0 or doesn't exist null PRIMARY KEY (`issue_id`), UNIQUE KEY `itemnumber` (`itemnumber`), KEY `issuesborridx` (`borrowernumber`), @@ -1761,6 +1762,7 @@ CREATE TABLE `old_issues` ( -- lists items that were checked out and have been r `onsite_checkout` int(1) NOT NULL default 0, -- in house use flag `note` LONGTEXT default NULL, -- issue note text `notedate` datetime default NULL, -- datetime of issue note (yyyy-mm-dd hh:mm::ss) + `noteseen` int(1) default NULL, -- describes whether checkout note has been seen 1, not been seen 0 or doesn't exist null PRIMARY KEY (`issue_id`), KEY `old_issuesborridx` (`borrowernumber`), KEY `old_issuesitemidx` (`itemnumber`), --- a/installer/data/mysql/userpermissions.sql +++ a/installer/data/mysql/userpermissions.sql @@ -5,6 +5,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'force_checkout', 'Force checkout if a limitation exists'), ( 1, 'manage_restrictions', 'Manage restrictions for accounts'), ( 1, 'self_checkout', 'Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID'), + ( 1, 'manage_checkout_nots', 'Mark checkout notes as seen/not seen'), ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'), ( 3, 'manage_circ_rules', 'Manage circulation rules'), ( 4, 'edit_borrowers', 'Add, modify and view patron information'), --- a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc @@ -32,6 +32,7 @@ [%- CASE 'overdues_report' -%]Execute overdue items report [%- CASE 'override_renewals' -%]Override blocked renewals [%- CASE 'self_checkout' -%]Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID + [%- CASE 'manage_checkout_notes' %]Mark checkout notes as seen/not seen [%- CASE 'manage_circ_rules' -%]manage circulation rules [%- CASE 'parameters_remaining_permissions' -%]Remaining system parameters permissions [%- CASE 'edit_borrowers' -%]Add, modify and view patron information --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/checkout-notes.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/checkout-notes.tt @@ -0,0 +1,164 @@ +[% USE Koha %] +[% USE KohaDates %] +[% USE Branches %] +[% INCLUDE 'doc-head-open.inc' %] +Home › Circulation › Checkout Notes +[% INCLUDE 'doc-head-close.inc' %] + +[% INCLUDE 'datatables.inc' %] + +[% INCLUDE 'calendar.inc' %] + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'circ-search.inc' %] + + +
+
+
+ +

Checkout notes

+ +
+ + [% IF ( selected_count ) %] +
+ [% IF ( action == 'seen' ) %] + [% selected_count %] note(s) marked as seen. + [% ELSIF ( action == 'notseen' ) %] + [% selected_count %] note(s) marked as not seen. + [% ELSE %] + Failed to change the status of [% selected_count %] item(s). + [% END %] +
+ Return to checkout notes + [% ELSE %] + + [% IF ( notes ) %] +
+ Select all | Clear all +
+ +
+ + + + + + + + + + + + + + + [% FOREACH note IN notes %] + + + + + + + + + + [% END %] + +
 TitleNoteDateSet byStatusActions
[% note.item.biblionumber.title %] - [% note.item.biblionumber.author %] ([% note.item.barcode %])[% note.note %][% note.notedate | $KohaDates %][% note.borrower.firstname %] [% note.borrower.surname %] ([% note.borrower.cardnumber %])[% IF ( note.noteseen == 0 ) %] + Not seen + [% ELSIF ( note.noteseen == 1 ) %] + Seen + [% END %][% IF ( note.noteseen == 1 ) %] + + [% ELSIF ( note.noteseen == 0 ) %] + + [% END %]
+ +
+ + +
+ +
+ + [% END %] + + [% END %] + +
+
+
+ +[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt @@ -31,6 +31,7 @@
  • Fast cataloging
  • [% END %] [% END %] + [% IF ( Koha.Preference('AllowCheckoutNotes') && CAN_user_circulate_manage_checkout_notes ) %]
  • Checkout notes [% IF ( pending_checkout_notes ) %][% pending_checkout_notes %][% END %]
  • [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt @@ -178,6 +178,13 @@ [% END %] + [% IF Koha.Preference('AllowCheckoutNotes') && CAN_user_circulate_manage_checkout_notes && pending_checkout_notes %] +
    + Checkout notes pending: + [% pending_checkout_notes %] +
    + [% END %] + [% END %] --- a/mainpage.pl +++ a/mainpage.pl @@ -31,6 +31,7 @@ use Koha::Patron::Modifications; use Koha::Patron::Discharge; use Koha::Reviews; use Koha::ArticleRequests; +use Koha::Checkouts; my $query = new CGI; @@ -74,6 +75,7 @@ my $pending_article_requests = Koha::ArticleRequests->search_limited( $branch ? ( branchcode => $branch ) : (), } )->count; +my $pending_checkout_notes = Koha::Checkouts->search({ noteseen => 0 })->count; $template->param( pendingcomments => $pendingcomments, @@ -82,6 +84,7 @@ $template->param( pending_borrower_modifications => $pending_borrower_modifications, pending_discharge_requests => $pending_discharge_requests, pending_article_requests => $pending_article_requests, + pending_checkout_notes => $pending_checkout_notes, ); # --- a/opac/opac-issue-note.pl +++ a/opac/opac-issue-note.pl @@ -67,7 +67,7 @@ if ( $action eq 'issuenote' && C4::Context->preference('AllowCheckoutNotes') ) { my $note = $query->param('note'); my $scrubber = C4::Scrubber->new(); my $clean_note = $scrubber->scrub($note); - if ( $issue->set({ notedate => dt_from_string(), note => $clean_note })->store ) { + if ( $issue->set({ notedate => dt_from_string(), note => $clean_note, noteseen => 0 })->store ) { if ($clean_note) { # only send email if note not empty my $branch = Koha::Libraries->find( $issue->branchcode ); my $letter = C4::Letters::GetPreparedLetter ( --- a/opac/svc/checkout_notes +++ a/opac/svc/checkout_notes @@ -76,7 +76,7 @@ if ($is_ajax) { } if ( $issue ) { - $issue->set({ notedate => dt_from_string(), note => $clean_note })->store; + $issue->set({ notedate => dt_from_string(), note => $clean_note, noteseen => 0 })->store; if($clean_note) { # only send email if note not empty my $branch = Koha::Libraries->find( $issue->branchcode ); my $biblionumber = $issue->item->biblionumber; --- a/svc/checkout_notes +++ a/svc/checkout_notes @@ -0,0 +1,63 @@ +#!/usr/bin/perl + +# This file is part of Koha. +# +# Copyright 2017 Aleisha Amohia +# +# 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 3 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, see . + +use Modern::Perl; + +use JSON qw( to_json ); +use CGI; +use C4::Service; +use C4::Auth qw /check_cookie_auth/; +use C4::Output qw(:DEFAULT :ajax); +use Koha::Checkouts; + +=head1 NAME + +svc/checkout_notes - Web service for managing patron notes set on issues + +=head1 DESCRIPTION + +=cut + +# AJAX requests +my $is_ajax = is_ajax(); +my $query = new CGI; +my ( $auth_status, $sessionID ) = check_cookie_auth( $query->cookie('CGISESSID'), { circulate => 'manage_checkout_notes' } ); +if ( $auth_status ne "ok" ) { + exit 0; +} +if ($is_ajax) { + my $issue_id = $query->param('issue_id'); + my $issue = Koha::Checkouts->find($issue_id); + my $action = $query->param('action'); + my $status = 'success'; + if ($action eq 'seen'){ + $issue->set({ noteseen => 1 })->store; + if ( $issue->noteseen != 1 ) { + $status = 'failure'; + } + } elsif ($action eq 'notseen'){ + $issue->set({ noteseen => 0 })->store; + if ( $issue->noteseen != 0 ) { + $status = 'failure'; + } + } + my $json = to_json ( { status => $status } ); + output_with_http_headers $query, undef, $json, 'js'; + exit; +} --