ReconversionMonaPrestatairesCommand.php 4.59 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
<?php

declare(strict_types=1);

namespace App\Command;

use App\Entity\GlobalParameter;
use App\Entity\Prestataire;
use App\Entity\Reconversion;
use App\Entity\Siege;
use App\Enum\MoyenEnum;
use App\Enum\ReconversionFrequencyEnum;
use App\Utils\CustomEntityManager;
use App\Utils\OperationUtils;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Twig\Environment;

/**
 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
 */
class ReconversionMonaPrestatairesCommand extends Command
{
27 28 29 30

    //Les reconversions doivent avoir lieu les dimanches soir qui précèdent les 14 et 28.
    // On utilise les crons suivants :

Yvon committed
31 32 33 34
    //15 23 * * 0 kohinos [ "$(date +\%d)" -ge 08 -a "$(date +\%d)" -le 14 ] && php /home/kohinos/kohinos/bin/console kohinos:ssa:reconversion-prestataires twice_a_month
    //15 23 * * 0 kohinos [ "$(date +\%d)" -ge 22 -a "$(date +\%d)" -le 28 ] && php /home/kohinos/kohinos/bin/console kohinos:ssa:reconversion-prestataires twice_a_month
    //17 23 * * 0 kohinos [ "$(date +\%d)" -ge 22 -a "$(date +\%d)" -le 28 ] && php /home/kohinos/kohinos/bin/console kohinos:ssa:reconversion-prestataires once_a_month
    //19 23 * 1,3,5,7,9,11 0 kohinos [ "$(date +\%d)" -ge 22 -a "$(date +\%d)" -le 28 ] && php /home/kohinos/kohinos/bin/console kohinos:ssa:reconversion-prestataires once_every_two_month
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

    protected static $defaultName = 'kohinos:ssa:reconversion-prestataires';

    protected $em;
    protected $mailer;
    protected $templating;
    protected $io;
    protected $param;
    protected $operationUtils;

    public function __construct(
        CustomEntityManager $em,
        \Swift_Mailer $mailer,
        Environment $templating,
        OperationUtils $operationUtils
    ) {
        $this->em = $em;
        $this->mailer = $mailer;
        $this->templating = $templating;
        $this->operationUtils = $operationUtils;
        parent::__construct();
    }

    protected function configure()
    {
        $this
            ->setDescription('SSA : générer des flux de reconversion conformément à la fréquence configurée par les prestataires')
            ->addArgument('reconvmode', InputArgument::REQUIRED, 'Restriction aux seuls prestataires ayant opté pour la fréquence choisie.');
    }

    /**
     * @param InputInterface  $input
     * @param OutputInterface $output
     *
     * @return int
     */
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->io = new SymfonyStyle($input, $output);
        $reconvmode = $input->getArgument('reconvmode');

        if (!in_array($reconvmode, ReconversionFrequencyEnum::getAvailableTypes())) {
            $this->io->error("L'argument " . $reconvmode . ' est invalide. Choix possibles : '
                . implode(', ', ReconversionFrequencyEnum::getAvailableTypes()));
            return 1;
        }

        $this->io->title('START. Reconversion pour les prestataires de compte positif ayant choisi la fréquence : ' . $reconvmode);

        $prestas = $this->em->getRepository(Prestataire::class)->findBy(['reconversionFrequency' => $reconvmode]);
        foreach ($prestas as $p) {
            $balance = $p->getEmlcAccount()->getBalance();
            if ($balance <= 0) {
                continue;
            }
            /* @var Prestataire $p */
            $flux = new Reconversion();
            //do not fill operator as it is automated process $entity->setOperateur();
            $flux->setExpediteur($p);
            $flux->setMontant($balance); //montant maximal
            $flux->setDestinataire($this->em->getRepository(Siege::class)->getTheOne());
            $flux->setMoyen(MoyenEnum::MOYEN_AUTRE);
            $flux->setTauxreconversion(
                !empty($p->getTauxreconversion()) ?
                    $p->getTauxreconversion()
                    : floatval(
                        $this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::RECONVERSION_PRESTATAIRE)
                    )
            );
            $now = new \DateTime();
            $flux->setReference(
                'Reconversion automatique du ' . $now->format('d/m/Y')
                . " pour le mode de reconversion " . $reconvmode
            );
            $this->operationUtils->executeOperations($flux);
        }

        $this->io->success('End');

        $memoryUsage = memory_get_usage(true) / 1024 / 1024;
        $this->io->text("Batch finished with memory: ${memoryUsage}M");

        return 0;
    }
}