<?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\Ajax; use common\helpers\Alwaysdata; use domain\Order\Order\Order; use domain\Order\Order\OrderRepositoryQuery; use domain\Order\OrderStatus\OrderStatus; use domain\Producer\Producer\Producer; use domain\Product\Product\Product; use Yii; use yii\data\ActiveDataProvider; use yii\filters\AccessControl; use yii\filters\VerbFilter; use yii\helpers\Html; use yii\web\NotFoundHttpException; class ProducerAdminController extends BackendController { public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['post'], ], ], 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return $this->getUserModule() ->getAuthorizationChecker() ->isGrantedAsAdministrator($this->getUserCurrent()); } ] ], ], ]; } /** * Liste les producteurs. * * @return mixed */ public function actionIndex() { $dataProviderProducer = new ActiveDataProvider([ 'query' => Producer::find() ->with('userProducer', 'user') ->orderBy('active DESC, free_price DESC'), 'pagination' => [ 'pageSize' => 1000, ], ]); return $this->render('index', [ 'dataProviderProducer' => $dataProviderProducer ]); } /** * Crée un producteur. */ public function actionCreate() { $producerModule = $this->getProducerModule(); $producer = $producerModule->instanciateProducer(); if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) { $this->setFlash('success', 'Producteur créé.'); return $this->redirect(['index']); } else { return $this->render('create', [ 'model' => $producer, ]); } } /** * Modification d'un producteur. */ public function actionUpdate(int $id) { $producerModule = $this->getProducerModule(); $producer = $this->findProducer($id); if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) { $this->setFlash('success', 'Producteur modifié.'); return $this->redirect(['index']); } else { return $this->render('update', [ 'model' => $producer, ]); } } /** * Facturation producteur. */ public function actionBilling(int $id) { $producer = $this->findProducer($id); return $this->render('billing', [ 'producer' => $producer, ]); } public function actionAlwaysdata(int $id) { $producer = $this->findProducer($id); if($producer->contact_email) { Yii::$app->alwaysdataClient->initRedirections($producer); return Ajax::responseSuccess('Redirections initialisées chez Alwaysdata'); } else { return Ajax::responseError("L'adresse email de contact du producteur n'est pas définie"); } } public function actionDolibarr(int $id) { $producerModule = $this->getProducerModule(); $producer = $this->findProducer($id); if($producer->dolibarr_socid) { $producerModule->generateDolibarrProducerInvoice($producer); return Ajax::responseSuccess("Facture générée sur Dolibarr pour le producteur \"".Html::encode($producer->name)."\""); } else { return Ajax::responseError("Dolibarr : l'id user du producteur doit être défini"); } } public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1) { $producerModule = $this->getProducerModule(); $userModule = $this->getUserModule(); $fromProducerId = (int)$fromProducerId; $toProducerId = (int)$toProducerId; $count = 0; $usersArray = $userModule->queryUsersBy(['id_producer' => $fromProducerId])->all(); foreach ($usersArray as $user) { $idUser = $user['user_id']; $countOrders = 0; if ($withOrders) { $countOrders = Order::searchCount([ 'id_user' => $idUser, 'distribution.id_producer' => $fromProducerId, ], [ 'conditions' => OrderRepositoryQuery::getSqlFilterIsValid() ]); } if (($withOrders && $countOrders) || !$withOrders) { $producerModule->addUser( $userModule->findOneUserById($idUser), $producerModule->findOneProducerById($toProducerId) ); $count++; } } if ($count) { $this->setFlash('success', $count . ' clients importés du producteur #' . $fromProducerId . ' vers le producteur #' . $toProducerId . '.'); } else { $this->setFlash('error', 'Aucun client à importer.'); } return $this->redirect(['producer-admin/index']); } public function actionProducerInstallTaxUpdatePrices($idProducer) { $productsArray = Product::searchAll([ 'id_producer' => $idProducer ]); $connection = Yii::$app->getDb(); foreach ($productsArray as $product) { $product->price = round($product->price / (1 + $product->taxRate->value), 2); $product->save(); $command = $connection->createCommand(" UPDATE `product_order` SET price = ROUND(price / (1 + :tax_value), 2), id_tax_rate = :id_tax_rate WHERE id_product = :id_product", [ ':id_product' => $product->id, ':tax_value' => $product->taxRate->value, ':id_tax_rate' => $product->taxRate->id, ]); $result = $command->query(); } echo 'ok'; } /** * Recherche un producteur. */ protected function findProducer(int $id) { $producerModule = $this->getProducerModule(); if (($model = $producerModule->findOneProducerById($id)) !== null) { return $model; } else { throw new NotFoundHttpException('Producteur introuvable.'); } } }