|
- <?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 Yii;
- use common\models\User;
- use yii\data\ActiveDataProvider;
- use yii\web\Controller;
- use yii\web\NotFoundHttpException;
- use yii\filters\VerbFilter;
- use yii\filters\AccessControl;
- use kartik\mpdf\Pdf;
- use common\models\Producer;
- use common\models\Order;
- use common\models\Subscription;
- use common\models\Distribution;
- use common\models\CreditHistory ;
-
- /**
- * UserController implements the CRUD actions for User model.
- */
- class CronController extends BackendController
- {
- public function behaviors()
- {
- return [
- 'verbs' => [
- 'class' => VerbFilter::className(),
- 'actions' => [
- 'delete' => ['post'],
- ],
- ],
- 'access' => [
- 'class' => AccessControl::className(),
- 'rules' => [
- [
- 'allow' => true,
- 'roles' => ['?'],
- ]
- ],
- ],
- ];
- }
-
- /**
- * Initialise la base de données de démo avec les données de l'environnement
- * de production (en modifiant les données privées).
- *
- * @param string $key
- */
- public function actionInitDatabaseDemo($key = '')
- {
- if ($key == '45432df6e842ac71aa0b5bb6b9f25d44' && YII_ENV == 'demo') {
-
- $arrayLastnames = [
- 'Martin', 'Bernard', 'Thomas', 'Petit', 'Robert', 'Richard', 'Durand', 'Dubois',
- 'Moreau', 'Laurent', 'Simon', 'Michel', 'Lefebvre', 'Leroy', 'Roux', 'David',
- 'Bertrand', 'Morel', 'Fournier', 'Girard', 'Bonnet', 'Dupont', 'Lambert', 'Fontaine',
- 'Rousseau', 'Vincent', 'Muller', 'Lefevre', 'Faure', 'Andre', 'Mercier', 'Blanc', 'Guerin',
- 'Boyer', 'Garnier', 'Chevalier', 'François', 'Legrand', 'Gauthier', 'Garcia', 'Perrin',
- 'Robin', 'Clement', 'Morin', 'Nicolas', 'Henry', 'Roussel', 'Mathieu', 'Gautier', 'Masson',
- 'Marchand', 'Duval', 'Denis', 'Dumont', 'Marie', 'Lemaire', 'Noël', 'Meyer', 'Dufour',
- 'Meunier', 'Brun', 'Blanchard', 'Giraud', 'Joly', 'Rivière', 'Lucas', 'Brunet', 'Gaillard', 'Barbier',
- 'Arnaud', 'Martinez', 'Gerard', 'Roche', 'Renard', 'Schmitt', 'Roy', 'Leroux', 'Colin', 'Vidal',
- 'Caron', 'Picard', 'Roger', 'Fabre', 'Aubert', 'Lemoine', 'Renaud', 'Dumas', 'Lacroix', 'Olivier',
- 'Philippe', 'Bourgeois', 'Pierre', 'Benoit', 'Rey', 'Leclerc', 'Payet', 'Rolland', 'Lecomte', 'Lopez',
- 'Jean', 'Dupuis', 'Guillot', 'Hubert', 'Berger', 'Carpentier', 'Sanchez', 'Dupuis', 'Moulin',
- 'Louis', 'Deschamps', 'Huet', 'Vasseur', 'Perez', 'Trouillot', 'Fusillier', 'Massenot', 'Boucher', 'Fleury',
- 'Royer', 'Klein', 'Jacquet', 'Jaquin', 'Adam', 'Paris', 'Poirier', 'Aubry', 'Guyot', 'Carré', 'Charles',
- 'Charpentier', 'Menard', 'Bailly', 'Bertin', 'Le Gall', 'Collet', 'Leger', 'Bouvier', 'Millet', 'Daniel',
- 'Langlois', 'Pelletier', 'Perrier', 'Leblanc', 'Lebrun', 'Monnier', 'Michaud', 'Laporte', 'Carlier',
- 'Pasquier', 'Delaunay', 'Lamy', 'Gilbert', 'Lejeune', 'Pichon', 'Cordier', 'Barthelemy', 'Perret', 'Reynaud',
- 'Humbert', 'Marechal', 'Bernard', 'Lemaitre', 'Gay', 'Bouchet', 'Da Silva', 'Chauvin', 'Chevalier', 'Tessier',
- 'Poulain', 'Girondin', 'Gillet', 'Guichard'
- ];
-
- $arrayNames = [
- 'Adel', 'Antonin', 'Armand', 'Arnaud', 'Aymeric', 'Baptiste', 'Barnabé', 'Bernard', 'Brice', 'Baudouin',
- 'Camille', 'Cassandre', 'Célestin', 'Christian', 'Clément', 'Cyril', 'Claude', 'Damien', 'Daniel', 'David',
- 'Delphin', 'Denis', 'Didier', 'Dimitri', 'Dorothée', 'Désiré', 'Edgard', 'Etienne', 'Eugène', 'Eudes', 'Eric',
- 'Fabien', 'Fabrice', 'Flavien', 'Florent', 'Francois', 'Frédéric', 'Gabin', 'Gabriel', 'Gautier', 'Gilles', 'Guy',
- 'Hervé', 'Huvert', 'Hugues', 'Hector', 'Jacques', 'Jason', 'Jean', 'Jeannot', 'Johan', 'Julien', 'Léon', 'Lionel', 'Loïc',
- 'Lucas', 'Luc', 'Lucien', 'Maurice', 'Maxence', 'Maxime', 'Michel', 'Morgan', 'Nicolas', 'Normand', 'Norbert', 'Olivier,',
- 'Pascal', 'Patrice', 'Pierrick', 'Raphael', 'Roland', 'Stéphane', 'Sylvain', 'Sylvestre', 'Timothée', 'Thomas', 'Tristan',
- 'Ulysse', 'Vincent', 'Victor', 'Vivien',
- 'Adeline', 'Albane', 'Alix', 'Amélie', 'Arielle', 'Aurelle', 'Blandine', 'Blanche', 'Brigitte', 'Berthe', 'Camille', 'Capucine',
- 'Catherine', 'Cécile', 'Charlotte', 'Chloé', 'Claudine', 'Clémenence', 'Constance', 'Cyrielle', 'Corinne', 'Danielle',
- 'Delphine', 'Denise', 'Dominique', 'Diane', 'Édith', 'Éliane', 'Éléonore', 'Émilie', 'Emmanuelle', 'Ève', 'Évelyne',
- 'Fanny', 'Flavie', 'Flore', 'Françoise', 'Gabrielle', 'Gaëlle', 'Geneviève', 'Georgette', 'Germaine', 'Gertrude', 'Gisèle',
- 'Gwenaëlle', 'Hélène', 'Héloïse', 'Henriette', 'Huguette', 'Inès', 'Isabelle', 'Jacqueline', 'Jeanne', 'Joëlle', 'Joséphine',
- 'Juliette', 'Justine', 'Julie', 'Laura', 'Laure', 'Léa', 'Léonie', 'Lucie', 'Lucienne', 'Lorraine', 'Lucille', 'Ludivine', 'Lydie',
- 'Margot', 'Marion', 'Marlène', 'Marthe', 'Mélodie', 'Monique', 'Noémie', 'Nadine', 'Nadège', 'Océane', 'Odette', 'Odile', 'Paulette',
- 'Rose', 'Roseline', 'Renée', 'Sabine', 'Sophie', 'Suzanne', 'Sylvie', 'Thérèse',
- ];
-
- $arrayNamesChecked = [];
- $arrayLastnameschecked = [];
-
- $users = User::searchAll([
- 'user_producer.id_producer' => 1
- ]) ;
-
- foreach ($users as $u) {
- if ($u->email != 'producer@opendistrib.net') {
- do {
- $indexLastname = rand(0, count($arrayLastnames) - 1);
- $indexName = rand(0, count($arrayNames) - 1);
- } while (isset($arrayLastnameschecked[$i_nom]) || isset($arrayNamesChecked[$i_prenom]));
-
- $arrayLastnameschecked[$i_nom] = true;
- $arrayNamesChecked[$i_prenom] = true;
-
- $lastname = $arrayLastnameschecked[$indexLastname];
- $name = $arrayNamesChecked[$indexName];
-
- $u->name = $name;
- $u->lastname = $lastname;
-
- $email = strtolower($name) . '.' . strtolower($lastname) . '@yopmail.com';
- $email = htmlentities($email, ENT_NOQUOTES, 'utf-8');
- $email = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $email);
- $email = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $email); // pour les ligatures e.g. 'œ'
- $email = preg_replace('#&[^;]+;#', '', $email); // supprime les autres caractères
- $email = str_replace(' ', '', $email);
- $u->email = $email;
-
- $u->telephone = '0600000000';
- } else {
- /*
- * Le hash du mot de passe en production est volontairement corrompu
- * pour empêcher la connexion des utilisateurs via ce compte en prod.
- * Lors de l'initialisation des utilisateurs sur l'espace de démo,
- * on remet le bon hash pour que ce compte soit disponible.
- */
- $u->password_hash = '$2y$13$2D5T3Eo0pySmtlAuEGcfmOdTR5mleog8Y6YPGhop/ych6pbj6aN2y';
- }
-
- $u->save();
- }
-
- $arrayOrders = Order::find()
- ->where('username IS NOT NULL')
- ->all();
-
- foreach ($arrayOrders as $order) {
- $lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)];
- $name = $arrayNames[rand(0, count($arrayNames) - 1)];
-
- $c->username = $name . ' ' . $lastname;
-
- $c->save();
- }
-
- $arraySubscription = Subscription::find()
- ->where('username IS NOT NULL')
- ->all();
-
- foreach ($arraySubscription as $subscription) {
- $lastname = $arrayLastnames[rand(0, count($arrayLastnames) - 1)];
- $name = $arrayNames[rand(0, count($arrayNames) - 1)];
- $c->username = $name . ' ' . $lastname;
- $c->save();
- }
- }
- }
-
- /**
- * Routine quotidienne concernant les commandes : paiement et envoi d'un
- * récap aux producteurs.
- *
- * @param string $key
- * @param string $forceDate
- */
- public function actionProcessOrders($key = '', $forceDate = '')
- {
- if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
-
- $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 = Producer::searchAll() ;
-
- foreach ($arrayProducers as $producer) {
- $distribution = Distribution::findOne([
- 'date' => $date,
- 'active' => 1,
- 'id_producer' => $producer->id,
- ]);
-
- if ($distribution && ($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 = Producer::getConfig('credit', $producer->id) ;
-
- if($arrayOrders && is_array($arrayOrders)) {
- foreach($arrayOrders as $order) {
- if($order->auto_payment && $configCredit) {
-
- if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) {
- $order->saveCreditHistory(
- CreditHistory::TYPE_PAYMENT,
- $order->getAmount(Order::AMOUNT_REMAINING),
- $order->distribution->id_producer,
- $order->id_user,
- User::ID_USER_SYSTEM
- );
- }
- }
- }
- }
-
- /*
- * Envoi des commandes par email au producteur
- */
- if(!strlen($forceDate)) {
- $arrayOrders = Order::searchAll([
- 'distribution.date' => $date,
- 'distribution.id_producer' => $producer->id
- ], [
- 'conditions' => 'date_delete IS NULL'
- ]) ;
-
- $user = User::searchOne([
- 'id_producer' => $producer->id,
- 'status' => User::STATUS_PRODUCER
- ]);
-
- $mail = Yii::$app->mailer->compose(
- [
- 'html' => 'cronOrdersSummary-html',
- 'text' => 'cronOrdersSummary-text',
- ], [
- 'date' => $date,
- 'orders' => $arrayOrders
- ]
- )
- ->setTo($user->email)
- ->setFrom([Yii::$app->params['adminEmail'] => 'distrib']);
-
- if (count($arrayOrders)) {
- $subject = '[distrib] Commandes du ' . date('d/m', strtotime($date));
-
- // génération du pdf de commande
- Yii::$app->runAction('distribution/report-cron', [
- 'date' => $date,
- 'save' => true,
- 'idProducer' => $producer->id,
- 'key' => '64ac0bdab7e9f5e48c4d991ec5201d57'
- ]);
- $mail->attach(Yii::getAlias('@app/web/pdf/Orders-' . $date . '-' . $producer->id . '.pdf'));
- } else {
- $subject = '[distrib] Aucune commande';
- }
-
- $mail->setSubject($subject)
- ->send();
- }
- }
- }
- }
- }
- }
|