From b87f31a599ee83ac1801ab9ebedc230ab59d4cb5 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 8 Mar 2019 11:56:45 +0100
Subject: [PATCH] FEAT #9514 Email sript

---
 .angulardoc.json                              |  4 --
 .../AcknowledgementReceiptController.php      |  4 --
 .../AcknowledgementReceiptTrait.php           |  9 +--
 .../controllers/ActionMethodController.php    |  2 +-
 .../controllers/MergeController.php           |  2 +-
 src/app/email/controllers/EmailController.php | 16 +++---
 src/app/email/scripts/sendEmail.php           | 57 +++++++++++++++++++
 src/core/models/PasswordModel.php             |  6 +-
 8 files changed, 76 insertions(+), 24 deletions(-)
 delete mode 100644 .angulardoc.json
 create mode 100644 src/app/email/scripts/sendEmail.php

diff --git a/.angulardoc.json b/.angulardoc.json
deleted file mode 100644
index cd6626264d7..00000000000
--- a/.angulardoc.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "repoId": "a053e6e9-56d8-4b38-8e27-a5308c01a2d9",
-  "lastSync": 0
-}
\ No newline at end of file
diff --git a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
index 2ac14e64c22..c6277bd8f85 100644
--- a/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
+++ b/src/app/acknowledgementReceipt/controllers/AcknowledgementReceiptController.php
@@ -28,7 +28,6 @@ use Template\models\TemplateModel;
 use Doctype\models\DoctypeExtModel;
 use Docserver\models\DocserverModel;
 use Resource\controllers\ResController;
-use Docserver\models\DocserverTypeModel;
 use Resource\controllers\StoreController;
 use History\controllers\HistoryController;
 use Resource\controllers\ResourceListController;
@@ -134,7 +133,6 @@ class AcknowledgementReceiptController
         }
 
         $data = $request->getParsedBody();
-        //$data = $request->getParams();
 
         if (!Validator::arrayType()->notEmpty()->validate($data['resources'])) {
             return $response->withStatus(400)->withJson(['errors' => 'Data resources is empty or not an array']);
@@ -268,8 +266,6 @@ class AcknowledgementReceiptController
             $paper = 0;
             foreach ($contactsToProcess as $contactToProcess) {
                 if (empty($contactToProcess)) {
-                    $email = 0;
-                    $paper = 0;
                     $noSendAR['number'] += 1;
                     $noSendAR['list'][] = ['resId' => $resId, 'alt_identifier' => $ext['alt_identifier'], 'info' => _NO_CONTACT ];
                     continue 2;
diff --git a/src/app/action/controllers/AcknowledgementReceiptTrait.php b/src/app/action/controllers/AcknowledgementReceiptTrait.php
index 992258bd053..2919314fcd5 100644
--- a/src/app/action/controllers/AcknowledgementReceiptTrait.php
+++ b/src/app/action/controllers/AcknowledgementReceiptTrait.php
@@ -159,8 +159,8 @@ trait AcknowledgementReceiptTrait
         }
         foreach ($emailsToSend as $email) {
             $isSent = EmailController::createEmail([
-                'userId' => $currentUser['id'],
-                'data' => [
+                '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)),
@@ -168,13 +168,14 @@ trait AcknowledgementReceiptTrait
                     'document'      => ['id' => $aArgs['resId'], 'isLinked' => false, 'original' => true],
                     'isHtml'        => true,
                     'status'        => 'TO_SEND'
+                ],
+                'options'   => [
+                    'acknowledgementReceiptId' => $email['id']
                 ]
             ]);
 
             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']]]);
             }
         }
 
diff --git a/src/app/action/controllers/ActionMethodController.php b/src/app/action/controllers/ActionMethodController.php
index fbf2772cb3b..88b158fff28 100644
--- a/src/app/action/controllers/ActionMethodController.php
+++ b/src/app/action/controllers/ActionMethodController.php
@@ -28,7 +28,7 @@ class ActionMethodController
     use AcknowledgementReceiptTrait;
 
     const COMPONENTS_ACTIONS = [
-        'confirmAction'                         => null,
+        'confirmAction'                         => 'createAcknowledgementReceipts',
         'closeMailAction'                       => 'closeMailAction',
         'closeAndIndexAction'                   => 'closeAndIndexAction',
         'updateDepartureDateAction'             => 'updateDepartureDateAction',
diff --git a/src/app/contentManagement/controllers/MergeController.php b/src/app/contentManagement/controllers/MergeController.php
index 81521f54fec..f83ba6deb95 100644
--- a/src/app/contentManagement/controllers/MergeController.php
+++ b/src/app/contentManagement/controllers/MergeController.php
@@ -103,7 +103,7 @@ class MergeController
         }
 
         //User
-        $currentUser = UserModel::getById(['id' => $args['userId'], 'select' => ['firstname', 'lastname']]);
+        $currentUser = UserModel::getById(['id' => $args['userId'], 'select' => ['firstname', 'lastname', 'phone', 'mail', 'initials']]);
 
         //Contact
         $contact = ContactModel::getOnView(['select' => ['*'], 'where' => ['ca_id = ?'], 'data' => [$args['contactAddressId']]])[0];
diff --git a/src/app/email/controllers/EmailController.php b/src/app/email/controllers/EmailController.php
index cc21699e2c1..0d8fae5ccf6 100644
--- a/src/app/email/controllers/EmailController.php
+++ b/src/app/email/controllers/EmailController.php
@@ -30,6 +30,7 @@ use Resource\controllers\ResController;
 use Respect\Validation\Validator;
 use Slim\Http\Request;
 use Slim\Http\Response;
+use SrcCore\models\CoreConfigModel;
 use SrcCore\models\PasswordModel;
 use SrcCore\models\ValidatorModel;
 use User\models\UserModel;
@@ -58,7 +59,7 @@ class EmailController
     {
         ValidatorModel::notEmpty($args, ['userId', 'data']);
         ValidatorModel::intVal($args, ['userId']);
-        ValidatorModel::arrayType($args, ['data']);
+        ValidatorModel::arrayType($args, ['data', 'options']);
 
         $user = UserModel::getById(['id' => $args['userId'], 'select' => ['user_id']]);
 
@@ -90,14 +91,13 @@ class EmailController
         ]);
 
         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 ['errors' => $isSent['errors'], 'code' => 502];
+            $customId = CoreConfigModel::getCustomId();
+            if (empty($customId)) {
+                $customId = 'null';
             }
+            $encryptKey = CoreConfigModel::getEncryptKey();
+            $options = empty($args['options']) ? '' : serialize($args['options']);
+            exec("/usr/bin/php src/app/email/scripts/sendEmail.php {$customId} {$id} {$args['userId']} '{$encryptKey}' '{$options}' > /dev/null &");
         }
 
         return true;
diff --git a/src/app/email/scripts/sendEmail.php b/src/app/email/scripts/sendEmail.php
new file mode 100644
index 00000000000..17870fcdaf4
--- /dev/null
+++ b/src/app/email/scripts/sendEmail.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Copyright Maarch since 2008 under licence GPLv3.
+ * See LICENCE.txt file at the root folder for more details.
+ * This file is part of Maarch software.
+ *
+ */
+
+/**
+ * @brief Email Script
+ * @author dev@maarch.org
+ */
+
+namespace Email\scripts;
+
+require 'vendor/autoload.php';
+
+use AcknowledgementReceipt\models\AcknowledgementReceiptModel;
+use Email\controllers\EmailController;
+use Email\models\EmailModel;
+use SrcCore\models\DatabasePDO;
+use User\models\UserModel;
+
+//customId   = $argv[1];
+//emailId    = $argv[2];
+//userId     = $argv[3];
+//encryptKey = $argv[4];
+//options    = $argv[5];
+
+$options = empty($argv[5]) ? null : unserialize($argv[5]);
+EmailScript::send(['customId' => $argv[1], 'emailId' => $argv[2], 'userId' => $argv[3], 'encryptKey' => $argv[4], 'options' => $options]);
+
+class EmailScript
+{
+    public static function send(array $args)
+    {
+        DatabasePDO::reset();
+        new DatabasePDO(['customId' => $args['customId']]);
+
+        $currentUser = UserModel::getById(['id' => $args['userId'], 'select' => ['user_id']]);
+        $GLOBALS['userId'] = $currentUser['user_id'];
+        $_SERVER['MAARCH_ENCRYPT_KEY'] = $args['encryptKey'];
+
+        $isSent = EmailController::sendEmail(['emailId' => $args['emailId'], 'userId' => $args['userId']]);
+        if (!empty($isSent['success'])) {
+            EmailModel::update(['set' => ['status' => 'SENT', 'send_date' => 'CURRENT_TIMESTAMP'], 'where' => ['id = ?'], 'data' => [$args['emailId']]]);
+        } else {
+            EmailModel::update(['set' => ['status' => 'ERROR'], 'where' => ['id = ?'], 'data' => [$args['emailId']]]);
+        }
+
+        //Options
+        if (!empty($args['options']['acknowledgementReceiptId']) && !empty($isSent['success'])) {
+            AcknowledgementReceiptModel::update(['set' => ['send_date' => 'CURRENT_TIMESTAMP'], 'where' => ['id = ?'], 'data' => [$args['options']['acknowledgementReceiptId']]]);
+        }
+    }
+}
diff --git a/src/core/models/PasswordModel.php b/src/core/models/PasswordModel.php
index 60a821813aa..0ac6b83040a 100755
--- a/src/core/models/PasswordModel.php
+++ b/src/core/models/PasswordModel.php
@@ -155,7 +155,8 @@ class PasswordModel
     public static function encrypt(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['password']);
- 
+        ValidatorModel::stringType($aArgs, ['password']);
+
         $enc_key = CoreConfigModel::getEncryptKey();
         
         $cipher_method = 'AES-128-CTR';
@@ -168,7 +169,8 @@ class PasswordModel
     public static function decrypt(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['cryptedPassword']);
- 
+        ValidatorModel::stringType($aArgs, ['cryptedPassword']);
+
         $enc_key = CoreConfigModel::getEncryptKey();
         
         $cipher_method = 'AES-128-CTR';
-- 
GitLab