|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- <?php
- /**
- Copyright Guillaume Bourgeois (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 console\commands;
-
- use common\helpers\MeanPayment;
- use domain\Distribution\Distribution\Distribution;
- use domain\Distribution\Distribution\DistributionModule;
- use domain\Distribution\Distribution\ExportManager;
- use domain\Order\Order\Order;
- use domain\Order\Order\OrderModule;
- use domain\Payment\PaymentModule;
- use domain\Producer\Producer\Producer;
- use domain\Producer\Producer\ProducerModule;
- use domain\User\User\User;
- use domain\User\User\UserModule;
- use yii\console\Controller;
-
- class ClosingOrdersController extends Controller
- {
- public $date;
- public $hour;
- public $notification;
-
- public function options($actionID)
- {
- return [
- 'date',
- 'hour',
- 'notification'
- ];
- }
-
- public function optionAliases()
- {
- return [
- 'date' => 'date',
- 'hour' => 'hour',
- 'notification' => 'notification'
- ];
- }
-
- public function actionIndex()
- {
- // exemple tâche planifiée : ./yii closing-orders -notification=1
-
- $producerModule = ProducerModule::getInstance();
- $distributionModule = DistributionModule::getInstance();
- $orderModule = OrderModule::getInstance();
- $userModule = UserModule::getInstance();
-
- [$date, $hour] = $this->getDateHour();
- $arrayProducers = $producerModule->getRepository()->findProducers();
- $userSystem = $userModule->getRepository()->findOneUserById(User::ID_USER_SYSTEM);
-
- foreach($arrayProducers as $producer) {
- \Yii::$app->logic->setProducerContext($producer);
- $distribution = $distributionModule->getRepository()->findOneDistribution($date, true);
-
- if($distribution) {
- // @TODO : gérer les horaires spécifiques
- if($hour == $producer->order_deadline || !$hour) {
- $ordersArray = $orderModule->getRepository()->findOrdersByDistribution($distribution);
-
- foreach($ordersArray as $order) {
- $orderModule->getBuilder()->initOrder($order);
-
- $this->payOrder($order, $userSystem);
- $this->notifyProducer($distribution);
- }
- }
- }
- }
- }
-
- public function notifyProducer(Distribution $distribution)
- {
- $producerModule = ProducerModule::getInstance();
-
- if ($this->notification
- && $producerModule->getSolver()->getConfig('option_notify_producer_order_summary')) {
-
- $mail = $this->buildMailNotificationProducer($distribution);
- $this->sendMailNotificationProducer($mail, $distribution->producer);
- }
- }
-
- public function buildMailNotificationProducer(Distribution $distribution)
- {
- $orderModule = OrderModule::getInstance();
- $distributionModule = DistributionModule::getInstance();
-
- $ordersArray = $orderModule->getRepository()->findOrdersByDistribution($distribution);
- $mail = \Yii::$app->mailerService->getMailer()->compose(
- [
- 'html' => '@common/mail/cronOrdersSummary-html',
- 'text' => '@common/mail/cronOrdersSummary-text',
- ], [
- 'date' => $distribution->date,
- 'orders' => $ordersArray
- ]
- )->setFrom([\Yii::$app->parameterBag->get('adminEmail') => 'Souke']);
-
- if (count($ordersArray)) {
- $subject = '[Souke] Commandes du ' . date('d/m', strtotime($distribution->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-' . $distribution->date . '-' . $distribution->producer->id . '.pdf'));
- } else {
- $subject = '[Souke] Aucune commande';
- }
- $mail->setSubject($subject);
-
- return $mail;
- }
-
- public function sendMailNotificationProducer($mail, Producer $producer)
- {
- $userModule = UserModule::getInstance();
- $usersArray = $userModule->getRepository()->findUsersByProducer($producer);
-
- foreach ($usersArray as $user) {
- if($user->email && strlen($user->email)) {
- $mail->setTo($user->email)->send();
- }
- }
- }
-
- public function payOrder(Order $order, User $userSystem)
- {
- $paymentModule = PaymentModule::getInstance();
- $orderModule = OrderModule::getInstance();
-
- if($orderModule->getRepository()->isCreditAutoPayment($order)
- && $orderModule->getSolver()->getOrderAmount($order, Order::AMOUNT_REMAINING) > 0) {
-
- $paymentModule->getManager()->payOrder(
- $order,
- MeanPayment::CREDIT,
- $userSystem,
- false
- );
- }
- }
-
- public function getDateHour(): array
- {
- $hour = $this->hour;
- $date = $this->date;
-
- if(!$date) {
- $hour = date('H');
- if ($hour == '00') {
- $date = date('Y-m-d');
- $hour = 24;
- } else {
- $date = date('Y-m-d', time() + 24 * 60 * 60);
- }
- }
-
- return [$date, $hour];
- }
- }
-
- ?>
|