Commit 071c3a50 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Fix/Up : Les jalons MAILS (jalon avec une option pour envoyer des mails...

Fix/Up : Les jalons MAILS (jalon avec une option pour envoyer des mails dédiés) prennent en compte la progression pour adapter le message envoyé. La variable URL a été ajoutée pour permettre d'ajouter un lien aux messages. TODO vérifier les sauts de ligne dans les gabarits
parent e358b8bc
Loading
Loading
Loading
Loading
Loading
+3 −1
Changes for module/Oscar/src/Oscar/Entity/ActivityDate.php: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -411,7 +411,7 @@ class ActivityDate implements ITrackable
            $tag = "todo";
            if ($this->isFinished()) {
                $tag = "done";
            } elseif ($this->isLate()) {
            } elseif ($this->isLate($now)) {
                $tag = "late";
            }

@@ -521,11 +521,13 @@ class ActivityDate implements ITrackable
    public function getEmailBody(array $variables = [], DateTime $dateReference = new DateTime()) :string
    {
        $out = $this->getType()->getEmailMessage();
        if( $this->isFinishable() && !$this->isFinished() ) {
            if ($this->isLate($dateReference)) {
                $out = $this->getType()->getEmailMessageLate();
            } elseif ($this->isFutur($dateReference)) {
                $out = $this->getType()->getEmailMessagePredicted();
            }
        }
        if( !$out ){
            $out = "Bonjour {PERSONNE},\n\n"
                . "Le jalon {JALON} arrive à échéance le {DATE}.";
+1 −1
Changes for module/Oscar/src/Oscar/Entity/OrganizationRepository.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -344,7 +344,7 @@ class OrganizationRepository extends EntityRepository implements IConnectedRepos
        $organization = $this->find($organizationId);
        $out[$organization->getId()] = $organization;
        if ($organization->hasParent()) {
            foreach ($organization->hasParent() as $org) {
            foreach ($organization->getParents() as $org) {
                $out[$org->getId()] = $org;
            }
        }
+63 −20
Changes for module/Oscar/src/Oscar/Service/MilestoneService.php: 63 added lines, 20 removed lines.
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ namespace Oscar\Service;

use Doctrine\ORM\Query;
use Interop\Container\ContainerInterface;
use Laminas\Uri\Http;
use Moment\Moment;
use Oscar\Entity\Activity;
use Oscar\Entity\ActivityDate;
@@ -30,16 +31,18 @@ use Oscar\Traits\UseLoggerService;
use Oscar\Traits\UseLoggerServiceTrait;
use Oscar\Traits\UseNotificationService;
use Oscar\Traits\UseNotificationServiceTrait;
use Oscar\Traits\UseOscarConfigurationService;
use Oscar\Traits\UseOscarConfigurationServiceTrait;
use Oscar\Traits\UseOscarUserContextService;
use Oscar\Traits\UseOscarUserContextServiceTrait;
use Oscar\Utils\DateTimeUtils;
use Symfony\Component\Console\Style\SymfonyStyle;

class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUserContextService,
                                  UseNotificationService, UseActivityLogService
                                  UseNotificationService, UseActivityLogService, UseOscarConfigurationService
{

    use UseEntityManagerTrait, UseLoggerServiceTrait, UseOscarUserContextServiceTrait, UseNotificationServiceTrait, UseActivityLogServiceTrait;
    use UseEntityManagerTrait, UseLoggerServiceTrait, UseOscarUserContextServiceTrait, UseNotificationServiceTrait, UseActivityLogServiceTrait, UseOscarConfigurationServiceTrait;


    private $serviceContainer;
@@ -277,8 +280,36 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
        return $milestone;
    }


    private $_router;

    protected function makeMailUrl(string $name, array $params = []) :string {

        if( $this->_router === null ){
            $urlAbsolute = $this->getOscarConfigurationService()->getUrlObsolute();
            $uri = new Http();
            $scheme = parse_url($urlAbsolute, PHP_URL_SCHEME);
            $uri->setScheme($scheme);
            $uri->setHost(parse_url($urlAbsolute, PHP_URL_HOST));
            $uri->setPort(parse_url($urlAbsolute, PHP_URL_PORT));
            $router = $this->getHttpRouter();
            $router->setRequestUri($uri);
            $router->setBaseUrl('/');
            $this->_router = $router;
        }

        return $router->assemble(
            $params,
            ['name' => $name, 'force_canonical' => true]
        );
    }



    public function mailMiltonesMailables( ?string $dateRef = null, ?SymfonyStyle $io = null ) :void {

        //die($this->makeMailUrl("contract/show", ['id' => 1]));

        // Date de référence
        $dateReference = new \DateTime($dateRef);

@@ -286,15 +317,14 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
        Moment::setLocale('fr_FR');

        $ioMsg = function($str) use ($io) {
          if ($io !== null) {
                $io->writeln($str);
          }
            $io?->info($str);
        };

        /** @var MailingService $mailingService */
        $mailingService = $this->getServiceContainer()->get(MailingService::class);

        $ioMsg("Mails pour " . $dateReference->format('Y-m-d'));
        $this->getLoggerService()->debug("#########################################");
        $this->getLoggerService()->debug("### Calcule des Mails au " . $dateReference->format('Y-m-d') . " ###");

        // Récupérer la liste des types de jalons
        $datetypes = $this->getDateTypeRepository()->getMailablesMilestones();
@@ -308,13 +338,11 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
            ->where('ad.type = :datetype_id AND ad.dateStart IN(:dates)')
            ->orWhere('ad.type = :datetype_id AND ad.dateStart < :dateref AND (ad.finished < 100 OR ad.finished IS NULL)');

        // Logique : Calculer la date de rappel pour chaque type de jalon en tenant compte de la récursivité
        $dateRef = $dateReference->format('Y-m-d');
        foreach ($datetypes as $datetype) {

            $ioMsg("\n#################################### " . $datetype['label'] . " ####################################");

            $this->getLoggerService()->debug("# Type: " . $datetype['label']);
            $queryBuilder = $milestoneQueryStandard;

            // Paramètres de la requête
            $parameters = [
                'datetype_id' => $datetype['id'],
@@ -325,14 +353,15 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
            if( $datetype['recursivity'] ){
                foreach (explode(',', $datetype['recursivity']) as $day){
                    $dayAdded = (new \DateTime($dateRef))->modify("+$day days");
                    $parameters['dates'][] = $dayAdded->format("Y-m-d");
                    $dayAddedStr = $dayAdded->format("Y-m-d");
                    $this->getLoggerService()->debug("J+$day : $dayAddedStr");
                    $parameters['dates'][] = $dayAddedStr;
                }
            }

            // Si le jalon doit être terminé, on ajoute une contrainte
            // sur le champ 'finished'
            if( $datetype['finishable'] ){
                $io->writeln("Doit être terminé");
                $queryBuilder = $milestoneQueryFinishable;
                $parameters['dateref'][] = $dateRef;
            }
@@ -342,11 +371,13 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs

            /** @var ActivityDate $milestone */
            foreach ($milestones as $milestone) {

                $moment = new Moment($milestone->getDateStartStr());
                $milestoneDate = $moment->format($formatDate);
                $milestoneTag = $milestone->getTagTimeStr($dateReference);
                $milestoneLabel = $milestone->getType()->getLabel();
                $milestoneActivityUrl = $this->makeMailUrl("contract/show", ['id' => $milestone->getActivity()->getId()]);

                $this->getLoggerService()->debug("    - $milestoneLabel ($milestoneDate) - $milestoneTag");
                if($moment->format('Y-m-d') == $dateReference->format('Y-m-d')){
                    $milestoneSince = "aujourd'hui";
                } else {
@@ -369,10 +400,12 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
                    $paramBody = [
                        '{PERSONNE}' => $person->getFullname(),
                        '{CONTRAT}' => $milestone->getActivity()->__toString(),
                        '{ACTIVITY}' => $milestone->getActivity()->__toString(),
                        '{JALON}' => $milestoneLabel,
                        '{DATESIMPLE}' => $milestoneDate,
                        '{DATE}' => $milestoneDateFull,
                        '{TAG}' => $milestoneTag
                        '{TAG}' => $milestoneTag,
                        '{URL}' => $milestoneActivityUrl,
                    ];

                    $bodyTemplate = $milestone->getEmailBody([], $dateReference);
@@ -385,15 +418,9 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
                    $fullname = $person->getFullname();
                    $mail->addTo($email, $fullname);
                    $mailingService->send($mail);
//                    echo " - $fullname ($email)\n";


                }
            }

        }

        return;
    }

    /**
@@ -665,4 +692,20 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
    {
        return $this->getEntityManager()->getRepository(DateType::class);
    }

    private $httpRouter;
    public function setHttpRouter(mixed $httpRouter)
    {
        $this->httpRouter = $httpRouter;
    }

    /**
     * @return mixed
     */
    public function getHttpRouter()
    {
        return $this->httpRouter;
    }


}
 No newline at end of file
+2 −0
Changes for module/Oscar/src/Oscar/Service/MilestoneServiceFactory.php: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ class MilestoneServiceFactory implements FactoryInterface
        $s->setEntityManager($container->get(EntityManager::class));
        $s->setNotificationService($container->get(NotificationService::class));
        $s->setActivityLogService($container->get(ActivityLogService::class));
        $s->setHttpRouter($container->get('HttpRouter'));
        $s->setOscarConfigurationService($container->get(OscarConfigurationService::class));
        return $s;
    }
}
 No newline at end of file
+5 −0
Changes for module/Oscar/src/Oscar/Service/OscarConfigurationService.php: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -1233,4 +1233,9 @@ class OscarConfigurationService implements ServiceLocatorAwareInterface
        }
        return array_key_exists($text, $texts) ?$texts[$text]: $text;
    }

    public function getUrlObsolute() :string
    {
        return $this->getConfiguration('urlAbsolute');
    }
}
Loading