Bug 20287: Move AddMember to Koha::Patron->store
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Thu, 22 Feb 2018 15:28:02 +0000 (12:28 -0300)
committerNick Clemens <nick@bywatersolutions.com>
Wed, 18 Jul 2018 15:49:46 +0000 (15:49 +0000)
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
C4/Members.pm
Koha/Patron.pm

index 18f8f67..cacccc7 100644 (file)
@@ -78,7 +78,6 @@ BEGIN {
 
     #Insert data
     push @EXPORT, qw(
-        &AddMember
     &AddMember_Auto
         &AddMember_Opac
     );
@@ -375,98 +374,6 @@ sub ModMember {
     return $execute_success;
 }
 
-=head2 AddMember
-
-  $borrowernumber = &AddMember(%borrower);
-
-insert new borrower into table
-
-(%borrower keys are database columns. Database columns could be
-different in different versions. Please look into database for correct
-column names.)
-
-Returns the borrowernumber upon success
-
-Returns as undef upon any db error without further processing
-
-=cut
-
-#'
-sub AddMember {
-    my (%data) = @_;
-    my $dbh = C4::Context->dbh;
-    my $schema = Koha::Database->new()->schema;
-
-    my $category = Koha::Patron::Categories->find( $data{categorycode} );
-    unless ($category) {
-        Koha::Exceptions::Object::FKConstraint->throw(
-            broken_fk => 'categorycode',
-            value     => $data{categorycode},
-        );
-    }
-
-    my $p = Koha::Patron->new( { userid => $data{userid}, firstname => $data{firstname}, surname => $data{surname} } );
-    # generate a proper login if none provided
-    $data{'userid'} = $p->generate_userid
-      if ( $data{'userid'} eq '' || ! $p->has_valid_userid );
-
-    # add expiration date if it isn't already there
-    $data{dateexpiry} ||= $category->get_expiry_date;
-
-    # add enrollment date if it isn't already there
-    unless ( $data{'dateenrolled'} ) {
-        $data{'dateenrolled'} = output_pref( { dt => dt_from_string, dateonly => 1, dateformat => 'iso' } );
-    }
-
-    $data{'privacy'} =
-        $category->default_privacy() eq 'default' ? 1
-      : $category->default_privacy() eq 'never'   ? 2
-      : $category->default_privacy() eq 'forever' ? 0
-      :                                             undef;
-
-    $data{'privacy_guarantor_checkouts'} = 0 unless defined( $data{'privacy_guarantor_checkouts'} );
-
-    # Make a copy of the plain text password for later use
-    my $plain_text_password = $data{'password'};
-
-    # create a disabled account if no password provided
-    $data{'password'} = ($data{'password'})? hash_password($data{'password'}) : '!';
-
-    # we don't want invalid dates in the db (mysql has a bad habit of inserting 0000-00-00
-    $data{'dateofbirth'}     = undef if ( not $data{'dateofbirth'} );
-    $data{'debarred'}        = undef if ( not $data{'debarred'} );
-    $data{'sms_provider_id'} = undef if ( not $data{'sms_provider_id'} );
-    $data{'guarantorid'}     = undef if ( not $data{'guarantorid'} );
-
-    # get only the columns of Borrower
-    # FIXME Do we really need this check?
-    my @columns = $schema->source('Borrower')->columns;
-    my $new_member = { map { join(' ',@columns) =~ /$_/ ? ( $_ => $data{$_} )  : () } keys(%data) } ;
-
-    delete $new_member->{borrowernumber};
-
-    my $patron = Koha::Patron->new( $new_member )->store;
-    $data{borrowernumber} = $patron->borrowernumber;
-
-    # If NorwegianPatronDBEnable is enabled, we set syncstatus to something that a
-    # cronjob will use for syncing with NL
-    if ( exists $data{'borrowernumber'} && C4::Context->preference('NorwegianPatronDBEnable') && C4::Context->preference('NorwegianPatronDBEnable') == 1 ) {
-        Koha::Database->new->schema->resultset('BorrowerSync')->create({
-            'borrowernumber' => $data{'borrowernumber'},
-            'synctype'       => 'norwegianpatrondb',
-            'sync'           => 1,
-            'syncstatus'     => 'new',
-            'hashed_pin'     => Koha::NorwegianPatronDB::NLEncryptPIN( $plain_text_password ),
-        });
-    }
-
-    logaction("MEMBERS", "CREATE", $data{'borrowernumber'}, "") if C4::Context->preference("BorrowersLog");
-
-    $patron->add_enrolment_fee_if_needed;
-
-    return $data{borrowernumber};
-}
-
 =head2 GetAllIssues
 
   $issues = &GetAllIssues($borrowernumber, $sortkey, $limit);
index 6396b50..3d2456c 100644 (file)
@@ -22,6 +22,7 @@ use Modern::Perl;
 
 use Carp;
 use List::MoreUtils qw( uniq );
+use Module::Load::Conditional qw( can_load );
 use Text::Unaccent qw( unac_string );
 
 use C4::Context;
@@ -41,6 +42,10 @@ use Koha::Club::Enrollments;
 use Koha::Account;
 use Koha::Subscription::Routinglists;
 
+if ( ! can_load( modules => { 'Koha::NorwegianPatronDB' => undef } ) ) {
+   warn "Unable to load Koha::NorwegianPatronDB";
+}
+
 use base qw(Koha::Object);
 
 our $RESULTSET_PATRON_ID_MAPPING = {
@@ -110,7 +115,7 @@ sub trim_whitespaces {
     my( $self ) = @_;
 
     my $schema  = Koha::Database->new->schema;
-    my @columns = $schema->source('Borrowers')->columns;
+    my @columns = $schema->source($self->_type)->columns;
 
     for my $column( @columns ) {
         my $value = $self->$column;
@@ -123,7 +128,7 @@ sub trim_whitespaces {
 }
 
 sub store {
-    my( $self ) = @_;
+    my ($self) = @_;
 
     $self->_result->result_source->schema->txn_do(
         sub {
@@ -138,10 +143,95 @@ sub store {
                 # We are in a transaction but the table is not locked
                 $self->fixup_cardnumber;
             }
+            unless ( $self->in_storage ) {    #AddMember
+
+                unless( $self->category->in_storage ) {
+                    Koha::Exceptions::Object::FKConstraint->throw(
+                        broken_fk => 'categorycode',
+                        value     => $self->categorycode,
+                    );
+                }
+
+                $self->trim_whitespaces;
+
+                # Generate a valid userid/login if needed
+                $self->userid($self->generate_userid)
+                  if not $self->userid or not $self->has_valid_userid;
+
+                # Add expiration date if it isn't already there
+                unless ( $self->dateexpiry ) {
+                    $self->dateexpiry( $self->category->get_expiry_date );
+                }
+
+                # Add enrollment date if it isn't already there
+                unless ( $self->dateenrolled ) {
+                    $self->dateenrolled(dt_from_string);
+                }
+
+                # Set the privacy depending on the patron's category
+                my $default_privacy = $self->category->default_privacy || q{};
+                $default_privacy =
+                    $default_privacy eq 'default' ? 1
+                  : $default_privacy eq 'never'   ? 2
+                  : $default_privacy eq 'forever' ? 0
+                  :                                                   undef;
+                $self->privacy($default_privacy);
+
+                unless ( defined $self->privacy_guarantor_checkouts ) {
+                    $self->privacy_guarantor_checkouts(0);
+                }
+
+                # Make a copy of the plain text password for later use
+                my $plain_text_password = $self->password;
+
+                # Create a disabled account if no password provided
+                $self->password( $self->password
+                    ? Koha::AuthUtils::hash_password( $self->password )
+                    : '!' );
+
+                # We don't want invalid dates in the db (mysql has a bad habit of inserting 0000-00-00)
+                $self->dateofbirth(undef) unless $self->dateofbirth;
+                $self->debarred(undef)    unless $self->debarred;
+
+                # Set default values if not set
+                $self->sms_provider_id(undef) unless $self->sms_provider_id;
+                $self->guarantorid(undef)     unless $self->guarantorid;
+
+                $self->borrowernumber(undef);
+
+                $self = $self->SUPER::store;
+
+                # If NorwegianPatronDBEnable is enabled, we set syncstatus to something that a
+                # cronjob will use for syncing with NL
+                if (   C4::Context->preference('NorwegianPatronDBEnable')
+                    && C4::Context->preference('NorwegianPatronDBEnable') == 1 )
+                {
+                    Koha::Database->new->schema->resultset('BorrowerSync')
+                      ->create(
+                        {
+                            'borrowernumber' => $self->borrowernumber,
+                            'synctype'       => 'norwegianpatrondb',
+                            'sync'           => 1,
+                            'syncstatus'     => 'new',
+                            'hashed_pin' =>
+                              Koha::NorwegianPatronDB::NLEncryptPIN(
+                                $plain_text_password),
+                        }
+                      );
+                }
+
+                $self->add_enrolment_fee_if_needed;
+
+                logaction( "MEMBERS", "CREATE", $self->borrowernumber, "" )
+                  if C4::Context->preference("BorrowersLog");
+            }
+            else {    #ModMember
+                $self = $self->SUPER::store;
+            }
 
-            $self->SUPER::store;
         }
     );
+    return $self;
 }
 
 =head3 delete