Bug 10863: Add 2 circulation permissions: force_checkout and lift_restriction
authorJonathan Druart <jonathan.druart@biblibre.com>
Wed, 5 Jun 2013 12:37:38 +0000 (14:37 +0200)
committerGalen Charlton <gmc@esilibrary.com>
Tue, 7 Jan 2014 03:59:53 +0000 (03:59 +0000)
This patch adds 2 circulation permissions: force_checkout and
lift_restriction.

During upgrade, these two permission are added to existing staff
users that already have the base circulate permission.

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 ?

Signed-off-by: Cedric Vita <cedric.vita@dracenie.com>
Bug 10863: The force checkout permission should not affect high holds

- typo checkout => check out.
- the force checkout permission does not affect high holds.

Signed-off-by: Cedric Vita <cedric.vita@dracenie.com>
Bug 10863: Follow-up: Adding missing permissions to translated files

This patch adds the 2 new permissions to all remaining sample files.
If the permissions don't get installed, the problem is bigger than
having an English description.

Also adds back the question "Check out anyway?" for high demand items (HIGHHOLDS).

Test xt/permissions.t passes now.

Bug 10863: Rename lift_restriction with manage_restrictions

The pref manage_restrictions now takes into account "Lost card" and
"Gone no address" restrictions.

Test plan:
- log in with a user with manage_restrictions permission
- verify you can set/unset restrictions when editing a patron
- log in with a user without manage_restrictions permission
- verify you cannot set/unset restrictions when editing a patron

Signed-off-by: Mathieu Saby <mathieu.saby@univ-rennes2.fr>
Note: The AgeRestrictionOverride pref has to be set to "Allow" if you
want to override the age restriction, even if the new permission is set.

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Passes koha-qa.pl, works as advertised

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
13 files changed:
installer/data/mysql/de-DE/mandatory/userpermissions.sql
installer/data/mysql/en/mandatory/userpermissions.sql
installer/data/mysql/es-ES/mandatory/userpermissions.sql
installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql
installer/data/mysql/it-IT/necessari/userpermissions.sql
installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql
installer/data/mysql/pl-PL/mandatory/userpermissions.sql
installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql
installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql
installer/data/mysql/updatedatabase.pl
koha-tmpl/intranet-tmpl/prog/en/includes/borrower_debarments.inc
koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt
koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt

index 9f5eadd..e85d053 100644 (file)
@@ -1,7 +1,9 @@
 INSERT INTO permissions (module_bit, code, description) VALUES
    ( 1, 'circulate_remaining_permissions', 'Übrige Ausleihberechtigungen'),
-   ( 1, 'override_renewals', 'Gesperrte Verlängerungen überschreiben'),
+   ( 1, 'override_renewals', 'Vormerksperren übergehen'),
    ( 1, 'overdues_report', 'Überfälligkeiten-Report ausführen'),
+   ( 1, 'force_checkout', 'Ausleihsperren übergehen'),
+   ( 1, 'manage_restrictions', 'Kontosperre "Gesperrt" aufheben'),
    ( 3, 'parameters_remaining_permissions', 'Übrige Administrationsberechtigungen'),
    ( 3, 'manage_circ_rules', 'Ausleihkonditionen verwalten'),
    ( 6, 'place_holds', 'Vormerkungen für Benutzer setzen'),
index 7874c9e..2f42224 100644 (file)
@@ -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, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
index 7874c9e..2f42224 100644 (file)
@@ -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, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
index 4f88b86..702db68 100644 (file)
@@ -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, 'manage_restrictions', 'Gérer les suspensions d\'un utilisateur'),
    ( 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'),
index fcefd20..0d27fc0 100644 (file)
@@ -4,6 +4,8 @@ INSERT INTO permissions (module_bit, code, description) VALUES
    ( 1, 'circulate_remaining_permissions', 'Permessi rimanenti per la circolazione'),
    ( 1, 'override_renewals', 'Sblocca i rinnovi bloccati'),
    ( 1, 'overdues_report', 'Execute overdue items report'),
+   ( 1, 'force_checkout', 'Force checkout if a limitation exists'),
+   ( 1, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Permessi rimanenti'),
    ( 3, 'manage_circ_rules', 'Gestisci regole circolazione'),
    ( 6, 'place_holds', 'Fai prenotazioni per gli utenti'),
index d66c5f2..c581bbd 100644 (file)
@@ -22,6 +22,8 @@ INSERT INTO permissions (module_bit, code, description) VALUES
    ( 1, 'circulate_remaining_permissions', 'Øvrige rettigheter for sirkulasjon'),
    ( 1, 'override_renewals', 'Overstyre blokkerte fornyinger'),
    ( 1, 'overdues_report', 'Execute overdue items report'),
+   ( 1, 'force_checkout', 'Force checkout if a limitation exists'),
+   ( 1, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Øvrige rettigheter knyttet til systempreferanser'),
    ( 3, 'manage_circ_rules', 'Endre sirkulasjonsregler'),
    ( 6, 'place_holds', 'Foreta reservering for lånere'),
index 2679e5f..dcd8aef 100644 (file)
@@ -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, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
index 0ebb745..acf904d 100644 (file)
@@ -28,6 +28,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, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
index bb0af07..adee3ff 100644 (file)
@@ -28,6 +28,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, 'manage_restrictions', 'Manage restrictions for accounts'),
    ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
    ( 3, 'manage_circ_rules', 'manage circulation rules'),
    ( 6, 'place_holds', 'Place holds for patrons'),
index d0255a4..23a2bd5 100755 (executable)
@@ -7882,6 +7882,33 @@ $DBversion = "3.15.00.011";
 if(CheckVersion($DBversion)) {
     $dbh->do("UPDATE marc_subfield_structure SET maxlength=9999 WHERE maxlength IS NULL OR maxlength=0;");
     print "Upgrade to $DBversion done (Bug 8018: set 9999 as default max length for subfields)\n";
+    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, 'manage_restrictions', '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, 'manage_restrictions'
+            FROM user_permissions
+            LEFT JOIN borrowers USING(borrowernumber)
+            WHERE borrowers.flags & (1 << 1)
+    });
+
+    print "Upgrade to $DBversion done (Bug 10863 - Add permission force_checkout and manage_restrictions)\n";
     SetVersion($DBversion);
 }
 
index a94af57..cea3416 100644 (file)
@@ -31,7 +31,7 @@
                      <th>Type</th>
                      <th>Comment</th>
                      <th>Expiration</th>
-                     [% IF ( CAN_user_borrowers ) %]
+                     [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
                          <th>&nbsp;</th>
                      [% END %]
                 </tr>
@@ -51,7 +51,7 @@
                         </td>
                         <td>[% d.comment %]</td>
                         <td>[% IF d.expiration %] [% d.expiration | $KohaDates %] [% ELSE %] <i>Indefinite</i> [% END %]</td>
-                        [% IF ( CAN_user_borrowers )%]
+                        [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
                             <td>
                                 <a class="remove_restriction" href="/cgi-bin/koha/members/mod_debarment.pl?borrowernumber=[% borrowernumber %]&amp;borrower_debarment_id=[% d.borrower_debarment_id %]&amp;action=del">
                                     Remove
@@ -63,8 +63,8 @@
             </tbody>
         </table>
     [% END %]
-    <p><a href="#" id="add_manual_restriction">Add manual restriction</a></p>
-    [% IF ( CAN_user_borrowers )%]
+    [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
+        <p><a href="#" id="add_manual_restriction">Add manual restriction</a></p>
         <form method="post" action="/cgi-bin/koha/members/mod_debarment.pl" class="clearfix">
             <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
             <input type="hidden" name="action" value="add" />
index 3ecedd8..7082284 100644 (file)
@@ -185,11 +185,19 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
 <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 check out</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 ) %]
@@ -209,7 +217,11 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
 [% 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 ) %]
@@ -232,20 +244,30 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
         [% item_notforloan_lib = AuthorisedValues.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 %]). Check out anyway?</li>
 [% END %]
 </ul>
 
@@ -256,6 +278,8 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
        });
        </script>
 [% END %]
+
+[% IF CAN_user_circulate_force_checkout or HIGHHOLDS %]
 <form method="post" action="/cgi-bin/koha/circ/circulation.pl" autocomplete="off">
 
 [% IF ( RESERVED ) %]
@@ -305,6 +329,7 @@ var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
     <input type="submit" class="deny" value="No, Don't Check Out (N)" accesskey="n" />
     [% END %]
 </form>
+[% END %]
 
 </div></div>
 [% END %] <!-- NEEDSCONFIRMATION -->
@@ -481,7 +506,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" />
index 4aa88cf..05b5b4e 100644 (file)
                 [% IF ( flagloo.key == 'gonenoaddress' ) %]Gone no address:[% END %]
                 [% IF ( flagloo.key == 'lost' ) %]Lost card:[% END %]
                 </label>
+                [% IF CAN_user_circulate_manage_restrictions %]
                                <label for="yes[% flagloo.name %]">Yes </label>
                                [% IF ( flagloo.yes ) %]
                                <input type="radio" id="yes[% flagloo.name %]" name="[% flagloo.name %]" value="1" checked="checked" />
                                [% ELSE %]
                                <input type="radio" id="no[% flagloo.name %]" name="[% flagloo.name %]" value="0" />
                                [% END %]
+                [% ELSE %]
+                  [% IF flagloo.yes %]Yes[% ELSE %]No[% END %]
+                [% END %]
 
             </li>
                        [% END %]
                                  <th>Type</th>
                                  <th>Comment</th>
                                  <th>Expiration</th>
-                                 <th>Remove?</th>
+                                 [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
+                                   <th>Remove?</th>
+                                 [% END %]
                             </tr>
                         </thead>
 
                                     <td>[% d.type %]</td>
                                     <td>[% d.comment %]</td>
                                     <td>[% IF d.expiration %] [% d.expiration | $KohaDates %] [% ELSE %] <i>Indefinite</i> [% END %]</td>
-                                    <td>
+                                    [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
+                                      <td>
                                         <input type="checkbox" id="debarment_[% d.borrower_debarment_id %]" name="remove_debarment" value="[% d.borrower_debarment_id %]" />
-                                    </td>
+                                      </td>
+                                    [% END %]
                                 </tr>
                             [% END %]
                         </tbody>
                     </table>
                 [% END %]
+                [% IF CAN_user_borrowers && CAN_user_circulate_manage_restrictions %]
                     <p><a href="#" id="add_manual_restriction">Add manual restriction</a></p>
                     <fieldset id="manual_restriction_form">
                         <input type="hidden" id="add_debarment" name="add_debarment" value="0" />
                             <a class="cancel" id="cancel_manual_restriction" href="#" onclick="">Cancel</a>
                         </p>
                     </fieldset>
+                [% END %]
             </fieldset>
                [% END %]