Commit 3fe87533 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Fix : PCRU

parent 6c99dd54
Loading
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -175,5 +175,40 @@
        ]
      }
    ]
  },
  {
    "uid": "A0004",
    "acronym": "TESTPCRU",
    "projectlabel": "Projet PCRUifié",
    "label": "Contrat vers PCRU",
    "datestart": "2022-01-01",
    "dateend": "2022-12-31",
    "datesigned": "2022-01-05",
    "financialImpact": "Dépense",
    "pfi": "2022PFI04079",
    "status": 101,
    "type": "ANR",
    "amount": 15250,
    "milestones": [
    ],
    "payments": [
    ],
    "organizations": {
      "Laboratoire": [
        "Groupe Olympia"
      ]
    },
    "persons": {
      "Responsable scientifique": [
        "Max Plank"
      ],
      "Chercheur": [
        "Erwin Schrödinger"
      ],
      "Ingénieur": [
        "Sarah Déclarant"
      ]
    },
    "workpackages": []
  }
]
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@
    "uid": "USR",
    "code": "USR",
    "shortname": "US Robots",
    "labintel": "UMR USR1",
    "type": "Société"
  },
  {
+40 −0
Original line number Diff line number Diff line
@@ -1789,6 +1789,7 @@ class Activity implements ResourceInterface
    }

    private $_cacheOrganizationsByRole;
    private $_cacheOrganizationsByRoles;

    public function getOrganizationsWithOneRole(array $roleIds): array
    {
@@ -1805,6 +1806,42 @@ class Activity implements ResourceInterface
        return $structures;
    }

    public function getOrganizationsWithOneRoleIn(array $roles, $deep = true) {
        if ($this->_cacheOrganizationsByRoles === null) {
            $this->_cacheOrganizationsByRoles = [];
            /** @var ActivityOrganization $relation */
            foreach ($this->getOrganizations() as $relation) {
                $role = $relation->getRole();
                $organization = $relation->getOrganization();
                $organizationId = $organization->getId();

                if (!array_key_exists($role, $this->_cacheOrganizationsByRoles)) {
                    $this->_cacheOrganizationsByRoles[$role] = [];
                }

                $this->_cacheOrganizationsByRoles[$role][$organizationId] = $organization;
            }
            if ($this->getProject()) {
                foreach ($this->getProject()->getOrganizations() as $relation) {
                    $role = $relation->getRole();
                    $organization = $relation->getOrganization();
                    $organizationId = $organization->getId();
                    if (!array_key_exists($role, $this->_cacheOrganizationsByRoles)) {
                        $this->_cacheOrganizationsByRoles[$role] = [];
                    }
                    $this->_cacheOrganizationsByRoles[$role][$organizationId] = $organization;
                }
            }
        }
        $output = [];
        foreach ($roles as $role) {
            if (isset($this->_cacheOrganizationsByRoles[$role])) {
                $output = array_merge($output, $this->_cacheOrganizationsByRoles[$role]);
            }
        }
        return $output;
    }

    public function getOrganizationsWithRole($role, $deep = true)
    {
        if ($this->_cacheOrganizationsByRole === null) {
@@ -1818,6 +1855,9 @@ class Activity implements ResourceInterface
            }
            if ($this->getProject()) {
                foreach ($this->getProject()->getOrganizations() as $partner) {
                    if (!isset($this->_cacheOrganizationsByRole[$partner->getRole()])) {
                        $this->_cacheOrganizationsByRole[$partner->getRole()] = [];
                    }
                    $this->_cacheOrganizationsByRole[$partner->getRole()][] = $partner;
                }
            }
+13 −11
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\ActivityPcruInfos;
use Oscar\Entity\ActivityPerson;
use Oscar\Entity\ContractDocument;
use Oscar\Entity\Organization;
use Oscar\Entity\PcruTypeContract;
use Oscar\Entity\PcruTypeContractRepository;
use Oscar\Exception\OscarException;
@@ -63,7 +64,7 @@ class ActivityPcruInfoFromActivityFactory

        // Récupération des laboratoires

        $structures = $activity->getOrganizationsWithOneRole($roleStructureToFind);
        $structures = $activity->getOrganizationsWithOneRoleIn($roleStructureToFind);

        if (count($structures) == 0) {
            $activityPcruInfos->addError(
@@ -72,23 +73,24 @@ class ActivityPcruInfoFromActivityFactory
        }

        $organizationsParsed = [];

        /** @var ActivityOrganization $unite */
        foreach ($activity->getOrganizationsWithRole($roleStructureToFind) as $unite) {
            $organizationsParsed[] = (string)$unite->getOrganization();
            if ($unite->getOrganization()->getLabintel()) {
                $codeUniteLabintel = $unite->getOrganization()->getLabintel();
                $sigleUnit = $unite->getOrganization()->getShortName();
        foreach ($activity->getOrganizationsWithOneRoleIn($roleStructureToFind) as $unite) {
            $organizationsParsed[] = (string)$unite;
            if ($unite->getLabintel()) {
                $codeUniteLabintel = $unite->getLabintel();
                $sigleUnit = $unite->getShortName();
            }
        }

        $partners = [];
        /** @var ActivityOrganization $partner */
        foreach ($activity->getOrganizationsWithRole($rolePartnerToFind) as $partner) {
            if ($partner->getOrganization()->getCodePcru()) {
        /** @var Organization $partner */
        foreach ($activity->getOrganizationsWithOneRoleIn($rolePartnerToFind) as $partner) {
            if ($partner->getCodePcru()) {
                if ($idPartenairePrincipal == "") {
                    $idPartenairePrincipal = $partner->getOrganization()->getCodePcru();
                    $idPartenairePrincipal = $partner->getCodePcru();
                } else {
                    $partners[] = $partner->getOrganization()->getCodePcru();
                    $partners[] = $partner->getCodePcru();
                }
            }
        }
+22 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ namespace Oscar\Service;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\ORM\NoResultException;
use Oscar\Entity\Activity;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\ActivityPcruInfos;
use Oscar\Entity\ActivityPcruInfosRepository;
use Oscar\Entity\ActivityRepository;
@@ -27,6 +28,8 @@ use Oscar\Traits\UseOscarConfigurationServiceTrait;
use Oscar\Traits\UseServiceContainer;
use Oscar\Traits\UseServiceContainerTrait;
use Oscar\Utils\PCRUCvsFile;
use Oscar\Validator\PCRUPartnerValidator;
use Oscar\Validator\PCRUUnitValidator;
use Oscar\Validator\PCRUValidator;
use Symfony\Component\Console\Style\SymfonyStyle;

@@ -162,7 +165,7 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
        // Contrôle des informations
        $pcruValidation = new PCRUValidator($this->getOscarConfigurationService(), $this->getEntityManager());
        $validation = $pcruValidation->validate($pcruInfos);
        if (count($pcruValidation->getError()) > 0) {
        if (count($pcruValidation->getErrors()) > 0) {
            throw new OscarException(
                "Impossible d'activer PCRU pour cette activité, des données sont manquantes/erronées"
            );
@@ -479,6 +482,24 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
            $documentPath = $this->getDocumentPath($pcruInfos->getDocumentId());
        }

        // Contrôle des organisations
        $validatorPartner = new PCRUPartnerValidator();
        foreach ($activity->getOrganizationsWithOneRoleIn($this->getOscarConfigurationService()->getPcruPartnerRoles()) as $partner) {
            if( !$validatorPartner->isValid($partner) ){
                var_dump($partner->getCodePCRU());
                $msg = implode(',', $validatorPartner->getMessages());
                $pcruInfos->addError(sprintf($msg, $partner));
                die();
            }
        }

        $validatorUnit = new PCRUUnitValidator();
        foreach ($activity->getOrganizationsWithOneRoleIn($this->getOscarConfigurationService()->getPcruUnitRoles()) as $partner) {
            if( !$validatorUnit->isValid($partner) ){
                $msg = implode(',', $validatorUnit->getMessages());
                $pcruInfos->addError(sprintf($msg, $partner));
            }
        }

        return [
            'validations' => $validation,
Loading