You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

319 line
15KB

  1. <?php
  2. /**
  3. * Copyright Guillaume Bourgeois (2018)
  4. *
  5. * contact@souke.fr
  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. use common\components\View;
  38. use common\helpers\GlobalParam;
  39. use common\helpers\Image;
  40. use domain\Feature\Feature\Feature;
  41. use domain\PointSale\PointSale\PointSale;
  42. use lo\widgets\Toggle;
  43. use domain\Product\Product\Product;
  44. use yii\bootstrap\ActiveForm;
  45. use yii\helpers\ArrayHelper;
  46. use yii\helpers\Html;
  47. /**
  48. * @var View $this
  49. */
  50. $producerModule = $this->getProducerModule();
  51. $productCategoryModule = $this->getProductCategoryModule();
  52. $taxRateModule = $this->getTaxRateModule();
  53. $featureChecker = $this->getFeatureModule()->getChecker();
  54. $accessoryModule = $this->getAccessoryModule();
  55. ?>
  56. <div class="product-form">
  57. <?php $form = ActiveForm::begin([
  58. 'enableClientValidation' => false,
  59. 'options' => ['enctype' => 'multipart/form-data']
  60. ]); ?>
  61. <div>
  62. <div class="col-md-8">
  63. <div class="panel panel-default">
  64. <div class="panel-heading">
  65. <h3 class="panel-title">
  66. <i class="fa fa-th-list"></i>
  67. Général
  68. </h3>
  69. </div>
  70. <div class="panel-body">
  71. <?= $form->field($model, 'status')->widget(Toggle::class,
  72. [
  73. 'options' => [
  74. 'data-id' => $model->id,
  75. 'data-on' => 'Oui',
  76. 'data-off' => 'Non',
  77. ],
  78. ]
  79. ); ?>
  80. <?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>
  81. <?php if($producerModule->getSolver()->getConfig('option_export_display_product_reference')): ?>
  82. <?= $form->field($model, 'reference')->textInput(['maxlength' => 255]) ?>
  83. <?php endif; ?>
  84. <?= $form->field($model, 'id_product_category')->dropDownList($productCategoryModule->populateProductCategoriesDropdownList()); ?>
  85. <?= $form->field($model, 'description')->textInput(['maxlength' => 255]) ?>
  86. <?= $form->field($model, 'recipe')->label('Description longue')
  87. ->widget(letyii\tinymce\Tinymce::class, [
  88. 'configs' => [
  89. 'plugins' => Yii::$app->parameterBag->get('tinyMcePlugins')
  90. ],
  91. ]); ?>
  92. <?= $form->field($model, 'unit')
  93. ->dropDownList(ArrayHelper::map(Product::$unitsArray, 'unit', 'wording'))
  94. ->label('Unité (pièce, poids ou volume)'); ?>
  95. <?= $form->field($model, 'step')->textInput()->hint('Définit ce qui est ajouté ou enlevé lors des changements de quantité.') ?>
  96. <?= $form->field($model, 'weight')->textInput()->label('Poids (g)')->hint("Si unité au poids ou volume, utilisé pour déterminer le nombre de pièces dans les exports.") ?>
  97. </div>
  98. </div>
  99. <div class="panel panel-default">
  100. <div class="panel-heading">
  101. <h3 class="panel-title">
  102. <i class="fa fa-euro"></i> Prix
  103. <a href="<?= Yii::$app->urlManager->createUrl(['product/prices-list', 'id' => $model->id]) ?>"
  104. class="btn btn-default btn-xs">
  105. Prix spécifiques (<?= count($model->productPrice) ?>)
  106. </a>
  107. </h3>
  108. </div>
  109. <div class="panel-body">
  110. <?php
  111. //Récupère la tva par défaut du producteur courant
  112. $producer = \common\helpers\GlobalParam::getCurrentProducer();
  113. $taxRateDefault = $producer->taxRate;
  114. $taxRateNamesArray = array_merge(array(0 => 'Tva par défaut'), ArrayHelper::map($taxRateModule->findTaxRates(), 'id', function ($model) {
  115. return $model->name;
  116. }));
  117. $taxRateValuesArray = array_merge(array(0 => $taxRateDefault->value), ArrayHelper::map($taxRateModule->findTaxRates(), 'id', function ($model) {
  118. return $model->value;
  119. }));
  120. foreach ($taxRateValuesArray as $key => $taxRateValue) {
  121. $taxRateValuesArrayFormatted[$key] = array('data-tax-rate-value' => $taxRateValue);
  122. }
  123. ?>
  124. <?php if ($taxRateDefault->value != 0): ?>
  125. <?= $form->field($model, 'id_tax_rate')->dropDownList($taxRateNamesArray, ['options' => $taxRateValuesArrayFormatted])->label('Taxe'); ?>
  126. <?php endif; ?>
  127. <?= $form->field($model, 'price', [
  128. 'template' => '
  129. <div class="row">
  130. <div class="col-xs-6">
  131. <label for="product-price" class="control-label without-tax"></label>
  132. <div class="input-group">
  133. {input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span></span>
  134. </div>
  135. </div>
  136. <div class="col-xs-6">
  137. <label for="product-price-with-tax" class="control-label with-tax"></label>
  138. <div class="input-group">
  139. <input type="text" id="product-price-with-tax" class="form-control" name="" value="">
  140. <span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span></span>
  141. </div>
  142. </div>
  143. </div>
  144. ',
  145. ]) ?>
  146. </div>
  147. </div>
  148. <?php if($featureChecker->isEnabled(Feature::ALIAS_PRODUCT_ACCESSORY)): ?>
  149. <div class="panel panel-default">
  150. <div class="panel-heading">
  151. <h3 class="panel-title">
  152. <i class="fa fa-<?= $accessoryModule->getDefinition()->getIcon() ?>"></i>
  153. Accessoires
  154. </h3>
  155. </div>
  156. <div class="panel-body">
  157. <?php if($model->hasAccessory()): ?>
  158. <?php foreach($model->getProductAccessories() as $productAccessory): ?>
  159. <a class="btn btn-default" href="<?= Yii::$app->urlManager->createUrl(['accessory/update', 'id' => $productAccessory->getAccessory()->getId()]) ?>"><?= Html::encode($productAccessory->getAccessory()->getName()) ?></a>
  160. <?php endforeach; ?>
  161. <?php else: ?>
  162. <p><em>Aucun accessoire n'est associé à ce produit.</em></p>
  163. <?php endif; ?>
  164. </div>
  165. </div>
  166. <?php endif; ?>
  167. <?php if (!$model->isNewRecord): ?>
  168. <div class="panel panel-default">
  169. <div class="panel-heading">
  170. <h3 class="panel-title">
  171. <i class="fa fa-edit"></i>
  172. Distributions à venir
  173. </h3>
  174. </div>
  175. <div class="panel-body">
  176. <?= $form->field($model, 'apply_distributions')
  177. ->checkbox()
  178. ->hint('Sélectionnez cette option si vous souhaitez que ces modifications (actif / non actif, quantités maximum) soient répercutées dans les distributions à venir.'); ?>
  179. </div>
  180. </div>
  181. <?php endif; ?>
  182. </div>
  183. <div class="col-md-4">
  184. <div class="panel panel-default">
  185. <div class="panel-heading">
  186. <h3 class="panel-title">
  187. <i class="fa fa-image"></i>
  188. Photo
  189. </h3>
  190. </div>
  191. <div class="panel-body">
  192. <?= $form->field($model, 'photoFile')->fileInput()->label('') ?>
  193. <?php
  194. if (strlen($model->photo)) {
  195. echo '<img class="photo-product" src="' . Image::getThumbnailSmall($model->photo, true) . '" width="200px" /><br />';
  196. echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label>';
  197. }
  198. ?>
  199. </div>
  200. </div>
  201. <div class="panel panel-default">
  202. <div class="panel-heading">
  203. <h3 class="panel-title">
  204. <i class="fa fa-calendar"></i>
  205. Jours de production
  206. </h3>
  207. </div>
  208. <div class="panel-body">
  209. <div id="days-production">
  210. <?= $form->field($model, 'monday')->checkbox() ?>
  211. <?= $form->field($model, 'tuesday')->checkbox() ?>
  212. <?= $form->field($model, 'wednesday')->checkbox() ?>
  213. <?= $form->field($model, 'thursday')->checkbox() ?>
  214. <?= $form->field($model, 'friday')->checkbox() ?>
  215. <?= $form->field($model, 'saturday')->checkbox() ?>
  216. <?= $form->field($model, 'sunday')->checkbox() ?>
  217. </div>
  218. <div class="clr"></div>
  219. </div>
  220. </div>
  221. <div class="panel panel-default">
  222. <div class="panel-heading">
  223. <h3 class="panel-title">
  224. <i class="fa fa-balance-scale"></i>
  225. Quantités maximum par jour
  226. </h3>
  227. </div>
  228. <div class="panel-body">
  229. <div id="maximum-quantities">
  230. <?= $form->field($model, 'quantity_max')->textInput() ?>
  231. <?= $form->field($model, 'quantity_max_monday')->textInput() ?>
  232. <?= $form->field($model, 'quantity_max_tuesday')->textInput() ?>
  233. <?= $form->field($model, 'quantity_max_wednesday')->textInput() ?>
  234. <?= $form->field($model, 'quantity_max_thursday')->textInput() ?>
  235. <?= $form->field($model, 'quantity_max_friday')->textInput() ?>
  236. <?= $form->field($model, 'quantity_max_saturday')->textInput() ?>
  237. <?= $form->field($model, 'quantity_max_sunday')->textInput() ?>
  238. </div>
  239. </div>
  240. </div>
  241. <div class="panel panel-default">
  242. <div class="panel-heading">
  243. <h3 class="panel-title">
  244. <i class="fa fa-repeat"></i>
  245. Abonnements
  246. </h3>
  247. </div>
  248. <div class="panel-body">
  249. <?= $form->field($model, 'is_available_for_subscriptions')->widget(Toggle::class,
  250. [
  251. 'options' => [
  252. 'data-id' => $model->id,
  253. 'data-on' => 'Oui',
  254. 'data-off' => 'Non',
  255. ],
  256. ]
  257. ); ?>
  258. </div>
  259. </div>
  260. <div class="panel panel-default">
  261. <div class="panel-heading">
  262. <h3 class="panel-title">
  263. <i class="fa fa-map-marker"></i>
  264. Disponibilité par point de vente
  265. </h3>
  266. </div>
  267. <div class="panel-body">
  268. <div id="availability-points-sale">
  269. <?= $form->field($model, 'available_on_points_sale')->radioList([1 => 'Disponible', 0 => 'Indisponible']) ?>
  270. <strong id="label-availability-points-sale">Et
  271. <span><?php if ($model->available_on_points_sale): ?>indisponible<?php else: ?>disponible<?php endif; ?></span>
  272. sur les points de vente</strong>
  273. <?php $pointSaleArray = PointSale::find()
  274. ->where([
  275. 'id_producer' => GlobalParam::getCurrentProducerId(),
  276. 'status' => 1
  277. ])
  278. ->orderBy('is_bread_box ASC, name ASC')
  279. ->all(); ?>
  280. <?= Html::activeCheckboxList($model, 'pointsSale', ArrayHelper::map($pointSaleArray, 'id', function ($pointSale, $defaultValue) use ($model) {
  281. return Html::encode($pointSale->name);
  282. }), ['encode' => false, 'class' => '']) ?>
  283. </div>
  284. </div>
  285. </div>
  286. </div>
  287. <div class="clr"></div>
  288. </div>
  289. <?= $form->field($model, 'id_producer')->hiddenInput()->label('') ?>
  290. <?= $this->render('@backend/views/_include/form_actions.php',[
  291. 'model' => $model,
  292. ]); ?>
  293. <?php ActiveForm::end(); ?>
  294. </div>