您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

2 个月前
10 个月前
10 个月前
10 个月前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 domain\Ticket\Ticket\TicketModule;
  38. use yii\grid\GridView;
  39. use yii\helpers\Html;
  40. /**
  41. * @var $this common\components\ViewBackend
  42. */
  43. $userModule = $this->getUserModule();
  44. $ticketModule = TicketModule::getInstance();
  45. $adminSettingBag = $this->getSettingModule()->getAdminSettingBag();
  46. $userCurrent = $this->getUserCurrent();
  47. $this->setTitle('Support & contact');
  48. $this->addBreadcrumb($this->getTitle());
  49. $supportOnline = $adminSettingBag->get('supportOnline');
  50. ?>
  51. <div class="support-index">
  52. <?php if ($context == 'producer'): ?>
  53. <?= $this->renderFile('@common/views/alert_message.php', [
  54. 'display' => $adminSettingBag->get('adminSupportAlertMessageDisplay'),
  55. 'type' => $adminSettingBag->get('adminSupportAlertMessageType'),
  56. 'title' => $adminSettingBag->get('adminSupportAlertMessageTitle'),
  57. 'icon' => $adminSettingBag->get('adminSupportAlertMessageIcon'),
  58. 'message' => $adminSettingBag->get('adminSupportAlertMessage'),
  59. ]) ?>
  60. <div class="callout callout-info">
  61. <p><i class="icon fa fa-info-circle"></i> Pour toutes vos questions, remarques, suggestions et remontées de
  62. bugs.</p>
  63. </div>
  64. <div>
  65. <div class="col-md-6 col-left">
  66. <div class="info-box">
  67. <span class="info-box-icon <?php if ($supportOnline): ?>bg-green<?php else: ?>bg-yellow<?php endif; ?>"><i
  68. class="fa fa-phone"></i></span>
  69. <div class="info-box-content">
  70. <span class="info-box-text">
  71. Me contacter directement
  72. <?php if ($supportOnline): ?>
  73. <br/><span class="label label-success">Disponible</span>
  74. <?php endif; ?>
  75. </span>
  76. <span class="info-box-text">
  77. <br/>
  78. <strong><?= $adminSettingBag->get('administratorPhoneNumber'); ?></strong>
  79. </span>
  80. </div>
  81. </div>
  82. </div>
  83. <div class="col-md-6 col-right">
  84. <div class="info-box">
  85. <span class="info-box-icon bg-yellow"><i class="fa fa-calendar"></i></span>
  86. <div class="info-box-content">
  87. <span class="info-box-text"><br/>
  88. <?= Html::a('Prendre rendez-vous', Yii::$app->parameterBag->get('appointmentUrl'), ['class' => 'btn btn-sm btn-default', 'target' => '_blank']); ?>
  89. </span>
  90. </div>
  91. </div>
  92. </div>
  93. <div class="col-md-6 col-left">
  94. <div class="info-box">
  95. <span class="info-box-icon bg-yellow"><i class="fa fa-comments"></i></span>
  96. <div class="info-box-content">
  97. <span class="info-box-text"><br/><?= Html::a('Ouvrir un ticket', ['support/create'], ['class' => 'btn btn-sm btn-default']); ?></span>
  98. </div>
  99. </div>
  100. </div>
  101. <div class="col-md-6 col-right">
  102. <div class="info-box">
  103. <span class="info-box-icon bg-yellow"><i class="fa fa-envelope"></i></span>
  104. <div class="info-box-content">
  105. <span class="info-box-text"><br/><?= Html::a("M'envoyer un email", 'mailto:' . $adminSettingBag->get('administratorEmail'), ['class' => 'btn btn-sm btn-default']); ?></span>
  106. </div>
  107. </div>
  108. </div>
  109. <?php if ($adminSettingBag->get('forumFlarumUrl')): ?>
  110. <div class="col-md-6 col-left">
  111. <div class="info-box">
  112. <span class="info-box-icon bg-yellow"><i class="fa fa-users"></i></span>
  113. <div class="info-box-content">
  114. <span class="info-box-text"><br/><?= Html::a("Aller sur le forum", $adminSettingBag->get('forumFlarumUrl'), ['class' => 'btn btn-sm btn-default', 'target' => '_blank']); ?></span>
  115. </div>
  116. </div>
  117. </div>
  118. <?php endif; ?>
  119. </div>
  120. <div class="clr"></div>
  121. <?php endif; ?>
  122. <div class="nav-tabs-custom ticket-list">
  123. <ul class="nav nav-tabs pull-right">
  124. <li><a href="#tab_2-2" data-toggle="tab">Fermés <span
  125. class="label label-default"><?= $dataProviderTicketClosed->totalCount ?></span></a></li>
  126. <li class="active"><a href="#tab_1-1" data-toggle="tab">Ouverts <span
  127. class="label label-default"><?= $dataProviderTicketOpen->totalCount ?></span></a></li>
  128. <li class="pull-left header"><i class="fa fa-comments"></i> Tickets</li>
  129. </ul>
  130. <div class="tab-content">
  131. <div class="tab-pane active" id="tab_1-1">
  132. <?= ticketList($context, $searchTicket, $dataProviderTicketOpen, $userCurrent); ?>
  133. </div>
  134. <div class="tab-pane" id="tab_2-2">
  135. <?= ticketList($context, $searchTicket, $dataProviderTicketClosed, $userCurrent); ?>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. <?php
  141. function ticketList($context, $searchTicket, $dataProviderTicket, $userCurrent)
  142. {
  143. $ticketModule = TicketModule::getInstance();
  144. $columnCreatedAt = [
  145. 'attribute' => 'created_at',
  146. 'headerOptions' => ['class' => 'td-created-at column-hide-on-mobile'],
  147. 'value' => function ($ticket) {
  148. return date('d/m/Y', strtotime($ticket->created_at));
  149. }
  150. ];
  151. $columnSubject = [
  152. 'attribute' => 'subject',
  153. 'headerOptions' => ['class' => 'td-subject'],
  154. 'format' => 'raw',
  155. 'value' => function ($ticket) use ($ticketModule, $userCurrent) {
  156. $firstTicketMessageUnread = $ticketModule->getFirstTicketMessageUnread($ticket, $userCurrent);
  157. if ($ticketModule->isTicketUnread($ticket, $userCurrent) && $firstTicketMessageUnread) {
  158. $link = '<strong>' . Html::a($ticket->subject, ['view', 'id' => $ticket->id, '#' => $firstTicketMessageUnread->id]) . '</strong>';
  159. } else {
  160. $link = Html::a($ticket->subject, ['view', 'id' => $ticket->id]);
  161. }
  162. return $link;
  163. }
  164. ];
  165. $columnLastMessage = [
  166. 'label' => 'Dernier message',
  167. 'headerOptions' => ['class' => 'td-last-message column-hide-on-mobile'],
  168. 'value' => function ($ticket) {
  169. $ticketMessages = $ticket->ticketMessages;
  170. if ($ticketMessages && is_array($ticketMessages)) {
  171. $lastTicketMessage = end($ticketMessages);
  172. $origin = date_create(date('Y-m-d', strtotime($lastTicketMessage->created_at)));
  173. $target = date_create();
  174. $interval = date_diff($origin, $target);
  175. $days = (int)$interval->format('%R%a');
  176. if ($days == 0) {
  177. return "Aujourd'hui";
  178. } elseif ($days == 1) {
  179. return "Hier";
  180. } else {
  181. return $days . ' jours';
  182. }
  183. }
  184. return '';
  185. }
  186. ];
  187. $columnMessages = [
  188. 'label' => 'Messages',
  189. 'headerOptions' => ['class' => 'td-messages column-hide-on-mobile'],
  190. 'value' => function ($ticket) {
  191. return count($ticket->ticketMessages);
  192. }
  193. ];
  194. $columnButtonActions = [
  195. 'class' => 'yii\grid\ActionColumn',
  196. 'template' => '{view} {close-open}',
  197. 'headerOptions' => ['class' => 'column-actions'],
  198. 'contentOptions' => ['class' => 'column-actions'],
  199. 'buttons' => [
  200. 'view' => function ($url, $ticket) {
  201. $url = ['view', 'id' => $ticket->id];
  202. return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url, [
  203. 'title' => 'Voir le ticket', 'class' => 'btn btn-default'
  204. ]);
  205. },
  206. 'close-open' => function ($url, $ticket) use ($ticketModule) {
  207. if ($ticketModule->isTicketOpen($ticket)) {
  208. $title = 'Fermer';
  209. $url = ['close', 'id' => $ticket->id];
  210. $glyphicon = 'glyphicon-folder-close';
  211. } else {
  212. $title = 'Ré-ouvrir';
  213. $url = ['open', 'id' => $ticket->id];
  214. $glyphicon = 'glyphicon-folder-open';
  215. }
  216. return Html::a('<span class="glyphicon ' . $glyphicon . '"></span>', $url, [
  217. 'title' => $title, 'class' => 'btn btn-default'
  218. ]);
  219. }
  220. ],
  221. ];
  222. $columnProducer = [
  223. 'attribute' => 'id_producer',
  224. 'headerOptions' => ['class' => 'td-producer'],
  225. 'value' => function ($ticket) {
  226. return $ticket->producer->name;
  227. }
  228. ];
  229. if ($context == 'producer') {
  230. $columns = [
  231. $columnCreatedAt,
  232. $columnSubject,
  233. $columnLastMessage,
  234. $columnMessages,
  235. $columnButtonActions
  236. ];
  237. } elseif ($context == 'admin') {
  238. $columns = [
  239. $columnCreatedAt,
  240. $columnProducer,
  241. $columnSubject,
  242. $columnLastMessage,
  243. $columnMessages,
  244. $columnButtonActions
  245. ];
  246. }
  247. $optionsGridView = [
  248. 'summary' => '',
  249. 'filterModel' => $searchTicket,
  250. 'dataProvider' => $dataProviderTicket,
  251. 'columns' => $columns,
  252. ];
  253. return GridView::widget($optionsGridView);
  254. }
  255. ?>