Bug 6782 - Move auto member cardnumber generation to occur when record is "Saved...
authorMeenakshi.R <meenakshi.r@osslabs.biz>
Wed, 6 Jun 2012 11:16:15 +0000 (16:46 +0530)
committerKyle M Hall <kyle@bywatersolutions.com>
Fri, 13 Jan 2017 11:47:00 +0000 (11:47 +0000)
Currently the card number is generated when the user enters the patron creation form. This creates a problem of concurrency - when two or more simulataneous users are registering members, the error "card no. in use" can occur.

This change moves the card number generation to occur after the "Save" button is pressed.

Changes:
-C4/Members.pm:
Added code to fixup_cardnumber,If the cardnumber is blank and "autoMemberNum" ON.
-koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt:
Added code to display "leave blank for auto calc during registration" in cardnumber label in patron registration form only if "autoMemberNum" ON.
-members/memberentry.pl:
Added code to get weather or not "autoMemberNum" is on or off and removed fixup_cardnumber generation.

Test cases:
-If "autoMemberNum" ON:
->In blank case, must generate auto card number in simulataneous users.
->If user entered, check for unique card number.

-If "autoMemberNum" OFF:
Must work normal.

Followed test plan, works as expected.
Note: Syspref PorrowerMandatoryField must not include cardnumber, otherwise
      you can not save. Maybe that should be mentioned in the comment for
      syspref autoMemberNum.
Signed-off-by: Marc VĂ©ron <veron@veron.ch>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
C4/Members.pm
koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt
members/memberentry.pl

index dfe4cbd..4195abe 100644 (file)
@@ -497,6 +497,12 @@ sub AddMember {
         $data{'dateenrolled'} = output_pref( { dt => dt_from_string, dateonly => 1, dateformat => 'iso' } );
     }
 
+    if ( C4::Context->preference("autoMemberNum") ) {
+        if ( not exists $data{cardnumber} or not defined $data{cardnumber} or $data{cardnumber} eq '' ) {
+            $data{cardnumber} = fixup_cardnumber( $data{cardnumber}, C4::Context->userenv->{'branch'}, $data{categorycode} );
+        }
+    }
+
     my $patron_category = $schema->resultset('Category')->find( $data{'categorycode'} );
     $data{'privacy'} =
         $patron_category->default_privacy() eq 'default' ? 1
index a66826d..54fd902 100644 (file)
@@ -600,27 +600,31 @@ $(document).ready(function() {
     <legend id="library_management_lgd">Library management</legend><ol>
       [% UNLESS nocardnumber %]
         <li>
-          [% IF ( mandatorycardnumber ) %]
+          [% IF mandatorycardnumber and not Koha.Preference('autoMemberNum') %]
             <label for="cardnumber" class="required">
           [% ELSE %]
             <label for="cardnumber" class="validated">
           [% END %]
-          Card number: </label>
+          [% IF Koha.Preference('autoMemberNum') %]
+              Card number<br>(<u>leave blank for auto calc during registration</u>): </label>
+          [% ELSE %]
+              Card number: </label>
+          [% END %]
           [% IF minlength_cardnumber == maxlength_cardnumber %]
                 <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber | html %]" minlength="[% minlength_cardnumber %]" maxlength="[% maxlength_cardnumber %]" />
-                [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
+                [% IF mandatorycardnumber and not Koha.Preference('autoMemberNum') %]<span class="required">Required</span>[% END %]
                 <div class="hint">Card number must be exactly [% minlength_cardnumber %] characters.</div>
           [% ELSIF minlength_cardnumber && maxlength_cardnumber %]
                 <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber | html %]" minlength="[% minlength_cardnumber %]" maxlength="[% maxlength_cardnumber %]" />
-                [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
+                [% IF mandatorycardnumber and not Koha.Preference('autoMemberNum') %]<span class="required">Required</span>[% END %]
                 <div class="hint">Card number must be between [% minlength_cardnumber %] and [% maxlength_cardnumber %] characters.</div>
           [% ELSIF maxlength_cardnumber %]
                 <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber | html %]" maxlength="[% maxlength_cardnumber %]" />
-                [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
+                [% IF mandatorycardnumber and not Koha.Preference('autoMemberNum') %]<span class="required">Required</span>[% END %]
                 <div class="hint">Card number can be up to [% maxlength_cardnumber %] characters.</div>
           [% ELSE %]
                 <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber | html %]" />
-                [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
+                [% IF mandatorycardnumber and not Koha.Preference('autoMemberNum') %]<span class="required">Required</span>[% END %]
                 <div class="hint">There is no minimum or maximum character length.</div>
           [% END %]
         </li>
index 2fcaa72..9213d59 100755 (executable)
@@ -561,7 +561,12 @@ if ( $op eq "duplicate" ) {
     $data{'cardnumber'} = "";
 }
 
-$data{'cardnumber'}=fixup_cardnumber($data{'cardnumber'}) if ( ( $op eq 'add' ) or ( $op eq 'duplicate' ) );
+if (C4::Context->preference("autoMemberNum")) {
+    $template->param( autoMemberNum => 1);
+} else {
+    $template->param( autoMemberNum => 0);
+}
+
 if(!defined($data{'sex'})){
     $template->param( none => 1);
 } elsif($data{'sex'} eq 'F'){