Commit 66f5ac1e authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Modèle : ok

- Form / Admin : OK
- Commandes en cours
parent 1b762638
Loading
Loading
Loading
Loading
Loading
+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
+22 −11
Original line number Diff line number Diff line
@@ -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;
@@ -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()
        ];
    }

@@ -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");
@@ -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) {
+55 −1
Original line number Diff line number Diff line
@@ -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.
     *
@@ -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 [
@@ -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(),
        ];
    }

+13 −2
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ namespace Oscar\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\ResultSetMapping;
use Oscar\Exception\OscarException;

class DateTypeRepository extends EntityRepository
{
@@ -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
@@ -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();
    }
}
+30 −0
Original line number Diff line number Diff line
@@ -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';
@@ -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