<?php /** * Copyright distrib (2018) * * contact@opendistrib.net * * 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 = '[Opendistrib] 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 = '[Opendistrib] 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(); } } } } } } } } }