- <?php
-
- /**
- * Copyright Souke (2018)
- *
- * contact@souke.fr
- *
- * Ce logiciel est un programme informatique servant à aider les producteurs
- * à distribuer leur production en circuits courts.
- *
- * Ce logiciel est régi par la licence CeCILL soumise au droit français et
- * respectant les principes de diffusion des logiciels libres. Vous pouvez
- * utiliser, modifier et/ou redistribuer ce programme sous les conditions
- * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
- * sur le site "http://www.cecill.info".
- *
- * En contrepartie de l'accessibilité au code source et des droits de copie,
- * de modification et de redistribution accordés par cette licence, il n'est
- * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
- * seule une responsabilité restreinte pèse sur l'auteur du programme, le
- * titulaire des droits patrimoniaux et les concédants successifs.
- *
- * A cet égard l'attention de l'utilisateur est attirée sur les risques
- * associés au chargement, à l'utilisation, à la modification et/ou au
- * développement et à la reproduction du logiciel par l'utilisateur étant
- * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
- * manipuler et qui le réserve donc à des développeurs et des professionnels
- * avertis possédant des connaissances informatiques approfondies. Les
- * utilisateurs sont donc invités à charger et tester l'adéquation du
- * logiciel à leurs besoins dans des conditions permettant d'assurer la
- * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
- * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
- *
- * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
- * pris connaissance de la licence CeCILL, et que vous en avez accepté les
- * termes.
- */
-
- namespace backend\controllers;
-
- use common\helpers\MeanPayment;
- use domain\Distribution\Distribution\ExportManager;
- use domain\Order\Order\Order;
- use domain\User\User\User;
- use Yii;
- use yii\filters\AccessControl;
- use yii\filters\VerbFilter;
-
- /**
- * UserController implements the CRUD actions for User model.
- */
- class CronController extends BackendController
- {
- public function behaviors()
- {
- return [
- 'verbs' => [
- 'class' => VerbFilter::class,
- 'actions' => [
- 'delete' => ['post'],
- ],
- ],
- 'access' => [
- 'class' => AccessControl::class,
- 'rules' => [
- [
- 'allow' => true,
- 'roles' => ['?'],
- ],
- [
- 'actions' => ['pay-orders'],
- 'allow' => true,
- 'roles' => ['@']
- ],
- ],
- ],
- ];
- }
-
- public function actionPayOrders($date)
- {
- \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
-
- if (strlen($date)) {
- $this->actionProcessOrders('64ac0bdab7e9f5e48c4d991ec5201d57', $date);
- }
-
- return [
- 'return' => 'success',
- 'alert' => [
- 'type' => 'success',
- 'message' => 'Commandes payées.'
- ]
- ];
- }
-
- public function actionForceProcessOrders($key = '')
- {
- $this->actionProcessOrders($key, date('Y-m-d'));
- }
-
- /**
- * Routine quotidienne concernant les commandes : paiement et envoi d'un
- * récap aux producteurs.
- *
- * @param string $key
- * @param string $forceDate
- */
- public function actionProcessOrders(string $key = '', string $forceDate = '')
- {
- $producerModule = $this->getProducerModule();
- $distributionModule = $this-> getDistributionModule();
- $orderModule = $this->getOrderModule();
- $paymentManager = $this->getPaymentModule();
- $userModule = $this->getUserModule();
-
- if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
- ini_set('memory_limit', '-1');
- set_time_limit(0);
- ini_set('display_errors', 1);
- ini_set('display_startup_errors', 1);
- error_reporting(E_ALL);
-
- $hour = 20;
- if (strlen($forceDate)) {
- $date = $forceDate;
- } else {
- $hour = date('H');
-
- if ($hour == '00') {
- $date = date('Y-m-d');
- $hour = 24;
- } else {
- $date = date('Y-m-d', time() + 24 * 60 * 60);
- }
- }
- $arrayProducers = $producerModule->findProducers();
-
- foreach ($arrayProducers as $producer) {
- $this->getLogic()->setProducerContext($producer);
- $distribution = $distributionModule
- ->findOneDistribution($date, true);
-
- if ($distribution) {
- // @TODO : attention, il faut prendre en compte les délais de commande spécifiques (lundi, mardi, mercredi etc.)
- if ($hour == $producer->order_deadline || strlen($forceDate)) {
- /*
- * Paiement des commandes (paiement automatique)
- */
- $arrayOrders = Order::searchAll([
- 'distribution.date' => $date,
- 'distribution.id_producer' => $producer->id
- ], [
- 'conditions' => 'date_delete IS NULL'
- ]);
-
- $configCredit = $producerModule->getConfig('credit');
-
- if ($arrayOrders && is_array($arrayOrders)) {
- foreach ($arrayOrders as $order) {
- $orderModule->initOrder($order);
- if ($order->auto_payment && $configCredit) {
- if ($orderModule->isCreditAutoPayment($order) && $orderModule->getOrderAmount($order, Order::AMOUNT_REMAINING) > 0) {
- $paymentManager->payOrder($order, MeanPayment::CREDIT, $userModule->findOneUserById(User::ID_USER_SYSTEM), false);
- }
- }
- }
- }
-
- /*
- * Envoi des commandes par email au producteur
- */
-
- if (!strlen($forceDate) && $producerModule->getConfig('option_notify_producer_order_summary')) {
- $arrayOrders = Order::searchAll([
- 'distribution.date' => $date,
- 'distribution.id_producer' => $producer->id
- ], [
- 'conditions' => 'date_delete IS NULL'
- ]);
-
- $mail = Yii::$app->mailer->compose(
- [
- 'html' => '@common/mail/cronOrdersSummary-html',
- 'text' => '@common/mail/cronOrdersSummary-text',
- ], [
- 'date' => $date,
- 'orders' => $arrayOrders
- ]
- )
- ->setFrom([Yii::$app->parameterBag->get('adminEmail') => 'distrib']);
-
- if (is_array($arrayOrders) && count($arrayOrders)) {
- $subject = '[Souke] Commandes du ' . date('d/m', strtotime($date));
-
- // @TODO : envoyer uniquement les exports qui sont activés dans les paramètres du producteur
- $distributionModule->getExportManager()->generate(ExportManager::ORDERS_PDF, $distribution, true);
-
- $mail->attach(
- Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf')
- );
- } else {
- $subject = '[Souke] Aucune commande';
- }
-
- $mail->setSubject($subject);
-
- // envoi des emails à tous les comptes users (statut producer) associés à ce producteur
- $userArray = User::searchAll([
- 'id_producer' => $producer->id,
- 'status' => User::STATUS_PRODUCER
- ]);
-
- foreach ($userArray as $user) {
- if($user->email && strlen($user->email) > 0) {
- $mail->setTo($user->email)->send();
- }
- }
- }
- }
- }
- }
- }
- }
- }
|