@@ -167,8 +167,8 @@ function ticketList($context, $searchTicket, $dataProviderTicket, $userCurrent) | |||
'format' => 'raw', | |||
'value' => function ($ticket) use ($ticketModule, $userCurrent) { | |||
if ($ticketModule->isTicketUnread($ticket, $userCurrent)) { | |||
$firstTicketMessageUnread = $ticketModule->getFirstTicketMessageUnread($ticket, $userCurrent); | |||
$firstTicketMessageUnread = $ticketModule->getFirstTicketMessageUnread($ticket, $userCurrent); | |||
if ($ticketModule->isTicketUnread($ticket, $userCurrent) && $firstTicketMessageUnread) { | |||
$link = '<strong>' . Html::a($ticket->subject, ['view', 'id' => $ticket->id, '#' => $firstTicketMessageUnread->id]) . '</strong>'; | |||
} else { | |||
$link = Html::a($ticket->subject, ['view', 'id' => $ticket->id]); |
@@ -44,6 +44,7 @@ use domain\Document\DeliveryNote\DeliveryNote; | |||
use domain\Order\Order\Order; | |||
use domain\Payment\Payment; | |||
use domain\Ticket\Ticket\Ticket; | |||
use domain\Ticket\TicketMessage\TicketMessage; | |||
use domain\User\User\User; | |||
$serverName = isset($_SERVER['SERVER_NAME']) ?? '' ; | |||
@@ -208,9 +209,13 @@ return [ | |||
domain\Document\DeliveryNote\Event\DeliveryNoteObserver::class | |||
], | |||
Ticket::class => [ | |||
// User : envoi email nouveau ticket à l'administrateur | |||
domain\User\User\Event\TicketObserver::class, | |||
// Envoi email nouveau ticket à l'administrateur | |||
\domain\Ticket\Ticket\Event\TicketObserver::class, | |||
], | |||
TicketMessage::class => [ | |||
// Envoi email nouveau message ticket à l'administrateur | |||
\domain\Ticket\TicketMessage\Event\TicketMessageObserver::class, | |||
] | |||
], | |||
], | |||
], |
@@ -0,0 +1,49 @@ | |||
<?php | |||
/** | |||
Copyright Souke (2018) | |||
contact@souke.fr | |||
Ce logiciel est un programme informatique servant à aider les producteurs | |||
à distribuer leur production en circuits courts. | |||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
sur le site "http://www.cecill.info". | |||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||
de modification et de redistribution accordés par cette licence, il n'est | |||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
titulaire des droits patrimoniaux et les concédants successifs. | |||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
associés au chargement, à l'utilisation, à la modification et/ou au | |||
développement et à la reproduction du logiciel par l'utilisateur étant | |||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||
avertis possédant des connaissances informatiques approfondies. Les | |||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use domain\User\User\UserModule; | |||
use yii\helpers\Html; | |||
$userModule = UserModule::getInstance(); | |||
?> | |||
<p>Une réponse vient d'être apportée par <strong><?= Html::encode($userModule->getSolver()->getUsername($ticketMessage->user)) ?></strong> au ticket | |||
<a href="<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['support/view', 'id' => $ticketMessage->ticket->id, '#' => $ticketMessage->id]) ?>"><?= Html::encode($ticketMessage->ticket->subject) ?></a>.</p> | |||
@@ -0,0 +1,50 @@ | |||
<?php | |||
/** | |||
Copyright Souke (2018) | |||
contact@souke.fr | |||
Ce logiciel est un programme informatique servant à aider les producteurs | |||
à distribuer leur production en circuits courts. | |||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
sur le site "http://www.cecill.info". | |||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||
de modification et de redistribution accordés par cette licence, il n'est | |||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
titulaire des droits patrimoniaux et les concédants successifs. | |||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
associés au chargement, à l'utilisation, à la modification et/ou au | |||
développement et à la reproduction du logiciel par l'utilisateur étant | |||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||
avertis possédant des connaissances informatiques approfondies. Les | |||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use domain\User\User\UserModule; | |||
use yii\helpers\Html; | |||
$userModule = UserModule::getInstance(); | |||
?> | |||
Une réponse vient d'être apportée par <?= Html::encode($userModule->getSolver()->getUsername($ticketMessage->user)) ?> au ticket <?= Html::encode($ticketMessage->ticket->subject) ?>. | |||
<?= Yii::$app->urlManagerBackend->createAbsoluteUrl(['support/view', 'id' => $ticketMessage->ticket->id, '#' => $ticketMessage->id]) ?> | |||
@@ -1,15 +1,14 @@ | |||
<?php | |||
namespace domain\User\User\Event; | |||
namespace domain\Ticket\Ticket\Event; | |||
use domain\Ticket\Ticket\TicketModule; | |||
use justcoded\yii2\eventlistener\observers\ActiveRecordObserver; | |||
use domain\User\User\UserModule; | |||
use yii\db\AfterSaveEvent; | |||
class TicketObserver extends ActiveRecordObserver | |||
{ | |||
public function inserted(AfterSaveEvent $event) | |||
{ | |||
UserModule::getInstance()->getNotifier() | |||
->sendMailNewTicketAdmin($event->sender); | |||
TicketModule::getInstance()->getNotifier()->sendEmailAdminNewTicket($event->sender); | |||
} | |||
} |
@@ -13,6 +13,7 @@ class TicketModule extends AbstractModule | |||
TicketSolver::class, | |||
TicketRepository::class, | |||
TicketBuilder::class, | |||
TicketNotifier::class, | |||
]; | |||
} | |||
@@ -35,4 +36,9 @@ class TicketModule extends AbstractModule | |||
{ | |||
return TicketBuilder::getInstance(); | |||
} | |||
public function getNotifier(): TicketNotifier | |||
{ | |||
return TicketNotifier::getInstance(); | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
<?php | |||
namespace domain\Ticket\Ticket; | |||
use domain\_\AbstractNotifier; | |||
use domain\Ticket\TicketMessage\TicketMessage; | |||
use domain\Ticket\TicketMessage\TicketMessageRepository; | |||
use domain\User\User\UserSolver; | |||
class TicketNotifier extends AbstractNotifier | |||
{ | |||
protected UserSolver $userSolver; | |||
protected TicketMessageRepository $ticketMessageRepository; | |||
public function loadDependencies(): void | |||
{ | |||
parent::loadDependencies(); | |||
$this->userSolver = $this->loadService(UserSolver::class); | |||
$this->ticketMessageRepository = $this->loadService(TicketMessageRepository::class); | |||
} | |||
public function sendEmailAdminNewTicket(Ticket $ticket) | |||
{ | |||
$this->mailer->sendAdmin( | |||
'Nouveau ticket de '.$ticket->producer->name.' : '.$ticket->subject, | |||
'newTicketAdmin', | |||
[ | |||
'ticket' => $ticket, | |||
] | |||
); | |||
} | |||
public function sendEmailAdminNewTicketMessage(TicketMessage $ticketMessage) | |||
{ | |||
$countTicketMessages = $this->ticketMessageRepository->countTicketMessagesByTicketId($ticketMessage->ticket->id); | |||
if($this->userSolver->isStatusProducer($ticketMessage->user) && $countTicketMessages > 1) { | |||
$this->mailer->sendAdmin( | |||
'Réponse au ticket : ' . $ticketMessage->ticket->subject.' ('.$ticketMessage->ticket->producer->name.')', | |||
'newTicketMessageAdmin', | |||
[ | |||
'ticketMessage' => $ticketMessage | |||
] | |||
); | |||
} | |||
} | |||
} |
@@ -98,7 +98,11 @@ class TicketSolver extends AbstractSolver | |||
} | |||
} | |||
return $ticket->ticketMessages[0]; | |||
if(isset($ticket->ticketMessages[0])) { | |||
return $ticket->ticketMessages[0]; | |||
} | |||
return null; | |||
} | |||
public function countTicketsUnreadByUserFromArray(array $ticketsArray, User $user): int |
@@ -0,0 +1,15 @@ | |||
<?php | |||
namespace domain\Ticket\TicketMessage\Event; | |||
use domain\Ticket\Ticket\TicketModule; | |||
use justcoded\yii2\eventlistener\observers\ActiveRecordObserver; | |||
use yii\db\AfterSaveEvent; | |||
class TicketMessageObserver extends ActiveRecordObserver | |||
{ | |||
public function inserted(AfterSaveEvent $event) | |||
{ | |||
TicketModule::getInstance()->getNotifier()->sendEmailAdminNewTicketMessage($event->sender); | |||
} | |||
} |
@@ -22,7 +22,7 @@ class TicketMessageBuilder extends AbstractBuilder | |||
public function createTicketMessage(Ticket $ticket, User $user, string $message): TicketMessage | |||
{ | |||
$ticketMessage = $this->instanciateTicketMessage($ticket, $user, $message); | |||
$this->saveCreate($ticketMessage); | |||
$this->create($ticketMessage); | |||
return $ticketMessage; | |||
} |
@@ -19,10 +19,22 @@ class TicketMessageRepository extends AbstractRepository | |||
public function getDefaultOptionsSearch(): array | |||
{ | |||
return [ | |||
self::WITH => ['user', 'producer', 'ticketMessages'], | |||
self::WITH => ['user'], | |||
self::JOIN_WITH => [], | |||
self::ORDER_BY => '', | |||
self::ATTRIBUTE_ID_PRODUCER => '' | |||
]; | |||
} | |||
public function findTicketMessagesByTicketId(int $ticketId) | |||
{ | |||
return $this->createDefaultQuery() | |||
->filterByTicketId($ticketId) | |||
->find(); | |||
} | |||
public function countTicketMessagesByTicketId(int $ticketId): int | |||
{ | |||
return count($this->findTicketMessagesByTicketId($ticketId)); | |||
} | |||
} |
@@ -12,4 +12,10 @@ class TicketMessageRepositoryQuery extends AbstractRepositoryQuery | |||
{ | |||
$this->loadDefinition(TicketMessageDefinition::class); | |||
} | |||
public function filterByTicketId(int $ticketId) | |||
{ | |||
$this->andWhere(['ticket_message.id_ticket' => $ticketId]); | |||
return $this; | |||
} | |||
} |
@@ -52,17 +52,6 @@ class UserNotifier extends AbstractNotifier implements ManagerInterface | |||
} | |||
} | |||
public function sendMailNewTicketAdmin(Ticket $ticket) | |||
{ | |||
$this->mailer->sendAdmin( | |||
'Nouveau ticket', | |||
'newTicketAdmin', | |||
[ | |||
'ticket' => $ticket, | |||
] | |||
); | |||
} | |||
public function sendMailNewPassword(User $user, string $password) | |||
{ | |||
$producer = $this->getProducerContext(); |