選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

535 行
27KB

  1. <?php
  2. /**
  3. * Copyright La boîte à pain (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. use yii\helpers\Html;
  38. use yii\widgets\ActiveForm;
  39. use common\logic\Producer\Producer\Model\Producer;
  40. use common\logic\Config\TaxRate\Model\TaxRate;
  41. use common\logic\Document\Document\Model\Document;
  42. use yii\helpers\ArrayHelper;
  43. $userManager = $this->getUserManager();
  44. \backend\assets\VuejsProducerUpdateAsset::register($this);
  45. $this->setTitle('Paramètres');
  46. $this->addBreadcrumb($this->getTitle());
  47. ?>
  48. <script>
  49. var appInitValues = {
  50. isAdmin: <?= (int) $userManager->isCurrentAdmin() ?>
  51. };
  52. </script>
  53. <div class="user-update" id="app-producer-update">
  54. <div id="nav-params">
  55. <a v-for="section in sectionsArray" v-if="!section.isAdminSection || (section.isAdminSection && isAdmin)"
  56. :class="'btn '+((currentSection == section.name) ? 'btn-primary' : 'btn-default')"
  57. @click="changeSection(section)" :href="'#'+section.name">
  58. {{ section.nameDisplay }}
  59. <span class="glyphicon glyphicon-triangle-bottom"></span>
  60. </a>
  61. </div>
  62. <div class="user-form">
  63. <?php $form = ActiveForm::begin([
  64. 'enableClientValidation' => false,
  65. ]); ?>
  66. <div>
  67. <div v-show="currentSection == 'general'" class="panel panel-default">
  68. <div class="panel-body">
  69. <h4>Accès</h4>
  70. <?= $form->field($model, 'active')
  71. ->dropDownList([
  72. 0 => 'Non',
  73. 1 => 'Oui'
  74. ], [])
  75. ->label('En ligne')
  76. ->hint('Activez cette option pour rendre votre espace visible à vos clients.'); ?>
  77. <?= $form->field($model, 'code')->hint("Saisissez ce champs si vous souhaitez protéger l'accès à votre espace par un code, sinon laissez-le vide.<br />"
  78. . "Ce code est à communiquer à vos clients pour qu'ils puissent ajouter votre espace à leurs favoris.<br />"
  79. . "<a href=\"" . Yii::$app->urlManager->createUrl(['communicate/index']) . "\">Cliquez ici</a> pour télécharger un mode d'emploi comprenant ce code à distribuer à vos clients.") ?>
  80. <h4>Général</h4>
  81. <?= $form->field($model, 'name') ?>
  82. <?= $form->field($model, 'type') ?>
  83. <?= $form->field($model, 'description')
  84. ->textarea(['rows' => 4])
  85. ->hint('Affiché sur la page d\'accueil') ?>
  86. <?= $form->field($model, 'address')
  87. ->textarea(['rows' => 4]) ?>
  88. <?= $form->field($model, 'postcode') ?>
  89. <?= $form->field($model, 'city') ?>
  90. <h4>Apparence</h4>
  91. <?= $form->field($model, 'background_color_logo') ?>
  92. <?= $form->field($model, 'logo')->fileInput() ?>
  93. <?php
  94. if (strlen($model->logo)) {
  95. echo '<img src="' . Yii::$app->urlManagerProducer->getHostInfo() . '/' . Yii::$app->urlManagerProducer->baseUrl . '/uploads/' . $model->logo . '" width="200px" /><br />';
  96. echo '<input type="checkbox" name="delete_logo" id="delete_logo" /> <label for="delete_logo">Supprimer le logo</label><br /><br />';
  97. }
  98. ?>
  99. <?= $form->field($model, 'photo')->fileInput()->hint('Format idéal : 900 x 150 px') ?>
  100. <?php
  101. if (strlen($model->photo)) {
  102. echo '<img src="' . Yii::$app->urlManagerProducer->getHostInfo() . '/' . Yii::$app->urlManagerProducer->baseUrl . '/uploads/' . $model->photo . '" width="400px" /><br />';
  103. echo '<input type="checkbox" name="delete_photo" id="delete_photo" /> <label for="delete_photo">Supprimer la photo</label><br /><br />';
  104. }
  105. ?>
  106. <?= $form->field($model, 'behavior_home_point_sale_day_list')
  107. ->dropDownList([
  108. Producer::BEHAVIOR_HOME_POINT_SALE_DAY_LIST_WEEK => 'Jours de la semaine',
  109. Producer::BEHAVIOR_HOME_POINT_SALE_DAY_LIST_INCOMING_DISTRIBUTIONS => 'Distributions à venir',
  110. ]); ?>
  111. <?= $form->field($model, 'option_point_sale_wording') ?>
  112. </div>
  113. </div>
  114. <div v-show="currentSection == 'tableau-bord'" class="panel panel-default">
  115. <div class="panel-body">
  116. <h4>Tableau de bord administration</h4>
  117. <?= $form->field($model, 'option_dashboard_number_distributions')
  118. ->dropDownList([
  119. 3 => '3',
  120. 6 => '6',
  121. 9 => '9',
  122. 12 => '12',
  123. 15 => '15',
  124. 18 => '18',
  125. 21 => '21',
  126. 24 => '24',
  127. 27 => '27',
  128. 30 => '30',
  129. ], []); ?>
  130. <?= $form->field($model, 'option_dashboard_date_start')->textInput([
  131. 'class' => 'datepicker form-control'
  132. ]); ?>
  133. <?= $form->field($model, 'option_dashboard_date_end')->textInput([
  134. 'class' => 'datepicker form-control'
  135. ]); ?>
  136. </div>
  137. </div>
  138. <div v-show="currentSection == 'prise-commande'" class="panel panel-default">
  139. <div class="panel-body">
  140. <h4>Horaires</h4>
  141. <?php
  142. $delaysArray = [
  143. 1 => '1 jour',
  144. 2 => '2 jours',
  145. 3 => '3 jours',
  146. 4 => '4 jours',
  147. 5 => '5 jours',
  148. 6 => '6 jours',
  149. 7 => '7 jours',
  150. ];
  151. $deadlinesArray = [
  152. 24 => 'Minuit',
  153. 23 => '23h',
  154. 22 => '22h',
  155. 21 => '21h',
  156. 20 => '20h',
  157. 19 => '19h',
  158. 18 => '18h',
  159. 17 => '17h',
  160. 16 => '16h',
  161. 15 => '15h',
  162. 14 => '14h',
  163. 13 => '13h',
  164. 12 => '12h',
  165. 11 => '11h',
  166. 10 => '10h',
  167. 9 => '9h',
  168. 8 => '8h',
  169. ];
  170. $daysArray = [
  171. 'monday' => 'Lundi',
  172. 'tuesday' => 'Mardi',
  173. 'wednesday' => 'Mercredi',
  174. 'thursday' => 'Jeudi',
  175. 'friday' => 'Vendredi',
  176. 'saturday' => 'Samedi',
  177. 'sunday' => 'Dimanche'
  178. ];
  179. ?>
  180. <div class="row">
  181. <div class="col-md-2">
  182. <strong>Par défaut</strong>
  183. </div>
  184. <div class="col-md-5">
  185. <?= $form->field($model, 'order_delay')
  186. ->dropDownList($delaysArray, ['prompt' => '--'])
  187. ->hint('Si <strong>1 jour</strong> est sélectionné, le client pourra commander jusqu\'à la veille de la production.<br />'
  188. . 'Si <strong>2 jours</strong> est sélectionné, le client pourra commander jusqu\'à l\'avant-veille de la production, etc.'); ?>
  189. </div>
  190. <div class="col-md-5">
  191. <?= $form->field($model, 'order_deadline')
  192. ->dropDownList($deadlinesArray, ['prompt' => '--'])
  193. ->hint('Heure limite jusqu\'à laquelle les clients peuvent commander pour satisfaire le délai de commande.<br />'
  194. . 'Par exemple, si <strong>2 jours</strong> est sélectionné dans le délai de commande, le client devra commander l\'avant-veille de la production avant l\'heure précisée ici.'); ?>
  195. </div>
  196. </div>
  197. <?php foreach ($daysArray as $day => $labelDay): ?>
  198. <div class="row">
  199. <div class="col-md-2">
  200. <strong><?= $labelDay ?></strong>
  201. </div>
  202. <div class="col-md-5">
  203. <?= $form->field($model, 'order_delay_' . $day, [
  204. 'template' => '{input}',
  205. ])->dropDownList($delaysArray, ['prompt' => '--'])->label(''); ?>
  206. </div>
  207. <div class="col-md-5">
  208. <?= $form->field($model, 'order_deadline_' . $day, [
  209. 'template' => '{input}',
  210. ])->dropDownList($deadlinesArray, ['prompt' => '--'])->label(''); ?>
  211. </div>
  212. </div>
  213. <?php endforeach; ?>
  214. <h4>Informations</h4>
  215. <?= $form->field($model, 'order_infos')
  216. ->textarea(['rows' => 6])
  217. ->hint('Affichées au client lors de sa commande') ?>
  218. <?= $form->field($model, 'option_payment_info')
  219. ->textarea(['rows' => 6])
  220. ->hint('Affichées au client à la fin de la prise de commande') ?>
  221. <h4>Tunnel de commande</h4>
  222. <?= $form->field($model, 'option_order_entry_point')
  223. ->dropDownList([
  224. Producer::ORDER_ENTRY_POINT_DATE => 'Date',
  225. Producer::ORDER_ENTRY_POINT_POINT_SALE => 'Point de vente',
  226. ], []); ?>
  227. <?= $form->field($model, 'behavior_order_select_distribution')
  228. ->dropDownList([
  229. Producer::BEHAVIOR_ORDER_SELECT_DISTRIBUTION_CALENDAR => 'Calendrier',
  230. Producer::BEHAVIOR_ORDER_SELECT_DISTRIBUTION_LIST => 'Liste',
  231. ]); ?>
  232. <?= $form->field($model, 'option_delivery')
  233. ->dropDownList([
  234. 0 => 'Non',
  235. 1 => 'Oui'
  236. ], []); ?>
  237. <?php echo $form->field($model, 'option_allow_order_guest')
  238. ->dropDownList([
  239. 0 => 'Non',
  240. 1 => 'Oui'
  241. ], []); ?>
  242. <h4>Notifications</h4>
  243. <?= $form->field($model, 'option_notify_producer_order_summary')
  244. ->dropDownList([
  245. 0 => 'Non',
  246. 1 => 'Oui',
  247. ], []); ?>
  248. <?= $form->field($model, 'option_email_confirm')
  249. ->dropDownList([
  250. 0 => 'Non',
  251. 1 => 'Oui'
  252. ], []); ?>
  253. <?= $form->field($model, 'option_email_confirm_producer')
  254. ->dropDownList([
  255. 0 => 'Non',
  256. 1 => 'Oui'
  257. ], []); ?>
  258. <h4>Exports</h4>
  259. <?= $form->field($model, 'option_csv_separator')
  260. ->dropDownList([
  261. ';' => 'Point-virgule (;)',
  262. ',' => 'Virgule (,)'
  263. ], []); ?>
  264. <?= $form->field($model, 'option_csv_export_all_products')
  265. ->dropDownList([
  266. 0 => 'Non',
  267. 1 => 'Oui'
  268. ], []); ?>
  269. <?= $form->field($model, 'option_csv_export_by_piece')
  270. ->dropDownList([
  271. 0 => 'Non',
  272. 1 => 'Oui'
  273. ], []); ?>
  274. <?= $form->field($model, 'option_display_export_grid')
  275. ->dropDownList([
  276. 0 => 'Non',
  277. 1 => 'Oui'
  278. ], []); ?>
  279. <?= $form->field($model, 'option_export_display_product_reference')
  280. ->dropDownList([
  281. 0 => 'Non',
  282. 1 => 'Oui'
  283. ], []); ?>
  284. <?= $form->field($model, 'option_export_display_column_delivery_note')
  285. ->dropDownList([
  286. 0 => 'Non',
  287. 1 => 'Oui'
  288. ], []); ?>
  289. <h4>Divers</h4>
  290. <?php
  291. $choicesWeeksDistributionsActivatedInAdvanceArray = [null => '--'];
  292. for($i = 1; $i < 13; $i++) {
  293. $choicesWeeksDistributionsActivatedInAdvanceArray[$i] = $i.' semaine'.(($i > 1) ? 's' : '');
  294. }
  295. ?>
  296. <?= $form->field($model, 'option_weeks_distributions_activated_in_advance')
  297. ->dropDownList($choicesWeeksDistributionsActivatedInAdvanceArray)
  298. ->hint("Attention, les premières semaines doivent être activées manuellement."); ?>
  299. <?= $form->field($model, 'option_order_reference_type')
  300. ->dropDownList([
  301. Producer::ORDER_REFERENCE_TYPE_NONE => '--',
  302. Producer::ORDER_REFERENCE_TYPE_YEARLY => 'Annuelle',
  303. ], []); ?>
  304. <?= $form->field($model, 'option_behavior_cancel_order')
  305. ->dropDownList([
  306. Producer::BEHAVIOR_DELETE_ORDER_DELETE => 'Suppression de la commande',
  307. Producer::BEHAVIOR_DELETE_ORDER_STATUS => 'Passage de la commande en statut "supprimé"',
  308. ], []); ?>
  309. </div>
  310. </div>
  311. <div v-show="currentSection == 'abonnements'" class="panel panel-default">
  312. <div class="panel-body">
  313. <h4>Abonnements</h4>
  314. <?= $form->field($model, 'user_manage_subscription')
  315. ->dropDownList([
  316. 0 => 'Non',
  317. 1 => 'Oui',
  318. ], []); ?>
  319. </div>
  320. </div>
  321. <div v-show="currentSection == 'credit-payment'" class="panel panel-default">
  322. <div class="panel-body">
  323. <h4>Crédit</h4>
  324. <?= $form->field($model, 'credit')
  325. ->dropDownList([
  326. 0 => 'Non',
  327. 1 => 'Oui',
  328. ], [])
  329. ->label('Activer le système de Crédit')
  330. ->hint('Le système de Crédit permet à vos clients d\'avoir un compte prépayé sur le site <em>distrib</em>.<br />'
  331. . 'Ils créditent leur compte en vous donnant la somme de leur choix et c\'est ensuite à vous de ' . Html::a('mettre à jour', ['user/index']) . ' leur Crédit en ligne.<br />'
  332. . 'Ceci fait, les clients paient leur commande directement via leur Crédit.'); ?>
  333. <?= $form->field($model, 'credit_functioning')
  334. ->dropDownList([
  335. Producer::CREDIT_FUNCTIONING_OPTIONAL => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_OPTIONAL],
  336. Producer::CREDIT_FUNCTIONING_MANDATORY => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_MANDATORY],
  337. Producer::CREDIT_FUNCTIONING_USER => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_USER],
  338. ], [])->hint(Producer::HINT_CREDIT_FUNCTIONING); ?>
  339. <?= $form->field($model, 'use_credit_checked_default')
  340. ->dropDownList([
  341. 0 => 'Non',
  342. 1 => 'Oui',
  343. ], [])->hint('Utilisation optionnelle du Crédit.'); ?>
  344. <?= $form->field($model, 'credit_limit_reminder', [
  345. 'template' => '{label}<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span></span></div>{hint}',
  346. ])
  347. ->hint("Une relance est envoyé au client dès que ce seuil est dépassé."); ?>
  348. <?= $form->field($model, 'credit_limit', [
  349. 'template' => '{label}<div class="input-group">{input}<span class="input-group-addon"><span class="glyphicon glyphicon-euro"></span></span></div>{hint}',
  350. ])->hint('Limite de crédit que l\'utilisateur ne pourra pas dépasser. Laisser vide pour permettre un crédit négatif et infini.'); ?>
  351. <h4>Paiement en ligne</h4>
  352. <?= $form->field($model, 'online_payment')
  353. ->dropDownList([
  354. 0 => 'Non',
  355. 1 => 'Oui',
  356. ], []); ?>
  357. <?= $form->field($model, 'option_online_payment_minimum_amount')
  358. ->hint('Valeur par défaut si non défini : '.Producer::ONLINE_PAYMENT_MINIMUM_AMOUNT_DEFAULT.' €')
  359. ->textInput(); ?>
  360. <?= $form->field($model, 'option_stripe_mode_test')->dropDownList([
  361. 0 => 'Non',
  362. 1 => 'Oui'
  363. ], []); ?>
  364. <?= $form->field($model, 'option_online_payment_type')
  365. ->dropDownList([
  366. 'credit' => 'Alimentation du crédit',
  367. 'order' => 'Paiement à la commande',
  368. ], []); ?>
  369. <?= $form->field($model, 'option_stripe_public_key')->textInput(); ?>
  370. <?= $form->field($model, 'option_stripe_private_key')->textInput(); ?>
  371. <?= $form->field($model, 'option_stripe_endpoint_secret')->textInput(); ?>
  372. </div>
  373. </div>
  374. <div v-show="currentSection == 'infos'" class="panel panel-default">
  375. <div class="panel-body">
  376. <h4>Informations légales</h4>
  377. <?= $form->field($model, 'mentions')
  378. ->textarea(['rows' => 15])
  379. ->hint('') ?>
  380. <?= $form->field($model, 'gcs')
  381. ->textarea(['rows' => 15])
  382. ->hint('') ?>
  383. </div>
  384. </div>
  385. <div v-show="currentSection == 'logiciels-caisse'" class="panel panel-default">
  386. <div class="panel-body">
  387. <h4>Tiller</h4>
  388. <?= $form->field($model, 'tiller')
  389. ->dropDownList([
  390. 0 => 'Non',
  391. 1 => 'Oui'
  392. ], [])
  393. ->label('Synchroniser avec Tiller'); ?>
  394. <?= $form->field($model, 'tiller_provider_token'); ?>
  395. <?= $form->field($model, 'tiller_restaurant_token'); ?>
  396. </div>
  397. </div>
  398. <div v-show="currentSection == 'facturation'" class="panel panel-default">
  399. <div class="panel-body">
  400. <h4>Facturation</h4>
  401. <?= $form->field($model, 'id_tax_rate_default')
  402. ->dropDownList(ArrayHelper::map(TaxRate::find()->all(), 'id', function ($model) {
  403. return $model->name;
  404. }))
  405. ->label('TVA à appliquer par défaut'); ?>
  406. <?= $form->field($model, 'option_tax_calculation_method')
  407. ->dropDownList(Document::$taxCalculationMethodArray); ?>
  408. <?= $form->field($model, 'option_export_evoliz')->dropDownList([
  409. 0 => 'Non',
  410. 1 => 'Oui'
  411. ]); ?>
  412. <?= $form->field($model, 'document_quotation_prefix'); ?>
  413. <?= $form->field($model, 'document_quotation_first_reference'); ?>
  414. <?= $form->field($model, 'document_quotation_duration'); ?>
  415. <?= $form->field($model, 'document_invoice_prefix'); ?>
  416. <?= $form->field($model, 'document_invoice_first_reference'); ?>
  417. <?= $form->field($model, 'document_delivery_note_prefix'); ?>
  418. <?= $form->field($model, 'document_delivery_note_first_reference'); ?>
  419. <?= $form->field($model, 'document_display_orders_invoice')->dropDownList([
  420. 0 => 'Non',
  421. 1 => 'Oui'
  422. ]); ?>
  423. <?= $form->field($model, 'document_display_orders_delivery_note')->dropDownList([
  424. 0 => 'Non',
  425. 1 => 'Oui'
  426. ]); ?>
  427. <?= $form->field($model, 'document_display_prices_delivery_note')->dropDownList([
  428. 0 => 'Non',
  429. 1 => 'Oui'
  430. ]); ?>
  431. <?= $form->field($model, 'document_display_product_description')->dropDownList([
  432. 0 => 'Non',
  433. 1 => 'Oui'
  434. ]); ?>
  435. <?= $form->field($model, 'option_document_price_decimals')->dropDownList([
  436. 2 => '2',
  437. 3 => '3'
  438. ]); ?>
  439. <?= $form->field($model, 'document_infos_top')
  440. ->textarea(['rows' => 8])
  441. ->hint("Affichées juste en dessous de l'adresse"); ?>
  442. <?= $form->field($model, 'document_infos_bottom')
  443. ->textarea(['rows' => 8]) ?>
  444. <?= $form->field($model, 'document_infos_quotation')
  445. ->textarea(['rows' => 8]) ?>
  446. <?= $form->field($model, 'document_infos_invoice')
  447. ->textarea(['rows' => 8]) ?>
  448. <?= $form->field($model, 'document_infos_delivery_note')
  449. ->textarea(['rows' => 8]) ?>
  450. </div>
  451. </div>
  452. <div v-show="currentSection == 'software'" class="panel panel-default">
  453. <div class="panel-body">
  454. <h4>Opendistrib</h4>
  455. <?php $urlAboutPage = Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/about']); ?>
  456. <?= $form->field($model, 'option_testimony')
  457. ->textarea(['rows' => 7])
  458. ->hint("Écrivez ici votre témoignage concernant l'utilisation du logiciel. Il sera publié sur la page <a href=\"".$urlAboutPage."\" target=\"_blanck\">À propos</a> du site.") ; ?>
  459. <?= $form->field($model, 'option_time_saved')
  460. ->dropDownList([
  461. null => '--',
  462. 0.5 => '30 minutes',
  463. 1 => '1 heure',
  464. 2 => '2 heures',
  465. 3 => '3 heures',
  466. 4 => '4 heures',
  467. 5 => '5 heures',
  468. 6 => '6 heures',
  469. 7 => '7 heures',
  470. 8 => '8 heures',
  471. ])
  472. ->hint("Sélectionnez le temps que vous estimez gagner chaque semaine en utilisant ce logiciel. Cette donnée sera utilisée sur la page <a href=\"".$urlAboutPage."\" target=\"_blanck\">À propos</a> du site.") ; ?>
  473. <?= $form->field($model, 'option_display_message_new_opendistrib_version')
  474. ->dropDownList([
  475. 1 => 'Oui',
  476. 0 => 'Non'
  477. ], []); ?>
  478. </div>
  479. </div>
  480. <div class="form-group">
  481. <?= Html::submitButton('Mettre à jour', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
  482. </div>
  483. </div>
  484. <?php ActiveForm::end(); ?>
  485. </div>
  486. </div>