No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

878 líneas
36KB

  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace backend\controllers;
  38. use common\helpers\Ajax;
  39. use common\helpers\GlobalParam;
  40. use common\helpers\MeanPayment;
  41. use common\helpers\Price;
  42. use common\helpers\Tiller;
  43. use common\logic\Distribution\Distribution\Model\Distribution;
  44. use common\logic\Document\DeliveryNote\Model\DeliveryNote;
  45. use common\logic\Order\Order\Model\Order;
  46. use common\logic\PointSale\PointSale\Model\PointSale;
  47. use common\logic\Producer\Producer\Model\Producer;
  48. use common\logic\Product\Product\Model\Product;
  49. use DateTime;
  50. use kartik\mpdf\Pdf;
  51. use yii\base\Exception;
  52. use yii\filters\AccessControl;
  53. class DistributionController extends BackendController
  54. {
  55. public function behaviors()
  56. {
  57. return [
  58. 'access' => [
  59. 'class' => AccessControl::class,
  60. 'rules' => [
  61. [
  62. 'actions' => ['report-cron', 'report-terredepains'],
  63. 'allow' => true,
  64. 'roles' => ['?']
  65. ],
  66. [
  67. 'allow' => true,
  68. 'roles' => ['@'],
  69. 'matchCallback' => function ($rule, $action) {
  70. return $this->getUserModule()
  71. ->getAuthorizationChecker()
  72. ->isGrantedAsProducer($this->getUserCurrent());
  73. }
  74. ]
  75. ],
  76. ],
  77. ];
  78. }
  79. public function actionIndex(string $date = '', int $idOrderUpdate = 0)
  80. {
  81. $this->checkProductsPointsSale();
  82. if(!$this->getDistributionModule()->getSolver()->validateDistributionDate($date)) {
  83. $date = '';
  84. }
  85. $orderUpdate = null;
  86. if($idOrderUpdate) {
  87. $orderUpdate = $this->getOrderModule()->getRepository()
  88. ->findOneOrderById($idOrderUpdate);
  89. }
  90. return $this->render('index', [
  91. 'date' => $date,
  92. 'orderUpdate' => $orderUpdate
  93. ]);
  94. }
  95. public function actionAjaxInfos($date = '')
  96. {
  97. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  98. $distributionModule = $this-> getDistributionModule();
  99. $orderModule = $this->getOrderModule();
  100. $productModule = $this->getProductModule();
  101. $userModule = $this->getUserModule();
  102. $producer = $this->getProducerCurrent();
  103. $dateObject = DateTime::createFromFormat('Y-m-d', $date);
  104. $json = ['distribution' => [], 'products' => []];
  105. $json['means_payment'] = MeanPayment::getAll();
  106. $json['producer'] = $this->buildAjaxInfosResponseProducer($producer);
  107. $json['distributions'] = $this->buildAjaxInfosResponseDistributions($dateObject);
  108. $json['units'] = Product::$unitsArray;
  109. if ($distributionModule->getSolver()->validateDistributionDate($date)) {
  110. $distribution = $distributionModule->createDistributionIfNotExist($date);
  111. $ordersArray = $orderModule->findOrdersByDistribution($distribution, false);
  112. $ordersArrayObject = $ordersArray;
  113. $productsArray = $productModule->findProductsByDistribution($distribution, false);
  114. $json['products'] = $this->buildAjaxInfosResponseProducts($distribution, $productsArray, $ordersArray);
  115. $json['distribution'] = $this->buildAjaxInfosResponseDistribution($distribution, $ordersArrayObject, $productsArray);
  116. $json['orders'] = $this->buildAjaxInfosResponseOrders($ordersArray, $productsArray);
  117. $json['points_sale'] = $this->buildAjaxInfosResponsePointsSale($distribution);
  118. $json['delivery_notes'] = $this->buildAjaxInfosResponseDeliveryNotes($date);
  119. $json['order_create'] = $this->buildAjaxInfosResponseOrderCreate($distribution, $productsArray);
  120. $json['users'] = $userModule->findUsers();
  121. $json['one_distribution_week_active'] = $distributionModule->isOneDistributionWeekActive($date);
  122. $json['tiller_is_synchro'] = $this->buildAjaxInfosResponseTiller($producer, $date);
  123. $json['missing_subscriptions'] = $this->buildAjaxInfosResponseMissingSubscriptions($date, $distribution, $ordersArrayObject);
  124. }
  125. return $json;
  126. }
  127. public function buildAjaxInfosResponsePointsSale(Distribution $distribution)
  128. {
  129. $producerModule = $this->getProducerModule();
  130. $pointSaleModule = $this->getPointSaleModule();
  131. $pointSaleDistributionModule = $this->getPointSaleDistributionModule();
  132. $pointsSaleArray = $pointSaleModule->findPointSalesByDistributionAsArray($distribution);
  133. // @TODO : à gérer autrement
  134. foreach($pointsSaleArray as &$pointSaleArray) {
  135. $idPointSale = $pointSaleArray['id'];
  136. $pointSale = $pointSaleModule->findOnePointSaleById($idPointSale);
  137. if(!isset($pointSaleArray['pointSaleDistribution']) || !$pointSaleArray['pointSaleDistribution'] || !count($pointSaleArray['pointSaleDistribution'])) {
  138. $pointSaleDistribution = $pointSaleDistributionModule->createPointSaleDistributionIfNotExist($distribution, $pointSale);
  139. $pointSaleArray['pointSaleDistribution'] = [
  140. [
  141. 'id_distribution' => $pointSaleDistribution->id_distribution,
  142. 'id_point_sale' => $pointSaleDistribution->id_point_sale,
  143. 'delivery' => $pointSaleDistribution->delivery
  144. ]
  145. ];
  146. }
  147. $pointSaleArray['credit_functioning'] = $producerModule->getPointSaleCreditFunctioning($pointSale);
  148. }
  149. return $pointsSaleArray;
  150. }
  151. public function buildAjaxInfosResponseProducts(Distribution $distribution, array $productsArray, array $ordersArray)
  152. {
  153. $distributionModule = $this-> getDistributionModule();
  154. $orderModule = $this->getOrderModule();
  155. $jsonProductsArray = [];
  156. foreach ($productsArray as $product) {
  157. $jsonProduct = $product->getAttributes();
  158. $quantityOrder = $orderModule->getProductQuantity($product, $ordersArray);
  159. $jsonProduct['quantity_ordered'] = $quantityOrder;
  160. if (!isset($product->productDistribution[0])) {
  161. $productDistributionAdd = $distributionModule->addProduct($distribution, $product);
  162. if($productDistributionAdd) {
  163. $jsonProduct['productDistribution'][0] = $productDistributionAdd->getAttributes();
  164. $product->populateRelation('productDistribution', [$productDistributionAdd]);
  165. }
  166. }
  167. else {
  168. foreach($product->productDistribution as $key => $productDistribution) {
  169. $jsonProduct['productDistribution'][$key] = $productDistribution->getAttributes();
  170. }
  171. }
  172. if (!isset($product->productDistribution[0]) || !is_numeric($product->productDistribution[0]->quantity_max)) {
  173. $jsonProduct['quantity_remaining'] = null;
  174. } else {
  175. $jsonProduct['quantity_remaining'] = $product->productDistribution[0]->quantity_max - $quantityOrder;
  176. }
  177. $jsonProduct['quantity_form'] = 0;
  178. if ($product->taxRate) {
  179. $jsonProduct['taxRate'] = $product->taxRate->getAttributes();
  180. }
  181. else {
  182. $jsonProduct['taxRate'] = $this->getProducerCurrent()->taxRate->getAttributes();
  183. }
  184. $jsonProductsArray[] = $jsonProduct;
  185. }
  186. return $jsonProductsArray;
  187. }
  188. public function buildAjaxInfosResponseProducer($producer)
  189. {
  190. return [
  191. 'credit' => $producer->credit,
  192. 'tiller' => $producer->tiller,
  193. 'option_display_export_grid' => $producer->option_display_export_grid
  194. ];
  195. }
  196. public function buildAjaxInfosResponseDistributions($dateObject)
  197. {
  198. $numberOfLoadedMonthes = '3 month';
  199. if (is_object($dateObject)) {
  200. $dateBegin = strtotime('-' . $numberOfLoadedMonthes, $dateObject->getTimestamp());
  201. $dateEnd = strtotime('+' . $numberOfLoadedMonthes, $dateObject->getTimestamp());
  202. } else {
  203. $dateBegin = strtotime('-' . $numberOfLoadedMonthes);
  204. $dateEnd = strtotime('+' . $numberOfLoadedMonthes);
  205. }
  206. return Distribution::searchAll([
  207. 'active' => 1
  208. ], [
  209. 'conditions' => [
  210. 'date > :date_begin',
  211. 'date < :date_end'
  212. ],
  213. 'params' => [
  214. ':date_begin' => date(
  215. 'Y-m-d',
  216. $dateBegin
  217. ),
  218. ':date_end' => date(
  219. 'Y-m-d',
  220. $dateEnd
  221. ),
  222. ],
  223. 'as_array' => true
  224. ]);
  225. }
  226. public function buildAjaxInfosResponseDistribution(Distribution $distribution, array $ordersArray, array $productsArray)
  227. {
  228. $productModule = $this->getProductModule();
  229. $orderModule = $this->getOrderModule();
  230. $distributionModule = $this-> getDistributionModule();
  231. $distributionJsonData = [
  232. 'id' => $distribution->id,
  233. 'active' => $distribution->active,
  234. 'url_report' => $this->getUrlManagerBackend()->createUrl(
  235. ['distribution/report', 'date' => $distribution->date]
  236. ),
  237. 'url_report_grid' => $this->getUrlManagerBackend()->createUrl(
  238. ['distribution/report-grid', 'date' => $distribution->date]
  239. ),
  240. 'url_export_shopping_cart_labels' => $this->getUrlManagerBackend()->createUrl(
  241. ['distribution/export-shopping-cart-labels', 'date' => $distribution->date]
  242. ),
  243. 'url_order' => $distributionModule->getLinkOrder($distribution),
  244. ];
  245. // montant et poids des commandes
  246. $revenues = 0;
  247. $weight = 0;
  248. if ($ordersArray) {
  249. foreach ($ordersArray as $order) {
  250. $orderModule->initOrder($order);
  251. if (is_null($order->date_delete)) {
  252. $revenues += $orderModule->getOrderAmountWithTax($order);
  253. $weight += $order->weight;
  254. }
  255. }
  256. }
  257. $distributionJsonData['revenues'] = Price::format($revenues);
  258. $distributionJsonData['weight'] = number_format($weight, 2);
  259. $distributionJsonData['potential_revenues'] = Price::format($productModule->getProductDistributionPotentialRevenues($productsArray));
  260. $distributionJsonData['potential_weight'] = number_format($productModule->getProductDistributionPotentialWeight($productsArray), 2);
  261. return $distributionJsonData;
  262. }
  263. public function buildAjaxInfosResponseOrders(array $ordersArray, array $productsArray)
  264. {
  265. $userModule = $this->getUserModule();
  266. $orderModule = $this->getOrderModule();
  267. $paymentManager = $this->getPaymentModule();
  268. if ($ordersArray) {
  269. foreach ($ordersArray as &$order) {
  270. $orderModule->initOrder($order);
  271. $productOrderArray = [];
  272. foreach ($order->productOrder as $productOrder) {
  273. $productOrderArray[$productOrder->id_product] = [
  274. 'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'],
  275. 'unit' => $productOrder->unit,
  276. 'price' => number_format($productOrder->price, 5),
  277. 'invoice_price' => number_format($productOrder->invoice_price, 5),
  278. 'price_with_tax' => Price::getPriceWithTax($productOrder->price, $productOrder->taxRate->value),
  279. ];
  280. }
  281. foreach ($productsArray as $product) {
  282. if (!isset($productOrderArray[$product['id']])) {
  283. $productOrderArray[$product['id']] = [
  284. 'quantity' => 0,
  285. 'unit' => $product['unit'],
  286. 'price' => number_format($product['price'], 5),
  287. 'price_with_tax' => Price::getPriceWithTax($product['price'], $product['taxRate']['value']),
  288. ];
  289. }
  290. }
  291. $paymentArray = [];
  292. foreach ($order->payment as $payment) {
  293. $paymentArray[] = [
  294. 'type' => $payment->type,
  295. 'wording_type' => $paymentManager->getStrType($payment),
  296. 'mean_payment' => $payment->mean_payment,
  297. 'wording_mean_payment' => $paymentManager->getStrMeanPayment($payment),
  298. 'date' => date('d/m/Y H:i:s', strtotime($payment->date)),
  299. 'user' => $payment->getUserObject() ? $userModule->getUsername($payment->getUserObject()) : '',
  300. 'user_action' => $paymentManager->getStrUserAction($payment),
  301. 'wording' => $paymentManager->getStrWording($payment, $order),
  302. 'amount' => $paymentManager->getAmount($payment, Order::AMOUNT_TOTAL, true),
  303. ];
  304. }
  305. $arrayCreditUser = [];
  306. if(isset($order->user)) {
  307. $arrayCreditUser['credit'] = $userModule->getCredit($order->user);
  308. $arrayCreditUser['credit_active'] = $userModule->getCreditActive($order->user);
  309. }
  310. $oneProductUnactivated = false;
  311. foreach ($order->productOrder as $productOrder) {
  312. foreach ($productsArray as $product) {
  313. if ($productOrder->id_product == $product['id'] && isset($product['productDistribution'][0]) && !$product['productDistribution'][0]['active']) {
  314. $oneProductUnactivated = true;
  315. }
  316. }
  317. }
  318. $order = array_merge($order->getAttributes(), [
  319. 'selected' => false,
  320. 'weight' => $order->weight,
  321. 'amount' => (float) Price::numberTwoDecimals($orderModule->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL)),
  322. 'amount_paid' => (float) Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_PAID)),
  323. 'amount_remaining' => Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_REMAINING)),
  324. 'amount_surplus' => Price::numberTwoDecimals($orderModule->getOrderAmount($order, Order::AMOUNT_SURPLUS)),
  325. 'user' => (isset($order->user)) ? array_merge(
  326. $order->user->getAttributes(),
  327. $arrayCreditUser
  328. ) : null,
  329. 'pointSale' => $order->pointSale ? ['id' => $order->pointSale->id, 'name' => $order->pointSale->name] : null,
  330. 'productOrder' => $productOrderArray,
  331. 'paymentsArray' => $paymentArray,
  332. 'oneProductUnactivated' => $oneProductUnactivated,
  333. 'isLinkedToValidDocument' => $orderModule->isLinkedToValidDocument($order),
  334. 'isLinkedToValidInvoice' => $orderModule->isLinkedToValidInvoice($order),
  335. 'isCreditAutoPayment' => $orderModule->isCreditAutoPayment($order),
  336. 'isCreditContext' => $orderModule->isCreditContext($order),
  337. 'isPaid' => $orderModule->isOrderPaid($order),
  338. 'isPaidViaInvoice' => $orderModule->isOrderPaidViaInvoice($order),
  339. 'paymentLabelShort' => $orderModule->getPaymentLabelShort($order),
  340. 'isCreditFunctioningMandatory' => $orderModule->isOrderCreditFunctioningMandatory($order),
  341. 'isCreditFunctioningUser' => $orderModule->isOrderCreditFunctioningUser($order),
  342. 'debitCredit' => false,
  343. ]);
  344. }
  345. }
  346. return $ordersArray;
  347. }
  348. public function buildAjaxInfosResponseDeliveryNotes(string $date)
  349. {
  350. $deliveryNotesArray = DeliveryNote::searchAll([
  351. 'distribution.date' => $date,
  352. ], [
  353. 'join_with' => ['user AS user_delivery_note', 'orders', 'producer']
  354. ]);
  355. $deliveryNotesByPointSaleArray = [];
  356. foreach ($deliveryNotesArray as $deliveryNote) {
  357. if (isset($deliveryNote->orders[0])) {
  358. $deliveryNotesByPointSaleArray[$deliveryNote->orders[0]->id_point_sale] =
  359. $deliveryNote->getAttributes();
  360. }
  361. }
  362. return $deliveryNotesByPointSaleArray;
  363. }
  364. public function buildAjaxInfosResponseOrderCreate(Distribution $distribution, array $productsArray)
  365. {
  366. $pointSaleModule = $this->getPointSaleModule();
  367. $pointSaleDefault = $pointSaleModule->findOnePointSaleDefaultByDistribution($distribution);
  368. $productOrderArray = [];
  369. foreach ($productsArray as $product) {
  370. $productOrderArray[$product['id']] = [
  371. 'quantity' => 0,
  372. 'unit' => $product['unit'],
  373. 'price' => number_format($product['price'], 5),
  374. 'price_with_tax' => Price::getPriceWithTax($product['price'], $product['taxRate']['value']),
  375. ];
  376. }
  377. return [
  378. 'id_point_sale' => $pointSaleDefault ? $pointSaleDefault->id : 0,
  379. 'id_user' => 0,
  380. 'username' => '',
  381. 'comment' => '',
  382. 'productOrder' => $productOrderArray
  383. ];
  384. }
  385. public function buildAjaxInfosResponseTiller(Producer $producer, string $date)
  386. {
  387. return $this->getOrderModule()->getTillerManager()->isSynchronized($date);
  388. }
  389. public function buildAjaxInfosResponseMissingSubscriptions(string $date, Distribution $distribution, array $ordersArray)
  390. {
  391. $subscriptionModule = $this->getSubscriptionModule();
  392. $missingSubscriptionsArray = [];
  393. $arraySubscriptions = $subscriptionModule->findSubscriptionsByDate($date);
  394. if ($distribution->active) {
  395. foreach ($arraySubscriptions as $subscription) {
  396. if (!$subscriptionModule->hasOrderAlreadyExist($subscription, $ordersArray)
  397. && $subscription->productSubscription && count($subscription->productSubscription)
  398. && $subscription->id_point_sale && $subscription->id_point_sale > 0) {
  399. $missingSubscriptionsArray[] = [
  400. 'username' => $subscriptionModule->getUsername($subscription)
  401. ];
  402. }
  403. }
  404. }
  405. return $missingSubscriptionsArray;
  406. }
  407. public function actionAjaxPointSaleFavorite($idUser)
  408. {
  409. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  410. $userModule = $this->getUserModule();
  411. $orderModule = $this->getOrderModule();
  412. $user = $userModule->findOneUserById($idUser);
  413. $idFavoritePointSale = 0;
  414. if($user) {
  415. $favoritePointSale = $orderModule->getUserFavoritePointSale($user);
  416. if ($favoritePointSale) {
  417. $idFavoritePointSale = $favoritePointSale->id;
  418. }
  419. }
  420. return [
  421. 'id_favorite_point_sale' => $idFavoritePointSale
  422. ];
  423. }
  424. public function actionAjaxUpdateProductOrder(
  425. $idDistribution,
  426. $idUser = false,
  427. $idPointSale = false,
  428. $idOrder = false
  429. )
  430. {
  431. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  432. $distributionModule = $this-> getDistributionModule();
  433. $orderModule = $this->getOrderModule();
  434. $userModule = $this->getUserModule();
  435. $pointSaleModule = $this->getPointSaleModule();
  436. $productModule = $this->getProductModule();
  437. $order = $orderModule->findOneOrderById($idOrder);
  438. $distribution = $distributionModule->findOneDistributionById($idDistribution);
  439. $user = $userModule->findOneUserById($idUser);
  440. $pointSale = $pointSaleModule->findOnePointSaleById($idPointSale);
  441. $productsArray = Product::find()
  442. ->where([
  443. 'id_producer' => GlobalParam::getCurrentProducerId(),
  444. ])->joinWith([
  445. 'productPrice',
  446. 'productDistribution' => function ($q) use ($distribution) {
  447. $q->where(['id_distribution' => $distribution->id]);
  448. }
  449. ])->all();
  450. $productOrderArray = [];
  451. foreach ($productsArray as $product) {
  452. $priceArray = $productModule->getPriceArray($product, $user, $pointSale);
  453. $quantity = 0;
  454. $invoicePrice = null;
  455. if (isset($order->productOrder)) {
  456. foreach ($order->productOrder as $productOrder) {
  457. if ($productOrder->id_product == $product['id']) {
  458. if ($productOrder->invoice_price) {
  459. $invoicePrice = number_format($productOrder->invoice_price, 5);
  460. } else {
  461. $invoicePrice = number_format($productOrder->price, 5);
  462. }
  463. $quantity = $productOrder->quantity;
  464. }
  465. }
  466. }
  467. $productOrderArray[$product['id']] = [
  468. 'quantity' => $quantity,
  469. 'unit' => $product->unit,
  470. 'prices' => $priceArray,
  471. 'active' => $product->productDistribution[0]->active
  472. && (!$pointSale || $productModule->isAvailableOnPointSale($product, $pointSale)),
  473. 'invoice_price' => $invoicePrice
  474. ];
  475. }
  476. return $productOrderArray;
  477. }
  478. public function actionAjaxUpdateInvoicePrices($idOrder)
  479. {
  480. $orderModule = $this->getOrderModule();
  481. $userProducerModule = $this->getUserProducerModule();
  482. $productModule = $this->getProductModule();
  483. $order = $orderModule->findOneOrderById($idOrder);
  484. if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) {
  485. $userProducer = null;
  486. if ($order->id_user) {
  487. $userProducer = $userProducerModule->findOneUserProducer($order->user);
  488. }
  489. foreach ($order->productOrder as $productOrder) {
  490. $invoicePrice = $productModule->getPrice($productOrder->product, [
  491. 'user' => $orderModule->getUserForInvoicing($order),
  492. 'point_sale' => $order->pointSale,
  493. 'user_producer' => $userProducer,
  494. 'quantity' => $productOrder->quantity
  495. ]);
  496. if ($invoicePrice != $productOrder->price) {
  497. $productOrder->invoice_price = $invoicePrice;
  498. } else {
  499. $productOrder->invoice_price = null;
  500. }
  501. $productOrder->save();
  502. }
  503. }
  504. }
  505. /**
  506. * Génére un PDF récapitulatif des des commandes d'un producteur pour une
  507. * date donnée (Méthode appelable via CRON)
  508. *
  509. * @param string $date
  510. * @param boolean $save
  511. * @param integer $idProducer
  512. * @param string $key
  513. * @return Pdf|null
  514. */
  515. public function actionReportCron($date = '', $save = false, $idProducer = 0, $key = '')
  516. {
  517. if ($key == '64ac0bdab7e9f5e48c4d991ec5201d57') {
  518. $this->actionReport($date, $save, $idProducer);
  519. }
  520. }
  521. /**
  522. * Génére un PDF récapitulatif des commandes d'un producteur pour une
  523. * date donnée.
  524. */
  525. public function actionReport(string $date = '', bool $save = false, int $idProducer = 0, string $type = "pdf")
  526. {
  527. if (!$idProducer) {
  528. $idProducer = $this->getProducerCurrent()->id;
  529. }
  530. $distributionModule = $this-> getDistributionModule();
  531. $producerModule = $this->getProducerModule();
  532. $producerCurrent = $producerModule->findOneProducerById($idProducer);
  533. $this->getLogic()->setProducerContext($producerCurrent);
  534. $distribution = $distributionModule->findOneDistribution($date);
  535. if ($distribution) {
  536. if ($type == 'pdf') {
  537. return $distributionModule->generateDistributionReportPdf($distribution, $save);
  538. }
  539. elseif ($type == 'csv') {
  540. $distributionModule->generateDistributionReportCsv($distribution);
  541. }
  542. }
  543. }
  544. public function actionReportGrid(string $date = '', bool $save = false, int $idProducer = 0)
  545. {
  546. if (!$idProducer) {
  547. $idProducer = $this->getProducerCurrent()->id;
  548. }
  549. $distributionModule = $this-> getDistributionModule();
  550. $producerModule = $this->getProducerModule();
  551. $producerCurrent = $producerModule->findOneProducerById($idProducer);
  552. $this->getLogic()->setProducerContext($producerCurrent);
  553. $distribution = $distributionModule->findOneDistribution($date);
  554. if ($distribution) {
  555. return $distributionModule->generateDistributionReportGridPdf($distribution, $save);
  556. }
  557. }
  558. public function actionExportShoppingCartLabels(string $date)
  559. {
  560. $distributionModule = $this-> getDistributionModule();
  561. $distribution = $distributionModule->findOneDistribution($date);
  562. if($distribution) {
  563. return $distributionModule->generateDistributionShoppingCartLabelsPdf($distribution);
  564. }
  565. }
  566. public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax)
  567. {
  568. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  569. $productDistributionModule = $this->getProductDistributionManager();
  570. $productDistribution = $this->getProductDistribution($idProduct, $idDistribution);
  571. $productDistributionModule->updateProductDistributionQuantityMax($productDistribution, (float) $quantityMax);
  572. return ['success'];
  573. }
  574. public function actionAjaxProcessActiveProduct(int $idDistribution, int $idProduct, int $active)
  575. {
  576. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  577. $productDistributionModule = $this->getProductDistributionManager();
  578. $productDistribution = $this->getProductDistribution($idProduct, $idDistribution);
  579. $productDistributionModule->updateProductDistributionActive($productDistribution, $active);
  580. return ['success'];
  581. }
  582. public function actionAjaxProcessActivePointSale(int $idDistribution, int $idPointSale, int $delivery)
  583. {
  584. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  585. $distributionModule = $this-> getDistributionModule();
  586. $pointSaleModule = $this->getPointSaleModule();
  587. $pointSaleDistributionModule = $this->getPointSaleDistributionModule();
  588. $pointSaleDistribution = $pointSaleDistributionModule->findOnePointSaleDistribution(
  589. $distributionModule->findOneDistributionById($idDistribution),
  590. $pointSaleModule->findOnePointSaleById($idPointSale)
  591. );
  592. $pointSaleDistribution->delivery = $delivery;
  593. $pointSaleDistributionModule->update($pointSaleDistribution);
  594. return ['success'];
  595. }
  596. public function getProductDistribution(int $idProduct, int $idDistribution)
  597. {
  598. $distributionModule = $this-> getDistributionModule();
  599. $productModule = $this->getProductModule();
  600. $productDistributionModule = $this->getProductDistributionManager();
  601. return $productDistributionModule->findOneProductDistribution(
  602. $distributionModule->findOneDistributionById($idDistribution),
  603. $productModule->findOneProductById($idProduct)
  604. );
  605. }
  606. /**
  607. * Active/désactive un jour de distribution.
  608. *
  609. * @param integer $idDistribution
  610. * @param string $date
  611. * @param boolean $active
  612. * @return array
  613. */
  614. public function actionAjaxProcessActiveDistribution(int $idDistribution = 0, string $date = '', bool $active = false)
  615. {
  616. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  617. $distributionModule = $this-> getDistributionModule();
  618. if ($idDistribution) {
  619. $distribution = $distributionModule->findOneDistributionById($idDistribution);
  620. }
  621. $format = 'Y-m-d';
  622. $dateObject = DateTime::createFromFormat($format, $date);
  623. if ($dateObject && $dateObject->format($format) === $date) {
  624. $distribution = $distributionModule->createDistributionIfNotExist($date);
  625. }
  626. if (isset($distribution) && $distribution) {
  627. $distributionModule->activeDistribution($distribution, $active);
  628. return ['success'];
  629. }
  630. return ['error'];
  631. }
  632. /**
  633. * Change l'état d'une semaine de production (activé, désactivé).
  634. *
  635. * @param string $date
  636. * @param integer $active
  637. */
  638. public function actionAjaxProcessActiveWeekDistribution($date, $active)
  639. {
  640. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  641. $week = sprintf('%02d', date('W', strtotime($date)));
  642. $start = strtotime(date('Y', strtotime($date)) . 'W' . $week);
  643. $dateMonday = date('Y-m-d', strtotime('Monday', $start));
  644. $dateTuesday = date('Y-m-d', strtotime('Tuesday', $start));
  645. $dateWednesday = date('Y-m-d', strtotime('Wednesday', $start));
  646. $dateThursday = date('Y-m-d', strtotime('Thursday', $start));
  647. $dateFriday = date('Y-m-d', strtotime('Friday', $start));
  648. $dateSaturday = date('Y-m-d', strtotime('Saturday', $start));
  649. $dateSunday = date('Y-m-d', strtotime('Sunday', $start));
  650. $pointsSaleArray = PointSale::searchAll(['status' => 1]);
  651. $activeMonday = false;
  652. $activeTuesday = false;
  653. $activeWednesday = false;
  654. $activeThursday = false;
  655. $activeFriday = false;
  656. $activeSaturday = false;
  657. $activeSunday = false;
  658. foreach ($pointsSaleArray as $pointSale) {
  659. if ($pointSale->delivery_monday) {
  660. $activeMonday = true;
  661. }
  662. if ($pointSale->delivery_tuesday) {
  663. $activeTuesday = true;
  664. }
  665. if ($pointSale->delivery_wednesday) {
  666. $activeWednesday = true;
  667. }
  668. if ($pointSale->delivery_thursday) {
  669. $activeThursday = true;
  670. }
  671. if ($pointSale->delivery_friday) {
  672. $activeFriday = true;
  673. }
  674. if ($pointSale->delivery_saturday) {
  675. $activeSaturday = true;
  676. }
  677. if ($pointSale->delivery_sunday) {
  678. $activeSunday = true;
  679. }
  680. }
  681. if ($activeMonday || !$active) {
  682. $this->actionAjaxProcessActiveDistribution(0, $dateMonday, $active);
  683. }
  684. if ($activeTuesday || !$active) {
  685. $this->actionAjaxProcessActiveDistribution(0, $dateTuesday, $active);
  686. }
  687. if ($activeWednesday || !$active) {
  688. $this->actionAjaxProcessActiveDistribution(0, $dateWednesday, $active);
  689. }
  690. if ($activeThursday || !$active) {
  691. $this->actionAjaxProcessActiveDistribution(0, $dateThursday, $active);
  692. }
  693. if ($activeFriday || !$active) {
  694. $this->actionAjaxProcessActiveDistribution(0, $dateFriday, $active);
  695. }
  696. if ($activeSaturday || !$active) {
  697. $this->actionAjaxProcessActiveDistribution(0, $dateSaturday, $active);
  698. }
  699. if ($activeSunday || !$active) {
  700. $this->actionAjaxProcessActiveDistribution(0, $dateSunday, $active);
  701. }
  702. return ['success'];
  703. }
  704. /**
  705. * Ajoute les commandes récurrentes pour une date donnée.
  706. *
  707. * @param string $date
  708. */
  709. public function actionAjaxProcessAddSubscriptions($date)
  710. {
  711. $ordersArray = $this->getOrderModule()->createAllOrdersFromSubscriptions($date, true);
  712. if($ordersArray && count($ordersArray)) {
  713. return Ajax::responseSuccess('Les abonnements ont bien été importés.');
  714. }
  715. return Ajax::responseError('Aucun abonnement à importer.');
  716. }
  717. /**
  718. * Synchronise les commandes avec la plateforme Tiller pour une date donnée.
  719. *
  720. * @param string $date
  721. */
  722. public function actionAjaxProcessSynchroTiller(string $date)
  723. {
  724. \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  725. return $this->getOrderModule()->getTillerManager()->synchronizeDistribution($date);
  726. }
  727. public function actionAjaxGenerateDeliveryNotePointSale(string $idOrders)
  728. {
  729. if (strlen($idOrders)) {
  730. $idOrders = json_decode($idOrders, true);
  731. if(is_array($idOrders)) {
  732. try {
  733. if($this->getOrderModule()->getDocumentManager()->generateDeliveryNoteForPointSale($idOrders)) {
  734. return Ajax::responseSuccess("Bon de livraison généré");
  735. }
  736. }
  737. catch(Exception $exception) {
  738. return Ajax::responseError($exception->getMessage());
  739. }
  740. }
  741. }
  742. return Ajax::responseError('Une erreur est survenue lors de la génération du bon de livraison.');
  743. }
  744. public function actionAjaxGenerateDeliveryNote(int $idOrder)
  745. {
  746. $orderModule = $this->getOrderModule();
  747. $order = $orderModule->getRepository()->findOneOrderById($idOrder);
  748. $orderModule->getDocumentManager()->generateDeliveryNoteForUser($order);
  749. return Ajax::responseSuccess('Bon de livraison généré');
  750. }
  751. public function actionAjaxGenerateDeliveryNoteEachUser(string $idOrders)
  752. {
  753. if (strlen($idOrders)) {
  754. $idOrders = json_decode($idOrders, true);
  755. $this->getOrderModule()->getDocumentManager()->generateDeliveryNotesForUser($idOrders);
  756. return Ajax::responseSuccess('Bon(s) de livraison généré(s)');
  757. }
  758. return Ajax::responseError('Une erreur est survenue lors de la génération du bon de livraison.');
  759. }
  760. public function actionAjaxValidateDeliveryNotes(string $idOrders)
  761. {
  762. if (strlen($idOrders)) {
  763. $idOrders = json_decode($idOrders, true);
  764. if($this->getOrderModule()->getDocumentManager()->validateDeliveryNotes($idOrders)) {
  765. return Ajax::responseSuccess('Bon(s) de livraison validé(s)');
  766. }
  767. }
  768. return Ajax::responseError('Une erreur est survenue lors de la validation des bons de livraison');
  769. }
  770. }