[ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return $this->getUserModule() ->getAuthorizationChecker() ->isGrantedAsProducer($this->getUserCurrent()); } ], ], ], ]; } /** * Liste les points de vente. */ public function actionIndex() { $searchModel = new PointSaleSearch(); $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); } /** * Crée un point de vente. * * @return mixed */ public function actionCreate() { $pointSaleModule = $this->getPointSaleModule(); $distributionModule = $this-> getDistributionModule(); $pointSale = $pointSaleModule->instanciatePointSale(); if ($pointSale->load(\Yii::$app->request->post()) && $pointSale->save()) { $pointSaleModule->updatePointSalePointProduction($pointSale); $pointSaleModule->processRestrictedAccess($pointSale); $this->initPaymentMethodsByCreditFunctioning($pointSale); $distributionModule->addPointSaleIncomingDistributions($pointSale); $this->setFlash('success', 'Point de vente créé.'); return $this->redirectAfterSave('point-sale', $pointSale->id); } else { return $this->render('create', array_merge($this->initForm(), [ 'model' => $pointSale, ])); } } /** * Modifie un point de vente. */ public function actionUpdate(int $id) { $distributionModule = $this-> getDistributionModule(); $pointSaleModule = $this->getPointSaleModule(); $model = $this->findModel($id); foreach ($model->userPointSale as $userPointSale) { $model->users[] = $userPointSale->id_user; $model->users_comment[$userPointSale->id_user] = $userPointSale->comment; } if ($model->load(\Yii::$app->request->post()) && $model->save()) { $pointSaleModule->updatePointSalePointProduction($model); $pointSaleModule->processRestrictedAccess($model); $this->initPaymentMethodsByCreditFunctioning($model); $distributionModule->addPointSaleIncomingDistributions($model); $this->setFlash('success', 'Point de vente modifié.'); return $this->redirectAfterSave('point-sale', $model->id); } else { return $this->render('update', array_merge($this->initForm($id), [ 'model' => $model, ])); } } public function initPaymentMethodsByCreditFunctioning(PointSale $pointSale) { if($this->getPointSaleModule()->getBuilder()->initPaymentMethodsByCreditFunctioning($pointSale)) { $this->addFlash('info', 'Le paiement sur place a été ajusté par rapport au fonctionnement de la cagnotte.'); } } /** * Initialise le formulaire de création/modification. */ public function initForm(int $id = 0) { $userModule = $this->getUserModule(); $users = $userModule->queryUsersBy() ->leftJoin('user_point_sale', 'user_point_sale.id_user = user.id AND user_point_sale.id_point_sale = :id_point_sale', [':id_point_sale' => $id]) ->orderBy('user_point_sale.id_point_sale DESC, lastname ASC, name ASC') ->all(); return [ 'users' => $users ]; } /** * Supprime un point de vente et redirige vers la liste des points de vente. */ public function actionDelete(int $id, $confirm = false) { $orderModule = $this->getOrderModule(); $distributionModule = $this-> getDistributionModule(); $pointSale = $this->findModel($id); if ($confirm) { $pointSale->status = -1; $pointSale->save(); // Suppression du lien entre les utilisateurs et le point de vente UserPointSale::deleteAll(['id_point_sale' => $id]); // Suppression du lien PointSaleDistribution pour toutes les distributions à venir $incomingDistributions = $distributionModule->findDistributionsIncoming(true); foreach ($incomingDistributions as $distribution) { PointSaleDistribution::deleteAll(['id_point_sale' => $id, 'id_distribution' => $distribution->id]); } // Suppression de toutes les commandes à venir de ce point de vente $ordersArray = Order::searchAll( [ 'id_point_sale' => $id, ], [ 'conditions' => [ 'distribution.date > :today', OrderRepositoryQuery::getSqlFilterIsValid() ], 'params' => [':today' => date('Y-m-d')] ] ); if ($ordersArray) { foreach ($ordersArray as $order) { $orderModule->getManager()->deleteOrder($order, $this->getUserCurrent(), true); } } $this->setFlash('success', 'Point de vente ' . Html::encode($pointSale->name) . ' supprimé.'); } else { $this->setFlash('info', 'Souhaitez-vous vraiment supprimer le point de vente ' . Html::encode($pointSale->name) . ' ? ' . Html::a('Oui', ['point-sale/delete', 'id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']) . ' ' . Html::a('Non', ['point-sale/index'], ['class' => 'btn btn-default'])); } return $this->redirect(['index']); } /** * Définit un point de vente par défaut. */ public function actionDefault(int $id) { $pointSaleModule = $this->getPointSaleModule(); $pointSale = $this->findModel($id); if ($pointSale) { PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]); if (!$pointSale->default) { $pointSale->default = 1; $pointSaleModule->saveUpdate($pointSale); $this->setFlash('success', 'Point de vente ' . Html::encode($pointSale->name) . ' défini par défaut.'); } else { $this->setFlash('success', 'Aucun point de vente défini par défaut'); } } return $this->redirect(['index']); } /** * Recherche un point de vente en fonction de son ID. */ protected function findModel(int $id) { $model = PointSale::find() ->with('userPointSale') ->where(['id' => $id]) ->one(); if(!$model || $model->id_producer != $this->getProducerCurrent()->id) { throw new NotFoundHttpException('Le point de vente demandé est introuvable.'); } return $model; } }