Loading install/demo/activity.json +35 −0 Original line number Diff line number Diff line Loading @@ -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 install/demo/organizations.json +1 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ "uid": "USR", "code": "USR", "shortname": "US Robots", "labintel": "UMR USR1", "type": "Société" }, { Loading module/Oscar/src/Oscar/Entity/Activity.php +40 −0 Original line number Diff line number Diff line Loading @@ -1789,6 +1789,7 @@ class Activity implements ResourceInterface } private $_cacheOrganizationsByRole; private $_cacheOrganizationsByRoles; public function getOrganizationsWithOneRole(array $roleIds): array { Loading @@ -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) { Loading @@ -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; } } Loading module/Oscar/src/Oscar/Factory/ActivityPcruInfoFromActivityFactory.php +13 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading @@ -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(); } } } Loading module/Oscar/src/Oscar/Service/PCRUService.php +22 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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" ); Loading Loading @@ -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 Loading
install/demo/activity.json +35 −0 Original line number Diff line number Diff line Loading @@ -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
install/demo/organizations.json +1 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ "uid": "USR", "code": "USR", "shortname": "US Robots", "labintel": "UMR USR1", "type": "Société" }, { Loading
module/Oscar/src/Oscar/Entity/Activity.php +40 −0 Original line number Diff line number Diff line Loading @@ -1789,6 +1789,7 @@ class Activity implements ResourceInterface } private $_cacheOrganizationsByRole; private $_cacheOrganizationsByRoles; public function getOrganizationsWithOneRole(array $roleIds): array { Loading @@ -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) { Loading @@ -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; } } Loading
module/Oscar/src/Oscar/Factory/ActivityPcruInfoFromActivityFactory.php +13 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading @@ -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(); } } } Loading
module/Oscar/src/Oscar/Service/PCRUService.php +22 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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" ); Loading Loading @@ -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