src/Service/OrganizationUtils.php line 748

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Enum\DocumentStatusEnum;
  4. use App\Enum\DocumentTypeOrganizationEnum;
  5. use App\Enum\DocumentTypeUserEnum;
  6. use App\Enum\HeadQuartersEnum;
  7. use App\Enum\InvoiceStatusEnum;
  8. use App\Enum\LegalRepresentativeQualityTypeEnum;
  9. use App\Enum\LegalStatusTypeEnum;
  10. use App\Enum\LetterTypeEnum;
  11. use App\Enum\OrganizationStatusEnum;
  12. use App\Enum\PappersDocumentTypeOrganizationEnum;
  13. use App\Enum\PersonTypeEnum;
  14. use App\Enum\ProductKeyEnum;
  15. use App\Enum\SignatoryEnum;
  16. use App\Traits\SentryNotifyTrait;
  17. use App\Utils\InvoiceUtils;
  18. use App\Utils\QuoteUtils;
  19. use Doctrine\Common\Collections\ArrayCollection;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Doctrine\ORM\OptimisticLockException;
  22. use Doctrine\ORM\ORMException;
  23. use Evo\Infrastructure\MappingORM\Document;
  24. use Evo\Infrastructure\MappingORM\LegalRepresentative;
  25. use Evo\Infrastructure\MappingORM\Letter;
  26. use Evo\Infrastructure\MappingORM\Organization;
  27. use Evo\Infrastructure\MappingORM\Person;
  28. use Evo\Infrastructure\MappingORM\Subscription;
  29. use Evo\Infrastructure\PdfGenerator\PathGenerator;
  30. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  31. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  32. use Symfony\Component\HttpFoundation\UrlHelper;
  33. use Symfony\Component\HttpKernel\Exception\HttpException;
  34. use Symfony\Contracts\Translation\TranslatorInterface;
  35. class OrganizationUtils
  36. {
  37.     use SentryNotifyTrait;
  38.     public const SERVICE_NAME '[ORGANIZATION UTILS] :: ';
  39.     public const ONE_MONTH '+1 months';
  40.     public const THREE_MONTHS '+3 months';
  41.     public const TWELVE_MONTHS '+12 months';
  42.     private TranslatorInterface $translator;
  43.     private UrlHelper $urlHelper;
  44.     private DocumentUtils $documentUtils;
  45.     private InvoiceUtils $invoiceUtils;
  46.     private QuoteUtils $quoteUtils;
  47.     private LegalRepresentativeUtils $legalRepresentativeUtils;
  48.     private LegalRepresentativeChecker $legalRepresentativeChecker;
  49.     private ParameterBagInterface $params;
  50.     private GocardlessAPI $gocardlessAPI;
  51.     private SessionInterface $session;
  52.     private EntityManagerInterface $em;
  53.     private UserChecker $userChecker;
  54.     private FrontAppAPI $frontAppAPI;
  55.     private PersonUtils $personUtils;
  56.     private LeadUtils $leadUtils;
  57.     private PappersService $pappersService;
  58.     private SubscriptionUtils $subscriptionUtils;
  59.     private DocumentFilesService $documentFilesService;
  60.     public function __construct(
  61.         TranslatorInterface $translator,
  62.         UrlHelper $urlHelper,
  63.         ParameterBagInterface $params,
  64.         GocardlessAPI $gocardlessAPI,
  65.         SessionInterface $session,
  66.         DocumentUtils $documentUtils,
  67.         InvoiceUtils $invoiceUtils,
  68.         QuoteUtils $quoteUtils,
  69.         LegalRepresentativeChecker $legalRepresentativeChecker,
  70.         LegalRepresentativeUtils $legalRepresentativeUtils,
  71.         LeadUtils $leadUtils,
  72.         UserChecker $userChecker,
  73.         EntityManagerInterface $em,
  74.         PersonUtils $personUtils,
  75.         FrontAppAPI $frontAppAPI,
  76.         PappersService $pappersService,
  77.         SubscriptionUtils $subscriptionUtils,
  78.         DocumentFilesService $documentFilesService
  79.     ) {
  80.         $this->translator $translator;
  81.         $this->urlHelper $urlHelper;
  82.         $this->params $params;
  83.         $this->gocardlessAPI $gocardlessAPI;
  84.         $this->session $session;
  85.         $this->documentUtils $documentUtils;
  86.         $this->invoiceUtils $invoiceUtils;
  87.         $this->quoteUtils $quoteUtils;
  88.         $this->legalRepresentativeUtils $legalRepresentativeUtils;
  89.         $this->userChecker $userChecker;
  90.         $this->legalRepresentativeChecker $legalRepresentativeChecker;
  91.         $this->em $em;
  92.         $this->personUtils $personUtils;
  93.         $this->frontAppAPI $frontAppAPI;
  94.         $this->leadUtils $leadUtils;
  95.         $this->pappersService $pappersService;
  96.         $this->subscriptionUtils $subscriptionUtils;
  97.         $this->documentFilesService $documentFilesService;
  98.     }
  99.     /**
  100.      * @param bool $create
  101.      * @param bool $domicile
  102.      *
  103.      * @deprecated
  104.      */
  105.     public function getOrganizationMandatoryDocuments($status$create true$domicile true): array
  106.     {
  107.         $mandatoryDocs = [];
  108.         if ($create) {
  109.             $mandatoryDocs = [
  110.                 DocumentTypeUserEnum::NIC_RECTO,
  111.                 DocumentTypeUserEnum::NIC_VERSO,
  112.                 DocumentTypeUserEnum::NIC_RECTO_VERSO,
  113.                 DocumentTypeUserEnum::ADDRESS_PROOF,
  114.             ];
  115.         }
  116.         $list = [];
  117.         foreach ($mandatoryDocs as $docType) {
  118.             if (in_array($docType$mandatoryDocs)) {
  119.                 $list[$docType] = $this->translator->trans(DocumentTypeOrganizationEnum::getReadableValue($docType));
  120.             }
  121.         }
  122.         return $list;
  123.     }
  124.     public function checkStatusDomiciliation(Organization $organization): ?string
  125.     {
  126.         if (!$organization->getCreatedAt()) {
  127.             return null;
  128.         }
  129.         $status null;
  130.         $now date('Y-m-d');
  131.         $dateRegister $organization->getCreatedAt()->format('Y-m-d');
  132.         $domiciliationDate $organization->getDomiciliationStartDate();
  133.         $startingDate $domiciliationDate $domiciliationDate->getTimestamp() : null;
  134.         $domiciliationDateTreeMonth $startingDate date('Y-m-d'strtotime(self::THREE_MONTHS$startingDate)) : null;
  135.         $statusException = [
  136.             OrganizationStatusEnum::CANCELLED,
  137.             OrganizationStatusEnum::PRE_CANCELLATION,
  138.             OrganizationStatusEnum::LOST,
  139.             OrganizationStatusEnum::DELETED,
  140.         ];
  141.         if (
  142.             $domiciliationDateTreeMonth &&
  143.             OrganizationStatusEnum::NEW_PAYMENT === $organization->getStatus()
  144.         ) {
  145.             if (
  146.                 $domiciliationDateTreeMonth $now &&
  147.                 (=== $organization->getBal() || null === $organization->getBal())
  148.             ) {
  149.                 return OrganizationStatusEnum::LOST;
  150.             }
  151.         }
  152.         $isPastDomiciliationDate $domiciliationDate && $domiciliationDate->format('Y-m-d') < $now;
  153.         $isNotNewDomiciliationOrInException = !$organization->getIsNewDomiciliation() || in_array($organization->getStatus(), $statusExceptiontrue);
  154.         if (
  155.             ($isPastDomiciliationDate && $isNotNewDomiciliationOrInException) ||
  156.             (!$domiciliationDate && $isNotNewDomiciliationOrInException)
  157.         ) {
  158.             return null;
  159.         }
  160.         $documentKBISCancellation $this->documentUtils->getDocument(DocumentTypeOrganizationEnum::KBIS_CANCELLATION$organization);
  161.         $documentKBISTransfer $this->documentUtils->getDocument(DocumentTypeOrganizationEnum::KBIS_TRANSFERT$organization);
  162.         if (HeadQuartersEnum::CONTRACT_DOMICILIATION === $organization->getHeadQuartersAddressType()) {
  163.             $isKBISCancellationApproved $documentKBISCancellation && DocumentStatusEnum::APPROVED === $documentKBISCancellation->getStatus();
  164.             $isKBISTransferApproved $documentKBISTransfer && DocumentStatusEnum::APPROVED === $documentKBISTransfer->getStatus();
  165.             if ($isKBISCancellationApproved || $isKBISTransferApproved) {
  166.                 return OrganizationStatusEnum::PRE_CANCELLATION;
  167.             }
  168.         } elseif ($documentKBISCancellation || $documentKBISTransfer) {
  169.             return OrganizationStatusEnum::PRE_CANCELLATION;
  170.         }
  171.         $haveExpiredDocument $this->documentUtils->hasExpiredDocument($organization);
  172.         if ($haveExpiredDocument &&
  173.             in_array($organization->getStatus(), [OrganizationStatusEnum::DOCS_MISSINGOrganizationStatusEnum::OKOrganizationStatusEnum::DOCS_EXPIRED], true)) {
  174.             return OrganizationStatusEnum::DOCS_EXPIRED;
  175.         }
  176.         $domiciliationContract $this->documentUtils->getDocument(DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT$organization);
  177.         $domiciliationCertificate $this->documentUtils->getDocument(DocumentTypeOrganizationEnum::DOMICILIATION_CERTIFICATE$organization);
  178.         $invoiceRegister $this->invoiceUtils->checkRegisterInvoice($organization);
  179.         $quoteRegister $this->quoteUtils->checkRegisterQuote($organization);
  180.         if ($domiciliationCertificate && DocumentStatusEnum::APPROVED === $domiciliationCertificate->getStatus()) {
  181.             if ($this->checkedMissingDocs($organization)) {
  182.                 $status OrganizationStatusEnum::OK;
  183.             } else {
  184.                 $status OrganizationStatusEnum::DOCS_MISSING;
  185.                 $this->updateInvoiceGenerationDate($organizationfalse);
  186.             }
  187.         } else {
  188.             $date date('Y-m-d'strtotime(self::THREE_MONTHSstrtotime($dateRegister)));
  189.             if ($date $now
  190.                 && (!$invoiceRegister || $this->invoiceUtils->isFullRepaid($invoiceRegister))
  191.                 && !$domiciliationCertificate
  192.                 && (!$domiciliationContract || !$domiciliationContract->getSignedBy())) {
  193.                 $status OrganizationStatusEnum::LOST;
  194.             } elseif (
  195.                 (($quoteRegister && InvoiceStatusEnum::PAID === $quoteRegister->getInvoice()->getStatus())
  196.                     || (
  197.                         $invoiceRegister && InvoiceStatusEnum::PAID === $invoiceRegister->getStatus()
  198.                         && !$domiciliationCertificate
  199.                     )) && !in_array($organization->getStatus(), $statusExceptiontrue)
  200.             ) {
  201.                 $status OrganizationStatusEnum::NEW_PAYMENT;
  202.             }
  203.         }
  204.         if (null !== $status && ($status === $organization->getStatus())) {
  205.             $status null;
  206.         }
  207.         return $status;
  208.     }
  209.     public function getGeneratedDocuments(Organization $organization): array
  210.     {
  211.         $docs = [];
  212.         foreach ($organization->getDocuments() as $document) {
  213.             if (in_array($document->getType(), $this->getDocsToGenerate($organization), true)) {
  214.                 $docs[$document->getType()] = [
  215.                     $this->translator->trans(DocumentTypeOrganizationEnum::getReadableValue($document->getType())) => $this->urlHelper->getAbsoluteUrl($document->getPath()),
  216.                 ];
  217.             }
  218.         }
  219.         return $docs;
  220.     }
  221.     /**
  222.      * Retourne la liste des documents Ã  générer.
  223.      */
  224.     public function getDocsToGenerate(Organization $organizationbool $generateContrat true): array
  225.     {
  226.         $docs = [];
  227.         if (null === $this->getAllLegalRepresentatives($organization)) {
  228.             return [];
  229.         }
  230.         if ($this->documentUtils->checkGenerateDNC($organization0)) {
  231.             $docs[] = DocumentTypeOrganizationEnum::DNC1;
  232.         }
  233.         if ($this->documentUtils->checkGenerateDNC($organization1)) {
  234.             $docs[] = DocumentTypeOrganizationEnum::DNC2;
  235.         }
  236.         if ($this->documentUtils->checkGenerateHQOwner($organization)) {
  237.             $docs[] = DocumentTypeOrganizationEnum::HQ_OWNER;
  238.         }
  239.         if ($this->documentUtils->checkGeneratePowerOfAttorney($organization)) {
  240.             $docs[] = DocumentTypeOrganizationEnum::KOAH_POWER_OF_ATTORNEY;
  241.         }
  242.         if ($this->documentUtils->checkGenerateSubscribersList($organization)) {
  243.             $docs[] = DocumentTypeOrganizationEnum::SUBSCRIBERS_LIST;
  244.         }
  245.         if ($this->checkGenerateDomiciliationContrat($organization) && $generateContrat) {
  246.             $docs[] = DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT;
  247.         }
  248.         if ($this->checkGenerateCertificateDomiciliation($organization)) {
  249.             $docs[] = DocumentTypeOrganizationEnum::DOMICILIATION_CERTIFICATE;
  250.         }
  251.         if (in_array($organization->getStatus(), [OrganizationStatusEnum::PRE_CANCELLATIONOrganizationStatusEnum::CANCELLED], true)) {
  252.             $docs[] = DocumentTypeOrganizationEnum::NOTICE_OF_TERMINATION;
  253.         }
  254.         return $docs;
  255.     }
  256.     public function getOrganizationRIB(Organization $organization)
  257.     {
  258.         $documents $organization->getDocuments();
  259.         foreach ($documents as $document) {
  260.             if (DocumentTypeOrganizationEnum::RIB === $document->getType()) {
  261.                 return $document;
  262.             }
  263.         }
  264.         return null;
  265.     }
  266.     /**
  267.      * Récupérer les représentants legaux d'une organisation selon son statut juridique.
  268.      */
  269.     public function getAllLegalRepresentatives(Organization $organization): ?array
  270.     {
  271.         $aLegalStatus $this->legalRepresentativeChecker->getByLegalStatus();
  272.         $aLegalRepresentativeTypes $this->getAvailableLegalRepresentativeTypes($organization->getLegalStatus());
  273.         if (!isset($aLegalStatus[$organization->getLegalStatus()])) {
  274.             return null;
  275.         }
  276.         $aLegalRepresentative = [];
  277.         foreach ($organization->getLegalRepresentatives() as $legalRepresentative) {
  278.             /** @var Person $person */
  279.             $person $legalRepresentative->getPerson();
  280.             if ($person) {
  281.                 $type $legalRepresentative->getPerson()->getType();
  282.                 $quality $legalRepresentative->getQuality();
  283.                 if ($type &&
  284.                     $quality &&
  285.                     in_array($type$aLegalRepresentativeTypestrue) &&
  286.                     array_key_exists($quality$aLegalStatus[$organization->getLegalStatus()]) &&
  287.                     LegalRepresentativeQualityTypeEnum::ASSOCIE_SEUL !== $quality
  288.                 ) {
  289.                     $aLegalRepresentative[] = $legalRepresentative;
  290.                 }
  291.             }
  292.         }
  293.         $this->legalRepresentativeUtils->sortByQuality($aLegalRepresentative);
  294.         if (!in_array($organization->getLegalStatus(), [LegalStatusTypeEnum::SASLegalStatusTypeEnum::SASU], true)
  295.         ) {
  296.             $aLegalRepresentative array_reverse($aLegalRepresentative);
  297.         }
  298.         return (empty($aLegalRepresentative)) ? null array_values($aLegalRepresentative);
  299.     }
  300.     /**
  301.      * @param string $legalStatus
  302.      */
  303.     public function getAvailableLegalRepresentativeTypes($legalStatus): array
  304.     {
  305.         $aLegalStatus = [
  306.             LegalStatusTypeEnum::SAS,
  307.             LegalStatusTypeEnum::SASU,
  308.             LegalStatusTypeEnum::SCCV,
  309.             LegalStatusTypeEnum::SCI,
  310.             LegalStatusTypeEnum::CIVIL_ORGANISATION,
  311.             LegalStatusTypeEnum::SNC,
  312.         ];
  313.         if (in_array($legalStatus$aLegalStatustrue)) {
  314.             $legalRepresentativeTypes = [
  315.                 PersonTypeEnum::PHYSICAL,
  316.                 PersonTypeEnum::LEGAL,
  317.             ];
  318.         } else {
  319.             $legalRepresentativeTypes = [
  320.                 PersonTypeEnum::PHYSICAL,
  321.             ];
  322.         }
  323.         return $legalRepresentativeTypes;
  324.     }
  325.     public function haveValidateDocuments(int $orgaId): ?array
  326.     {
  327.         $lrRepo $this->em->getRepository(LegalRepresentative::class);
  328.         return $lrRepo->hasDocToValided($orgaId);
  329.     }
  330.     public function haveKbisCancellationToApprove(int $orgaId): ?array
  331.     {
  332.         $docRepo $this->em->getRepository(Document::class);
  333.         return $docRepo->hasKbisCancellationToApprove($orgaId);
  334.     }
  335.     public function haveContratToSign(int $orgaId): ?array
  336.     {
  337.         $docRepo $this->em->getRepository(Document::class);
  338.         return $docRepo->hasContractSign($orgaId);
  339.     }
  340.     public function getLegalRepresentativeOfOrganization(Organization $organization): ?Person
  341.     {
  342.         /** @var ArrayCollection $legalRepresentatives */
  343.         $legalRepresentatives $organization->getLegalRepresentatives();
  344.         if ($legalRepresentatives->count() > 0) {
  345.             /** @var LegalRepresentative $legalRepresentative */
  346.             foreach ($legalRepresentatives as $legalRepresentative) {
  347.                 $person $legalRepresentative->getPerson();
  348.                 if ((null !== $person) && (PersonTypeEnum::PHYSICAL === $person->getType())) {
  349.                     return $person;
  350.                 }
  351.             }
  352.         }
  353.         return null;
  354.     }
  355.     public function checkGenerateDomiciliationContrat(Organization $organization): bool
  356.     {
  357.         if (!$organization
  358.             || !$organization->getIsNewDomiciliation()
  359.             || !SubscriptionUtils::getDomSubscription($organization)
  360.             || !$organization->getDomiciliationStartDate()
  361.             || == count($organization->getLegalRepresentatives())
  362.             || $this->documentUtils->isSignedDocument(
  363.                 DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT,
  364.                 $organization,
  365.                 [SignatoryEnum::BOTHSignatoryEnum::SIGNED_CLIENT]
  366.             )
  367.             || OrganizationStatusEnum::DOCS_MISSING === $organization->getStatus()) {
  368.             return false;
  369.         }
  370.         /*
  371.          * Checked if domiciliation certificate is approved
  372.          */
  373.         foreach ($organization->getDocuments() as $document) {
  374.             if (DocumentTypeOrganizationEnum::DOMICILIATION_CERTIFICATE === $document->getType() &&
  375.                 DocumentStatusEnum::APPROVED === $document->getStatus()) {
  376.                 return false;
  377.             }
  378.         }
  379.         if ($organization->getAddress() || null !== $organization->getStore()) {
  380.             $legalRepresentative $this->getLegalRepresentativeLoop($organization);
  381.             if (!empty($legalRepresentative)) {
  382.                 $legalRepresentative $legalRepresentative[0];
  383.                 if (null === $legalRepresentative->getPhoneNumber()) {
  384.                     return false;
  385.                 }
  386.             } else {
  387.                 return false;
  388.             }
  389.             $subscription SubscriptionUtils::getDomSubscription($organization);
  390.             if (null !== $subscription) {
  391.                 $pack $this->subscriptionUtils->getPackUniqueKey($subscription);
  392.                 if (null !== $pack) {
  393.                     return true;
  394.                 }
  395.             }
  396.         }
  397.         return false;
  398.     }
  399.     public function getLegalRepresentativeLoop(Organization $organization): ?array
  400.     {
  401.         foreach ($organization->getLegalRepresentatives() as $legalRepresentative) {
  402.             if (in_array($legalRepresentative->getQuality(), [LegalRepresentativeQualityTypeEnum::CHAIRMANLegalRepresentativeQualityTypeEnum::MANAGER], true)
  403.                 && null !== $legalRepresentative->getPerson()
  404.             ) {
  405.                 return [$legalRepresentative];
  406.             }
  407.         }
  408.         return null;
  409.     }
  410.     public function checkGenerateCertificateDomiciliation(Organization $organization): bool
  411.     {
  412.         return OrganizationStatusEnum::NEW_PAYMENT === $organization->getStatus() &&
  413.         $this->checkApprovedDocument($organization) &&
  414.         !$this->documentUtils->hasDocument(DocumentTypeOrganizationEnum::DOMICILIATION_CERTIFICATE$organization);
  415.     }
  416.     public function checkApprovedDocument(Organization $organization): bool
  417.     {
  418.         $aDocs $this->documentUtils->getDocumentsTypes($organization->getDocuments());
  419.         if (empty($aDocs)) {
  420.             return false;
  421.         }
  422.         /*
  423.          * Vérification si contrat de domiciliation est signé
  424.          */
  425.         if (!$this->documentUtils->isSignedDocument(DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT$organization)) {
  426.             return false;
  427.         }
  428.         /*
  429.          * Validation RIB
  430.          */
  431.         if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::RIB$aDocs)) {
  432.             return false;
  433.         }
  434.         $aLegalStatus = [
  435.             LegalStatusTypeEnum::EURL,
  436.             LegalStatusTypeEnum::SARL,
  437.             LegalStatusTypeEnum::SNC,
  438.             LegalStatusTypeEnum::AUTO_ENTREPRENEUR,
  439.             LegalStatusTypeEnum::ASSOCIATION,
  440.             LegalStatusTypeEnum::SCI,
  441.             LegalStatusTypeEnum::SCCV,
  442.             LegalStatusTypeEnum::CIVIL_ORGANISATION,
  443.             LegalStatusTypeEnum::EIRL,
  444.             LegalStatusTypeEnum::EI,
  445.             LegalStatusTypeEnum::SELARL,
  446.             LegalStatusTypeEnum::SDE,
  447.             LegalStatusTypeEnum::BL,
  448.         ];
  449.         if (in_array($organization->getLegalStatus(), $aLegalStatustrue)) {
  450.             // check document for LR MANAGER et CO MANAGER
  451.             $hasLegalRepresentativeWithQualityManager $this->hasLegalRepresentativeWithQuality(LegalRepresentativeQualityTypeEnum::MANAGER$organization);
  452.             if ($hasLegalRepresentativeWithQualityManager) {
  453.                 $filter = [LegalRepresentativeQualityTypeEnum::MANAGERLegalRepresentativeQualityTypeEnum::CO_MANAGER];
  454.                 if ($this->documentUtils->hasInvalidDocument($organization$filter)) {
  455.                     return false;
  456.                 }
  457.             } else {
  458.                 return false;
  459.             }
  460.         } elseif (in_array($organization->getLegalStatus(), [LegalStatusTypeEnum::SASLegalStatusTypeEnum::SASU], true)) {
  461.             // check document for LR CHAIRMAN et GENERAL_MANAGER
  462.             $hasLegalRepresentativeWithQualityChairman $this->hasLegalRepresentativeWithQuality(LegalRepresentativeQualityTypeEnum::CHAIRMAN$organization);
  463.             if ($hasLegalRepresentativeWithQualityChairman) {
  464.                 $filter = [LegalRepresentativeQualityTypeEnum::CHAIRMANLegalRepresentativeQualityTypeEnum::GENERAL_MANAGER];
  465.                 if ($this->documentUtils->hasInvalidDocument($organization$filter)) {
  466.                     return false;
  467.                 }
  468.             }
  469.         } else {
  470.             return false;
  471.         }
  472.         return true;
  473.     }
  474.     public function hasLegalRepresentativeWithQuality($qualityOrganization $organization): bool
  475.     {
  476.         $legalRepresentatives $this->getAllLegalRepresentatives($organization);
  477.         foreach ($legalRepresentatives ?? [] as $legalRepresentative) {
  478.             if ($legalRepresentative->getQuality() === $quality) {
  479.                 return true;
  480.             }
  481.         }
  482.         return false;
  483.     }
  484.     public function statusChangedActions(string $newStatusOrganization $organization$flush false): void
  485.     {
  486.         switch ($newStatus) {
  487.             case OrganizationStatusEnum::CANCELLED:
  488.                 $this->cancelOrganizationSubscription($organization);
  489.                 break;
  490.             case OrganizationStatusEnum::PRE_CANCELLATION:
  491.                 if (null === $organization->getTerminationDate()) {
  492.                     $now = new \DateTime();
  493.                     $terminationDate date('Y-m-d'strtotime(self::ONE_MONTH$now->getTimestamp()));
  494.                     $organization->setTerminationDate(new \DateTime($terminationDate));
  495.                 }
  496.                 break;
  497.             case OrganizationStatusEnum::NEW:
  498.                 $this->leadUtils->changeStatus($organizationfalse);
  499.                 break;
  500.         }
  501.         if ($flush) {
  502.             try {
  503.                 $this->em->persist($organization);
  504.                 $this->em->flush();
  505.             } catch (ORMException $e) {
  506.                 $this->captureSentryException($e);
  507.             }
  508.         }
  509.     }
  510.     public function cancelOrganizationSubscription(Organization $organization): void
  511.     {
  512.         $subscription SubscriptionUtils::getDomSubscription($organization);
  513.         $this->cancelledSubscriptions($organization);
  514.         if (null !== $subscription) {
  515.             // Cancelled Gocardless
  516.             $this->gocardlessAPI->canceledMandate($organization->getMandatID());
  517.             try {
  518.                 $this->em->persist($subscription);
  519.             } catch (ORMException $e) {
  520.                 $this->captureSentryException($e);
  521.             }
  522.         }
  523.         $organization->setMandatID(null);
  524.         $organization->setReferenceGocardless(null);
  525.         try {
  526.             $this->em->persist($organization);
  527.             $this->em->flush();
  528.         } catch (ORMException $e) {
  529.             $this->captureSentryException($e);
  530.         }
  531.     }
  532.     public function cancelledSubscriptions(Organization $organization): void
  533.     {
  534.         $subscriptions $organization->getSubscriptions();
  535.         /** @var Subscription $subscription */
  536.         foreach ($subscriptions as $subscription) {
  537.             if ($subscription->getActive()) {
  538.                 $subscription->setActive(false);
  539.                 try {
  540.                     $this->em->persist($subscription);
  541.                     $this->em->flush();
  542.                 } catch (ORMException $e) {
  543.                     $this->captureSentryException($e);
  544.                 }
  545.             }
  546.         }
  547.     }
  548.     public function getNextGeneratingInvoice(Organization $organization)
  549.     {
  550.         $domiciliationStartDate $organization->getDomiciliationStartDate();
  551.         if (!$domiciliationStartDate instanceof \DateTimeInterface) {
  552.             return null;
  553.         }
  554.         $subscription SubscriptionUtils::getDomSubscription($organization);
  555.         if (null !== $subscription) {
  556.             $nextPayment $subscription->getNextPayment();
  557.             $now date('Y-m-d');
  558.             $domiciliationStartDay $domiciliationStartDate->format('d');
  559.             $frequency SubscriptionUtils::getFrequency($subscription);
  560.             $tmpDate date('Y-m-d'strtotime($frequency$domiciliationStartDate->getTimestamp()));
  561.             if (null !== $nextPayment) {
  562.                 $referenceDate $nextPayment->format('Y-m-d') > $tmpDate $nextPayment->format('Y-m-d') : $tmpDate;
  563.             } else {
  564.                 $referenceDate $tmpDate;
  565.             }
  566.             if ($now $referenceDate) {
  567.                 $referenceDate $now;
  568.             }
  569.             $tmp explode('-'$referenceDate);
  570.             if ('02' === $tmp[1] && in_array($domiciliationStartDay, ['28''29''30''31'])) {
  571.                 $domiciliationStartDay '27';
  572.             }
  573.             $reference $tmp[0].'-'.$tmp[1].'-'.$domiciliationStartDay;
  574.             if ($reference $now) {
  575.                 $reference date('Y-m-d'strtotime('+1 month'strtotime($reference)));
  576.             }
  577.             return $reference;
  578.         }
  579.         return null;
  580.     }
  581.     public function getContratDomiciliation(Organization $organization): ?Document
  582.     {
  583.         $documents $organization->getDocuments();
  584.         /** @var Document $document */
  585.         foreach ($documents as $document) {
  586.             if (DocumentTypeOrganizationEnum::DOMICILIATION_CONTRACT === $document->getType()) {
  587.                 return $document;
  588.             }
  589.         }
  590.         return null;
  591.     }
  592.     /**
  593.      * @return bool
  594.      */
  595.     public function hasLetterWelcome(Organization $organization)
  596.     {
  597.         /** @var Letter $letter */
  598.         foreach ($organization->getLetters()->toArray() as $letter) {
  599.             if (LetterTypeEnum::WELCOME === $letter->getType()) {
  600.                 return true;
  601.             }
  602.         }
  603.         return false;
  604.     }
  605.     public function generateOnlyDomiciliationCertificate(Document $document)
  606.     {
  607.         if (null !== $document->getPerson()) {
  608.             $aDocs = [];
  609.             $organizations $this->personUtils->getOrganizations($document->getPerson());
  610.             $organizationsOfLRParent $this->personUtils->getOrganizationsParentOfLR($document->getPerson());
  611.             $organizations array_merge_recursive($organizations$organizationsOfLRParent);
  612.             $organizationIDFinished = [];
  613.             /** @var Organization $organization */
  614.             foreach ($organizations as $organization) {
  615.                 if (!in_array($organization->getId(), $organizationIDFinished) && $this->checkGenerateCertificateDomiciliation($organization)) {
  616.                     $aDocs[] = DocumentTypeOrganizationEnum::DOMICILIATION_CERTIFICATE;
  617.                     $this->generateDocs($organizationfalse$aDocs);
  618.                 }
  619.             }
  620.         }
  621.     }
  622.     /**
  623.      * Generate document.
  624.      *
  625.      * @param array<string> $docsToGenerate
  626.      *
  627.      * @throws ORMException
  628.      * @throws OptimisticLockException
  629.      */
  630.     public function generateDocs(
  631.         Organization $organization,
  632.         bool $generateContract true,
  633.         array $docsToGenerate = [],
  634.         bool $isGenerationAuto false
  635.     ): ?Document {
  636.         if (empty($docsToGenerate)) {
  637.             $docsToGenerate $this->getDocsToGenerate($organization$generateContract);
  638.         }
  639.         $docsToGenerate array_unique($docsToGenerate);
  640.         $formalityDocuments = [
  641.             DocumentTypeOrganizationEnum::DNC1,
  642.             DocumentTypeOrganizationEnum::DNC2,
  643.             DocumentTypeOrganizationEnum::KOAH_POWER_OF_ATTORNEY,
  644.             DocumentTypeOrganizationEnum::HQ_OWNER,
  645.         ];
  646.         $documents = [];
  647.         $organizationTmp = clone $organization;
  648.         foreach ($docsToGenerate as $docType) {
  649.             $status DocumentStatusEnum::APPROVED;
  650.             if (in_array($docType$formalityDocumentstrue)) {
  651.                 $status DocumentStatusEnum::GENERATED_DOC;
  652.             }
  653.             $trans DocumentTypeOrganizationEnum::getReadableValue($docType);
  654.             $document = new Document();
  655.             $document
  656.                 ->setType($docType)
  657.                 ->setStatus($status)
  658.                 ->setName($this->translator->trans($trans));
  659.             $documents[] = $document;
  660.             // just use for checking status domiciliation
  661.             $organizationTmp->addDocument($document);
  662.             // overwrite the organization of the new document
  663.             $document->setOrganization($organization);
  664.         }
  665.         $organizationStatus $this->checkStatusDomiciliation($organizationTmp);
  666.         // Detach the organizationTmp to avoid the flush
  667.         $this->em->detach($organizationTmp);
  668.         if ($organizationStatus && $organization->getStatus() !== $organizationStatus) {
  669.             $organization->setStatus($organizationStatus);
  670.         }
  671.         if (!$isGenerationAuto) {
  672.             $this->em->flush();
  673.         }
  674.         return $documents[0] ?? null;
  675.     }
  676.     /**
  677.      * Vérifier les documents manquants si approuvés.
  678.      */
  679.     public function checkedMissingDocs(Organization $organization)
  680.     {
  681.         $aDocs $this->documentUtils->getDocumentsTypes($organization->getDocuments());
  682.         if (empty($aDocs)) {
  683.             return false;
  684.         }
  685.         switch ($organization->getLegalStatus()) {
  686.             case LegalStatusTypeEnum::AUTO_ENTREPRENEUR:
  687.             case LegalStatusTypeEnum::EI:
  688.             case LegalStatusTypeEnum::EIRL:
  689.             case LegalStatusTypeEnum::ASSOCIATION:
  690.                 if (LegalStatusTypeEnum::ASSOCIATION === $organization->getLegalStatus()) {
  691.                     $document DocumentTypeOrganizationEnum::ASSOCIATION_RECEIPT;
  692.                 } else {
  693.                     $document DocumentTypeOrganizationEnum::MICRO_ORGANIZATION_RECEIPT;
  694.                 }
  695.                 if (!$this->documentUtils->isApprovedDocument($document$aDocs)) {
  696.                     return false;
  697.                 }
  698.                 break;
  699.             case LegalStatusTypeEnum::SDE:
  700.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE$aDocs)) {
  701.                     return false;
  702.                 }
  703.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::KBIS_SUCCURSALE$aDocs)) {
  704.                     return false;
  705.                 }
  706.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::DBE$aDocs)) {
  707.                     return false;
  708.                 }
  709.                 break;
  710.             case LegalStatusTypeEnum::BL:
  711.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE$aDocs)) {
  712.                     return false;
  713.                 }
  714.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::KBIS_SOCIETE_MERE$aDocs)) {
  715.                     return false;
  716.                 }
  717.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::DBE$aDocs)) {
  718.                     return false;
  719.                 }
  720.                 break;
  721.             default:
  722.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::STATUS$aDocs)) {
  723.                     return false;
  724.                 }
  725.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::KBIS$aDocs)) {
  726.                     return false;
  727.                 }
  728.                 if (!$this->documentUtils->isApprovedDocument(DocumentTypeOrganizationEnum::DBE$aDocs)) {
  729.                     return false;
  730.                 }
  731.         }
  732.         return true;
  733.     }
  734.     public function hasAllRequiredDocumentToPassToOKStatus(Organization $organization): bool
  735.     {
  736.         $requiredDocuments $this->getRequiredDocumentsTypeToPassToOKStatus($organization);
  737.         $aDocs $this->documentUtils->getDocumentsTypes($organization->getDocuments());
  738.         foreach ($requiredDocuments as $document) {
  739.             if (!array_key_exists($document$aDocs)) {
  740.                 return false;
  741.             }
  742.         }
  743.         return true;
  744.     }
  745.     public function hasAllDocumentsUploadedButAtLeastOneRefused(Organization $organization): bool
  746.     {
  747.         $aDocs $this->documentUtils->getDocumentsTypes($organization->getDocuments());
  748.         $requiredDocuments $this->getRequiredDocumentsTypeToPassToOKStatus($organization);
  749.         $docsToChecks array_intersect_key($aDocsarray_flip($requiredDocuments));
  750.         $countNotApprovedDoc 0;
  751.         foreach ($requiredDocuments as $requiredDocument) {
  752.             if ($this->documentUtils->isRefusedDocument($requiredDocument$docsToChecks)) {
  753.                 ++$countNotApprovedDoc;
  754.             }
  755.         }
  756.         return $countNotApprovedDoc >= 1;
  757.     }
  758.     public function getRequiredDocumentsTypeToPassToOKStatus(Organization $organization): array
  759.     {
  760.         $legalStatus $organization->getLegalStatus();
  761.         switch ($legalStatus) {
  762.             case LegalStatusTypeEnum::AUTO_ENTREPRENEUR:
  763.             case LegalStatusTypeEnum::EI:
  764.             case LegalStatusTypeEnum::EIRL:
  765.             case LegalStatusTypeEnum::ASSOCIATION:
  766.                 if (LegalStatusTypeEnum::ASSOCIATION === $legalStatus) {
  767.                     return [DocumentTypeOrganizationEnum::ASSOCIATION_RECEIPT];
  768.                 }
  769.                 return [DocumentTypeOrganizationEnum::MICRO_ORGANIZATION_RECEIPT];
  770.             case LegalStatusTypeEnum::SDE:
  771.                 return [
  772.                     DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE,
  773.                     DocumentTypeOrganizationEnum::KBIS_SUCCURSALE,
  774.                     DocumentTypeOrganizationEnum::DBE,
  775.                 ];
  776.             case LegalStatusTypeEnum::BL:
  777.                 return [
  778.                     DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE,
  779.                     DocumentTypeOrganizationEnum::KBIS_SOCIETE_MERE,
  780.                     DocumentTypeOrganizationEnum::DBE,
  781.                 ];
  782.             default:
  783.                 return [
  784.                     DocumentTypeOrganizationEnum::STATUS,
  785.                     DocumentTypeOrganizationEnum::KBIS,
  786.                     DocumentTypeOrganizationEnum::DBE,
  787.                 ];
  788.         }
  789.     }
  790.     public function getMissingDocsForPappers(Organization $organization): array
  791.     {
  792.         $aDocs $this->documentUtils->getDocumentsTypes($organization->getDocuments());
  793.         // Remove not approved documents
  794.         $aDocs array_filter($aDocs, static function ($doc) {
  795.             return DocumentStatusEnum::NOT_APPROVED !== $doc;
  796.         });
  797.         $missingDocuments = [];
  798.         if (empty($aDocs)) {
  799.             return $missingDocuments;
  800.         }
  801.         $legalStatus $organization->getLegalStatus();
  802.         $requiredDocumentTypes = [
  803.             DocumentTypeOrganizationEnum::KBIS,
  804.             DocumentTypeOrganizationEnum::DBE,
  805.             DocumentTypeOrganizationEnum::STATUS,
  806.         ];
  807.         switch ($legalStatus) {
  808.             case LegalStatusTypeEnum::AUTO_ENTREPRENEUR:
  809.             case LegalStatusTypeEnum::EI:
  810.             case LegalStatusTypeEnum::EIRL:
  811.             case LegalStatusTypeEnum::ASSOCIATION:
  812.                 if (LegalStatusTypeEnum::ASSOCIATION === $organization->getLegalStatus()) {
  813.                     $requiredDocumentTypes = [DocumentTypeOrganizationEnum::ASSOCIATION_RECEIPT];
  814.                 } else {
  815.                     $requiredDocumentTypes = [DocumentTypeOrganizationEnum::MICRO_ORGANIZATION_RECEIPT];
  816.                 }
  817.                 break;
  818.             case LegalStatusTypeEnum::SDE:
  819.                 $requiredDocumentTypes = [
  820.                     DocumentTypeOrganizationEnum::KBIS_SUCCURSALE,
  821.                     DocumentTypeOrganizationEnum::DBE,
  822.                     DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE,
  823.                 ];
  824.                 break;
  825.             case LegalStatusTypeEnum::BL:
  826.                 $requiredDocumentTypes = [
  827.                     DocumentTypeOrganizationEnum::KBIS_SOCIETE_MERE,
  828.                     DocumentTypeOrganizationEnum::DBE,
  829.                     DocumentTypeOrganizationEnum::STATUS_TRADUITS_SOCIETE_MERE,
  830.                 ];
  831.                 break;
  832.         }
  833.         foreach ($requiredDocumentTypes as $documentType) {
  834.             if (!array_key_exists($documentType$aDocs)) {
  835.                 $missingDocuments[] = $documentType;
  836.             }
  837.         }
  838.         return $missingDocuments;
  839.     }
  840.     /**
  841.      * Récupère les représentants légaux PHYSIQUES de niveau le plus haut (CHAIRMAN pour SAS/SASU, MANAGER pour SARL/EURL).
  842.      *
  843.      * @return array|null
  844.      */
  845.     public function getPhysicalLegalRepresentativeLoop(Organization $organization)
  846.     {
  847.         foreach ($organization->getLegalRepresentatives() as $legalRepresentative) {
  848.             if (in_array(
  849.                 $legalRepresentative->getQuality(),
  850.                 [LegalRepresentativeQualityTypeEnum::CHAIRMANLegalRepresentativeQualityTypeEnum::MANAGER]
  851.             )
  852.                 && null !== $legalRepresentative->getPerson()
  853.             ) {
  854.                 if (PersonTypeEnum::PHYSICAL == $legalRepresentative->getPerson()->getType()) {
  855.                     return [$legalRepresentative];
  856.                 }/* else {
  857.                     return $this->getFirstPhysicalLR($legalRepresentative);
  858.                 }*/
  859.             }
  860.         }
  861.         return null;
  862.     }
  863.     public function getFirstPhysicalLR(LegalRepresentative $legalRepresentative)
  864.     {
  865.         if ($legalRepresentative->getPerson() && PersonTypeEnum::PHYSICAL == $legalRepresentative->getPerson()->getType()) {
  866.             return $legalRepresentative;
  867.         } elseif (null !== $legalRepresentative->getParent()) {
  868.             return $this->getFirstPhysicalLR($legalRepresentative->getParent());
  869.         }
  870.         return null;
  871.     }
  872.     /**
  873.      * @return mixed
  874.      */
  875.     public function generateURLGocardLess(Organization $organization, ?string $source null)
  876.     {
  877.         $sessionID $this->generateToken();
  878.         $this->session->set('session_id'$sessionID);
  879.         if ('TUNNEL' === $source) {
  880.             $redirectTo $this->params->get('uri_tunnel').'/documents/'.$organization->getId().'?rib=ok&session_id='.$sessionID;
  881.         } else {
  882.             $redirectTo $this->params->get('uri_bv').'/validation-gc/EDIT/'.$source.'?organization='.$organization->getId().'&session_id='.$sessionID;
  883.         }
  884.         $redirectFlows $this->gocardlessAPI->createRedirectFlows($sessionID$redirectTo);
  885.         if (null !== $redirectFlows) {
  886.             return $redirectFlows->redirect_url;
  887.         }
  888.         return null;
  889.     }
  890.     private function generateToken()
  891.     {
  892.         return 'SESS_'.rtrim(strtr(base64_encode(random_bytes(32)), '+/''-_'), '=');
  893.     }
  894.     /**
  895.      * @return array
  896.      */
  897.     public function getMandatoryDocuments(Organization $organization)
  898.     {
  899.         $mandatoryDocuments = [
  900.             DocumentTypeOrganizationEnum::RIB,
  901.         ];
  902.         if (in_array(
  903.             $organization->getLegalStatus(),
  904.             [
  905.                 LegalStatusTypeEnum::EI,
  906.                 LegalStatusTypeEnum::AUTO_ENTREPRENEUR,
  907.                 LegalStatusTypeEnum::EIRL,
  908.                 LegalStatusTypeEnum::ASSOCIATION,
  909.             ]
  910.         )) {
  911.             if (LegalStatusTypeEnum::ASSOCIATION == $organization->getLegalStatus()) {
  912.                 $mandatoryDocuments[] = DocumentTypeOrganizationEnum::ASSOCIATION_RECEIPT;
  913.             } else {
  914.                 $mandatoryDocuments[] = DocumentTypeOrganizationEnum::MICRO_ORGANIZATION_RECEIPT;
  915.             }
  916.         } else {
  917.             $mandatoryDocuments[] = DocumentTypeOrganizationEnum::STATUS;
  918.             $mandatoryDocuments[] = DocumentTypeOrganizationEnum::DBE;
  919.             $mandatoryDocuments[] = DocumentTypeOrganizationEnum::KBIS;
  920.         }
  921.         $list = [];
  922.         foreach ($mandatoryDocuments as $mandatoryDocument) {
  923.             $list[$mandatoryDocument] = $this->translator->trans(DocumentTypeOrganizationEnum::getReadableValue($mandatoryDocument));
  924.         }
  925.         return $list;
  926.     }
  927.     public function hasReexpedition(Organization $organization): bool
  928.     {
  929.         $subscription SubscriptionUtils::getDomSubscription($organization);
  930.         if (null !== $subscription) {
  931.             $products $subscription->getProductsFromServices();
  932.             foreach ($products as $product) {
  933.                 if (ProductKeyEnum::REEXPEDITION_COURRIER === $product->getUniqueKey() || ProductKeyEnum::REEXPEDITION_TRIMESTRIELLE === $product->getUniqueKey()) {
  934.                     return true;
  935.                 }
  936.             }
  937.         }
  938.         return false;
  939.     }
  940.     public function checkPermission(Organization $organization$token)
  941.     {
  942.         $user $this->userChecker->checkUserByToken($token);
  943.         if (!$user) {
  944.             return false;
  945.         }
  946.         return $organization && (in_array($user$organization->getUsers())
  947.                 || in_array('ROLE_ADMIN'$user->getRoles()));
  948.     }
  949.     private function updateInvoiceGenerationDate(Organization $organizationbool $reset false): void
  950.     {
  951.         $subscription SubscriptionUtils::getDomSubscription($organization);
  952.         if ($subscription && $organization->getDomiciliationStartDate()) {
  953.             $frequency SubscriptionUtils::getFrequency($subscription);
  954.             $nextPayment date('Y-m-d'strtotime($frequency$organization->getDomiciliationStartDate()->getTimestamp()));
  955.             if (!$subscription->getInvoiceGenerationDate() || $reset) {
  956.                 $subscription->setInvoiceGenerationDate($organization->getDomiciliationStartDate());
  957.                 $subscription->setNextPayment(new \DateTime($nextPayment));
  958.                 $this->em->persist($subscription);
  959.                 $this->em->flush();
  960.             }
  961.         }
  962.     }
  963.     public function updateInfoFrontApp(Organization $organization): void
  964.     {
  965.         $appEnv getenv('APP_ENV');
  966.         if ('prod' === $appEnv && [] !== $organization->getUsers()) {
  967.             $user $organization->getUsers()[0];
  968.             $this->frontAppAPI->updateContact($user);
  969.         }
  970.     }
  971.     /**
  972.      * Get category.
  973.      */
  974.     public static function getCategory(Organization $organization): string
  975.     {
  976.         $category = [];
  977.         if ($organization->getIsNewDomiciliation()) {
  978.             $category[] = 'Domiciliation';
  979.         }
  980.         if ($organization->getIsNewImmatriculation()) {
  981.             $category[] = 'IMMAT';
  982.         }
  983.         if ($organization->getIsNewTransfert()) {
  984.             $category[] = 'Transfert';
  985.         }
  986.         return implode(' + '$category);
  987.     }
  988.     public function generateDocsFromPappers(Organization $organizationDocument $document): bool
  989.     {
  990.         $documentsToGenerate PappersDocumentTypeOrganizationEnum::DOCUMENT_PAPPERS_ABLE_TO_GENERATE;
  991.         $type array_search($document->getType(), $documentsToGeneratetrue);
  992.         if ($organization->getSIRET() && $document->getType()) {
  993.             $response $this->pappersService->getDocument((string) $organization->getSIRET(), $type);
  994.             if (200 === $response->getStatusCode()) {
  995.                 $this->documentFilesService->writeFile(
  996.                     PathGenerator::generatePathForDocument($document),
  997.                     $response->getContent()
  998.                 );
  999.                 return true;
  1000.             }
  1001.             $response json_decode($response->getContent(), null512JSON_THROW_ON_ERROR);
  1002.             throw new HttpException($response->statusCodesprintf('Error %s: %s'$response->statusCode$response->message));
  1003.         }
  1004.         return false;
  1005.     }
  1006.     public function updateSurveillance(Organization $organization, ?array $sirenChangeset)
  1007.     {
  1008.         $organizationWithSameSiren $this->em->getRepository(Organization::class)->findOneBy(['SIRET' => $organization->getSIRET()]);
  1009.         $organizationWithSameOldSiren null;
  1010.         if ($sirenChangeset && $sirenChangeset[0]) {
  1011.             $organizationWithSameOldSiren $this->em->getRepository(Organization::class)->findOneBy(['SIRET' => $sirenChangeset[0]]);
  1012.         }
  1013.         $case1 $this->getCaseForSurveillance(1$organization$sirenChangeset);
  1014.         $case2 $this->getCaseForSurveillance(2$organization$sirenChangeset);
  1015.         $case3 $this->getCaseForSurveillance(3$organization$sirenChangeset);
  1016.         $case4 $this->getCaseForSurveillance(4$organization$sirenChangeset);
  1017.         $mustUpdate true;
  1018.         switch (true) {
  1019.             case $case1:
  1020.                 $organization->setIsSurveillance(true);
  1021.                 $this->pappersService->addSurveillance(['siren' => $organization->getSIRET()]);
  1022.                 break;
  1023.             case $case2:
  1024.                 $organization->setIsSurveillance(false);
  1025.                 if ($sirenChangeset && $sirenChangeset[0] && !$organizationWithSameOldSiren) {
  1026.                     $this->pappersService->removeSurveillance(['siren' => $sirenChangeset[0]]);
  1027.                 }
  1028.                 break;
  1029.             case $case3:
  1030.                 if ($sirenChangeset && $sirenChangeset[0] && !$organizationWithSameOldSiren) {
  1031.                     $this->pappersService->removeSurveillance(['siren' => $sirenChangeset[0]]);
  1032.                 } else {
  1033.                     $mustUpdate false;
  1034.                 }
  1035.                 $this->pappersService->addSurveillance(['siren' => $organization->getSIRET()]);
  1036.                 break;
  1037.             case $case4:
  1038.                 $organization->setIsSurveillance(false);
  1039.                 if (!$organizationWithSameSiren || $organizationWithSameSiren->getId() === $organization->getId()) {
  1040.                     $this->pappersService->removeSurveillance(['siren' => $organization->getSIRET()]);
  1041.                 }
  1042.                 break;
  1043.             default:
  1044.                 $mustUpdate false;
  1045.                 break;
  1046.         }
  1047.         if ($mustUpdate) {
  1048.             $this->em->flush();
  1049.         }
  1050.     }
  1051.     private function getCaseForSurveillance(
  1052.         int $case,
  1053.         Organization $organization,
  1054.         ?array $sirenChangeset
  1055.     ): bool {
  1056.         $isInActiveStatus in_array($organization->getStatus(), [
  1057.             OrganizationStatusEnum::DOCS_MISSING,
  1058.             OrganizationStatusEnum::OK,
  1059.             OrganizationStatusEnum::DOCS_EXPIRED,
  1060.         ], true);
  1061.         $isInLostStatus in_array($organization->getStatus(), [
  1062.             OrganizationStatusEnum::CANCELLED,
  1063.             OrganizationStatusEnum::LOST,
  1064.             OrganizationStatusEnum::DELETED,
  1065.         ], true);
  1066.         $isInLegalStatus in_array($organization->getLegalStatus(), LegalStatusTypeEnum::$legalStatusForSurveillancetrue);
  1067.         switch ($case) {
  1068.             case 1:
  1069.                 return !in_array(
  1070.                     false,
  1071.                     [
  1072.                         $isInActiveStatus,
  1073.                         !$organization->getIsSurveillance(),
  1074.                         !empty($organization->getSIRET()),
  1075.                         $isInLegalStatus,
  1076.                     ],
  1077.                     true
  1078.                 );
  1079.             case 2:
  1080.                 return $sirenChangeset && !in_array(
  1081.                     false,
  1082.                     [
  1083.                         $isInActiveStatus,
  1084.                         $organization->getIsSurveillance(),
  1085.                         $sirenChangeset,
  1086.                         $sirenChangeset[0],
  1087.                         empty($organization->getSIRET()),
  1088.                         $isInLegalStatus,
  1089.                     ],
  1090.                     true
  1091.                 );
  1092.             case 3:
  1093.                 return $sirenChangeset && !in_array(
  1094.                     false,
  1095.                     [
  1096.                         $isInActiveStatus,
  1097.                         $organization->getIsSurveillance(),
  1098.                         $sirenChangeset,
  1099.                         $sirenChangeset[0],
  1100.                         !empty($organization->getSIRET()),
  1101.                         $isInLegalStatus,
  1102.                     ],
  1103.                     true
  1104.                 );
  1105.             default:
  1106.                 return !in_array(
  1107.                     false,
  1108.                     [
  1109.                         $isInLostStatus,
  1110.                         $organization->getIsSurveillance(),
  1111.                         !empty($organization->getSIRET()),
  1112.                     ],
  1113.                     true
  1114.                 );
  1115.         }
  1116.     }
  1117. }