Loading module/Oscar/src/Oscar/Command/OscarNotificationsMailMilestoneCommand.php 0 → 100644 +50 −0 Original line number Diff line number Diff line <?php namespace Oscar\Command; use Oscar\Service\MilestoneService; use Oscar\Service\OscarUserContext; use Oscar\Service\PersonService; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; class OscarNotificationsMailMilestoneCommand extends OscarCommandAbstract { protected static $defaultName = 'notifications:mail-milestones'; protected function configure() { $this ->setDescription("Envoi des jalons avec envoi par email") ->addOption('date', 'd', InputOption::VALUE_OPTIONAL, 'date de déclenchement', null) ; } protected function execute(InputInterface $input, OutputInterface $output): int { $this->addOutputStyle($output); $io = new SymfonyStyle($input, $output); $date = $input->getOption('date'); $dateRef = new \DateTime(); if( $date ){ $dateRef = new \DateTime($date); } /** @var MilestoneService $milestoneService */ $milestoneService = $this->getServicemanager()->get(MilestoneService::class); try { $milestoneService->mailMiltonesMailables($dateRef->format('Y-m-d H:i:s'), $io); } catch (\Exception $e) { $io->error($e->getMessage()); return self::FAILURE; } return self::SUCCESS; } } No newline at end of file module/Oscar/src/Oscar/Controller/DateTypeController.php +22 −11 Original line number Diff line number Diff line Loading @@ -12,7 +12,9 @@ use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException; use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Oscar\Entity\ActivityDate; use Oscar\Entity\ActivityDateRepository; use Oscar\Entity\DateType; use Oscar\Entity\DateTypeRepository; use Oscar\Exception\OscarException; use Oscar\Form\DateTypeForm; use Oscar\Provider\Privileges; Loading @@ -25,14 +27,27 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser { use UseOscarUserContextServiceTrait; /** * @return DateTypeRepository * @throws \Doctrine\ORM\Exception\NotSupported */ protected function getDateTypeRepository() : DateTypeRepository { return $this->getEntityManager()->getRepository(DateType::class); } /** * @return ActivityDateRepository * @throws \Doctrine\ORM\Exception\NotSupported */ protected function getActivityDateRepository() : ActivityDateRepository { return $this->getEntityManager()->getRepository(ActivityDate::class); } public function indexAction() { $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_MILESTONETYPE_MANAGE); $entities = $this->getEntityManager()->getRepository(DateType::class)->allArray(); return [ 'entities' => $entities 'entities' => $this->getDateTypeRepository()->allArray() ]; } Loading Loading @@ -83,13 +98,9 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser public function deleteAction(): Response { $id = $this->params()->fromRoute('id'); $dateType = $this->getEntityManager()->getRepository(DateType::class)->find($id); $dateType = $this->getDateTypeRepository()->find($id); $jalons = $this->getEntityManager()->getRepository(ActivityDate::class)->findBy( [ 'type' => $dateType ] ); $jalons = $this->getActivityDateRepository()->findBy(['type' => $dateType]); if (count($jalons) > 0) { throw new OscarException("Impossible de supprimer un type de jalon utilisé dans les activités"); Loading @@ -113,7 +124,7 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser */ public function editAction(): ViewModel { $entity = $this->getEntityManager()->getRepository(DateType::class)->find($this->params()->fromRoute('id')); $entity = $this->getDateTypeRepository()->find($this->params()->fromRoute('id')); $rolesCheck = $entity->getRoles(); $arrayRoles = []; foreach ($rolesCheck as $role) { Loading module/Oscar/src/Oscar/Entity/DateType.php +55 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,22 @@ class DateType implements ITrackable */ private $description; /** * Message spécifique pour le mail. * * @var string * @ORM\Column(type="string", nullable=true) */ private ?string $emailMessage = ""; /** * Mail activé. * * @var bool * @ORM\Column(type="boolean", nullable=false, options={"default"=false}) */ private bool $emailEnable = false; /** * Permet de configurer les féquences de rappel. * Loading Loading @@ -182,6 +198,42 @@ class DateType implements ITrackable return $this; } /** * @return string|null */ public function getEmailMessage(): ?string { return $this->emailMessage; } /** * @param string|null $emailMessage * @return $this */ public function setEmailMessage(?string $emailMessage): self { $this->emailMessage = $emailMessage; return $this; } /** * @return bool */ public function isEmailEnable(): bool { return $this->emailEnable; } /** * @param bool $emailEnable * @return $this */ public function setEmailEnable(bool $emailEnable): self { $this->emailEnable = $emailEnable; return $this; } function toArray() { return [ Loading @@ -190,7 +242,9 @@ class DateType implements ITrackable 'facet' => $this->getFacet(), 'finishable' => $this->isFinishable(), 'description' => $this->getDescription(), 'recursivity' => $this->getRecursivityArray() 'recursivity' => $this->getRecursivityArray(), 'emailEnable' => $this->isEmailEnable(), 'emailMessage' => $this->getEmailMessage(), ]; } Loading module/Oscar/src/Oscar/Entity/DateTypeRepository.php +13 −2 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ namespace Oscar\Entity; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\ResultSetMapping; use Oscar\Exception\OscarException; class DateTypeRepository extends EntityRepository { Loading @@ -20,12 +21,14 @@ class DateTypeRepository extends EntityRepository $rsm->addScalarResult('id', 'id'); $rsm->addScalarResult('label', 'label'); $rsm->addScalarResult('description', 'description'); $rsm->addScalarResult('emailmessage', 'emailMessage'); $rsm->addScalarResult('emailenable', 'emailEnable'); $rsm->addScalarResult('recursivity', 'recursivity'); $rsm->addScalarResult('finishable', 'finishable'); $rsm->addScalarResult('facet', 'facet'); $rsm->addScalarResult('roles', 'roles'); $rsm->addScalarResult('used', 'used'); $sql = 'select d.id, d.label, d.description, $sql = 'select d.id, d.label, d.description, d.emailenable, d.emailmessage, d.finishable , d.recursivity, d.facet, count(a.id) as used, json_agg(distinct ur.role_id) as roles from datetype d left join activitydate a ON a.type_id = d.id Loading @@ -46,7 +49,15 @@ class DateTypeRepository extends EntityRepository } return $results; } catch (\Exception $e) { die($e->getMessage()); throw new OscarException($e->getMessage()); } } public function getMailablesMilestones() { $queryBuilder = $this->createQueryBuilder('d') ->select('d') ->where('d.emailEnable = true'); return $queryBuilder->getQuery()->getArrayResult(); } } module/Oscar/src/Oscar/Form/DateTypeForm.php +30 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,34 @@ class DateTypeForm extends Form implements InputFilterProviderInterface 'type'=>Checkbox::class ]); $label = 'Mail dédié'; $this->add([ 'name' => 'emailEnable', 'options' => [ 'label' => $label, 'use_hidden_element' => false, 'checked_value' => '1', 'unchecked_value' => '0', ], 'attributes' => [ 'class' => 'form-control' ], 'type'=>Checkbox::class ]); $label = 'Message du mail'; $this->add([ 'name' => 'emailMessage', 'options' => [ 'label' => $label ], 'attributes' => [ 'class' => 'form-control', 'placeholder' => $label, ], 'type'=>'Textarea' ]); // Fréquence des notifications $label = 'Fréquence des notifications'; Loading Loading @@ -141,6 +169,8 @@ class DateTypeForm extends Form implements InputFilterProviderInterface 'description' => [ 'required' => false ], 'recursivity' => [ 'required' => false ], 'finishable' => [ 'required' => false ], 'emailEnable' => [ 'required' => false ], 'emailMessage' => [ 'required' => false ], 'roles' => ['required' => false], ]; } Loading Loading
module/Oscar/src/Oscar/Command/OscarNotificationsMailMilestoneCommand.php 0 → 100644 +50 −0 Original line number Diff line number Diff line <?php namespace Oscar\Command; use Oscar\Service\MilestoneService; use Oscar\Service\OscarUserContext; use Oscar\Service\PersonService; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; class OscarNotificationsMailMilestoneCommand extends OscarCommandAbstract { protected static $defaultName = 'notifications:mail-milestones'; protected function configure() { $this ->setDescription("Envoi des jalons avec envoi par email") ->addOption('date', 'd', InputOption::VALUE_OPTIONAL, 'date de déclenchement', null) ; } protected function execute(InputInterface $input, OutputInterface $output): int { $this->addOutputStyle($output); $io = new SymfonyStyle($input, $output); $date = $input->getOption('date'); $dateRef = new \DateTime(); if( $date ){ $dateRef = new \DateTime($date); } /** @var MilestoneService $milestoneService */ $milestoneService = $this->getServicemanager()->get(MilestoneService::class); try { $milestoneService->mailMiltonesMailables($dateRef->format('Y-m-d H:i:s'), $io); } catch (\Exception $e) { $io->error($e->getMessage()); return self::FAILURE; } return self::SUCCESS; } } No newline at end of file
module/Oscar/src/Oscar/Controller/DateTypeController.php +22 −11 Original line number Diff line number Diff line Loading @@ -12,7 +12,9 @@ use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException; use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\ORMException; use Oscar\Entity\ActivityDate; use Oscar\Entity\ActivityDateRepository; use Oscar\Entity\DateType; use Oscar\Entity\DateTypeRepository; use Oscar\Exception\OscarException; use Oscar\Form\DateTypeForm; use Oscar\Provider\Privileges; Loading @@ -25,14 +27,27 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser { use UseOscarUserContextServiceTrait; /** * @return DateTypeRepository * @throws \Doctrine\ORM\Exception\NotSupported */ protected function getDateTypeRepository() : DateTypeRepository { return $this->getEntityManager()->getRepository(DateType::class); } /** * @return ActivityDateRepository * @throws \Doctrine\ORM\Exception\NotSupported */ protected function getActivityDateRepository() : ActivityDateRepository { return $this->getEntityManager()->getRepository(ActivityDate::class); } public function indexAction() { $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_MILESTONETYPE_MANAGE); $entities = $this->getEntityManager()->getRepository(DateType::class)->allArray(); return [ 'entities' => $entities 'entities' => $this->getDateTypeRepository()->allArray() ]; } Loading Loading @@ -83,13 +98,9 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser public function deleteAction(): Response { $id = $this->params()->fromRoute('id'); $dateType = $this->getEntityManager()->getRepository(DateType::class)->find($id); $dateType = $this->getDateTypeRepository()->find($id); $jalons = $this->getEntityManager()->getRepository(ActivityDate::class)->findBy( [ 'type' => $dateType ] ); $jalons = $this->getActivityDateRepository()->findBy(['type' => $dateType]); if (count($jalons) > 0) { throw new OscarException("Impossible de supprimer un type de jalon utilisé dans les activités"); Loading @@ -113,7 +124,7 @@ class DateTypeController extends AbstractOscarController implements UseOscarUser */ public function editAction(): ViewModel { $entity = $this->getEntityManager()->getRepository(DateType::class)->find($this->params()->fromRoute('id')); $entity = $this->getDateTypeRepository()->find($this->params()->fromRoute('id')); $rolesCheck = $entity->getRoles(); $arrayRoles = []; foreach ($rolesCheck as $role) { Loading
module/Oscar/src/Oscar/Entity/DateType.php +55 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,22 @@ class DateType implements ITrackable */ private $description; /** * Message spécifique pour le mail. * * @var string * @ORM\Column(type="string", nullable=true) */ private ?string $emailMessage = ""; /** * Mail activé. * * @var bool * @ORM\Column(type="boolean", nullable=false, options={"default"=false}) */ private bool $emailEnable = false; /** * Permet de configurer les féquences de rappel. * Loading Loading @@ -182,6 +198,42 @@ class DateType implements ITrackable return $this; } /** * @return string|null */ public function getEmailMessage(): ?string { return $this->emailMessage; } /** * @param string|null $emailMessage * @return $this */ public function setEmailMessage(?string $emailMessage): self { $this->emailMessage = $emailMessage; return $this; } /** * @return bool */ public function isEmailEnable(): bool { return $this->emailEnable; } /** * @param bool $emailEnable * @return $this */ public function setEmailEnable(bool $emailEnable): self { $this->emailEnable = $emailEnable; return $this; } function toArray() { return [ Loading @@ -190,7 +242,9 @@ class DateType implements ITrackable 'facet' => $this->getFacet(), 'finishable' => $this->isFinishable(), 'description' => $this->getDescription(), 'recursivity' => $this->getRecursivityArray() 'recursivity' => $this->getRecursivityArray(), 'emailEnable' => $this->isEmailEnable(), 'emailMessage' => $this->getEmailMessage(), ]; } Loading
module/Oscar/src/Oscar/Entity/DateTypeRepository.php +13 −2 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ namespace Oscar\Entity; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\ResultSetMapping; use Oscar\Exception\OscarException; class DateTypeRepository extends EntityRepository { Loading @@ -20,12 +21,14 @@ class DateTypeRepository extends EntityRepository $rsm->addScalarResult('id', 'id'); $rsm->addScalarResult('label', 'label'); $rsm->addScalarResult('description', 'description'); $rsm->addScalarResult('emailmessage', 'emailMessage'); $rsm->addScalarResult('emailenable', 'emailEnable'); $rsm->addScalarResult('recursivity', 'recursivity'); $rsm->addScalarResult('finishable', 'finishable'); $rsm->addScalarResult('facet', 'facet'); $rsm->addScalarResult('roles', 'roles'); $rsm->addScalarResult('used', 'used'); $sql = 'select d.id, d.label, d.description, $sql = 'select d.id, d.label, d.description, d.emailenable, d.emailmessage, d.finishable , d.recursivity, d.facet, count(a.id) as used, json_agg(distinct ur.role_id) as roles from datetype d left join activitydate a ON a.type_id = d.id Loading @@ -46,7 +49,15 @@ class DateTypeRepository extends EntityRepository } return $results; } catch (\Exception $e) { die($e->getMessage()); throw new OscarException($e->getMessage()); } } public function getMailablesMilestones() { $queryBuilder = $this->createQueryBuilder('d') ->select('d') ->where('d.emailEnable = true'); return $queryBuilder->getQuery()->getArrayResult(); } }
module/Oscar/src/Oscar/Form/DateTypeForm.php +30 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,34 @@ class DateTypeForm extends Form implements InputFilterProviderInterface 'type'=>Checkbox::class ]); $label = 'Mail dédié'; $this->add([ 'name' => 'emailEnable', 'options' => [ 'label' => $label, 'use_hidden_element' => false, 'checked_value' => '1', 'unchecked_value' => '0', ], 'attributes' => [ 'class' => 'form-control' ], 'type'=>Checkbox::class ]); $label = 'Message du mail'; $this->add([ 'name' => 'emailMessage', 'options' => [ 'label' => $label ], 'attributes' => [ 'class' => 'form-control', 'placeholder' => $label, ], 'type'=>'Textarea' ]); // Fréquence des notifications $label = 'Fréquence des notifications'; Loading Loading @@ -141,6 +169,8 @@ class DateTypeForm extends Form implements InputFilterProviderInterface 'description' => [ 'required' => false ], 'recursivity' => [ 'required' => false ], 'finishable' => [ 'required' => false ], 'emailEnable' => [ 'required' => false ], 'emailMessage' => [ 'required' => false ], 'roles' => ['required' => false], ]; } Loading