'format' => 'raw', | 'format' => 'raw', | ||||
'value' => function ($ticket) use ($ticketModule, $userCurrent) { | '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>'; | $link = '<strong>' . Html::a($ticket->subject, ['view', 'id' => $ticket->id, '#' => $firstTicketMessageUnread->id]) . '</strong>'; | ||||
} else { | } else { | ||||
$link = Html::a($ticket->subject, ['view', 'id' => $ticket->id]); | $link = Html::a($ticket->subject, ['view', 'id' => $ticket->id]); |
use domain\Order\Order\Order; | use domain\Order\Order\Order; | ||||
use domain\Payment\Payment; | use domain\Payment\Payment; | ||||
use domain\Ticket\Ticket\Ticket; | use domain\Ticket\Ticket\Ticket; | ||||
use domain\Ticket\TicketMessage\TicketMessage; | |||||
use domain\User\User\User; | use domain\User\User\User; | ||||
$serverName = isset($_SERVER['SERVER_NAME']) ?? '' ; | $serverName = isset($_SERVER['SERVER_NAME']) ?? '' ; | ||||
domain\Document\DeliveryNote\Event\DeliveryNoteObserver::class | domain\Document\DeliveryNote\Event\DeliveryNoteObserver::class | ||||
], | ], | ||||
Ticket::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, | |||||
] | |||||
], | ], | ||||
], | ], | ||||
], | ], |
<?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> | |||||
<?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]) ?> | |||||
<?php | <?php | ||||
namespace domain\User\User\Event; | |||||
namespace domain\Ticket\Ticket\Event; | |||||
use domain\Ticket\Ticket\TicketModule; | |||||
use justcoded\yii2\eventlistener\observers\ActiveRecordObserver; | use justcoded\yii2\eventlistener\observers\ActiveRecordObserver; | ||||
use domain\User\User\UserModule; | |||||
use yii\db\AfterSaveEvent; | use yii\db\AfterSaveEvent; | ||||
class TicketObserver extends ActiveRecordObserver | class TicketObserver extends ActiveRecordObserver | ||||
{ | { | ||||
public function inserted(AfterSaveEvent $event) | public function inserted(AfterSaveEvent $event) | ||||
{ | { | ||||
UserModule::getInstance()->getNotifier() | |||||
->sendMailNewTicketAdmin($event->sender); | |||||
TicketModule::getInstance()->getNotifier()->sendEmailAdminNewTicket($event->sender); | |||||
} | } | ||||
} | } |
TicketSolver::class, | TicketSolver::class, | ||||
TicketRepository::class, | TicketRepository::class, | ||||
TicketBuilder::class, | TicketBuilder::class, | ||||
TicketNotifier::class, | |||||
]; | ]; | ||||
} | } | ||||
{ | { | ||||
return TicketBuilder::getInstance(); | return TicketBuilder::getInstance(); | ||||
} | } | ||||
public function getNotifier(): TicketNotifier | |||||
{ | |||||
return TicketNotifier::getInstance(); | |||||
} | |||||
} | } |
<?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 | |||||
] | |||||
); | |||||
} | |||||
} | |||||
} |
} | } | ||||
} | } | ||||
return $ticket->ticketMessages[0]; | |||||
if(isset($ticket->ticketMessages[0])) { | |||||
return $ticket->ticketMessages[0]; | |||||
} | |||||
return null; | |||||
} | } | ||||
public function countTicketsUnreadByUserFromArray(array $ticketsArray, User $user): int | public function countTicketsUnreadByUserFromArray(array $ticketsArray, User $user): int |
<?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); | |||||
} | |||||
} |
public function createTicketMessage(Ticket $ticket, User $user, string $message): TicketMessage | public function createTicketMessage(Ticket $ticket, User $user, string $message): TicketMessage | ||||
{ | { | ||||
$ticketMessage = $this->instanciateTicketMessage($ticket, $user, $message); | $ticketMessage = $this->instanciateTicketMessage($ticket, $user, $message); | ||||
$this->saveCreate($ticketMessage); | |||||
$this->create($ticketMessage); | |||||
return $ticketMessage; | return $ticketMessage; | ||||
} | } |
public function getDefaultOptionsSearch(): array | public function getDefaultOptionsSearch(): array | ||||
{ | { | ||||
return [ | return [ | ||||
self::WITH => ['user', 'producer', 'ticketMessages'], | |||||
self::WITH => ['user'], | |||||
self::JOIN_WITH => [], | self::JOIN_WITH => [], | ||||
self::ORDER_BY => '', | self::ORDER_BY => '', | ||||
self::ATTRIBUTE_ID_PRODUCER => '' | 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)); | |||||
} | |||||
} | } |
{ | { | ||||
$this->loadDefinition(TicketMessageDefinition::class); | $this->loadDefinition(TicketMessageDefinition::class); | ||||
} | } | ||||
public function filterByTicketId(int $ticketId) | |||||
{ | |||||
$this->andWhere(['ticket_message.id_ticket' => $ticketId]); | |||||
return $this; | |||||
} | |||||
} | } |
} | } | ||||
} | } | ||||
public function sendMailNewTicketAdmin(Ticket $ticket) | |||||
{ | |||||
$this->mailer->sendAdmin( | |||||
'Nouveau ticket', | |||||
'newTicketAdmin', | |||||
[ | |||||
'ticket' => $ticket, | |||||
] | |||||
); | |||||
} | |||||
public function sendMailNewPassword(User $user, string $password) | public function sendMailNewPassword(User $user, string $password) | ||||
{ | { | ||||
$producer = $this->getProducerContext(); | $producer = $this->getProducerContext(); |