From 346ec569da7ef9b032eeda6751fc64bfae25e801 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Wed, 5 Jun 2013 14:37:38 +0200
Subject: [PATCH] Bug 10863: Add 2 circulation permissions: force_checkout and
 lift_restriction

This patch adds 2 circulation permissions: force_checkout and
lift_restriction.

Both are added to existing patrons having circulation flags.

force_checkout allows a librarian to force a checkout if a limitation
occurred.

lift_restriction allows a librarian to lift a restriction for a patron.

Test plan:
1/ Find a debarred patron and go on the checkout page. The "Lift
restriction" button should be present only if the logged librarian has
the lift_restriction permission.
2/ If the force_checkout permission is set, a librarian should be
allowed to check out in several cases:
- age restriction
- the item is issued to another patron
- the item is not for loan
- the patron has overdue items
- the item is lost
- the item is a high demand item
- the item is reserved
- another case ?
---
 .../data/mysql/en/mandatory/userpermissions.sql    |    2 +
 .../mysql/fr-FR/1-Obligatoire/userpermissions.sql  |    2 +
 installer/data/mysql/updatedatabase.pl             |   30 +++++++++++++
 .../prog/en/modules/circ/circulation.tt            |   45 +++++++++++++++++---
 .../prog/en/modules/members/memberentrygen.tt      |   41 ++++++++++--------
 5 files changed, 96 insertions(+), 24 deletions(-)

diff --git a/installer/data/mysql/en/mandatory/userpermissions.sql b/installer/data/mysql/en/mandatory/userpermissions.sql
index 4fa2a7a..cf0eb54 100644
--- a/installer/data/mysql/en/mandatory/userpermissions.sql
+++ b/installer/data/mysql/en/mandatory/userpermissions.sql
@@ -2,6 +2,8 @@ INSERT INTO permissions (module_bit, code, description) VALUES
    ( 1, 'circulate_remaining_permissions', 'Remaining circulation permissions'),
    ( 1, 'override_renewals', 'Override blocked renewals'),
    ( 1, 'overdues_report', 'Execute overdue items report'),
+   ( 1, 'force_checkout', 'Force checkout if a limitation exists'),
+   ( 1, 'lift_restriction', 'Lift restriction for restricted accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
diff --git a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql b/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql
index 355ee27..acd8436 100644
--- a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql
+++ b/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql
@@ -2,6 +2,8 @@ INSERT INTO permissions (module_bit, code, description) VALUES
    ( 1, 'circulate_remaining_permissions', 'Fonctions de circulation restantes'),
    ( 1, 'override_renewals', 'Outrepasser les limites de renouvellement'),
    ( 1, 'overdues_report', 'Executer le rapport de retards'),
+   ( 1, 'force_checkout', 'Forcer le prêt si une limitation existe'),
+   ( 1, 'lift_restriction', 'Lever la suspenssion d\'un utilisateur suspendu'),
    ( 3, 'parameters_remaining_permissions', 'Paramètres du système restants'),
    ( 3, 'manage_circ_rules', 'Gestion des règles de circulation'),
    ( 6, 'place_holds', 'Réserver pour des adhérents'),
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index ddcc455..cd3d4f0 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -7104,6 +7104,36 @@ if ( CheckVersion($DBversion) ) {
     SetVersion($DBversion);
 }
 
+
+
+
+$DBversion = "3.13.00.XXX";
+if ( CheckVersion($DBversion) ) {
+    $dbh->do(q{
+        INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'force_checkout', 'Force checkout if a limitation exists')
+    });
+    $dbh->do(q{
+        INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'lift_restriction', 'Lift restriction for restricted accounts')
+    });
+    $dbh->do(q{
+        INSERT INTO user_permissions (borrowernumber, module_bit, code)
+            SELECT user_permissions.borrowernumber, 1, 'force_checkout'
+            FROM user_permissions
+            LEFT JOIN borrowers USING(borrowernumber)
+            WHERE borrowers.flags & (1 << 1)
+    });
+    $dbh->do(q{
+        INSERT INTO user_permissions (borrowernumber, module_bit, code)
+            SELECT user_permissions.borrowernumber, 1, 'lift_restriction'
+            FROM user_permissions
+            LEFT JOIN borrowers USING(borrowernumber)
+            WHERE borrowers.flags & (1 << 1)
+    });
+
+    print "Upgrade to $DBversion done (Bug XXXXX - Add permission force_checkout and lift_restriction)\n";
+    SetVersion($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 TableExists($table)
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..4125ae8 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
@@ -327,11 +327,19 @@ function validate1(date) {
 <div class="yui-g">
 
 <div id="circ_needsconfirmation" class="dialog alert">
-<h3>Please confirm checkout</h3>
+[% IF CAN_user_circulate_force_checkout %]
+  <h3>Please confirm checkout</h3>
+[% ELSE %]
+  <h3>Cannot checkout</h3>
+[% END %]
 
 <ul>
 [%IF ( AGE_RESTRICTION ) %]
-    <li>Age restriction [% AGE_RESTRICTION %]. Check out anyway?</li>
+    <li>Age restriction [% AGE_RESTRICTION %].
+      [% IF CAN_user_circulate_force_checkout %]
+        Check out anyway?
+      [% END %]
+    </li>
 [% END %]
 
 [% IF ( DEBT ) %]
@@ -351,7 +359,11 @@ function validate1(date) {
 [% END %]
 
 [% IF ( ISSUED_TO_ANOTHER ) %]
-    <li>Item <i>[% getTitleMessageIteminfo %]</i> ([% getBarcodeMessageIteminfo %]) is checked out to <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% issued_borrowernumber %]">[% issued_firstname %] [% issued_surname %]</a> ([% issued_cardnumber %]). Check in and check out?</li>
+    <li>Item <i>[% getTitleMessageIteminfo %]</i> ([% getBarcodeMessageIteminfo %]) is checked out to <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% issued_borrowernumber %]">[% issued_firstname %] [% issued_surname %]</a> ([% issued_cardnumber %]).
+      [% IF CAN_user_circulate_force_checkout %]
+        Check in and check out?
+      [% END %]
+    </li>
 [% END %]
 
 [% IF ( TOO_MANY ) %]
@@ -374,20 +386,34 @@ function validate1(date) {
         [% item_notforloan_lib = KohaAuthorisedValues.GetByCode( authvalcode_notforloan, item_notforloan, 0 ) %]
         Item is normally not for loan [% IF (item_notforloan_lib) %]([% item_notforloan_lib %])[% END %].
     [% END %]
+      [% IF CAN_user_circulate_force_checkout %]
         Check out anyway?
+      [% END %]
     </li>
 [% END %]
 
 [% IF ( USERBLOCKEDOVERDUE ) %]
-    <li>Patron has [% USERBLOCKEDOVERDUE %] overdue item(s).  Check out anyway?</li>
+    <li>Patron has [% USERBLOCKEDOVERDUE %] overdue item(s).
+      [% IF CAN_user_circulate_force_checkout %]
+       Check out anyway?
+      [% END %]
+    </li>
 [% END %]
 
 [% IF ( ITEM_LOST ) %]
-    <li>This item has been lost with a status of "[% ITEM_LOST %]". Check out anyway?</li>
+    <li>This item has been lost with a status of "[% ITEM_LOST %]".
+      [% IF CAN_user_circulate_force_checkout %]
+        Check out anyway?
+      [% END %]
+    </li>
 [% END %]
 
 [% IF  HIGHHOLDS %]
-	<li>High demand item. Loan period shortened to [% HIGHHOLDS.duration %] days (due [% HIGHHOLDS.returndate %]). Check out anyway?</li>
+	<li>High demand item. Loan period shortened to [% HIGHHOLDS.duration %] days (due [% HIGHHOLDS.returndate %]).
+      [% IF CAN_user_circulate_force_checkout %]
+        Check out anyway?
+      [% END %]
+    </li>
 [% END %]
 </ul>
 
@@ -398,6 +424,8 @@ function validate1(date) {
 	});
 	</script>
 [% END %]
+
+[% IF CAN_user_circulate_force_checkout %]
 <form method="post" action="/cgi-bin/koha/circ/circulation.pl" autocomplete="off">
 
 [% IF ( RESERVED ) %]
@@ -447,6 +475,7 @@ function validate1(date) {
     <input type="submit" class="deny" value="No, Don't Check Out (N)" accesskey="n" />
     [% END %]
 </form>
+[% END %]
 
 </div></div>
 [% END %] <!-- NEEDSCONFIRMATION -->
@@ -623,7 +652,7 @@ No patron matched <span class="ex">[% message %]</span>
 
 	<div class="hint">Enter item barcode:</div>
 
-    [% IF ( NEEDSCONFIRMATION ) %]
+    [% IF NEEDSCONFIRMATION %]
 	    <input type="text" name="barcode" id="barcode" class="barcode focus" size="14" disabled="disabled" />
     [% ELSE %]
 	    <input type="text" name="barcode" id="barcode" class="barcode focus" size="14" />
@@ -700,12 +729,14 @@ No patron matched <span class="ex">[% message %]</span>
             [% IF ( userdebarred ) %]
                <li class="blocker">
                <span class="circ-hlt"> Restricted:</span> Patron's account is restricted [% IF (userdebarreddate ) %] until [% userdebarreddate %] [% END %] [% IF (debarredcomment ) %] with the comment "[% debarredcomment %]"[% END %]
+               [% IF CAN_user_circulate_lift_restriction %]
                <form class="inline compact" action="/cgi-bin/koha/members/setstatus.pl" method="post">
 	                <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
 	                <input type="hidden" name="destination" value="circ" />
 	                <input type="hidden" name="cardnumber" value="[% cardnumber %]" />
 	                <input type="submit" value="Lift restriction" />
                </form>
+               [% END %]
 			</li>[% END %]
 
         	[% IF ( odues ) %]<li>[% IF ( nonreturns ) %]<span class="circ-hlt">Overdues:</span> Patron has <span class="circ-hlt">ITEMS OVERDUE</span>. See highlighted items <a href="#checkouts">below</a>[% END %]</li>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
index 2cb1bb3..e934da1 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
@@ -1160,23 +1160,30 @@
 
             </li>
 			[% END %]
-			<li>
-				<label for="yesdebarred" class="radio">Restricted: </label>
-				[% IF ( debarred ) %]
-				<label for="yesdebarred">Yes </label>
-				<input type="radio" id="yesdebarred" name="debarred" value="1" checked="checked"/>
-                <label for="nodebarred">No </label>
-                <input type="radio" id="nodebarred" name="debarred" value="0"/>
-				[% ELSE %]
-				<label for="yesdebarred">Yes </label>
-				<input type="radio" id="yesdebarred" name="debarred" value="1" />
-                <label for="nodebarred">No </label>
-                <input type="radio" id="nodebarred" name="debarred" value="0" checked="checked"/>
-				[% END %]
-
-                <span id="debarreduntil"><label for="datedebarred" class="inline">Until:</label>
-                <input type="text" name="datedebarred" id="datedebarred" class="debarred datepicker [% focusAction %]" value="[% datedebarred %]" />
-                <span class="hint">(optional)</span> </span>
+            <li>
+                <label for="yesdebarred" class="radio">Restricted: </label>
+                [% IF CAN_user_circulate_lift_restriction %]
+                  [% IF ( debarred ) %]
+                  <label for="yesdebarred">Yes </label>
+                    <input type="radio" id="yesdebarred" name="debarred" value="1" checked="checked"/>
+                    <label for="nodebarred">No </label>
+                    <input type="radio" id="nodebarred" name="debarred" value="0"/>
+                  [% ELSE %]
+                    <label for="yesdebarred">Yes </label>
+                    <input type="radio" id="yesdebarred" name="debarred" value="1" />
+                    <label for="nodebarred">No </label>
+                    <input type="radio" id="nodebarred" name="debarred" value="0" checked="checked"/>
+                  [% END %]
+                  <span id="debarreduntil"><label for="datedebarred" class="inline">Until:</label>
+                  <input type="text" name="datedebarred" id="datedebarred" class="debarred datepicker [% focusAction %]" value="[% datedebarred %]" />
+                  <span class="hint">(optional)</span> </span>
+                [% ELSE %]
+                  [% IF ( debarred ) %]
+                    Yes, until [% datedebarred %]
+                  [% ELSE %]
+                    No
+                  [% END %]
+                [% END %]
                 </li>
                 <li>
 		        <label for="debarredcomment" class="radio">Comment:</label>
-- 
1.7.10.4