src/Service/OrganizationUtils.php line 1039

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