Bug 5549 : GetPendingIssues now returns DateTime objects
[koha.git] / C4 / Members.pm
index b81872c..434a018 100644 (file)
@@ -23,7 +23,7 @@ package C4::Members;
 use strict;
 #use warnings; FIXME - Bug 2505
 use C4::Context;
-use C4::Dates qw(format_date_in_iso);
+use C4::Dates qw(format_date_in_iso format_date);
 use Digest::MD5 qw(md5_base64);
 use Date::Calc qw/Today Add_Delta_YM check_date Date_to_Days/;
 use C4::Log; # logaction
@@ -31,8 +31,13 @@ use C4::Overdues;
 use C4::Reserves;
 use C4::Accounts;
 use C4::Biblio;
+use C4::Letters;
 use C4::SQLHelper qw(InsertInTable UpdateInTable SearchInTable);
 use C4::Members::Attributes qw(SearchIdMatchingAttribute);
+use C4::NewsChannels; #get slip news
+use DateTime;
+use DateTime::Format::DateParse;
+use Koha::DateUtils;
 
 our ($VERSION,@ISA,@EXPORT,@EXPORT_OK,$debug);
 
@@ -91,6 +96,9 @@ BEGIN {
                &DeleteMessage
                &GetMessages
                &GetMessagesCount
+
+        &IssueSlip
+               GetBorrowersWithEmail
        );
 
        #Modify data
@@ -468,7 +476,7 @@ sub patronflags {
         $flaginfo{'message'} = $patroninformation->{'borrowernotes'};
         $flags{'NOTES'}      = \%flaginfo;
     }
-    my ( $odues, $itemsoverdue ) = checkoverdues($patroninformation->{'borrowernumber'});
+    my ( $odues, $itemsoverdue ) = C4::Overdues::checkoverdues($patroninformation->{'borrowernumber'});
     if ( $odues && $odues > 0 ) {
         my %flaginfo;
         $flaginfo{'message'}  = "Yes";
@@ -1027,9 +1035,15 @@ sub GetPendingIssues {
     my $sth = C4::Context->dbh->prepare($query);
     $sth->execute(@borrowernumbers);
     my $data = $sth->fetchall_arrayref({});
-    my $today = C4::Dates->new->output('iso');
+    my $tz = C4::Context->tz();
+    my $today = DateTime->now( time_zone => $tz);
     foreach (@{$data}) {
-        if ($_->{date_due}  and $_->{date_due} lt $today) {
+        if ($_->{issuedate}) {
+            $_->{issuedate} = dt_from_string($_->{issuedate}. 'sql');
+        }
+        $_->{date_due} or next;
+        $_->{date_due} = DateTime::Format::DateParse->parse_datetime($_->{date_due}, $tz->name());
+        if ( DateTime->compare($_->{date_due}, $today) == -1 ) {
             $_->{overdue} = 1;
         }
     }
@@ -2229,6 +2243,109 @@ sub DeleteMessage {
     logaction("MEMBERS", "DELCIRCMESSAGE", $message->{'borrowernumber'}, $message->{'message'}) if C4::Context->preference("BorrowersLog");
 }
 
+=head2 IssueSlip
+
+  IssueSlip($branchcode, $borrowernumber, $quickslip)
+
+  Returns letter hash ( see C4::Letters::GetPreparedLetter )
+
+  $quickslip is boolean, to indicate whether we want a quick slip
+
+=cut
+
+sub IssueSlip {
+    my ($branch, $borrowernumber, $quickslip) = @_;
+
+#   return unless ( C4::Context->boolean_preference('printcirculationslips') );
+
+    my $today       = POSIX::strftime("%Y-%m-%d", localtime);
+
+    my $issueslist = GetPendingIssues($borrowernumber);
+    foreach my $it (@$issueslist){
+        if ($it->{'issuedate'} eq $today) {
+            $it->{'today'} = 1;
+        }
+        elsif ($it->{'date_due'} le $today) {
+            $it->{'overdue'} = 1;
+        }
+
+        $it->{'date_due'}=format_date($it->{'date_due'});
+    }
+    my @issues = sort { $b->{'timestamp'} <=> $a->{'timestamp'} } @$issueslist;
+
+    my ($letter_code, %repeat);
+    if ( $quickslip ) {
+        $letter_code = 'ISSUEQSLIP';
+        %repeat =  (
+            'checkedout' => [ map {
+                'biblio' => $_,
+                'items'  => $_,
+                'issues' => $_,
+            }, grep { $_->{'today'} } @issues ],
+        );
+    }
+    else {
+        $letter_code = 'ISSUESLIP';
+        %repeat =  (
+            'checkedout' => [ map {
+                'biblio' => $_,
+                'items'  => $_,
+                'issues' => $_,
+            }, grep { !$_->{'overdue'} } @issues ],
+
+            'overdue' => [ map {
+                'biblio' => $_,
+                'items'  => $_,
+                'issues' => $_,
+            }, grep { $_->{'overdue'} } @issues ],
+
+            'news' => [ map {
+                $_->{'timestamp'} = $_->{'newdate'};
+                { opac_news => $_ }
+            } @{ GetNewsToDisplay("slip") } ],
+        );
+    }
+
+    return  C4::Letters::GetPreparedLetter (
+        module => 'circulation',
+        letter_code => $letter_code,
+        branchcode => $branch,
+        tables => {
+            'branches'    => $branch,
+            'borrowers'   => $borrowernumber,
+        },
+        repeat => \%repeat,
+    );
+}
+
+=head2 GetBorrowersWithEmail
+
+    ([$borrnum,$userid], ...) = GetBorrowersWithEmail('me@example.com');
+
+This gets a list of users and their basic details from their email address.
+As it's possible for multiple user to have the same email address, it provides
+you with all of them. If there is no userid for the user, there will be an
+C<undef> there. An empty list will be returned if there are no matches.
+
+=cut
+
+sub GetBorrowersWithEmail {
+    my $email = shift;
+
+    my $dbh = C4::Context->dbh;
+
+    my $query = "SELECT borrowernumber, userid FROM borrowers WHERE email=?";
+    my $sth=$dbh->prepare($query);
+    $sth->execute($email);
+    my @result = ();
+    while (my $ref = $sth->fetch) {
+        push @result, $ref;
+    }
+    die "Failure searching for borrowers by email address: $sth->errstr" if $sth->err;
+    return @result;
+}
+
+
 END { }    # module clean-up code here (global destructor)
 
 1;