[ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], ] ], ], ]; } /** * Liste les abonnements de l'utilisateur. */ public function actionIndex() { if (\Yii::$app->user->isGuest) { $producer = $this->getProducerCurrent(); return $this->redirect($this->getUrlManagerFrontend()->createAbsoluteUrl(['site/producer', 'id' => $producer->id])); } $searchModel = new SubscriptionSearch(); $searchModel->id_user = GlobalParam::getCurrentUserId(); $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider ]); } public function actionAjaxProcess() { $subscriptionModule = $this->getSubscriptionModule(); $model = new SubscriptionForm(); $model->id_producer = GlobalParam::getCurrentProducerId(); $model->id_user = GlobalParam::getCurrentUserId(); $posts = \Yii::$app->request->post(); $idSubscription = (int)$posts['idSubscription']; $isUpdate = false; if ($idSubscription) { $subscription = $subscriptionModule->findOneSubscriptionById($idSubscription); if ($subscription) { $model->id = $idSubscription; $isUpdate = true; } } if ($model->load($posts) && $model->validate() && $model->save()) { $subscription = $subscriptionModule->getRepository()->findOneSubscriptionById($model->id); $subscriptionModule->getOrderManager() ->updateOrdersIncomingDistributionsFromSubscription($subscription, $isUpdate); if ($isUpdate) { $this->setFlash('success', 'Abonnement modifié'); } else { $this->setFlash('success', 'Abonnement ajouté'); } } } /** * Crée une commande récurrente. */ public function actionForm(int $id = 0) { if (\Yii::$app->user->isGuest) { $producer = $this->getProducerCurrent(); return $this->redirect($this->getUrlManagerFrontend()->createAbsoluteUrl(['site/producer', 'id' => $producer->id])); } return $this->render('form', [ 'idSubscription' => $id ]); } /** * Modifie une commande récurrente. */ public function actionUpdate(int $id) { if (\Yii::$app->user->isGuest) { $producer = $this->getProducerCurrent(); return $this->redirect($this->getUrlManagerFrontend()->createAbsoluteUrl(['site/producer', 'id' => $producer->id])); } $subscriptionModule = $this->getSubscriptionModule(); $model = new SubscriptionForm; $subscription = $subscriptionModule->findOneSubscriptionById($id); if ($subscription) { $model->id = $id; $model->id_producer = $subscription->id_producer; $model->id_user = $subscription->id_user; $model->username = $subscription->username; $model->id_point_sale = $subscription->id_point_sale; $model->date_begin = date('d/m/Y', strtotime($subscription->date_begin)); if (strlen($subscription->date_end)) { $model->date_end = date('d/m/Y', strtotime($subscription->date_end)); } $model->monday = $subscription->monday; $model->tuesday = $subscription->tuesday; $model->wednesday = $subscription->wednesday; $model->thursday = $subscription->thursday; $model->friday = $subscription->friday; $model->saturday = $subscription->saturday; $model->sunday = $subscription->sunday; $model->auto_payment = Subscription::AUTO_PAYMENT_DEDUCTED; $model->week_frequency = $subscription->week_frequency; // produits $arrayProductsSubscription = ProductSubscription::searchAll([ 'id_subscription' => $model->id ]); foreach ($arrayProductsSubscription as $productSubscription) { $model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; } } else { throw new NotFoundHttpException('L\'abonnement est introuvable.', 404); } $productsArray = $this->getProductModule()->findProducts(); if ($model->load(\Yii::$app->request->post()) && $model->validate()) { if (!strlen($model->date_end)) { $model->date_end = null; } if ($model->save()) { $this->setFlash('success', 'Abonnement modifié'); $subscription = $subscriptionModule->findOneSubscriptionById($model->id); $matchedDistributionsArray = $this-> getDistributionModule()->findDistributionsIncomingMatchWithSubscrtiption($subscription); if (count($matchedDistributionsArray)) { return $this->redirect( [ 'subscription/update-distributions', 'idSubscription' => $subscription->id, 'update' => true ] ); } else { return $this->redirect(['subscription/index']); } } } return $this->render('update', [ 'model' => $model, 'productsArray' => $productsArray ]); } /** * Supprime un abonnement. */ public function actionDelete($id) { if (\Yii::$app->user->isGuest) { $producer = $this->getProducerCurrent(); return $this->redirect($this->getUrlManagerFrontend()->createAbsoluteUrl(['site/producer', 'id' => $producer->id])); } $subscriptionModule = $this->getSubscriptionModule(); $subscription = $subscriptionModule->findOneSubscriptionById($id); $subscriptionModule->deleteSubscription($subscription); // @TODO : gérer via événements $this->getSubscriptionModule()->getOrderManager() ->deleteOrdersIncomingDistributionsFromSubscription($subscription); $this->setFlash('success', 'Abonnement supprimé'); return $this->redirect(['subscription/index']); } public function actionAjaxInfos($idSubscription = 0) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $params = []; $productModule = $this->getProductModule(); $subscriptionModule = $this->getSubscriptionModule(); $user = GlobalParam::getCurrentUser(); $userProducer = $this->getUserProducerModule()->findOneUserProducer($this->getUserCurrent()); $pointSale = null; if ($idSubscription > 0) { $arrayProductsSubscription = ProductSubscription::searchAll([ 'id_subscription' => $idSubscription ]); $subscription = $subscriptionModule->findOneSubscriptionById($idSubscription); if ($subscription && $subscription->id_point_sale) { $pointSale = $this->getPointSaleModule()->findOnePointSaleById($subscription->id_point_sale); } } // Produits $productsArray = $productModule->findProducts(); $indexProduct = 0; foreach ($productsArray as &$product) { $quantity = 0; $coefficientUnit = $productModule->getSolver()->getUnitCoefficient($product); if (isset($arrayProductsSubscription) && count($arrayProductsSubscription)) { foreach ($arrayProductsSubscription as $productSubscription) { if ($product->id == $productSubscription->id_product) { $coefficientUnit = $productModule->getSolver()->getUnitCoefficient($productSubscription->product); $quantity = $productSubscription->quantity * $coefficientUnit; } } } $productPointSaleArray = []; foreach($product->productPointSale as $productPointSale) { $productPointSaleArray[] = $productPointSale->id_point_sale; } $product = array_merge( $product->getAttributes(), [ 'index' => $indexProduct++, 'quantity_form' => $quantity, 'coefficient_unit' => $coefficientUnit, 'wording_unit' => $productModule->getSolver()->strUnit($product, UnitDefinition::WORDING_UNIT, true), 'wording_short' => $productModule->getSolver()->strUnit($product), 'price_with_tax' => $productModule->getPriceWithTax($product, [ 'user' => $user, 'user_producer' => $userProducer, 'point_sale' => $pointSale ]), 'product_point_sale_array' => $productPointSaleArray ] ); if($product['unit'] == 'piece' && is_null($product['step'])) { $product['step'] = 1; } } $params['products'] = $productsArray; $pointsSaleArray = $this->getPointSaleModule()->findPointSales(); foreach ($pointsSaleArray as &$pointSale) { $pointSale = array_merge($pointSale->getAttributes(), [ 'userPointSale' => ($pointSale->userPointSale ? $pointSale->userPointSale[0] : '') ]); if ($pointSale['code'] && strlen($pointSale['code'])) { $pointSale['code'] = '***'; } } $params['points_sale'] = $pointsSaleArray; if ($idSubscription > 0) { $subscription = $subscriptionModule->findOneSubscriptionById($idSubscription); if (!$subscription || $subscription->id_user != GlobalParam::getCurrentUserId()) { throw new UserException('Abonnement introuvable'); } else { $params = array_merge($params, $subscription->getAttributes()); } } return $params; } /** * Vérifie le code saisi pour un point de vente. */ public function actionAjaxValidateCodePointSale($idPointSale, $code) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $pointSaleModule = $this->getPointSaleModule(); $pointSale = $pointSaleModule->findOnePointSaleById($idPointSale); if ($pointSale && $pointSaleModule->validateCode($pointSale, $code)) { return 1; } return 0; } }