Bug 12461 - Add patron clubs feature
[koha.git] / Koha / Patron.pm
index a40d6f0..759d2d6 100644 (file)
@@ -24,17 +24,18 @@ use Carp;
 
 use C4::Context;
 use C4::Log;
+use Koha::Checkouts;
 use Koha::Database;
 use Koha::DateUtils;
 use Koha::Holds;
-use Koha::Issues;
-use Koha::OldIssues;
+use Koha::Old::Checkouts;
 use Koha::Patron::Categories;
 use Koha::Patron::HouseboundProfile;
 use Koha::Patron::HouseboundRole;
 use Koha::Patron::Images;
 use Koha::Patrons;
 use Koha::Virtualshelves;
+use Koha::Club::Enrollments;
 
 use base qw(Koha::Object);
 
@@ -66,8 +67,7 @@ sub delete {
     $self->_result->result_source->schema->txn_do(
         sub {
             # Delete Patron's holds
-            # FIXME Should be $patron->get_holds
-            $_->delete for Koha::Holds->search( { borrowernumber => $self->borrowernumber } );
+            $self->holds->delete;
 
             # Delete all lists and all shares of this borrower
             # Consistent with the approach Koha uses on deleting individual lists
@@ -124,7 +124,12 @@ sub guarantor {
 sub image {
     my ( $self ) = @_;
 
-    return Koha::Patron::Images->find( $self->borrowernumber )
+    return Koha::Patron::Images->find( $self->borrowernumber );
+}
+
+sub library {
+    my ( $self ) = @_;
+    return Koha::Library->_new_from_dbic($self->_result->branchcode);
 }
 
 =head3 guarantees
@@ -252,15 +257,15 @@ sub do_check_for_previous_checkout {
     };
 
     # Check current issues table
-    my $issues = Koha::Issues->search($criteria);
+    my $issues = Koha::Checkouts->search($criteria);
     return 1 if $issues->count; # 0 || N
 
     # Check old issues table
-    my $old_issues = Koha::OldIssues->search($criteria);
+    my $old_issues = Koha::Old::Checkouts->search($criteria);
     return $old_issues->count;  # 0 || N
 }
 
-=head2 is_debarred
+=head3 is_debarred
 
 my $debarment_expiration = $patron->is_debarred;
 
@@ -279,7 +284,7 @@ sub is_debarred {
     return;
 }
 
-=head2 is_expired
+=head3 is_expired
 
 my $is_expired = $patron->is_expired;
 
@@ -295,7 +300,7 @@ sub is_expired {
     return 0;
 }
 
-=head2 is_going_to_expire
+=head3 is_going_to_expire
 
 my $is_going_to_expire = $patron->is_going_to_expire;
 
@@ -315,7 +320,7 @@ sub is_going_to_expire {
     return 0;
 }
 
-=head2 update_password
+=head3 update_password
 
 my $updated = $patron->update_password( $userid, $password );
 
@@ -363,7 +368,7 @@ sub renew_account {
     return dt_from_string( $expiry_date )->truncate( to => 'day' );
 }
 
-=head2 has_overdues
+=head3 has_overdues
 
 my $has_overdues = $patron->has_overdues;
 
@@ -377,7 +382,7 @@ sub has_overdues {
     return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime( dt_from_string() ) } })->count;
 }
 
-=head2 track_login
+=head3 track_login
 
     $patron->track_login;
     $patron->track_login({ force => 1 });
@@ -396,7 +401,7 @@ sub track_login {
     $self->lastseen( dt_from_string() )->store;
 }
 
-=head2 move_to_deleted
+=head3 move_to_deleted
 
 my $is_moved = $patron->move_to_deleted;
 
@@ -408,6 +413,7 @@ This can be done before deleting a patron, to make sure the data are not complet
 sub move_to_deleted {
     my ($self) = @_;
     my $patron_infos = $self->unblessed;
+    delete $patron_infos->{updated_on}; #This ensures the updated_on date in deletedborrowers will be set to the current timestamp
     return Koha::Database->new->schema->resultset('Deletedborrower')->create($patron_infos);
 }
 
@@ -496,6 +502,18 @@ sub add_enrolment_fee_if_needed {
     return $enrolment_fee || 0;
 }
 
+=head3 checkouts
+
+my $issues = $patron->checkouts
+
+=cut
+
+sub checkouts {
+    my ($self) = @_;
+    my $issues = $self->_result->issues;
+    return Koha::Checkouts->_new_from_dbic( $issues );
+}
+
 =head3 get_overdues
 
 my $overdue_items = $patron->get_overdues
@@ -507,16 +525,101 @@ Return the overdued items
 sub get_overdues {
     my ($self) = @_;
     my $dtf = Koha::Database->new->schema->storage->datetime_parser;
-    my $issues = Koha::Issues->search(
+    return $self->checkouts->search(
         {
-            'me.borrowernumber' => $self->borrowernumber,
             'me.date_due' => { '<' => $dtf->format_datetime(dt_from_string) },
         },
         {
             prefetch => { item => { biblio => 'biblioitems' } },
         }
     );
-    return $issues;
+}
+
+=head3 get_age
+
+my $age = $patron->get_age
+
+Return the age of the patron
+
+=cut
+
+sub get_age {
+    my ($self)    = @_;
+    my $today_str = dt_from_string->strftime("%Y-%m-%d");
+    return unless $self->dateofbirth;
+    my $dob_str   = dt_from_string( $self->dateofbirth )->strftime("%Y-%m-%d");
+
+    my ( $dob_y,   $dob_m,   $dob_d )   = split /-/, $dob_str;
+    my ( $today_y, $today_m, $today_d ) = split /-/, $today_str;
+
+    my $age = $today_y - $dob_y;
+    if ( $dob_m . $dob_d > $today_m . $today_d ) {
+        $age--;
+    }
+
+    return $age;
+}
+
+=head3 account
+
+my $account = $patron->account
+
+=cut
+
+sub account {
+    my ($self) = @_;
+    return Koha::Account->new( { patron_id => $self->borrowernumber } );
+}
+
+=head3 holds
+
+my $holds = $patron->holds
+
+Return all the holds placed by this patron
+
+=cut
+
+sub holds {
+    my ($self) = @_;
+    my $holds_rs = $self->_result->reserves->search( {}, { order_by => 'reservedate' } );
+    return Koha::Holds->_new_from_dbic($holds_rs);
+}
+
+=head3 first_valid_email_address
+
+=cut
+
+sub first_valid_email_address {
+    my ($self) = @_;
+
+    return $self->email() || $self->emailpro() || $self->B_email() || q{};
+}
+
+=head3 get_club_enrollments
+
+=cut
+
+sub get_club_enrollments {
+    my ($self) = @_;
+
+    return Koha::Club::Enrollments->search( { borrowernumber => $self->borrowernumber(), date_canceled => undef } );
+}
+
+=head3 get_enrollable_clubs
+
+=cut
+
+sub get_enrollable_clubs {
+    my ( $self, $is_enrollable_from_opac ) = @_;
+
+    my $params;
+    $params->{is_enrollable_from_opac} = $is_enrollable_from_opac
+      if $is_enrollable_from_opac;
+    $params->{is_email_required} = 0 unless $self->first_valid_email_address();
+
+    $params->{borrower} = $self;
+
+    return Koha::Clubs->get_enrollable($params);
 }
 
 =head3 type