From eb6e38401d22adf2c1a10139a010df47237b42d8 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Wed, 6 Mar 2019 15:42:49 +0100
Subject: [PATCH] FEAT #9514 Send email

---
 rest/index.php                                |  2 +-
 .../AcknowledgementReceiptTrait.php           | 43 +++++++++++--
 .../controllers/MergeController.php           | 18 +++---
 src/app/email/controllers/EmailController.php | 61 ++++++++++++-------
 src/app/email/models/EmailModel.php           |  6 +-
 .../controllers/ResourceListController.php    |  1 +
 6 files changed, 93 insertions(+), 38 deletions(-)

diff --git a/rest/index.php b/rest/index.php
index a09636c7120..62e8483046d 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -153,7 +153,7 @@ $app->put('/doctypes/types/{id}/redirect', \Doctype\controllers\DoctypeControlle
 $app->get('/administration/doctypes/new', \Doctype\controllers\FirstLevelController::class . ':initDoctypes');
 
 //Emails
-$app->post('/emails', \Email\controllers\EmailController::class . ':create');
+$app->post('/emails', \Email\controllers\EmailController::class . ':send');
 
 //Entities
 $app->get('/entities', \Entity\controllers\EntityController::class . ':get');
diff --git a/src/app/action/controllers/AcknowledgementReceiptTrait.php b/src/app/action/controllers/AcknowledgementReceiptTrait.php
index 54d44eaa738..992258bd053 100644
--- a/src/app/action/controllers/AcknowledgementReceiptTrait.php
+++ b/src/app/action/controllers/AcknowledgementReceiptTrait.php
@@ -19,6 +19,8 @@ use Convert\controllers\ConvertPdfController;
 use Docserver\controllers\DocserverController;
 use Docserver\models\DocserverModel;
 use Doctype\models\DoctypeExtModel;
+use Email\controllers\EmailController;
+use Entity\models\EntityModel;
 use Resource\models\ResModel;
 use SrcCore\models\DatabaseModel;
 use SrcCore\models\ValidatorModel;
@@ -59,7 +61,7 @@ trait AcknowledgementReceiptTrait
             }
         }
 
-        $resource = ResModel::getById(['select' => ['type_id', 'destination'], 'resId' => $aArgs['resId']]);
+        $resource = ResModel::getById(['select' => ['type_id', 'destination', 'subject'], 'resId' => $aArgs['resId']]);
         $doctype = DoctypeExtModel::getById(['id' => $resource['type_id'], 'select' => ['process_mode']]);
 
         if ($doctype['process_mode'] == 'SVA') {
@@ -81,8 +83,10 @@ trait AcknowledgementReceiptTrait
         $docserver = DocserverModel::getByDocserverId(['docserverId' => 'TEMPLATES', 'select' => ['path_template']]);
         $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $template[0]['template_path']) . $template[0]['template_file_name'];
 
-        $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
+        $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id', 'mail']]);
         $ids = [];
+        $errors = [];
+        $emailsToSend = [];
         DatabaseModel::beginTransaction();
         foreach ($contactsToProcess as $contactToProcess) {
             $contact = ContactModel::getByAddressId(['addressId' => $contactToProcess, 'select' => ['email', 'address_street', 'address_town', 'address_postal_code']]);
@@ -103,7 +107,7 @@ trait AcknowledgementReceiptTrait
                 ]);
                 $format = 'html';
             } else {
-                if (!file_exists($pathToDocument)) {
+                if (!file_exists($pathToDocument) || !is_file($pathToDocument)) {
                     DatabaseModel::rollbackTransaction();
                     return [];
                 }
@@ -131,7 +135,7 @@ trait AcknowledgementReceiptTrait
                 return ['errors' => '[storeResource] ' . $storeResult['errors']];
             }
 
-            $ids[] = AcknowledgementReceiptModel::create([
+            $id = AcknowledgementReceiptModel::create([
                 'resId'             => $aArgs['resId'],
                 'type'              => $templateAttachmentType,
                 'format'            => $format,
@@ -142,9 +146,38 @@ trait AcknowledgementReceiptTrait
                 'filename'          => $storeResult['file_destination_name'],
                 'fingerprint'       => $storeResult['fingerPrint']
             ]);
+
+            if (!empty($contact['email'])) {
+                $emailsToSend[] = ['id' => $id, 'email' => $contact['email'], 'encodedHtml' => $mergedDocument['encodedDocument']];
+            }
+            $ids[] = $id;
         }
         DatabaseModel::commitTransaction();
 
-        return $ids;
+        if (!empty($emailsToSend)) {
+            $entity = EntityModel::getByEntityId(['entityId' => $resource['destination'], 'select' => ['email', 'id']]);
+        }
+        foreach ($emailsToSend as $email) {
+            $isSent = EmailController::createEmail([
+                'userId' => $currentUser['id'],
+                'data' => [
+                    'sender'        => empty($entity['email']) ? ['email' => $currentUser['mail']] : ['email' => $entity['email'], 'entityId' => $entity['id']],
+                    'recipients'    => [$email['email']],
+                    'object'        => '[AR] ' . (empty($resource['subject']) ? '' : substr($resource['subject'], 0, 100)),
+                    'body'          => base64_decode($email['encodedHtml']),
+                    'document'      => ['id' => $aArgs['resId'], 'isLinked' => false, 'original' => true],
+                    'isHtml'        => true,
+                    'status'        => 'TO_SEND'
+                ]
+            ]);
+
+            if (!empty($isSent['errors'])) {
+                $errors[] = "Send Email error AR {$email['id']}: {$isSent['errors']}";
+            } else {
+                AcknowledgementReceiptModel::update(['set' => ['send_date' => 'CURRENT_TIMESTAMP'], 'where' => ['id = ?'], 'data' => [$email['id']]]);
+            }
+        }
+
+        return ['ids' => $ids, 'errors' => $errors];
     }
 }
diff --git a/src/app/contentManagement/controllers/MergeController.php b/src/app/contentManagement/controllers/MergeController.php
index ced1fad1dc8..81521f54fec 100644
--- a/src/app/contentManagement/controllers/MergeController.php
+++ b/src/app/contentManagement/controllers/MergeController.php
@@ -49,14 +49,16 @@ class MergeController
             $args['path'] = null;
         }
 
-        if ($extension == 'odt') {
-            $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
-//            $tbs->LoadTemplate("{$args['path']}#content.xml;styles.xml", OPENTBS_ALREADY_UTF8);
-        } elseif ($extension == 'docx') {
-            $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
-//            $tbs->LoadTemplate("{$args['path']}#word/header1.xml;word/footer1.xml", OPENTBS_ALREADY_UTF8);
-        } else {
-            $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
+        if (!empty($args['path'])) {
+            if ($extension == 'odt') {
+                $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
+    //            $tbs->LoadTemplate("{$args['path']}#content.xml;styles.xml", OPENTBS_ALREADY_UTF8);
+            } elseif ($extension == 'docx') {
+                $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
+    //            $tbs->LoadTemplate("{$args['path']}#word/header1.xml;word/footer1.xml", OPENTBS_ALREADY_UTF8);
+            } else {
+                $tbs->LoadTemplate($args['path'], OPENTBS_ALREADY_UTF8);
+            }
         }
 
         $dataToBeMerge = MergeController::getDataForMerge($args['data']);
diff --git a/src/app/email/controllers/EmailController.php b/src/app/email/controllers/EmailController.php
index 8f3e1b5bb86..cc21699e2c1 100644
--- a/src/app/email/controllers/EmailController.php
+++ b/src/app/email/controllers/EmailController.php
@@ -36,33 +36,49 @@ use User\models\UserModel;
 
 class EmailController
 {
-    public function create(Request $request, Response $response)
+    public function send(Request $request, Response $response)
     {
         if (!ServiceModel::hasService(['id' => 'sendmail', 'userId' => $GLOBALS['userId'], 'location' => 'sendmail', 'type' => 'use'])) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
-        $data = $request->getParams();
+        $body = $request->getParsedBody();
 
-        $check = EmailController::controlCreateEmail(['login' => $GLOBALS['userId'], 'data' => $data]);
-        if (!empty($check['errors'])) {
-            return $response->withStatus($check['code'])->withJson(['errors' => $check['errors']]);
+        $user = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
+        $isSent = EmailController::createEmail(['userId' => $user['id'], 'data' => $body]);
+
+        if (!empty($isSent['errors'])) {
+            return $response->withStatus($isSent['code'])->withJson(['errors' => $isSent['errors']]);
         }
 
-        $user = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
+        return $response->withStatus(204);
+    }
+
+    public static function createEmail(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['userId', 'data']);
+        ValidatorModel::intVal($args, ['userId']);
+        ValidatorModel::arrayType($args, ['data']);
+
+        $user = UserModel::getById(['id' => $args['userId'], 'select' => ['user_id']]);
+
+        $check = EmailController::controlCreateEmail(['login' => $user['user_id'], 'data' => $args['data']]);
+        if (!empty($check['errors'])) {
+            return ['errors' => $check['errors'], 'code' => $check['code']];
+        }
 
         $id = EmailModel::create([
-            'userId'                => $user['id'],
-            'sender'                => json_encode($data['sender']),
-            'recipients'            => json_encode($data['recipients']),
-            'cc'                    => empty($data['cc']) ? '[]' : json_encode($data['cc']),
-            'cci'                   => empty($data['cci']) ? '[]' : json_encode($data['cci']),
-            'object'                => $data['object'],
-            'body'                  => $data['body'],
-            'document'              => empty($data['document']) ? null : json_encode($data['document']),
-            'isHtml'                => $data['isHtml'] ? 'true' : 'false',
-            'status'                => $data['status'] == 'DRAFT' ? 'DRAFT' : 'WAITING',
-            'messageExchangeId'     => $data['messageExchangeId']
+            'userId'                => $args['userId'],
+            'sender'                => json_encode($args['data']['sender']),
+            'recipients'            => json_encode($args['data']['recipients']),
+            'cc'                    => empty($args['data']['cc']) ? '[]' : json_encode($args['data']['cc']),
+            'cci'                   => empty($args['data']['cci']) ? '[]' : json_encode($args['data']['cci']),
+            'object'                => empty($args['data']['object']) ? null : $args['data']['object'],
+            'body'                  => empty($args['data']['body']) ? null : $args['data']['body'],
+            'document'              => empty($args['data']['document']) ? null : json_encode($args['data']['document']),
+            'isHtml'                => $args['data']['isHtml'] ? 'true' : 'false',
+            'status'                => $args['data']['status'] == 'DRAFT' ? 'DRAFT' : 'WAITING',
+            'messageExchangeId'     => empty($args['data']['messageExchangeId']) ? null : $args['data']['messageExchangeId']
         ]);
 
         HistoryController::add([
@@ -73,18 +89,18 @@ class EmailController
             'info'         => _EMAIL_ADDED
         ]);
 
-        if ($data['status'] != 'DRAFT') {
-            $isSent = EmailController::sendEmail(['emailId' => $id, 'userId' => $user['id']]);
+        if ($args['data']['status'] != 'DRAFT') {
+            $isSent = EmailController::sendEmail(['emailId' => $id, 'userId' => $args['userId']]);
 
             if (!empty($isSent['success'])) {
                 EmailModel::update(['set' => ['status' => 'SENT', 'send_date' => 'CURRENT_TIMESTAMP'], 'where' => ['id = ?'], 'data' => [$id]]);
             } else {
                 EmailModel::update(['set' => ['status' => 'ERROR'], 'where' => ['id = ?'], 'data' => [$id]]);
-                return $response->withStatus(502)->withJson(['errors' => $isSent['errors']]);
+                return ['errors' => $isSent['errors'], 'code' => 502];
             }
         }
 
-        return $response->withStatus(204);
+        return true;
     }
 
     public static function sendEmail(array $args)
@@ -167,6 +183,9 @@ class EmailController
 
         $phpmailer->Subject = $email['object'];
         $phpmailer->Body = $email['body'];
+        if (empty($email['body'])) {
+            $phpmailer->AllowEmpty = true;
+        }
 
         //TODO M2M
 
diff --git a/src/app/email/models/EmailModel.php b/src/app/email/models/EmailModel.php
index c86d2d07a6a..d3dedc6c06a 100644
--- a/src/app/email/models/EmailModel.php
+++ b/src/app/email/models/EmailModel.php
@@ -56,12 +56,12 @@ class EmailModel
                 'recipients'                => $aArgs['recipients'],
                 'cc'                        => $aArgs['cc'],
                 'cci'                       => $aArgs['cci'],
-                'object'                    => empty($aArgs['object']) ? null : $aArgs['object'],
-                'body'                      => empty($aArgs['body']) ? null : $aArgs['body'],
+                'object'                    => $aArgs['object'],
+                'body'                      => $aArgs['body'],
                 'document'                  => $aArgs['document'],
                 'is_html'                   => $aArgs['isHtml'],
                 'status'                    => $aArgs['status'],
-                'message_exchange_id'       => empty($aArgs['messageExchangeId']) ? null : $aArgs['messageExchangeId'],
+                'message_exchange_id'       => $aArgs['messageExchangeId'],
                 'creation_date'             => 'CURRENT_TIMESTAMP'
             ]
         ]);
diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php
index 88ea5611569..01fb0513719 100644
--- a/src/app/resource/controllers/ResourceListController.php
+++ b/src/app/resource/controllers/ResourceListController.php
@@ -646,6 +646,7 @@ class ResourceListController
                     return $response->withStatus(500)->withJson(['errors' => $methodResponse['errors']]);
                 }
                 if ($methodResponse !== true) {
+                    //TODO array_merge keys avec errors
                     $methodResponses = array_merge($methodResponses, $methodResponse);
                 }
             }
-- 
GitLab