From 9307604aa08b4c793cdd44b53fb8bb0ae00e4243 Mon Sep 17 00:00:00 2001
From: Erik Thuning <boooink@gmail.com>
Date: Wed, 27 Jul 2022 13:53:18 +0200
Subject: [PATCH] Implemented receipts for loan extensions

---
 include/Cron.php | 108 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 75 insertions(+), 33 deletions(-)

diff --git a/include/Cron.php b/include/Cron.php
index 3303ff5..80bc67a 100644
--- a/include/Cron.php
+++ b/include/Cron.php
@@ -19,9 +19,17 @@ class Cron {
         $this->strings = array(
             'en' => array(
                 'new' => array(
+                    'single' => "The following loan has been registered in your name:",
+                    'multi'  => "The following loans have been registered in your name:",
                     'expiry' => "expires on",
                     'serial' => "serial number",
                 ),
+                'extend' => array(
+                    'single' => "The following loan has been extended:",
+                    'multi'  => "The following loans have been extended:",
+                    'expiry' => "extended to",
+                    'serial' => "serial number",
+                ),
                 'expiring' => array(
                     'single' => "The following loan expires in less than $days days:",
                     'multi'  => "The following loans expire in less than $days days:",
@@ -37,9 +45,17 @@ class Cron {
             ),
             'sv' => array(
                 'new' => array(
+                    'single' => "Följande lån har registrerats på din användare:",
+                    'multi'  => "Följande lån har registrerats på din användare:",
                     'expiry' => "går ut",
                     'serial' => "artikelnummer",
                 ),
+                'extend' => array(
+                    'single' => "Följande lån har förlängts:",
+                    'multi'  => "Följande lån har förlängts:",
+                    'expiry' => "förlängt till",
+                    'serial' => "artikelnummer",
+                ),
                 'expiring' => array(
                     'single' => "Följande lån går ut om mindre än $days dagar:",
                     'multi'  => "Följande lån går ut om mindre än $days dagar:",
@@ -71,13 +87,16 @@ class Cron {
             $user = new User($row['user']);
             $since_time = $row['since_time'];
 
-            $notify_loans = array();
+            $new_loans = array();
+            $extended_loans = array();
             foreach($user->get_loans('active') as $loan) {
                 if($loan->get_starttime() >= $since_time) {
-                    $notify_loans[] = $loan;
+                    $new_loans[] = $loan;
+                } else if($loan->get_last_extension() >= $since_time) {
+                    $extended_loans[] = $loan;
                 }
             }
-            $this->send_receipt($user, $notify_loans);
+            $this->send_receipt($user, $new_loans, $extended_loans);
             $delete = prepare('delete from `pending_receipt`
                                where `user` = ? and `send_time` < ?');
             bind($delete, 'ii', $user->get_id(), $this->now->getTimestamp());
@@ -86,44 +105,70 @@ class Cron {
         commit_trans();
     }
 
-    private function send_receipt($user, $loans) {
+    private function make_receipt_subject($num_new, $num_extended) {
+        $subject = "DSV Helpdesk: ";
+        $messages = array();
+        if($num_new > 1) {
+            $messages[] = $num_new." nya";
+        } else if($num_new > 0) {
+            $messages[] = $num_new." nytt";
+        }
+        if($num_extended > 1) {
+            $messages[] = $num_extended." förlängda";
+        } else if($num_extended > 0) {
+            $messages[] = $num_extended." förlängt";
+        }
+        return $subject.implode(" och ", $messages)." lån";
+    }
+
+    private function send_receipt($user, $new, $extended) {
         $uid = $user->get_name();
         $name = $this->ldap->get_firstname($uid);
 
-        $count = count($loans);
-        if($count > 1) {
-            $new_sv = "nya lån";
-            $new_en = "new loans";
-            $have = "have";
-        } else {
-            $new_sv = "nytt lån";
-            $new_en = "new loan";
-            $have = "has";
+        $new_count = count($new);
+        $extended_count = count($extended);
+        $subject = $this->make_receipt_subject($new_count, $extended_count);
+
+        $list_sv = array();
+        $list_en = array();
+        if($new_count > 0) {
+            $list_sv[] = $this->make_notice('sv', 'new', $new);
+            $list_en[] = $this->make_notice('en', 'new', $new);
         }
-        $subject = "DSV Helpdesk: $count $new_sv";
+        if($extended_count > 0) {
+            $list_sv[] = $this->make_notice('sv', 'extend', $extended);
+            $list_en[] = $this->make_notice('en', 'extend', $extended);
+        }
+        $list_sv = implode("\n\n", $list_sv);
+        $list_en = implode("\n\n", $list_en);
 
-        $intro_sv = "";
-        $intro_en = "$count $new_en $have been registered to your user:";
-
-        $list_sv = $this->make_notice('sv', 'new', $loans);
-        $list_en = $this->make_notice('en', 'new', $loans);
+        $info_sv = array();
+        $info_en = array();
+        if($new_count > 0) {
+            $info_sv[] = "Eventuella artiklar du inte hämtat ut redan kan hämtas från Helpdesk.";
+            $info_en[] = "Any products you haven't already picked up can be collected from Helpdesk.";
+        }
+        $info_sv[] = "Svara på det här mailet om du har några frågor.";
+        $info_en[] = "Please reply to this email if you have any questions.";
+        $info_sv = implode(' ', $info_sv);
+        $info_en = implode(' ', $info_en);
 
         $message = <<<EOF
 Hej $name!
 
-Det här är ett automatiskt meddelande om att $count $new_sv har registrerats på din användare:
+Det här är ett automatiskt meddelande från Helpdesk.
 
 $list_sv
 
-Eventuella artiklar du inte hämtat ut redan kan hämtas från Helpdesk. Svara på det här mailet om du har några frågor.
+$info_sv
 
 ----
 
-This is an automated message to inform you that $count $new_en $have been registered in your name:
+This is an automated message from Helpdesk.
 
 $list_en
 
-Any products you haven't already picked up can be collected from Helpdesk. Please reply to this email if you have any questions.
+$info_en
 
 Mvh
 DSV Helpdesk
@@ -158,18 +203,18 @@ EOF;
         }
     }
 
-    private function make_subject($num_expiring, $num_expired) {
+    private function make_reminder_subject($num_expiring, $num_expired) {
         $subject = "DSV Helpdesk: ";
         $messages = array();
         if($num_expiring > 0) {
-            $messages[] = $num_expiring." utgående lån";
+            $messages[] = $num_expiring." utgående";
         }
         if($num_expired > 1) {
-            $messages[] = $num_expired." försenade lån";
+            $messages[] = $num_expired." försenade";
         } elseif($num_expired > 0) {
-            $messages[] = $num_expired." försenat lån";
+            $messages[] = $num_expired." försenat";
         }
-        return $subject.implode(" och ", $messages);
+        return $subject.implode(" och ", $messages)." lån";
     }
 
     private function make_notice($lang, $type, $list) {
@@ -197,10 +242,6 @@ EOF;
                       ." $serial, ".$strings['expiry']." $endtime";
         }
 
-        if($type === 'new') {
-            return implode("\n", $lines);
-        }
-
         $msg = $strings['single'];
         if(count($list) > 1) {
             $msg = $strings['multi'];
@@ -244,7 +285,8 @@ EOF;
         $overdue_count = count($overdue);
         $total = $expiring_count + $overdue_count;
 
-        $subject = $this->make_subject($expiring_count, $overdue_count);
+        $subject = $this->make_reminder_subject($expiring_count,
+                                                $overdue_count);
 
         $info_sv = array();
         $info_en = array();