|
- <?php
-
-
-
- namespace backend\controllers;
-
- use common\models\Product;
- use common\models\User;
- use common\models\Document;
- use common\helpers\GlobalParam;
- use common\models\Order;
- use yii\base\UserException;
- use yii;
-
- class DocumentController extends BackendController
- {
- public function behaviors()
- {
- return [
- 'verbs' => [
- '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,
- ]);
- }
-
-
-
- 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 actionDelete($id)
- {
- $model = $this->findModel($id);
-
- if ($model->isStatusValid()) {
- throw new UserException('Vous ne pouvez pas supprimer un document validé.');
- }
-
- $model->delete();
-
- Order::updateAll([
- 'order.id_delivery_note' => null
- ], [
- 'order.id_delivery_note' => $id
- ]);
-
- Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('delete', $model));
- $this->redirect(['delivery-note/index']);
- }
-
- public function actionDownload($id)
- {
- $document = $this->findModel($id);
- $producer = GlobalParam::getCurrentProducer();
- $content = $this->renderPartial('/document/download', [
- 'producer' => $producer,
- 'document' => $document
- ]);
-
- $contentFooter = '<div id="footer">';
- $contentFooter .= '<div class="infos-bottom">' . Html::encode($producer->document_infos_bottom) . '</div>';
- if ($document->isStatusValid() || $document->isStatusDraft()) {
- $contentFooter .= '<div class="reference-document">';
- if ($document->isStatusValid()) {
- $contentFooter .= $document->getType() . ' N°' . $document->reference;
- }
- if ($document->isStatusDraft()) {
- $contentFooter .= $document->getType() . ' non validé';
- if($document->getType() == 'Facture') {
- $contentFooter .= 'e' ;
- }
- }
- $contentFooter .= '</div>';
- }
- $contentFooter .= '</div>';
-
- $pdf = new Pdf([
- 'mode' => Pdf::MODE_UTF8,
- 'format' => Pdf::FORMAT_A4,
- 'orientation' => Pdf::ORIENT_PORTRAIT,
- 'destination' => Pdf::DEST_BROWSER,
- 'content' => $content,
- 'cssFile' => Yii::getAlias('@webroot/css/document/download.css'),
- 'methods' => [
-
-
- 'SetHTMLFooter' => $contentFooter
- ]
- ]);
-
- return $pdf->render();
- }
-
- public function actionAjaxAddressUser($idUser)
- {
- \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
-
- if ($idUser > 0) {
- $user = User::searchOne([
- 'id' => $idUser
- ]);
-
- if ($user) {
- return [
- 'return' => 'success',
- 'address' => $user->getFullAddress()
- ];
- }
- }
-
- return ['return' => 'error'];
- }
-
- public function actionValidate($id)
- {
- $classDocument = $this->getClass();
-
- if ($id > 0 && Document::isValidClass($classDocument)) {
- $document = $classDocument::searchOne([
- 'id' => $id
- ]);
-
- if ($document) {
- $document->changeStatus(Document::STATUS_VALID);
- $document->save();
- Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('validate', $document));
- return $this->redirect(['delivery-note/index']);
- }
- }
-
- Yii::$app->getSession()->setFlash('danger', 'Une erreur est survenue lors de la validation du document.');
- return $this->redirect(['delivery-note/index']);
- }
-
- 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',
- 'alert' => [
- 'type' => 'success',
- 'message' => 'Document validé'
- ]
- ];
- }
- }
-
- return [
- 'return' => 'error',
- 'alert' => [
- 'type' => 'danger',
- 'message' => 'Une erreur est survenue lors de la validation du document.'
- ]
- ];
- }
-
- 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();
-
- $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) {
- return array_merge($product->getAttributes(), [
- 'price_with_tax' => $product->price_with_tax,
- 'wording_unit' => $product->wording_unit,
- 'tax_rate' => $product->taxRate->value
- ]);
- }),
- 'orders' => $ordersArray,
- 'total' => $document->getAmount(Order::AMOUNT_TOTAL),
- 'total_with_tax' => $document->getAmountWithTax(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->status = 'tmp-order' ;
- $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',
- 'alert' => [
- 'type' => 'success',
- 'message' => 'Produit ajouté'
- ]
- ];
- }
- }
-
- }
-
- return [
- 'return' => 'error',
- 'alert' => [
- 'type' => 'danger',
- 'message' => 'Une erreur est survenue lors de la suppression du produit.'
- ]
- ];
- }
-
- 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',
- 'alert' => [
- 'type' => 'danger',
- 'message' => 'Produit supprimé'
- ]
- ];
- }
-
- return [
- 'return' => 'error',
- 'alert' => [
- 'type' => 'danger',
- 'message' => 'Une erreur est survenue lors de la suppression du produit.'
- ]
- ];
- }
-
- public function getClass()
- {
- $class = get_class($this);
- $class = str_replace('Controller', '', $class);
- $class = str_replace('backend\controllers\\', '', $class);
- return $class;
- }
-
- public 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 .= ' <strong>' . Html::encode($model->name) . '</strong> ';
-
- if ($type == 'create') {
- $message .= 'ajouté';
- } elseif ($type == 'update') {
- $message .= 'modifié';
- } elseif ($type == 'delete') {
- $message .= 'supprimé';
- } elseif ($type == 'validate') {
- $message .= 'validé';
- }
-
- 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;
- }
-
-
-
- protected function findModel($id)
- {
- $class = $this->getClass();
-
- $model = $class::searchOne([
- 'id' => $id
- ]);
-
- if ($model) {
- return $model;
- } else {
- throw new NotFoundHttpException('The requested page does not exist.');
- }
- }
-
- }
|