[ 'class' => VerbFilter::className(), 'actions' => [ ], ], 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'roles' => ['@'], 'matchCallback' => function ($rule, $action) { return User::hasAccessBackend(); } ] ], ], ]; } public function actionCreate() { $class = $this->getClass(); $model = new $class(); if ($model->load(Yii::$app->request->post())) { $model->id_producer = GlobalParam::getCurrentProducerId() ; if($model->save()) { Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('create', $model)); return $this->redirect(['/'.$model->getControllerUrlPath().'/update', 'id' => $model->id]); } else { Yii::$app->getSession()->setFlash('error', 'Un problème est survenu lors de la création du document.'); } } return $this->render('/document/create', [ 'title' => $this->getTitle('Ajouter'), 'typeDocument' => $this->getDocumentType(), 'model' => $model, ]); } /** * Modifie un modèle Produit existant. * Si la modification réussit, le navigateur est redirigé vers la page 'index'. * * @param integer $id * @return mixed */ public function actionUpdate($id) { $model = $this->findModel($id) ; $class = $this->getClass(); $model = $class::searchOne([ 'id' => $id ]) ; if($model->isStatusValid()) { throw new UserException('Vous ne pouvez pas modifier un document validé.'); } if ($model && $model->load(Yii::$app->request->post()) && $model->save()) { Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('update', $model)); } return $this->render('/document/update', [ 'title' => $this->getTitle('Modifier'), 'typeDocument' => $this->getDocumentType(), 'model' => $model, ]); } public function actionAjaxAddressUser($idUser) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; if($idUser > 0) { $user = User::findOne($idUser); if($user) { $address = $user['lastname'].' '.$user['name']."\n" ; $address .= $user['address'] ; return [ 'return' => 'success', 'address' => $address ] ; } } return ['return' => 'error'] ; } public function actionAjaxValidateDocument($idDocument, $classDocument) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; if($idDocument > 0 && Document::isValidClass($classDocument)) { $document = $classDocument::searchOne([ 'id' => $idDocument ]) ; if($document) { $document->changeStatus(Document::STATUS_VALID) ; $document->save() ; return ['return' => 'success'] ; } } return ['return' => 'error'] ; } public function actionAjaxInit($idDocument, $classDocument) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; if($idDocument > 0 && Document::isValidClass($classDocument)) { $document = $classDocument::searchOne([ 'id' => $idDocument ]) ; if($document) { $productsArray = Product::searchAll([], [ 'as_array' => true, ]) ; $ordersArray = [] ; foreach($document->orders as $order) { $order->init() ; $productsOrderArray = [] ; foreach($order->productOrder as $productOrder) { $productsOrderArray[$productOrder->id] = $productOrder->getAttributes() ; } $ordersArray[$order->id] = array_merge( $order->getAttributes(), [ 'productOrder' => $productsOrderArray, ] ); } return [ 'return' => 'success', 'document' => array_merge($document->getAttributes(), [ 'html_label' => $document->getHtmlLabel(), 'class' => $document->getClass() ]), 'idUser' => $document->user->id, 'products' => ArrayHelper::map($productsArray, 'id', function($product) { $product['wording_unit'] = Product::strUnit($product['unit']) ; return $product; }), 'orders' => $ordersArray, 'total' => $document->getAmount(Order::AMOUNT_TOTAL) ] ; } } return ['return' => 'error'] ; } public function actionAjaxAddProduct($idDocument, $classDocument, $idProduct, $quantity, $price) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; if(Document::isValidClass($classDocument)) { $document = $classDocument::searchOne([ 'id' => $idDocument ]) ; $product = Product::searchOne([ 'id' => $idProduct ]) ; if($document && $product) { if(count($document->orders) == 0) { $order = new Order ; $order->id_user = $document->id_user ; $order->id_point_sale = null ; $order->id_distribution = null ; $order->origin = Order::ORIGIN_ADMIN ; $order->date = date('Y-m-d H:i:s'); $fieldIdDocument = 'id_'.$classDocument::tableName() ; $order->$fieldIdDocument = $document->id ; $order->save() ; } else { $order = $document->orders[0] ; } if($order) { $productOrder = new ProductOrder ; $productOrder->id_order = $order->id ; $productOrder->id_product = $idProduct ; $quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient']; $productOrder->quantity = $quantity ; $productOrder->price = (float) $price ; $productOrder->unit = $product->unit ; $productOrder->step = $product->step ; $productOrder->id_tax_rate = $productOrder->id_tax_rate ? $product->taxRate->id : GlobalParam::getCurrentProducer()->taxRate->id ; $productOrder->save() ; return [ 'return' => 'success', ] ; } } } return [ 'return' => 'error' ] ; } public function actionAjaxDeleteProductOrder($idProductOrder) { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $productOrder = ProductOrder::searchOne([ 'id' => $idProductOrder ]) ; if($productOrder) { $productOrder->delete() ; return [ 'return' => 'success' ] ; } return [ 'return' => 'error' ] ; } protected function getClass() { $class = get_class($this); $class = str_replace('Controller', '', $class) ; $class = str_replace('backend\controllers\\', '', $class) ; return $class ; } protected function getDocumentType() { $class = $this->getClass(); if($class == 'Invoice') { $documentType = 'Facture' ; } elseif($class == 'DeliveryNote') { $documentType = 'Bon de livraison' ; } elseif($class == 'Quotation') { $documentType = 'Devis' ; } if(isset($documentType)) { return $documentType ; } return '' ; } public function getFlashMessage($type = 'create', $model) { $class = $this->getClass(); $message = $this->getDocumentType() ; $message .= ' '.Html::encode($model->name).' ' ; if($type == 'create') { $message .= 'ajouté' ; } elseif($type == 'update') { $message .= 'modifié' ; } if($class == 'Invoice') { $message .= 'e' ; } return $message ; } protected function getTitle($prepend) { $class = $this->getClass(); switch ($class) { case 'Invoice' : $title = $prepend . ' une facture'; break; case 'DeliveryNote' : $title = $prepend . ' un bon de livraison'; break; case 'Quotation' : $title = $prepend . ' un devis'; break; } return $title; } /** * Recherche un Document en fonction de son ID. * * @param integer $id * @return Produit * @throws NotFoundHttpException si le modèle n'est pas trouvé */ protected function findModel($id) { $class = $this->getClass() ; if (($model = $class::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } }