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

558 行
40KB

  1. <?php
  2. /**
  3. Copyright distrib (2018)
  4. contact@opendistrib.net
  5. Ce logiciel est un programme informatique servant à aider les producteurs
  6. à distribuer leur production en circuits courts.
  7. Ce logiciel est régi par la licence CeCILL soumise au droit français et
  8. respectant les principes de diffusion des logiciels libres. Vous pouvez
  9. utiliser, modifier et/ou redistribuer ce programme sous les conditions
  10. de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  11. sur le site "http://www.cecill.info".
  12. En contrepartie de l'accessibilité au code source et des droits de copie,
  13. de modification et de redistribution accordés par cette licence, il n'est
  14. offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  15. seule une responsabilité restreinte pèse sur l'auteur du programme, le
  16. titulaire des droits patrimoniaux et les concédants successifs.
  17. A cet égard l'attention de l'utilisateur est attirée sur les risques
  18. associés au chargement, à l'utilisation, à la modification et/ou au
  19. développement et à la reproduction du logiciel par l'utilisateur étant
  20. donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  21. manipuler et qui le réserve donc à des développeurs et des professionnels
  22. avertis possédant des connaissances informatiques approfondies. Les
  23. utilisateurs sont donc invités à charger et tester l'adéquation du
  24. logiciel à leurs besoins dans des conditions permettant d'assurer la
  25. sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  26. à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  27. Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  28. pris connaissance de la licence CeCILL, et que vous en avez accepté les
  29. termes.
  30. */
  31. \backend\assets\VuejsDistributionIndexAsset::register($this);
  32. $this->setTitle('Distributions') ;
  33. $this->setPageTitle('Distributions') ;
  34. ?>
  35. <div id="app-distribution-index" class="app-vuejs">
  36. <?php if(strlen($date)): ?>
  37. <span id="distribution-date"><?= $date; ?></span>
  38. <?php endif; ?>
  39. <div id="loading" v-if="showLoading">
  40. <img src="<?= Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/loader.gif" alt="Chargement ..." />
  41. </div>
  42. <div id="wrapper-app-distribution-index" :class="'wrapper-app-vuejs '+(loading ? '' : 'loaded')">
  43. <div class="col-md-4">
  44. <div id="calendar">
  45. <v-date-picker
  46. is-inline
  47. is-expanded
  48. v-model="date"
  49. popover-visibility="hidden"
  50. firstDayOfWeek="1"
  51. :mode="calendar.mode"
  52. :formats="calendar.formats"
  53. :theme-styles="calendar.themeStyles"
  54. :attributes="calendar.attrs"
  55. @dayclick='dayClicked'>
  56. ></v-date-picker>
  57. </div>
  58. <div class="clr"></div>
  59. </div>
  60. <div class="col-md-8">
  61. <div v-if="date">
  62. <div id="infos-top">
  63. <div class="col-md-12">
  64. <div class="info-box" id="info-box-distribution">
  65. <span :class="'info-box-icon '+(distribution.active ? 'bg-green' : 'bg-red')"><i :class="'fa '+(distribution.active ? 'fa-check' : 'fa-remove')"></i></span>
  66. <div class="info-box-content">
  67. <span class="info-box-text">
  68. <h4>Distribution du <strong>{{ dateFormat }}</strong></h4>
  69. <a @click="activeWeekDistribution" data-active="0" class="btn btn-default btn-active-week" v-if="oneDistributionWeekActive">Désactiver cette semaine</a>
  70. <a @click="activeWeekDistribution" data-active="1" class="btn btn-default btn-active-week" v-else>Activer cette semaine</a>
  71. <a @click="activeDistribution" data-active="0" class="btn btn-default" v-if="distribution.active">Désactiver ce jour</a>
  72. <a @click="activeDistribution" data-active="1" class="btn btn-default" v-else>Activer ce jour</a>
  73. </span>
  74. </div>
  75. </div>
  76. </div>
  77. <!-- produits -->
  78. <div class="col-md-6">
  79. <div class="info-box col-md-4">
  80. <span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span>
  81. <div class="info-box-content">
  82. <span class="info-box-text">
  83. {{ countActiveProducts }} Produits<br /><br />
  84. <button class="btn btn-default" @click="showModalProducts = true">Configurer</button>
  85. </span>
  86. </div>
  87. </div>
  88. </div>
  89. <modal v-if="showModalProducts" id="modal-products" @close="showModalProducts = false">
  90. <h3 slot="header">Produits</h3>
  91. <div slot="body">
  92. <table class="table table-condensed table-bordered table-hover">
  93. <thead>
  94. <tr>
  95. <td>Actif</td>
  96. <td>Nom</td>
  97. <td class="quantity-ordered">Commandé</td>
  98. <td class="quantity-max">Maximum</td>
  99. </tr>
  100. </thead>
  101. <tbody>
  102. <tr v-for="product in products">
  103. <td>
  104. <button class="btn btn-success" v-if="product.productDistribution[0].active == 1"><span class="glyphicon glyphicon-ok"></span></button>
  105. <button class="btn btn-default" v-else data-active-product="1" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-ok"></span></button>
  106. <button class="btn btn-danger" v-if="product.productDistribution[0].active == 0"><span class="glyphicon glyphicon-remove"></span></button>
  107. <button class="btn btn-default" v-else data-active-product="0" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-remove"></span></button>
  108. </td>
  109. <td>{{ product.name }}</td>
  110. <td class="quantity-ordered">{{ product.quantity_ordered ? product.quantity_ordered + ' '+ ((product.unit == 'piece') ? ' p.' : ' '+(product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)') : '&empty;' }}</td>
  111. <td class="quantity-max">
  112. <div class="input-group">
  113. <input type="text" class="form-control quantity-max" placeholder="&infin;" :data-id-product="product.id" v-model="product.productDistribution[0].quantity_max" @keyup="productQuantityMaxChange" />
  114. <span class="input-group-addon">{{ (product.unit == 'piece') ? 'p.' : ' '+((product.unit == 'g' || product.unit == 'kg') ? 'kg' : 'litre(s)') }}</span>
  115. </div>
  116. </td>
  117. </tr>
  118. </tbody>
  119. </table>
  120. </div>
  121. <div slot="footer">
  122. <div class="actions-form">
  123. <button class="modal-default-button btn btn-default" @click="closeModalProducts">Fermer</button>
  124. </div>
  125. </div>
  126. </modal>
  127. <div class="col-md-6">
  128. <div class="info-box col-md-4">
  129. <span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span>
  130. <div class="info-box-content">
  131. <span class="info-box-text">
  132. {{ countActivePointsSale }} Points de vente<br /><br />
  133. <button class="btn btn-default" @click="showModalPointsSale = true">Configurer</button>
  134. </span>
  135. </div>
  136. </div>
  137. </div>
  138. <modal v-if="showModalPointsSale" id="modal-points-sale" @close="showModalPointsSale = false">
  139. <h3 slot="header">Points de vente</h3>
  140. <div slot="body">
  141. <table class="table table-condensed table-bordered table-hover">
  142. <thead>
  143. <tr>
  144. <td>Actif</td>
  145. <td>Nom</td>
  146. </tr>
  147. </thead>
  148. <tbody>
  149. <tr v-for="pointSale in pointsSale">
  150. <td>
  151. <button class="btn btn-success" v-if="pointSale.pointSaleDistribution[0].delivery == 1"><span class="glyphicon glyphicon-ok"></span></button>
  152. <button class="btn btn-default" v-else data-delivery-point-sale="1" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-ok"></span></button>
  153. <button class="btn btn-danger" v-if="pointSale.pointSaleDistribution[0].delivery == 0"><span class="glyphicon glyphicon-remove"></span></button>
  154. <button class="btn btn-default" v-else data-delivery-point-sale="0" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-remove"></span></button>
  155. </td>
  156. <td>{{ pointSale.name }}</td>
  157. </tr>
  158. </tbody>
  159. </table>
  160. </div>
  161. </modal>
  162. <div class="col-md-6">
  163. <div id="summary-ca-weight" class="info-box col-md-4">
  164. <span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span>
  165. <div class="info-box-content">
  166. <span class="info-box-text">CA</span>
  167. <span class="info-box-number">{{ distribution.revenues }} <span class="normal" v-if="distribution.potential_revenues != '0.00 €'">/ {{ distribution.potential_revenues }}</span></span>
  168. <span class="info-box-text">Poids</span>
  169. <span class="info-box-number">{{ distribution.weight }} kg <span class="normal" v-if="distribution.potential_weight > 0">/ {{ distribution.potential_weight }} kg</span></span>
  170. </div>
  171. </div>
  172. </div>
  173. <div class="col-md-6">
  174. <div class="info-box col-md-4">
  175. <span class="info-box-icon bg-yellow"><i class="fa fa-download"></i></span>
  176. <div class="info-box-content">
  177. <span class="info-box-text">
  178. {{ countOrders }} Commande<span v-if="countOrders > 1">s</span><br />
  179. <a href="#" class="btn btn-xs btn-default" disabled="disabled" v-if="countOrders == 0">Télécharger (PDF)</a>
  180. <a :href="distribution.url_report" class="btn btn-default">Télécharger (PDF)</a><br />
  181. <a href="#" class="btn btn-xs btn-default" disabled="disabled" v-if="countOrders == 0">Télécharger (CSV)</a>
  182. <a :href="distribution.url_report+'&type=csv'" class="btn btn-default">Télécharger (CSV)</a>
  183. </span>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class="callout callout-info" v-else>
  190. <h4><i class="fa fa-info"></i> Pour commencer</h4>
  191. <p>Veuillez choisir une date de distribution.</p>
  192. </div>
  193. </div>
  194. <div class="clr"></div>
  195. <div id="orders" class="panel panel-default" v-if="date">
  196. <div class="panel-heading">
  197. <h3 class="panel-title">Commandes <label class="label label-success" v-if="orders.length">{{ orders.length }}</label><label class="label label-danger" v-else>0</label></h3>
  198. </div>
  199. <div class="panel-body">
  200. <button id="btn-add-subscriptions" @click="addSubscriptions" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-plus"></span> Importer les abonnements</button>
  201. <button id="btn-add-order" @click="showModalFormOrderCreate = true" class="btn btn-primary btn-xs"><span class="glyphicon glyphicon-plus"></span> Ajouter une commande</button>
  202. <order-form
  203. v-if="showModalFormOrderCreate"
  204. :date="date"
  205. :order="orderCreate"
  206. :points-sale="pointsSale"
  207. :users="users"
  208. :products="products"
  209. :producer="producer"
  210. @close="showModalFormOrderCreate = false"
  211. @ordercreatedupdated="orderCreatedUpdated"
  212. ></order-form>
  213. <div id="wrapper-nav-points-sale">
  214. <ul id="nav-points-sale">
  215. <li data-id-point-sale="0" data-id-point-sale="0" v-if="countActivePointsSale > 1" @click="pointSaleClick">
  216. <a class="btn btn-default btn-primary" v-if="idActivePointSale == 0">Tous <span class="label label-default">{{ orders.length }}</span> <span class="glyphicon glyphicon-triangle-bottom"></span></a>
  217. <a class="btn btn-default" v-else>Tous <span class="label label-default">{{ orders.length }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
  218. </li>
  219. <li v-for="pointSale in pointsSale" :data-id-point-sale="pointSale.id" v-if="pointSale.pointSaleDistribution[0].delivery == 1" @click="pointSaleClick">
  220. <a class="btn btn-default btn-primary" v-if="idActivePointSale == pointSale.id">{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
  221. <a class="btn btn-default" v-else>{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
  222. </li>
  223. </ul>
  224. <div class="clr"></div>
  225. </div>
  226. <table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)">
  227. <tbody>
  228. <template v-for="(order, key, index) in orders" v-if="idActivePointSale == 0 || idActivePointSale == order.id_point_sale">
  229. <tr>
  230. <td>
  231. <label class="label label-success" v-if="order.origin == 'user'">client</label>
  232. <label class="label label-default" v-else-if="order.origin == 'auto'">auto</label>
  233. <label class="label label-warning" v-else>admin</label>
  234. </td>
  235. <td>
  236. <span class="label label-danger" v-if="order.date_delete"><span class="glyphicon glyphicon-trash"></span></span>
  237. <span class="label label-warning" v-if="order.date_update"><span class="glyphicon glyphicon-pencil"></span></span>
  238. <span class="label label-success" v-if="!order.date_update && !order.date_delete"><span class="glyphicon glyphicon-check"></span></span>
  239. </td>
  240. <td>
  241. <span v-if="order.user">{{ order.user.lastname+' '+order.user.name }}</span>
  242. <span v-else>{{ order.username }}</span>
  243. <span v-if="order.comment && order.comment.length > 0" class="glyphicon glyphicon-comment"></span>
  244. </td>
  245. <td v-if="idActivePointSale == 0">
  246. {{ order.pointSale.name }}
  247. </td>
  248. <td>{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+'&nbsp;€' }}</td>
  249. <td class="column-state-payment">
  250. <div class="input-group">
  251. <span class="label label-success input-group-addon" v-if="order.amount_paid == order.amount">payé</span>
  252. <span class="label label-default input-group-addon" v-else-if="order.amount_paid == 0">non réglé</span>
  253. <span class="label label-default input-group-addon" v-else-if="order.amount_paid > order.amount">surplus</span>
  254. <span class="label label-warning input-group-addon" v-else-if="order.amount_paid < order.amount">reste à payer</span>
  255. <span class="glyphicon glyphicon-time" title="Paiement automatique" v-if="order.auto_payment && producer.credit && (order.amount_paid == 0 || order.amount_paid < order.amount)"></span>
  256. </div>
  257. </td>
  258. <td class="column-payment" v-if="producer.credit">
  259. <div class="btn-group" v-if="order.user && !order.date_delete">
  260. <button class="btn btn-xs btn-default" v-if="order.amount_paid == order.amount" @click="orderPaymentClick" :data-id-order="order.id" data-type="refund" :data-amount="order.amount">
  261. <span class="glyphicon glyphicon-euro"></span> Rembourser
  262. </button>
  263. <button class="btn btn-xs btn-default" v-else-if="order.amount_paid == 0" @click="orderPaymentClick" :data-id-order="order.id" data-type="payment" :data-amount="order.amount">
  264. <span class="glyphicon glyphicon-euro"></span> Payer
  265. </button>
  266. <button class="btn btn-xs btn-default" v-else-if="order.amount_paid < order.amount" @click="orderPaymentClick" :data-id-order="order.id" data-type="payment" :data-amount="order.amount_remaining">
  267. <span class="glyphicon glyphicon-euro"></span> Payer
  268. </button>
  269. <button class="btn btn-xs btn-default" v-else-if="order.amount_paid > order.amount" @click="orderPaymentClick" :data-id-order="order.id" data-type="refund" :data-amount="order.amount_surplus">
  270. <span class="glyphicon glyphicon-euro"></span> Rembourser
  271. </button>
  272. <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  273. <span class="caret"></span>
  274. <span class="sr-only">Toggle Dropdown</span>
  275. </button>
  276. <ul class="dropdown-menu">
  277. <li><a href="javascript:void(0);" @click="orderPaymentModalClick" :data-id-order="order.id">Historique</a></li>
  278. </ul>
  279. </div>
  280. </td>
  281. <td class="column-actions">
  282. <span v-if="order.oneProductUnactivated" class="glyphicon glyphicon-warning-sign" title="Contient un produit non activé"></span>
  283. <button class="btn btn-default" :data-id-order="order.id" @click="orderViewClick"><span :class="'glyphicon ' + ((showViewProduct && idOrderView == order.id) ? 'glyphicon-eye-close' : 'glyphicon-eye-open')"></span></button>
  284. <button class="btn btn-default" :data-id-order="order.id" @click="updateOrderClick"><span class="glyphicon glyphicon-pencil"></span></button>
  285. <button class="btn btn-default" :data-id-order="order.id" @click="deleteOrderClick"><span class="glyphicon glyphicon-trash"></span></button>
  286. <a class="btn btn-default" :href="baseUrl+'/subscription/update?id='+order.id_subscription" v-if="order.id_subscription > 0"><span class="glyphicon glyphicon-repeat"></span></a>
  287. <a class="btn btn-default add-subscription" :href="baseUrl+'/subscription/create?idOrder='+order.id" v-else><span class="glyphicon glyphicon-plus"></span><span class="glyphicon glyphicon-repeat"></span></a>
  288. <order-form
  289. v-if="showModalFormOrderUpdate && idOrderUpdate == order.id"
  290. :date="date"
  291. :id-point-sale="idActivePointSale"
  292. :points-sale="pointsSale"
  293. :users="users"
  294. :products="products"
  295. :order="ordersUpdate[key]"
  296. :producer="producer"
  297. @close="showModalFormOrderUpdate = false"
  298. @ordercreatedupdated="orderCreatedUpdated"
  299. ></order-form>
  300. <modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false">
  301. <h3 slot="header">
  302. Commande du <strong>{{ dateFormat }}</strong> &gt;
  303. <strong><span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span>
  304. <span v-else>{{ order.username }}</span></strong>
  305. </h3>
  306. <div slot="body">
  307. <div class="col-md-4">
  308. <div class="info-box">
  309. <span :class="'info-box-icon ' +((order.amount_paid == order.amount) ? 'bg-green' : 'bg-red')"><i class="fa fa-check"></i></span>
  310. <div class="info-box-content">
  311. <span class="info-box-text">Montant</span>
  312. <span class="info-box-number">{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span>
  313. <span class="info-box-text">
  314. Statut<br />
  315. <span class="label label-success" v-if="order.amount_paid == order.amount">payé</span>
  316. <span class="label label-default" v-else-if="order.amount_paid == 0">non réglé</span>
  317. <span class="label label-default" v-else-if="order.amount_paid > order.amount">surplus</span>
  318. <span class="label label-warning" v-else-if="order.amount_paid < order.amount">reste à payer</span>
  319. </span>
  320. </div>
  321. </div>
  322. <div class="info-box">
  323. <span :class="'info-box-icon ' +((order.user.credit > 0) ? 'bg-green' : 'bg-red')"><i class="fa fa-user"></i></span>
  324. <div class="info-box-content">
  325. <span class="info-box-text">Crédit utilisateur</span>
  326. <span class="info-box-number">{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span>
  327. </div>
  328. </div>
  329. <button v-if="order.amount_paid == order.amount"
  330. class="btn btn-default"
  331. :data-amount="order.amount"
  332. data-type="refund"
  333. @click="orderPaymentClick" >
  334. <span class="glyphicon glyphicon-chevron-right"></span>
  335. Rembourser {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
  336. </button>
  337. <button v-else-if="order.amount_paid == 0"
  338. class="btn btn-default"
  339. :data-amount="order.amount"
  340. data-type="payment"
  341. @click="orderPaymentClick">
  342. <span class="glyphicon glyphicon-chevron-right"></span>
  343. Payer {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
  344. </button>
  345. <button v-else-if="order.amount_paid > order.amount"
  346. class="btn btn-default"
  347. :data-amount="order.amount_surplus"
  348. data-type="refund"
  349. @click="orderPaymentClick">
  350. <span class="glyphicon glyphicon-chevron-right"></span>
  351. Rembourser {{ order.amount_surplus.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
  352. </button>
  353. <button v-else-if="order.amount_paid < order.amount"
  354. class="btn btn-default"
  355. :data-amount="order.amount_remaining"
  356. data-type="payment"
  357. @click="orderPaymentClick">
  358. <span class="glyphicon glyphicon-chevron-right"></span>
  359. Payer le restant {{ order.amount_remaining.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
  360. </button>
  361. </div>
  362. <div class="col-md-8">
  363. <h4>Historique paiement</h4>
  364. <table class="table table-condensed table-bordered table-hover">
  365. <thead>
  366. <tr>
  367. <td>Date</td>
  368. <td>Utilisateur</td>
  369. <td>Action</td>
  370. <td>- Débit</td>
  371. <td>+ Crédit</td>
  372. </tr>
  373. </thead>
  374. <tbody>
  375. <tr v-for="creditHistory in order.creditHistory">
  376. <td>{{ creditHistory.date }}</td>
  377. <td>{{ creditHistory.user_action }}</td>
  378. <td v-html="creditHistory.wording"></td>
  379. <td v-html="creditHistory.debit"></td>
  380. <td v-html="creditHistory.credit"></td>
  381. </tr>
  382. </tbody>
  383. </table>
  384. </div>
  385. </div>
  386. </modal>
  387. </td>
  388. </tr>
  389. <tr class="view" v-if="showViewProduct && idOrderView == order.id">
  390. <td colspan="6">
  391. <strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong>
  392. <ul>
  393. <li v-for="product in products" v-if="order.productOrder[product.id].quantity > 0">
  394. {{ product.name }} : {{ order.productOrder[product.id].quantity }} {{ order.productOrder[product.id].unit == 'piece' ? ' pièce(s)' : ' '+order.productOrder[product.id].unit }} <span v-if="product.productDistribution[0].active == 0" class="glyphicon glyphicon-warning-sign" title="Ce produit n'est pas activé"></span>
  395. </li>
  396. </ul>
  397. <div v-if="order.comment && order.comment.length > 0" class="comment">
  398. <strong><span class="glyphicon glyphicon-menu-right"></span> Commentaire</strong><br />
  399. {{ order.comment }}
  400. </div>
  401. </td>
  402. </tr>
  403. </template>
  404. </tbody>
  405. </table>
  406. <div class="alert alert-warning" v-else>
  407. Aucune commande
  408. </div>
  409. </div>
  410. </div>
  411. </div>
  412. </div>
  413. <!-- template for the order-form component -->
  414. <script type="text/x-template" id="order-form-template">
  415. <modal class="modal-form-order" @close="$emit('close')">
  416. <h3 slot="header">Ajouter une commande</h3>
  417. <div slot="body">
  418. <div class="callout callout-warning" v-if="errors.length">
  419. <ul>
  420. <li v-for="error in errors">{{ error }}</li>
  421. </ul>
  422. </div>
  423. <div class="col-md-4">
  424. <div class="form-group">
  425. <label class="control-label" for="select-id-point-sale">Point de vente</label>
  426. <select class="form-control" id="select-id-point-sale" v-model="order.id_point_sale">
  427. <option v-for="pointSale in pointsSale" v-if="pointSale.pointSaleDistribution[0].delivery == 1" :value="pointSale.id">{{ pointSale.name }}</option>
  428. </select>
  429. </div>
  430. <div class="form-group">
  431. <a v-if="producer.credit && order.id_user > 0" class="btn btn-xs btn-primary btn-credit" :href="baseUrl+'/user/credit?id='+user.id_user" v-for="user in users" v-if="user.id_user == order.id_user">{{ parseFloat(user.credit).toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+'&nbsp;€' }}</a>
  432. <label class="control-label" for="select-id-user">
  433. Utilisateur
  434. </label>
  435. <select class="form-control" v-model="order.id_user">
  436. <option value="0">--</option>
  437. <option v-for="user in users" :value="user.id_user">{{ user.lastname +' '+ user.name }}</option>
  438. </select>
  439. <input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" />
  440. </div>
  441. <div class="form-group">
  442. <label class="control-label" for="textarea-comment">Commentaire</label>
  443. <textarea class="form-control" id="textarea-comment" v-model="order.comment"></textarea>
  444. </div>
  445. </div>
  446. <div class="col-md-8">
  447. <label class="control-label">Produits</label>
  448. <table class="table table-condensed table-bordered table-hover table-products">
  449. <thead>
  450. <tr>
  451. <th></th>
  452. <th>Nom</th>
  453. <th>Quantité</th>
  454. <th>Reste</th>
  455. </tr>
  456. </thead>
  457. <tbody>
  458. <tr v-for="product in products" :class="(order.productOrder[product.id] > 0) ? 'product-ordered' : ''">
  459. <td>
  460. <span class="label label-success" v-if="product.productDistribution[0].active == 1">Actif</span>
  461. <span class="label label-danger" v-else>Inactif</span>
  462. </td>
  463. <td>{{ product.name }}</td>
  464. <td class="quantity">
  465. <div class="input-group">
  466. <span class="input-group-btn">
  467. <button class="btn btn-default btn-moins" type="button" @click="productQuantityClick(product.id, order.productOrder[product.id].unit == 'piece' ? -1 : -parseFloat(product.step))"><span class="glyphicon glyphicon-minus"></span></button>
  468. </span>
  469. <input type="text" v-model="order.productOrder[product.id].quantity" class="form-control" />
  470. <span class="input-group-addon">{{ order.productOrder[product.id].unit == 'piece' ? 'p.' : order.productOrder[product.id].unit }}</span>
  471. <span class="input-group-btn">
  472. <button class="btn btn-default btn-plus" type="button" @click="productQuantityClick(product.id, order.productOrder[product.id].unit == 'piece' ? 1 : parseFloat(product.step))"><span class="glyphicon glyphicon-plus"></span></button>
  473. </span>
  474. </div>
  475. </td>
  476. <td class="quantity-remaining infinite" v-if="product.quantity_remaining === null || order.productOrder[product.id].unit != product.unit">&infin;</td>
  477. <td class="quantity-remaining negative" v-else-if="product.quantity_remaining <= 0">{{ product.quantity_remaining }} {{ order.productOrder[product.id].unit == 'piece' ? ' p.' : ' '+(order.productOrder[product.id].unit == 'g' || order.productOrder[product.id].unit == 'kg') ? 'kg' : 'litre(s)' }}</td>
  478. <td class="quantity-remaining has-quantity" v-else>{{ product.quantity_remaining }} {{ order.productOrder[product.id].unit == 'piece' ? ' p.' : ' '+(order.productOrder[product.id].unit == 'g' || order.productOrder[product.id].unit == 'kg') ? 'kg' : 'litre(s)' }}</td>
  479. </tr>
  480. </tbody>
  481. </table>
  482. </div>
  483. </div>
  484. <div slot="footer">
  485. <div class="actions-form">
  486. <button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-if="!order.id && order.id_user > 0" data-process-credit="1">Créer et payer</button>
  487. <button class="modal-default-button btn btn-primary" @click="submitFormUpdate" v-if="order.id && order.id_user > 0" data-process-credit="1">Modifier et payer</button>
  488. <button class="modal-default-button btn btn-primary" @click="submitFormUpdate" v-if="order.id">Modifier</button>
  489. <button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-else>Créer</button>
  490. <button class="modal-default-button btn btn-default" @click="$emit('close')">Annuler</button>
  491. </div>
  492. </div>
  493. </modal>
  494. </script>
  495. <!-- template for the modal component -->
  496. <script type="text/x-template" id="modal-template">
  497. <transition name="modal">
  498. <div class="modal-mask">
  499. <div class="modal-wrapper">
  500. <div class="modal-container">
  501. <div class="modal-header">
  502. <slot name="header"></slot>
  503. </div>
  504. <div class="modal-body">
  505. <slot name="body"></slot>
  506. </div>
  507. <div class="modal-footer">
  508. <slot name="footer">
  509. <button class="modal-default-button btn btn-default" @click="$emit('close')">Fermer</button>
  510. </slot>
  511. </div>
  512. </div>
  513. </div>
  514. </div>
  515. </transition>
  516. </script>