From f6518225afbfcd2c9120a601a69389078c43c85c Mon Sep 17 00:00:00 2001 From: Ruslan Baidan Date: Thu, 25 Jan 2024 16:42:40 +0100 Subject: [PATCH] Updated the operational risks functionality. --- config/module.config.php | 6 +- .../ApiAnrInstancesRisksOpController.php | 91 ++- src/Controller/ApiAnrLibraryController.php | 97 +-- src/Controller/ApiAnrObjectsController.php | 164 ++--- src/Controller/ApiAnrRisksController.php | 7 +- src/Controller/ApiAnrRisksOpController.php | 52 +- .../ApiAnrTreatmentPlanController.php | 4 +- src/Service/AnrCartoRiskService.php | 70 +- src/Service/AnrInstanceRiskOpService.php | 678 +++++++----------- src/Service/AnrInstanceRiskService.php | 23 +- src/Service/DeliverableGenerationService.php | 4 +- src/Service/InstanceRiskOwnerService.php | 22 + src/Service/OperationalRiskScaleService.php | 51 +- src/Table/ObjectCategoryTable.php | 12 - ...SpecificInstanceRiskDataInputValidator.php | 3 + ...ecificInstanceRiskOpDataInputValidator.php | 104 +++ ...UpdateInstanceRiskOpDataInputValidator.php | 42 ++ 17 files changed, 673 insertions(+), 757 deletions(-) create mode 100644 src/Validator/InputValidator/InstanceRiskOp/PostSpecificInstanceRiskOpDataInputValidator.php create mode 100644 src/Validator/InputValidator/InstanceRiskOp/UpdateInstanceRiskOpDataInputValidator.php diff --git a/config/module.config.php b/config/module.config.php index 10be4036..9d7824c2 100755 --- a/config/module.config.php +++ b/config/module.config.php @@ -1653,9 +1653,13 @@ ReflectionBasedAbstractFactory::class, InputValidator\RecommendationRisk\PostRecommendationRiskDataInputValidator::class => ReflectionBasedAbstractFactory::class, + InputValidator\InstanceRisk\PostSpecificInstanceRiskDataInputValidator::class => + ReflectionBasedAbstractFactory::class, InputValidator\InstanceRisk\UpdateInstanceRiskDataInputValidator::class => ReflectionBasedAbstractFactory::class, - InputValidator\InstanceRisk\PostSpecificInstanceRiskDataInputValidator::class => + InputValidator\InstanceRiskOp\PostSpecificInstanceRiskOpDataInputValidator::class => + ReflectionBasedAbstractFactory::class, + InputValidator\InstanceRiskOp\UpdateInstanceRiskOpDataInputValidator::class => ReflectionBasedAbstractFactory::class, // Commands diff --git a/src/Controller/ApiAnrInstancesRisksOpController.php b/src/Controller/ApiAnrInstancesRisksOpController.php index 50f57654..03dedf61 100755 --- a/src/Controller/ApiAnrInstancesRisksOpController.php +++ b/src/Controller/ApiAnrInstancesRisksOpController.php @@ -1,39 +1,98 @@ -anrInstanceRiskOpService = $anrInstanceRiskOpService; + $this->validatePostParams($this->postSpecificInstanceRiskOpDataInputValidator, $data); + + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + + $operationalInstanceRisk = $this->anrInstanceRiskOpService->createSpecificOperationalInstanceRisk( + $anr, + $this->postSpecificInstanceRiskOpDataInputValidator->getValidData() + ); + + return $this->getSuccessfulJsonResponse(['id' => $operationalInstanceRisk->getId()]); } - // TODO: update the calls and usages as on BackOffice side. + /** + * @param array $data + */ public function update($id, $data) { - $risk = $this->anrInstanceRiskOpService->update((int)$id, $data); - unset($risk['anr'], $risk['instance'], $risk['object'], $risk['rolfRisk']); + $this->validatePostParams($this->updateInstanceRiskOpDataInputValidator, $data); - return new JsonModel($risk); - } + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + + $instanceRiskOp = $this->anrInstanceRiskOpService->update( + $anr, + (int)$id, + $this->updateInstanceRiskOpDataInputValidator->getValidData() + ); + return $this->getPreparedJsonResponse([ + 'cacheBrutRisk' => $instanceRiskOp->getCacheBrutRisk(), + 'cacheNetRisk' => $instanceRiskOp->getCacheNetRisk(), + 'cacheTargetedRisk' => $instanceRiskOp->getCacheTargetedRisk(), + ]); + } + /** + * @param array $data + */ public function patch($id, $data) { - $risk = $this->anrInstanceRiskOpService->updateScaleValue((int)$id, $data); - unset($risk['anr'], $risk['instance'], $risk['object'], $risk['rolfRisk']); + $this->validatePostParams($this->patchInstanceRiskOpDataInputValidator, $data); + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + + $instanceRiskOp = $this->anrInstanceRiskOpService->updateScaleValue( + $anr, + (int)$id, + $this->patchInstanceRiskOpDataInputValidator->getValidData() + ); + + return $this->getPreparedJsonResponse([ + 'cacheBrutRisk' => $instanceRiskOp->getCacheBrutRisk(), + 'cacheNetRisk' => $instanceRiskOp->getCacheNetRisk(), + 'cacheTargetedRisk' => $instanceRiskOp->getCacheTargetedRisk(), + ]); + } + + public function delete($id) + { + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + + $this->anrInstanceRiskOpService->delete($anr, (int)$id); - return new JsonModel($risk); + return $this->getSuccessfulJsonResponse(); } } diff --git a/src/Controller/ApiAnrLibraryController.php b/src/Controller/ApiAnrLibraryController.php index be11407c..68adcc1b 100755 --- a/src/Controller/ApiAnrLibraryController.php +++ b/src/Controller/ApiAnrLibraryController.php @@ -1,7 +1,7 @@ getRequest()->getAttribute('anr'); - /** @var AnrObjectService $service */ - $service = $this->getService(); - $objectsCategories = $service->getLibraryTreeStructure($anr); - - $this->formatDependencies($objectsCategories, $this->dependencies); - - $fields = ['id', 'label1', 'label2', 'label3', 'label4', 'position', 'objects', 'child']; - $objectsCategories = $this->recursiveArray($objectsCategories, null, 0, $fields); - - return new JsonModel([ - $this->name => $objectsCategories - ]); - } - - /** - * @inheritdoc - */ - public function create($data) - { - // TODO: Anr object is from the attribute. - $anrId = $this->params()->fromRoute('anrid'); - if (empty($anrId)) { - throw new \Monarc\Core\Exception\Exception('Anr id missing', 412); - } - $data['anr'] = $anrId; - - if (!isset($data['objectId'])) { - throw new \Monarc\Core\Exception\Exception('objectId is missing'); - } - - /** @var AnrObjectService $service */ - $service = $this->getService(); - $id = $service->attachObjectToAnr($data['objectId'], $anrId); - - return new JsonModel([ - 'status' => 'ok', - 'id' => $id, - ]); - } - - /** - * @inheritdoc - */ - public function delete($id) - { - $anrId = $this->params()->fromRoute('anrid'); - if (empty($anrId)) { - throw new \Monarc\Core\Exception\Exception('Anr id missing', 412); - } - - /** @var AnrObjectService $service */ - $service = $this->getService(); - $service->detachObjectFromAnr($id, $anrId); - - return new JsonModel([ - 'status' => 'ok' - ]); - } - - /** - * @inheritdoc - */ - public function get($id) - { - return $this->methodNotAllowed(); - } - - /** - * @inheritdoc - */ - public function update($id, $data) - { - return $this->methodNotAllowed(); - } - - /** - * @inheritdoc - */ - public function patch($id, $data) - { - return $this->methodNotAllowed(); + return $this->getPreparedJsonResponse(['categories' => $this->anrObjectService->getLibraryTreeStructure($anr)]); } } diff --git a/src/Controller/ApiAnrObjectsController.php b/src/Controller/ApiAnrObjectsController.php index 1df40f96..1bc8362b 100755 --- a/src/Controller/ApiAnrObjectsController.php +++ b/src/Controller/ApiAnrObjectsController.php @@ -1,7 +1,7 @@ anrObjectService = $anrObjectService; + $this->objectImportService = $objectImportService; + $this->getObjectsInputFormatter = $getObjectsInputFormatter; + $this->getObjectInputFormatter = $getObjectInputFormatter; + $this->postObjectDataInputValidator = $postObjectDataInputValidator; } public function getList() { - $page = $this->params()->fromQuery('page'); - $limit = $this->params()->fromQuery('limit'); - $order = $this->params()->fromQuery('order'); - $filter = $this->params()->fromQuery('filter'); - $asset = (int)$this->params()->fromQuery('asset'); - $category = (int)$this->params()->fromQuery('category'); - $lock = $this->params()->fromQuery('lock'); - $anr = (int)$this->params()->fromRoute('anrid'); - - /** @var ObjectService $service */ - $service = $this->getService(); - $objects = $service->getListSpecific($page, $limit, $order, $filter, $asset, $category, null, $anr, $lock); - - if ($lock == 'true') { - foreach ($objects as $key => $object) { - $this->formatDependencies($objects[$key], $this->dependencies); - } - } + $formattedInputParams = $this->getFormattedInputParams($this->getObjectsInputFormatter); - return new JsonModel([ - 'count' => $service->getFilteredCount($filter, $asset, $category, null, $anr), - $this->name => $objects, + return $this->getPreparedJsonResponse([ + 'count' => $this->anrObjectService->getCount($formattedInputParams), + 'objects' => $this->anrObjectService->getList($formattedInputParams), ]); } /** - * @inheritdoc + * @param string $id */ public function get($id) { - // TODO: anr obj from attr of the middleware - $anr = (int)$this->params()->fromRoute('anrid'); - - $object = $this->anrObjectService->getObjectData($anr, $id); - - if (count($this->dependencies)) { - $this->formatDependencies($object, $this->dependencies); - } + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + $formattedInputParams = $this->getFormattedInputParams($this->getObjectInputFormatter); - $anrs = []; - foreach ($object['anrs'] as $key => $anr) { - $anrs[] = $anr->getJsonArray(); - } - $object['anrs'] = $anrs; - - return new JsonModel($object); + return $this->getPreparedJsonResponse($this->anrObjectService->getObjectData($anr, $id, $formattedInputParams)); } /** - * @inheritdoc + * @param array $data */ public function create($data) { - $anrId = (int)$this->params()->fromRoute('anrid'); - if (empty($anrId)) { - throw new \Monarc\Core\Exception\Exception('Anr id missing', 412); - } - - if (array_keys($data) !== range(0, count($data) - 1)) { - # if $data is an associative array - $data = array($data); + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + if (!empty($data['mosp'])) { + $monarcObject = $this->objectImportService->importFromArray($data, $anr); + + return $monarcObject !== null + ? $this->getSuccessfulJsonResponse(['id' => $monarcObject->getUuid()]) + : $this->getSuccessfulJsonResponse(); } - $created_objects = array(); - foreach ($data as $key => $new_data) { - $new_data['anr'] = $anrId; - if (\is_string($new_data['asset'])) { - $new_data['asset'] = ['uuid' => $new_data['asset'], 'anr' => $anrId]; - } - $id = $this->getService()->create($new_data, true, AbstractEntity::FRONT_OFFICE); - array_push($created_objects, $id); - } - return new JsonModel([ - 'status' => 'ok', - 'id' => count($created_objects)==1 ? $created_objects[0]: $created_objects, - ]); + $isBatchData = $this->isBatchData($data); + $this->validatePostParams($this->postObjectDataInputValidator, $data, $isBatchData); + + $result = $isBatchData + ? $this->anrObjectService->createList($anr, $this->postObjectDataInputValidator->getValidDataSets()) + : $this->anrObjectService->create($anr, $this->postObjectDataInputValidator->getValidData()); + + return $this->getSuccessfulJsonResponse(['id' => $isBatchData ? $result : $result->getUuid()]); } /** - * @inheritdoc + * @param string $id + * @param array $data */ public function update($id, $data) { - $anrId = (int)$this->params()->fromRoute('anrid'); - if (empty($anrId)) { - throw new \Monarc\Core\Exception\Exception('Anr id missing', 412); - } - $data['anr'] = $anrId; + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); + + $this->validatePostParams($this->postObjectDataInputValidator, $data); - /** @var ObjectService $service */ - $service = $this->getService(); - $service->update($id, $data, AbstractEntity::FRONT_OFFICE); + $this->anrObjectService->update($anr, $id, $this->postObjectDataInputValidator->getValidData()); - return new JsonModel(['status' => 'ok']); + return $this->getSuccessfulJsonResponse(); } /** - * @inheritdoc + * @param string $id */ - public function patch($id, $data) + public function delete($id) { - $anrId = (int)$this->params()->fromRoute('anrid'); - if (empty($anrId)) { - throw new \Monarc\Core\Exception\Exception('Anr id missing', 412); - } - $data['anr'] = $anrId; + /** @var Anr $anr */ + $anr = $this->getRequest()->getAttribute('anr'); - /** @var ObjectService $service */ - $service = $this->getService(); - $service->patch($id, $data, AbstractEntity::FRONT_OFFICE); + $this->anrObjectService->delete($anr, $id); - return new JsonModel(['status' => 'ok']); + return $this->getSuccessfulJsonResponse(); } /** - * TODO: moved from another controller. Service class is not the same (old AnrLibraryService). To implement. * Called to validate the library objects detaching possibility. */ public function parentsAction() { - $matcher = $this->getEvent()->getRouteMatch(); - return new JsonModel($this->getService()->getParentsInAnr($matcher->getParam('anrid'), $matcher->getParam('id'))); + $anr = $this->getRequest()->getAttribute('anr'); + $objectUuid = $this->params()->fromRoute('id'); + + return $this->getPreparedJsonResponse($this->anrObjectService->getParentsInAnr($anr, $objectUuid)); } } diff --git a/src/Controller/ApiAnrRisksController.php b/src/Controller/ApiAnrRisksController.php index 303523d2..fcb7ddfd 100755 --- a/src/Controller/ApiAnrRisksController.php +++ b/src/Controller/ApiAnrRisksController.php @@ -23,20 +23,21 @@ public function __construct(private AnrInstanceRiskService $anrInstanceRiskServi } /** - * Fetch instance risks by instance ID. + * Fetch instance risks by instance ID or for the whole analysis if id is null. * - * @param int|string $id Instance id. + * @param int|string|null $id Instance id. */ public function get($id) { /** @var Anr $anr */ $anr = $this->getRequest()->getAttribute('anr'); $params = $this->prepareParams(); + $id = $id === null ? null : (int)$id; if ($this->params()->fromQuery('csv', false)) { /** @var Response $response */ $response = $this->getResponse(); - $response->getHeaders()->addHeaderLine('Content-Type', 'text/csv; charset=utf-8'); + $response->getHeaders()?->addHeaderLine('Content-Type', 'text/csv; charset=utf-8'); $response->setContent($this->anrInstanceRiskService->getInstanceRisksInCsv($anr, (int)$id, $params)); return $response; diff --git a/src/Controller/ApiAnrRisksOpController.php b/src/Controller/ApiAnrRisksOpController.php index 35f4d853..6aa99375 100755 --- a/src/Controller/ApiAnrRisksOpController.php +++ b/src/Controller/ApiAnrRisksOpController.php @@ -1,7 +1,7 @@ getRequest()->getAttribute('anr'); $params = $this->getFilterParams(); + $id = $id === null ? null : (int)$id; if ($this->params()->fromQuery('csv', false)) { /** @var Response $response */ $response = $this->getResponse(); - $response->getHeaders()->addHeaderLine('Content-Type', 'text/csv; charset=utf-8'); + $response->getHeaders()?->addHeaderLine('Content-Type', 'text/csv; charset=utf-8'); $response->setContent( $this->anrInstanceRiskOpService->getOperationalRisksInCsv($anr, $id, $params) ); @@ -56,43 +62,7 @@ public function get($id) public function getList() { - /** @var Anr $anr */ - $anr = $this->getRequest()->getAttribute('anr'); - $params = $this->getFilterParams(); - - if ($this->params()->fromQuery('csv', false)) { - /** @var Response $response */ - $response = $this->getResponse(); - $response->getHeaders()->addHeaderLine('Content-Type', 'text/csv; charset=utf-8'); - $response->setContent( - $this->anrInstanceRiskOpService->getOperationalRisksInCsv($anr, null, $params) - ); - - return $response; - } - - $risks = $this->anrInstanceRiskOpService->getOperationalRisks($anr, null, $params); - - return $this->getPreparedJsonResponse([ - 'count' => \count($risks), - 'oprisks' => $params['limit'] > 0 - ? \array_slice($risks, ($params['page'] - 1) * $params['limit'], $params['limit']) - : $risks, - ]); - } - - public function create($data) - { - return $this->getSuccessfulJsonResponse([ - 'id' => $this->anrInstanceRiskOpService->createSpecificRiskOp($data), - ]); - } - - public function delete($id) - { - $this->anrInstanceRiskOpService->delete((int)$id); - - return $this->getSuccessfulJsonResponse(); + $this->get(null); } protected function getFilterParams(): array diff --git a/src/Controller/ApiAnrTreatmentPlanController.php b/src/Controller/ApiAnrTreatmentPlanController.php index a6cd461e..c53bdbe9 100755 --- a/src/Controller/ApiAnrTreatmentPlanController.php +++ b/src/Controller/ApiAnrTreatmentPlanController.php @@ -16,7 +16,9 @@ class ApiAnrTreatmentPlanController extends AbstractRestfulControllerRequestHand { use ControllerRequestResponseHandlerTrait; - public function __construct(private AnrRecommendationRiskService $anrRecommendationRiskService) {} + public function __construct(private AnrRecommendationRiskService $anrRecommendationRiskService) + { + } public function getList() { diff --git a/src/Service/AnrCartoRiskService.php b/src/Service/AnrCartoRiskService.php index d8547892..b3f2b44d 100755 --- a/src/Service/AnrCartoRiskService.php +++ b/src/Service/AnrCartoRiskService.php @@ -163,22 +163,21 @@ public function buildListScalesAndHeaders($anrId) * * @param int $anrId The ANR ID */ - public function buildListScalesOpRisk($anrId) + public function buildListScalesOpRisk(int $anrId) { // Only load the ANR if we don't have the ANR already loaded, or a different one. - if (!$this->anr || $this->anr->get('id') != $anrId) { - $this->anr = $this->get('anrTable')->getEntity($anrId); + if (!$this->anr || $this->anr->getId() !== $anrId) { + $this->anr = $this->get('anrTable')->findById($anrId); } // Only compute the listScales and headers fields if we didn't already if ($this->listOpRiskScales === null) { /** @var OperationalRiskScaleTable $operationalRiskScaleTable */ $operationalRiskScaleTable = $this->get('operationalRiskScaleTable'); - $likelihoodScale = current( - $operationalRiskScaleTable->findWithCommentsByAnrAndType( - $this->anr, OperationalRiskScale::TYPE_LIKELIHOOD - ) - ); + $likelihoodScale = current($operationalRiskScaleTable->findWithCommentsByAnrAndType( + $this->anr, + OperationalRiskScale::TYPE_LIKELIHOOD + )); $impactsScale = current( $operationalRiskScaleTable->findWithCommentsByAnrAndType($this->anr, OperationalRiskScale::TYPE_IMPACT) ); @@ -197,7 +196,8 @@ public function buildListScalesOpRisk($anrId) $this->listOpRiskScales[OperationalRiskScale::TYPE_IMPACT] = $impactScaleValues; $this->listOpRiskScales[OperationalRiskScale::TYPE_LIKELIHOOD] = range( - $likelihoodScale->getMin(), $likelihoodScale->getMax() + $likelihoodScale->getMin(), + $likelihoodScale->getMax() ); } } @@ -346,7 +346,7 @@ public function getCountersRisks($mode = 'raw') $byTreatment['treated'][$context['color']]['sum'] += $context['max']; } - $kindOfTreatment = match ($context['treatment']) { + $kindOfMeasure = match ($context['treatment']) { InstanceRiskSuperClass::KIND_REDUCTION => 'reduction', InstanceRiskSuperClass::KIND_REFUSED => 'denied', InstanceRiskSuperClass::KIND_ACCEPTATION => 'accepted', @@ -354,27 +354,27 @@ public function getCountersRisks($mode = 'raw') default => 'not_treated', }; - if (!isset($byTreatment['all'][$kindOfTreatment]['count'])) { - $byTreatment['all'][$kindOfTreatment]['count'] = 0; + if (!isset($byTreatment['all'][$kindOfMeasure]['count'])) { + $byTreatment['all'][$kindOfMeasure]['count'] = 0; } - if (!isset($byTreatment['all'][$kindOfTreatment]['sum'])) { - $byTreatment['all'][$kindOfTreatment]['sum'] = 0; + if (!isset($byTreatment['all'][$kindOfMeasure]['sum'])) { + $byTreatment['all'][$kindOfMeasure]['sum'] = 0; } - if (!isset($byTreatment[$kindOfTreatment][$context['color']]['count'])) { - $byTreatment[$kindOfTreatment][$context['color']]['count'] = 0; + if (!isset($byTreatment[$kindOfMeasure][$context['color']]['count'])) { + $byTreatment[$kindOfMeasure][$context['color']]['count'] = 0; } - if (!isset($byTreatment[$kindOfTreatment][$context['color']]['sum'])) { - $byTreatment[$kindOfTreatment][$context['color']]['sum'] = 0; + if (!isset($byTreatment[$kindOfMeasure][$context['color']]['sum'])) { + $byTreatment[$kindOfMeasure][$context['color']]['sum'] = 0; } - $byTreatment[$kindOfTreatment][$context['color']]['count'] += 1; - $byTreatment[$kindOfTreatment][$context['color']]['sum'] += $context['max']; + $byTreatment[$kindOfMeasure][$context['color']]['count'] += 1; + $byTreatment[$kindOfMeasure][$context['color']]['sum'] += $context['max']; - $byTreatment['all'][$kindOfTreatment]['count'] += 1; - $byTreatment['all'][$kindOfTreatment]['sum'] += $context['max']; + $byTreatment['all'][$kindOfMeasure]['count'] += 1; + $byTreatment['all'][$kindOfMeasure]['sum'] += $context['max']; } } } @@ -477,7 +477,7 @@ public function getCountersOpRisks($mode = 'raw') $byTreatment['treated'][$color]['sum'] += $max; } - $kindOfTreatment = match ($treatment) { + $kindOfMeasure = match ($treatment) { InstanceRiskOpSuperClass::KIND_REDUCTION => 'reduction', InstanceRiskOpSuperClass::KIND_REFUSED => 'denied', InstanceRiskOpSuperClass::KIND_ACCEPTATION => 'accepted', @@ -485,27 +485,27 @@ public function getCountersOpRisks($mode = 'raw') default => 'not_treated', }; - if (!isset($byTreatment['all'][$kindOfTreatment]['count'])) { - $byTreatment['all'][$kindOfTreatment]['count'] = 0; + if (!isset($byTreatment['all'][$kindOfMeasure]['count'])) { + $byTreatment['all'][$kindOfMeasure]['count'] = 0; } - if (!isset($byTreatment['all'][$kindOfTreatment]['sum'])) { - $byTreatment['all'][$kindOfTreatment]['sum'] = 0; + if (!isset($byTreatment['all'][$kindOfMeasure]['sum'])) { + $byTreatment['all'][$kindOfMeasure]['sum'] = 0; } - if (!isset($byTreatment[$kindOfTreatment][$color]['count'])) { - $byTreatment[$kindOfTreatment][$color]['count'] = 0; + if (!isset($byTreatment[$kindOfMeasure][$color]['count'])) { + $byTreatment[$kindOfMeasure][$color]['count'] = 0; } - if (!isset($byTreatment[$kindOfTreatment][$color]['sum'])) { - $byTreatment[$kindOfTreatment][$color]['sum'] = 0; + if (!isset($byTreatment[$kindOfMeasure][$color]['sum'])) { + $byTreatment[$kindOfMeasure][$color]['sum'] = 0; } - $byTreatment[$kindOfTreatment][$color]['count'] += 1; - $byTreatment[$kindOfTreatment][$color]['sum'] += $max; + $byTreatment[$kindOfMeasure][$color]['count'] += 1; + $byTreatment[$kindOfMeasure][$color]['sum'] += $max; - $byTreatment['all'][$kindOfTreatment]['count'] += 1; - $byTreatment['all'][$kindOfTreatment]['sum'] += $max; + $byTreatment['all'][$kindOfMeasure]['count'] += 1; + $byTreatment['all'][$kindOfMeasure]['sum'] += $max; } return [$countersRiskOP, $distribRiskOp, $riskOpMaxSum, $byTreatment]; diff --git a/src/Service/AnrInstanceRiskOpService.php b/src/Service/AnrInstanceRiskOpService.php index 0e902624..dae7bc49 100644 --- a/src/Service/AnrInstanceRiskOpService.php +++ b/src/Service/AnrInstanceRiskOpService.php @@ -1,206 +1,136 @@ recommendationRiskTable = $recommendationRiskTable; - $this->rolfRiskTable = $rolfRiskTable; - $this->recommendationTable = $recommendationTable; - $this->instanceRiskOwnerTable = $instanceRiskOwnerTable; + $this->connectedUser = $connectedUserService->getConnectedUser(); } - /* - public function createInstanceRisksOp(Entity\InstanceSuperClass $instance, Entity\ObjectSuperClass $object): void + public function getOperationalRisks(Entity\Anr $anr, int $instanceId = null, array $params = []): array { - if ($object->getRolfTag() === null || !$object->getAsset()->isPrimary()) { - return; + $instancesIds = []; + if ($instanceId !== null) { + /** @var Entity\Instance $instance */ + $instance = $this->instanceTable->findByIdAndAnr($instanceId, $anr); + $instancesIds = $instance->getSelfAndChildrenIds(); } - $otherInstance = $this->instanceTable->findOneByAnrAndObjectExcludeInstance( - $instance->getAnr(), - $object, - $instance + $operationalInstanceRisks = $this->instanceRiskOpTable->findByAnrInstancesAndFilterParams( + $anr, + $instancesIds, + $params ); - if ($otherInstance !== null && $object->isScopeGlobal()) { - foreach ($this->instanceRiskOpTable->findByInstance($otherInstance) as $instanceRiskOp) { - $newInstanceRiskOp = $this->getConstructedFromObjectInstanceRiskOp($instanceRiskOp) - ->setAnr($instance->getAnr()) - ->setInstance($instance) - ->setObject($instanceRiskOp->getObject()) - ->setRolfRisk($instanceRiskOp->getRolfRisk()) - // TODO: this is not set on Core. - ->setInstanceRiskOwner($instanceRiskOp->getInstanceRiskOwner()) - ->setCreator($this->connectedUser->getEmail()); - $this->instanceRiskOpTable->save($newInstanceRiskOp, false); - - $operationalInstanceRiskScales = $this->operationalInstanceRiskScaleTable->findByInstanceRiskOp( - $instanceRiskOp - ); - foreach ($operationalInstanceRiskScales as $operationalInstanceRiskScale) { - $newOperationalInstanceRiskScale = $this - ->getConstructedFromObjectOperationalInstanceRiskScale($operationalInstanceRiskScale) - ->setCreator($this->connectedUser->getEmail()); - $this->operationalInstanceRiskScaleTable->save($newOperationalInstanceRiskScale, false); + $anrLanguage = $anr->getLanguage(); + $result = []; + foreach ($operationalInstanceRisks as $operationalInstanceRisk) { + $recommendationUuids = []; + foreach ($operationalInstanceRisk->getRecommendationRisks() as $recommendationRisk) { + if ($recommendationRisk->getRecommendation() !== null) { + $recommendationUuids[] = $recommendationRisk->getRecommendation()->getUuid(); } } - } else { - $rolfTag = $this->rolfTagTable->findById($object->getRolfTag()->getId()); - foreach ($rolfTag->getRisks() as $rolfRisk) { - $this->createInstanceRiskOpWithScales( - $instance, - $object, - $rolfRisk - ); - } - } - $this->instanceRiskOpTable->flush(); - } - - public function update(Entity\AnrSuperClass $anr, int $id, array $data): Entity\InstanceRiskOpSuperClass - { - /** @var Entity\InstanceRiskOpSuperClass $operationalInstanceRisk - $operationalInstanceRisk = $this->instanceRiskOpTable->findByIdAndAnr($id, $anr); + $scalesData = []; + foreach ($operationalInstanceRisk->getOperationalInstanceRiskScales() as $operationalInstanceRiskScale) { + $operationalRiskScaleType = $operationalInstanceRiskScale->getOperationalRiskScaleType(); + $scalesData[$operationalRiskScaleType->getId()] = [ + 'instanceRiskScaleId' => $operationalInstanceRiskScale->getId(), + 'label' => $operationalRiskScaleType->getLabel(), + 'netValue' => $operationalInstanceRiskScale->getNetValue(), + 'brutValue' => $operationalInstanceRiskScale->getBrutValue(), + 'targetedValue' => $operationalInstanceRiskScale->getTargetedValue(), + 'isHidden' => $operationalRiskScaleType->isHidden(), + ]; + } - if (isset($data['kindOfMeasure'])) { - $operationalInstanceRisk->setKindOfMeasure((int)$data['kindOfMeasure']); - } - if (isset($data['comment'])) { - $operationalInstanceRisk->setComment($data['comment']); - } - if (isset($data['netProb']) && $operationalInstanceRisk->getNetProb() !== $data['netProb']) { - $this->verifyScaleProbabilityValue($operationalInstanceRisk->getAnr(), (int)$data['netProb']); - $operationalInstanceRisk->setNetProb((int)$data['netProb']); - } - if (isset($data['brutProb']) && $operationalInstanceRisk->getBrutProb() !== $data['brutProb']) { - $this->verifyScaleProbabilityValue($operationalInstanceRisk->getAnr(), (int)$data['brutProb']); - $operationalInstanceRisk->setBrutProb((int)$data['brutProb']); - } - if (isset($data['targetedProb']) && $operationalInstanceRisk->getTargetedProb() !== $data['targetedProb']) { - $this->verifyScaleProbabilityValue($operationalInstanceRisk->getAnr(), (int)$data['targetedProb']); - $operationalInstanceRisk->setTargetedProb((int)$data['targetedProb']); - } - // TODO: missing on Core: - if (isset($data['owner'])) { - $this->processRiskOwnerName((string)$data['owner'], $operationalInstanceRisk); - } - if (isset($data['context']) && (string)$data['context'] !== $operationalInstanceRisk->getContext()) { - $operationalInstanceRisk->setContext($data['context']); + $result[] = [ + 'id' => $operationalInstanceRisk->getId(), + 'rolfRisk' => $operationalInstanceRisk->getRolfRisk()?->getId(), + 'label' . $anrLanguage => $operationalInstanceRisk->getRiskCacheLabel($anrLanguage), + 'description' . $anrLanguage => $operationalInstanceRisk->getRiskCacheDescription($anrLanguage), + 'context' => $operationalInstanceRisk->getContext(), + 'owner' => $operationalInstanceRisk->getInstanceRiskOwner() + ? $operationalInstanceRisk->getInstanceRiskOwner()->getName() + : '', + 'netProb' => $operationalInstanceRisk->getNetProb(), + 'brutProb' => $operationalInstanceRisk->getBrutProb(), + 'targetedProb' => $operationalInstanceRisk->getTargetedProb(), + 'scales' => $scalesData, + 'cacheNetRisk' => $operationalInstanceRisk->getCacheNetRisk(), + 'cacheBrutRisk' => $operationalInstanceRisk->getCacheBrutRisk(), + 'cacheTargetedRisk' => $operationalInstanceRisk->getCacheTargetedRisk(), + 'kindOfMeasure' => $operationalInstanceRisk->getKindOfMeasure(), + 'comment' => $operationalInstanceRisk->getComment(), + 'specific' => $operationalInstanceRisk->getSpecific(), + 't' => $operationalInstanceRisk->isTreated(), + 'position' => $operationalInstanceRisk->getInstance()->getPosition(), + 'instanceInfos' => [ + 'id' => $operationalInstanceRisk->getInstance()->getId(), + 'scope' => $operationalInstanceRisk->getInstance()->getObject()->getScope(), + 'name' . $anrLanguage => $operationalInstanceRisk->getInstance()->getName($anrLanguage), + ], + 'recommendations' => implode(',', $recommendationUuids), + ]; } - $operationalInstanceRisk->setUpdater($this->connectedUser->getEmail()); - - $this->updateRiskCacheValues($operationalInstanceRisk); - - $this->instanceRiskOpTable->save($operationalInstanceRisk); - - return $operationalInstanceRisk; + return $result; } - */ - public function createSpecificRiskOp(array $data): int + public function createSpecificOperationalInstanceRisk(Entity\Anr $anr, array $data): Entity\InstanceRiskOp { - $instance = $this->instanceTable->findById((int)$data['instance']); - $anr = $instance->getAnr(); + /** @var Entity\Instance $instance */ + $instance = $this->instanceTable->findByIdAndAnr($data['instance'], $anr); - if ((int)$data['source'] === 2) { - $rolfRisk = (new RolfRisk()) + if ($data['source'] === self::CREATION_SOURCE_NEW_RISK) { + $rolfRisk = (new Entity\RolfRisk()) ->setAnr($anr) - ->setCode((string)$data['code']) + ->setCode($data['code']) ->setLabels(['label' . $anr->getLanguage() => $data['label']]) ->setDescriptions(['description' . $anr->getLanguage() => $data['description'] ?? '']) ->setCreator($this->connectedUser->getFirstname() . ' ' . $this->connectedUser->getLastname()); $this->rolfRiskTable->saveEntity($rolfRisk, true); } else { + /** @var Entity\RolfRisk $rolfRisk */ $rolfRisk = $this->rolfRiskTable->findById((int)$data['risk']); $operationalInstanceRisk = $this->instanceRiskOpTable->findByAnrInstanceAndRolfRisk( $anr, @@ -208,17 +138,65 @@ public function createSpecificRiskOp(array $data): int $rolfRisk ); if ($operationalInstanceRisk !== null) { - throw new Exception("This risk already exists in this instance", 412); + throw new Exception('This risk already exists in this instance', 412); } } - $operationalInstanceRisk = (new InstanceRiskOp()) + $operationalInstanceRisk = (new Entity\InstanceRiskOp()) ->setAnr($anr) ->setRolfRisk($rolfRisk) ->setInstance($instance) ->setObject($instance->getObject()) ->setIsSpecific(true) ->setRiskCacheCode($rolfRisk->getCode()) + ->setRiskCacheLabels($rolfRisk->getLabels()) + ->setRiskCacheDescriptions($rolfRisk->getDescriptions()) + ->setCreator($this->connectedUser->getEmail()); + + $operationalRiskScaleTypes = $this->operationalRiskScaleTypeTable->findByAnrAndScaleType( + $instance->getAnr(), + CoreEntity\OperationalRiskScaleSuperClass::TYPE_IMPACT + ); + foreach ($operationalRiskScaleTypes as $operationalRiskScaleType) { + $operationalInstanceRiskScale = (new Entity\OperationalInstanceRiskScale()) + ->setAnr($anr) + ->setOperationalInstanceRisk($operationalInstanceRisk) + ->setOperationalRiskScaleType($operationalRiskScaleType) + ->setCreator($this->connectedUser->getEmail()); + $this->operationalInstanceRiskScaleTable->save($operationalInstanceRiskScale, false); + } + + $this->instanceRiskOpTable->save($operationalInstanceRisk); + + return $operationalInstanceRisk; + } + + public function createInstanceRisksOp(Entity\Instance $instance, Entity\MonarcObject $monarcObject): void + { + if ($monarcObject->getRolfTag() === null || !$monarcObject->getAsset()->isPrimary()) { + return; + } + + foreach ($monarcObject->getRolfTag()->getRisks() as $rolfRisk) { + $this->createInstanceRiskOpWithScales($instance, $monarcObject, $rolfRisk); + } + + $this->instanceRiskOpTable->flush(); + } + + /** The objects are created and persisted but not saved in the DB. */ + public function createInstanceRiskOpWithScales( + Entity\Instance $instance, + Entity\MonarcObject $monarcObject, + Entity\RolfRisk $rolfRisk + ): Entity\InstanceRiskOp { + /** @var Entity\InstanceRiskOp $instanceRiskOp */ + $instanceRiskOp = (new Entity\InstanceRiskOp()) + ->setAnr($instance->getAnr()) + ->setInstance($instance) + ->setObject($monarcObject) + ->setRolfRisk($rolfRisk) + ->setRiskCacheCode($rolfRisk->getCode()) ->setRiskCacheLabels([ 'riskCacheLabel1' => $rolfRisk->getLabel(1), 'riskCacheLabel2' => $rolfRisk->getLabel(2), @@ -231,117 +209,140 @@ public function createSpecificRiskOp(array $data): int 'riskCacheDescription3' => $rolfRisk->getDescription(3), 'riskCacheDescription4' => $rolfRisk->getDescription(4), ]) - ->setCreator($this->connectedUser->getFirstname() . ' ' . $this->connectedUser->getLastname()); + ->setCreator($this->connectedUser->getEmail()); - $this->instanceRiskOpTable->save($operationalInstanceRisk, false); + $this->instanceRiskOpTable->save($instanceRiskOp, false); + /** @var Entity\OperationalRiskScaleType[] $operationalRiskScaleTypes */ $operationalRiskScaleTypes = $this->operationalRiskScaleTypeTable->findByAnrAndScaleType( $instance->getAnr(), - OperationalRiskScale::TYPE_IMPACT + CoreEntity\OperationalRiskScaleSuperClass::TYPE_IMPACT ); foreach ($operationalRiskScaleTypes as $operationalRiskScaleType) { - $operationalInstanceRiskScale = (new OperationalInstanceRiskScale()) - ->setAnr($anr) - ->setOperationalInstanceRisk($operationalInstanceRisk) - ->setOperationalRiskScaleType($operationalRiskScaleType) - ->setCreator($this->connectedUser->getEmail()); - $this->operationalInstanceRiskScaleTable->save($operationalInstanceRiskScale, false); + $this->createOperationalInstanceRiskScaleObject($instanceRiskOp, $operationalRiskScaleType); + } + + return $instanceRiskOp; + } + + public function updateScaleValue(Entity\Anr $anr, int $id, array $data): Entity\InstanceRiskOp + { + /** @var Entity\InstanceRiskOp $operationalInstanceRisk */ + $operationalInstanceRisk = $this->instanceRiskOpTable->findByIdAndAnr($id, $anr); + /** @var Entity\OperationalInstanceRiskScale $operationInstanceRiskScale */ + $operationInstanceRiskScale = $this->operationalInstanceRiskScaleTable->findByIdAndAnr( + (int)$data['instanceRiskScaleId'], + $anr + ); + + if (isset($data['netValue']) && $operationInstanceRiskScale->getNetValue() !== (int)$data['netValue']) { + $this->verifyScaleValue($operationInstanceRiskScale, (int)$data['netValue']); + $operationInstanceRiskScale->setNetValue((int)$data['netValue']); + } + if (isset($data['brutValue']) && $operationInstanceRiskScale->getBrutValue() !== (int)$data['brutValue']) { + $this->verifyScaleValue($operationInstanceRiskScale, (int)$data['brutValue']); + $operationInstanceRiskScale->setBrutValue((int)$data['brutValue']); + } + if (isset($data['targetedValue']) + && $operationInstanceRiskScale->getTargetedValue() !== (int)$data['targetedValue'] + ) { + $this->verifyScaleValue($operationInstanceRiskScale, (int)$data['targetedValue']); + $operationInstanceRiskScale->setTargetedValue((int)$data['targetedValue']); } - $this->instanceRiskOpTable->getDb()->flush(); + $operationInstanceRiskScale->setUpdater($this->connectedUser->getEmail()); - return $operationalInstanceRisk->getId(); + $this->updateRiskCacheValues($operationalInstanceRisk); + + $this->operationalInstanceRiskScaleTable->save($operationInstanceRiskScale); + + return $operationalInstanceRisk; } - public function getOperationalRisks(AnrSuperClass $anr, int $instanceId = null, array $params = []): array + public function update(Entity\Anr $anr, int $id, array $data): Entity\InstanceRiskOp { - $instancesIds = $this->determineInstancesIdsFromParam($instanceId); + /** @var Entity\InstanceRiskOp $operationalInstanceRisk */ + $operationalInstanceRisk = $this->instanceRiskOpTable->findByIdAndAnr($id, $anr); + $likelihoodScale = $this->operationalRiskScaleService->getFromCacheOrFindLikelihoodScale($anr); - $anrLanguage = $anr->getLanguage(); + if (isset($data['kindOfMeasure'])) { + $operationalInstanceRisk->setKindOfMeasure((int)$data['kindOfMeasure']); + } + if (isset($data['comment'])) { + $operationalInstanceRisk->setComment($data['comment']); + } + if (isset($data['netProb']) && $operationalInstanceRisk->getNetProb() !== $data['netProb']) { + $this->verifyScaleProbabilityValue((int)$data['netProb'], $likelihoodScale); + $operationalInstanceRisk->setNetProb((int)$data['netProb']); + } + if (isset($data['brutProb']) && $operationalInstanceRisk->getBrutProb() !== $data['brutProb']) { + $this->verifyScaleProbabilityValue((int)$data['brutProb'], $likelihoodScale); + $operationalInstanceRisk->setBrutProb((int)$data['brutProb']); + } + if (isset($data['targetedProb']) && $operationalInstanceRisk->getTargetedProb() !== $data['targetedProb']) { + $this->verifyScaleProbabilityValue((int)$data['targetedProb'], $likelihoodScale); + $operationalInstanceRisk->setTargetedProb((int)$data['targetedProb']); + } + if (isset($data['owner'])) { + $this->instanceRiskOwnerService->processRiskOwnerNameAndAssign( + (string)$data['owner'], + $operationalInstanceRisk + ); + } + if (isset($data['context']) && (string)$data['context'] !== $operationalInstanceRisk->getContext()) { + $operationalInstanceRisk->setContext($data['context']); + } - $operationalInstanceRisks = $this->instanceRiskOpTable->findByAnrInstancesAndFilterParams( - $anr, - $instancesIds, - $params - ); + $operationalInstanceRisk->setUpdater($this->connectedUser->getEmail()); - $result = []; - $scaleTypesTranslations = $this->translationTable->findByAnrTypesAndLanguageIndexedByKey( - $anr, - [Translation::OPERATIONAL_RISK_SCALE_TYPE, Translation::OPERATIONAL_RISK_SCALE_COMMENT], - $this->getAnrLanguageCode($anr) - ); - foreach ($operationalInstanceRisks as $operationalInstanceRisk) { - $recommendationUuids = []; - foreach ($operationalInstanceRisk->getRecommendationRisks() as $recommendationRisk) { - if ($recommendationRisk->getRecommendation() !== null) { - $recommendationUuids[] = $recommendationRisk->getRecommendation()->getUuid(); + $this->updateRiskCacheValues($operationalInstanceRisk); + + $this->instanceRiskOpTable->save($operationalInstanceRisk); + + $this->updateInstanceRiskRecommendationsPositions($operationalInstanceRisk); + + return $operationalInstanceRisk; + } + + public function updateRiskCacheValues(Entity\InstanceRiskOp $operationalInstanceRisk): void + { + foreach (['Brut', 'Net', 'Targeted'] as $valueType) { + $max = -1; + $probVal = $operationalInstanceRisk->{'get' . $valueType . 'Prob'}(); + if ($probVal !== -1) { + foreach ($operationalInstanceRisk->getOperationalInstanceRiskScales() as $riskScale) { + if (!$riskScale->getOperationalRiskScaleType()->isHidden()) { + $scaleValue = $riskScale->{'get' . $valueType . 'Value'}(); + if ($scaleValue > -1 && ($probVal * $scaleValue) > $max) { + $max = $probVal * $scaleValue; + } + } } } - $scalesData = []; - foreach ($operationalInstanceRisk->getOperationalInstanceRiskScales() as $operationalInstanceRiskScale) { - $operationalRiskScaleType = $operationalInstanceRiskScale->getOperationalRiskScaleType(); - $scalesData[$operationalRiskScaleType->getId()] = [ - 'instanceRiskScaleId' => $operationalInstanceRiskScale->getId(), - 'label' => isset($scaleTypesTranslations[$operationalRiskScaleType->getLabelTranslationKey()]) - ? $scaleTypesTranslations[$operationalRiskScaleType->getLabelTranslationKey()]->getValue() - : '', - 'netValue' => $operationalInstanceRiskScale->getNetValue(), - 'brutValue' => $operationalInstanceRiskScale->getBrutValue(), - 'targetedValue' => $operationalInstanceRiskScale->getTargetedValue(), - 'isHidden' => $operationalRiskScaleType->isHidden(), - ]; + if ($operationalInstanceRisk->{'getCache' . $valueType . 'Risk'}() !== $max) { + $operationalInstanceRisk + ->setUpdater($this->connectedUser->getEmail()) + ->{'setCache' . $valueType . 'Risk'}($max); + $this->instanceRiskOpTable->save($operationalInstanceRisk, false); } - - $result[] = [ - 'id' => $operationalInstanceRisk->getId(), - 'rolfRisk' => $operationalInstanceRisk->getRolfRisk() - ? $operationalInstanceRisk->getRolfRisk()->getId() - : null, - 'label' . $anrLanguage => $operationalInstanceRisk->getRiskCacheLabel($anrLanguage), - 'description' . $anrLanguage => $operationalInstanceRisk->getRiskCacheDescription($anrLanguage), - 'context' => $operationalInstanceRisk->getContext(), - 'owner' => $operationalInstanceRisk->getInstanceRiskOwner() - ? $operationalInstanceRisk->getInstanceRiskOwner()->getName() - : '', - 'netProb' => $operationalInstanceRisk->getNetProb(), - 'brutProb' => $operationalInstanceRisk->getBrutProb(), - 'targetedProb' => $operationalInstanceRisk->getTargetedProb(), - 'scales' => $scalesData, - 'cacheNetRisk' => $operationalInstanceRisk->getCacheNetRisk(), - 'cacheBrutRisk' => $operationalInstanceRisk->getCacheBrutRisk(), - 'cacheTargetedRisk' => $operationalInstanceRisk->getCacheTargetedRisk(), - 'kindOfMeasure' => $operationalInstanceRisk->getKindOfMeasure(), - 'comment' => $operationalInstanceRisk->getComment(), - 'specific' => $operationalInstanceRisk->getSpecific(), - 't' => $operationalInstanceRisk->getKindOfMeasure() === InstanceRiskOp::KIND_NOT_TREATED ? 0 : 1, - 'position' => $operationalInstanceRisk->getInstance()->getPosition(), - 'instanceInfos' => [ - 'id' => $operationalInstanceRisk->getInstance()->getId(), - 'scope' => $operationalInstanceRisk->getInstance()->getObject()->getScope(), - 'name' . $anrLanguage => $operationalInstanceRisk->getInstance()->getName($anrLanguage), - ], - 'recommendations' => implode(',', $recommendationUuids), - ]; } - - return $result; } - public function getOperationalRisksInCsv(Anr $anr, int $instanceId = null, array $params = []): string + public function getOperationalRisksInCsv(Entity\Anr $anr, int $instanceId = null, array $params = []): string { - $instancesIds = $this->determineInstancesIdsFromParam($instanceId); + $instancesIds = []; + if ($instanceId !== null) { + /** @var Entity\Instance $instance */ + $instance = $this->instanceTable->findByIdAndAnr($instanceId, $anr); + $instancesIds = $instance->getSelfAndChildrenIds(); + } $anrLanguage = $anr->getLanguage(); + /** @var Entity\OperationalRiskScaleType[] $operationalRiskScaleTypes */ $operationalRiskScaleTypes = $this->operationalRiskScaleTypeTable->findByAnrAndScaleType( $anr, - OperationalRiskScale::TYPE_IMPACT - ); - $scaleTypesTranslations = $this->translationTable->findByAnrTypesAndLanguageIndexedByKey( - $anr, - [Translation::OPERATIONAL_RISK_SCALE_TYPE], - $this->getAnrLanguageCode($anr) + CoreEntity\OperationalRiskScaleSuperClass::TYPE_IMPACT ); $tableHeaders = [ @@ -354,8 +355,7 @@ public function getOperationalRisksInCsv(Anr $anr, int $instanceId = null, array $tableHeaders['brutProb'] = $this->translateService->translate('Prob.', $anrLanguage) . "(" . $translatedRiskValueDescription . ")"; foreach ($operationalRiskScaleTypes as $operationalRiskScaleType) { - $label = $scaleTypesTranslations[$operationalRiskScaleType->getLabelTranslationKey()] - ->getValue(); + $label = $operationalRiskScaleType->getLabel(); $tableHeaders[$label . " (" . $translatedRiskValueDescription . ")"] = $label . " (" . $translatedRiskValueDescription . ")"; } @@ -366,8 +366,7 @@ public function getOperationalRisksInCsv(Anr $anr, int $instanceId = null, array $tableHeaders['netProb'] = $this->translateService->translate('Prob.', $anrLanguage) . "(" . $translatedNetRiskDescription . ")"; foreach ($operationalRiskScaleTypes as $operationalRiskScaleType) { - $label = $scaleTypesTranslations[$operationalRiskScaleType->getLabelTranslationKey()] - ->getValue(); + $label = $operationalRiskScaleType->getLabel(); $tableHeaders[$label . " (" . $translatedNetRiskDescription . ")"] = $label . " (" . $translatedNetRiskDescription . ")"; } @@ -408,13 +407,13 @@ public function getOperationalRisksInCsv(Anr $anr, int $instanceId = null, array } $values[] = $operationalInstanceRisk->getCacheNetRisk(); $values[] = $operationalInstanceRisk->getComment(); - $values[] = InstanceRiskOp::getAvailableMeasureTypes()[$operationalInstanceRisk->getKindOfMeasure()]; + $values[] = CoreEntity\InstanceRiskOpSuperClass::getAvailableMeasureTypes()[ + $operationalInstanceRisk->getKindOfMeasure() + ]; $values[] = $operationalInstanceRisk->getCacheTargetedRisk() === -1 ? $operationalInstanceRisk->getCacheNetRisk() : $operationalInstanceRisk->getCacheTargetedRisk(); - $values[] = $operationalInstanceRisk->getInstanceRiskOwner() !== null ? - $operationalInstanceRisk->getInstanceRiskOwner()->getName() : - null; + $values[] = $operationalInstanceRisk->getInstanceRiskOwner()?->getName(); $values[] = $operationalInstanceRisk->getContext(); $values[] = $this->getCsvRecommendations($anr, $operationalInstanceRisk); $values[] = $this->getCsvMeasures($anrLanguage, $operationalInstanceRisk); @@ -430,26 +429,10 @@ public function getOperationalRisksInCsv(Anr $anr, int $instanceId = null, array return $output; } - /** - * @throws EntityNotFoundException - * @throws Exception - * @throws ORMException - */ - public function update(int $id, array $data): array + public function delete(Entity\Anr $anr, int $id): void { - $result = parent::update($id, $data); - - /** @var InstanceRiskOp $operationalInstanceRisk */ - $operationalInstanceRisk = $this->instanceRiskOpTable->findById($id); - - $this->updateInstanceRiskRecommendationsPositions($operationalInstanceRisk); - - return $result; - } - - public function delete(int $id): void - { - $operationalInstanceRisk = $this->instanceRiskOpTable->findById($id); + /** @var Entity\InstanceRiskOp $operationalInstanceRisk */ + $operationalInstanceRisk = $this->instanceRiskOpTable->findByIdAndAnr($id, $anr); if (!$operationalInstanceRisk->isSpecific()) { throw new Exception('Only specific risks can be deleted.', 412); } @@ -459,97 +442,25 @@ public function delete(int $id): void $this->processRemovedInstanceRiskRecommendationsPositions($operationalInstanceRisk); } - /** - * Called from parent::createInstanceRiskOpWithScales - */ - protected function createInstanceRiskOpObjectFromInstanceObjectAndRolfRisk( - InstanceSuperClass $instance, - ObjectSuperClass $object, - RolfRiskSuperClass $rolfRisk - ): InstanceRiskOpSuperClass { - return (new InstanceRiskOp()) - ->setAnr($instance->getAnr()) - ->setInstance($instance) - ->setObject($object) - ->setRolfRisk($rolfRisk) - ->setRiskCacheCode($rolfRisk->getCode()) - ->setRiskCacheLabels([ - 'riskCacheLabel1' => $rolfRisk->getLabel(1), - 'riskCacheLabel2' => $rolfRisk->getLabel(2), - 'riskCacheLabel3' => $rolfRisk->getLabel(3), - 'riskCacheLabel4' => $rolfRisk->getLabel(4), - ]) - ->setRiskCacheDescriptions([ - 'riskCacheDescription1' => $rolfRisk->getDescription(1), - 'riskCacheDescription2' => $rolfRisk->getDescription(2), - 'riskCacheDescription3' => $rolfRisk->getDescription(3), - 'riskCacheDescription4' => $rolfRisk->getDescription(4), - ]); - } - - /** - * Called from InstanceRiskOpService::createInstanceRisksOp - * && OperationalRiskScaleService::createOperationalRiskScaleType - */ + /** The object is created and persisted, but not saved in the DB. */ public function createOperationalInstanceRiskScaleObject( - InstanceRiskOpSuperClass $instanceRiskOp, - OperationalRiskScaleTypeSuperClass $operationalRiskScaleType - ): OperationalInstanceRiskScaleSuperClass { - return (new OperationalInstanceRiskScale()) + Entity\InstanceRiskOp $instanceRiskOp, + Entity\OperationalRiskScaleType $operationalRiskScaleType + ): Entity\OperationalInstanceRiskScale { + $operationalInstanceRiskScale = (new Entity\OperationalInstanceRiskScale()) ->setAnr($instanceRiskOp->getAnr()) ->setOperationalInstanceRisk($instanceRiskOp) ->setOperationalRiskScaleType($operationalRiskScaleType) ->setCreator($this->connectedUser->getEmail()); - } - - protected function createInstanceRiskOwnerObject(AnrSuperClass $anr, string $ownerName): InstanceRiskOwnerSuperClass - { - return (new InstanceRiskOwner()) - ->setAnr($anr) - ->setName($ownerName) - ->setCreator($this->connectedUser->getEmail()); - } - - /** - * @param Instance[] $instances - * - * @return array - */ - private function extractInstancesAndTheirChildrenIds(array $instances): array - { - $instancesIds = []; - foreach ($instances as $instanceId => $instance) { - $instancesIds[] = $instanceId; - $instancesIds = array_merge( - $instancesIds, - $this->extractInstancesAndTheirChildrenIds($instance->getParameterValues('children')) - ); - } - - return $instancesIds; - } - - private function determineInstancesIdsFromParam($instanceId): array - { - $instancesIds = []; - if ($instanceId !== null) { - $instance = $this->instanceTable->findById($instanceId); - // TODO: remove initTree and use TreeStructureTrait::getEntityIdsWithLinkedChildren - $this->instanceTable->initTree($instance); - $instancesIds = $this->extractInstancesAndTheirChildrenIds([$instance->getId() => $instance]); - } + $this->operationalInstanceRiskScaleTable->save($operationalInstanceRiskScale, false); - return $instancesIds; + return $operationalInstanceRiskScale; } - protected function getCsvRecommendations(AnrSuperClass $anr, InstanceRiskOp $operationalInstanceRisk): string + protected function getCsvRecommendations(Entity\Anr $anr, Entity\InstanceRiskOp $operationalInstanceRisk): string { - $recommendationsRisks = $this->recommendationRiskTable->findByAnrAndOperationalInstanceRisk( - $anr, - $operationalInstanceRisk - ); $csvData = []; - foreach ($recommendationsRisks as $recommendationRisk) { + foreach ($operationalInstanceRisk->getRecommendationRisks() as $recommendationRisk) { $recommendation = $recommendationRisk->getRecommendation(); $csvData[] = $recommendation->getCode() . " - " . $recommendation->getDescription(); } @@ -557,67 +468,14 @@ protected function getCsvRecommendations(AnrSuperClass $anr, InstanceRiskOp $ope return implode("\n", $csvData); } - protected function getCsvMeasures(int $anrLanguage, InstanceRiskOp $operationalInstanceRisk): string + protected function getCsvMeasures(int $anrLanguage, Entity\InstanceRiskOp $operationalInstanceRisk): string { - $measures = $operationalInstanceRisk->getRolfRisk() - ? $operationalInstanceRisk->getRolfRisk()->getMeasures() - : []; $csvData = []; - foreach ($measures as $measure) { + foreach ($operationalInstanceRisk->getRolfRisk()->getMeasures() as $measure) { $csvData[] = "[" . $measure->getReferential()->getLabel($anrLanguage) . "] " . $measure->getCode() . " - " . $measure->getLabel($anrLanguage); } return implode("\n", $csvData); } - - protected function getConstructedFromObjectInstanceRiskOp( - CoreEntity\InstanceRiskOpSuperClass $instanceRiskOp - ): CoreEntity\InstanceRiskOpSuperClass { - return FrontOfficeEntity\InstanceRiskOp::constructFromObject($instanceRiskOp); - } - - protected function getConstructedFromObjectOperationalInstanceRiskScale( - CoreEntity\OperationalInstanceRiskScaleSuperClass $operationalInstanceRiskScale - ): CoreEntity\OperationalInstanceRiskScaleSuperClass { - return FrontOfficeEntity\OperationalInstanceRiskScale::constructFromObject($operationalInstanceRiskScale); - } - - private function processRiskOwnerName( - string $ownerName, - Entity\InstanceRiskOp $operationalInstanceRisk - ): void { - if (empty($ownerName)) { - $operationalInstanceRisk->setInstanceRiskOwner(null); - } else { - $instanceRiskOwner = $this->instanceRiskOwnerTable->findByAnrAndName( - $operationalInstanceRisk->getAnr(), - $ownerName - ); - if ($instanceRiskOwner === null) { - $instanceRiskOwner = $this->createInstanceRiskOwnerObject( - $operationalInstanceRisk->getAnr(), - $ownerName - ); - - $this->instanceRiskOwnerTable->save($instanceRiskOwner, false); - - $operationalInstanceRisk->setInstanceRiskOwner($instanceRiskOwner); - } elseif ($operationalInstanceRisk->getInstanceRiskOwner() === null - || $operationalInstanceRisk->getInstanceRiskOwner()->getId() !== $instanceRiskOwner->getId() - ) { - $operationalInstanceRisk->setInstanceRiskOwner($instanceRiskOwner); - } - } - } - - private function createInstanceRiskOwnerObject( - Entity\Anr $anr, - string $ownerName - ): Entity\InstanceRiskOwner { - return (new Entity\InstanceRiskOwner()) - ->setAnr($anr) - ->setName($ownerName) - ->setCreator($this->connectedUser->getEmail()); - } } diff --git a/src/Service/AnrInstanceRiskService.php b/src/Service/AnrInstanceRiskService.php index 39f96312..16daf66d 100644 --- a/src/Service/AnrInstanceRiskService.php +++ b/src/Service/AnrInstanceRiskService.php @@ -29,7 +29,6 @@ class AnrInstanceRiskService public function __construct( private Table\InstanceRiskTable $instanceRiskTable, - private Table\InstanceRiskOwnerTable $instanceRiskOwnerTable, private Table\RecommendationTable $recommendationTable, private Table\RecommendationRiskTable $recommendationRiskTable, private Table\InstanceTable $instanceTable, @@ -429,7 +428,7 @@ public function getInstanceRisksInCsv(Entity\Anr $anr, $instanceId = null, $para private function updateInstanceRiskData(Entity\InstanceRisk $instanceRisk, array $data): void { if (isset($data['owner'])) { - $this->processRiskOwnerName((string)$data['owner'], $instanceRisk); + $this->instanceRiskOwnerService->processRiskOwnerNameAndAssign((string)$data['owner'], $instanceRisk); } if (isset($data['context'])) { $instanceRisk->setContext($data['context']); @@ -455,26 +454,6 @@ private function updateInstanceRiskData(Entity\InstanceRisk $instanceRisk, array $this->recalculateRiskRates($instanceRisk); } - private function processRiskOwnerName(string $ownerName, Entity\InstanceRisk $instanceRisk): void - { - if (empty($ownerName)) { - $instanceRisk->setInstanceRiskOwner(null); - return; - } - - /** @var Entity\Anr $anr */ - $anr = $instanceRisk->getAnr(); - $instanceRiskOwner = $this->instanceRiskOwnerTable->findByAnrAndName($anr, $ownerName); - if ($instanceRiskOwner === null) { - $instanceRiskOwner = $this->instanceRiskOwnerService->create($anr, $ownerName); - $instanceRisk->setInstanceRiskOwner($instanceRiskOwner); - } elseif ($instanceRisk->getInstanceRiskOwner() === null - || $instanceRisk->getInstanceRiskOwner()->getId() !== $instanceRiskOwner->getId() - ) { - $instanceRisk->setInstanceRiskOwner($instanceRiskOwner); - } - } - private function duplicateRecommendationRisks( Entity\InstanceRisk $fromInstanceRisk, Entity\InstanceRisk $newInstanceRisk diff --git a/src/Service/DeliverableGenerationService.php b/src/Service/DeliverableGenerationService.php index 58e2c7a1..32f1471f 100644 --- a/src/Service/DeliverableGenerationService.php +++ b/src/Service/DeliverableGenerationService.php @@ -669,7 +669,7 @@ protected function buildRiskAssessmentValues() 'CURRENT_RISK_MAP' => $this->generateCurrentRiskMap('real'), 'TARGET_RISK_MAP' => $this->generateCurrentRiskMap('targeted'), 'TABLE_ASSET_CONTEXT' => $this->generateAssetContextTable(), - 'RISKS_KIND_OF_TREATMENT' => $this->generateRisksByKindOfTreatment(), + 'RISKS_KIND_OF_TREATMENT' => $this->generateRisksByKindOfMeasure(), 'TABLE_AUDIT_INSTANCES' => $this->generateTableAudit(), 'TABLE_AUDIT_RISKS_OP' => $this->generateTableAuditOp(), ]] @@ -2450,7 +2450,7 @@ protected function getRisksDistribution($infoRisk = true) * Generates the Risks by kind of treatment * @return mixed|string The WordXml data generated */ - protected function generateRisksByKindOfTreatment() + protected function generateRisksByKindOfMeasure() { $result = null; $opRisksAllScales = $this->operationalRiskScaleService->getOperationalRiskScales($this->anr->getId()); diff --git a/src/Service/InstanceRiskOwnerService.php b/src/Service/InstanceRiskOwnerService.php index 60da0772..4da09ffe 100644 --- a/src/Service/InstanceRiskOwnerService.php +++ b/src/Service/InstanceRiskOwnerService.php @@ -10,6 +10,8 @@ use Monarc\Core\Model\Entity\UserSuperClass; use Monarc\Core\Service\ConnectedUserService; use Monarc\FrontOffice\Model\Entity\Anr; +use Monarc\FrontOffice\Model\Entity\InstanceRisk; +use Monarc\FrontOffice\Model\Entity\InstanceRiskOp; use Monarc\FrontOffice\Model\Entity\InstanceRiskOwner; use Monarc\FrontOffice\Table\InstanceRiskOwnerTable; @@ -54,6 +56,26 @@ public function getOrCreateInstanceRiskOwner( return $this->cachedData['instanceRiskOwners'][$ownerName]; } + public function processRiskOwnerNameAndAssign(string $ownerName, InstanceRisk|InstanceRiskOp $instanceRisk): void + { + if (empty($ownerName)) { + $instanceRisk->setInstanceRiskOwner(null); + return; + } + + /** @var Anr $anr */ + $anr = $instanceRisk->getAnr(); + $instanceRiskOwner = $this->instanceRiskOwnerTable->findByAnrAndName($anr, $ownerName); + if ($instanceRiskOwner === null) { + $instanceRiskOwner = $this->create($anr, $ownerName); + $instanceRisk->setInstanceRiskOwner($instanceRiskOwner); + } elseif ($instanceRisk->getInstanceRiskOwner() === null + || $instanceRisk->getInstanceRiskOwner()->getId() !== $instanceRiskOwner->getId() + ) { + $instanceRisk->setInstanceRiskOwner($instanceRiskOwner); + } + } + public function getList(Anr $anr, array $params = []): array { $result = []; diff --git a/src/Service/OperationalRiskScaleService.php b/src/Service/OperationalRiskScaleService.php index e9a507fc..f507de42 100644 --- a/src/Service/OperationalRiskScaleService.php +++ b/src/Service/OperationalRiskScaleService.php @@ -1,7 +1,7 @@ connectedUser = $connectedUserService->getConnectedUser(); - $this->operationalRiskScaleTable = $operationalRiskScaleTable; - $this->operationalRiskScaleTypeTable = $operationalRiskScaleTypeTable; - $this->operationalRiskScaleCommentTable = $operationalRiskScaleCommentTable; - $this->instanceRiskOpService = $instanceRiskOpService; - $this->instanceRiskOpTable = $instanceRiskOpTable; - $this->operationalInstanceRiskScaleTable = $operationalInstanceRiskScaleTable; } - public function getOperationalRiskScales(Entity\Anr $anr): array { $result = []; @@ -133,11 +115,10 @@ public function createOperationalRiskScaleType(Entity\Anr $anr, array $data): En /* Link the new type with all the existed operational risks. */ /** @var Entity\InstanceRiskOp $operationalInstanceRisk */ foreach ($this->instanceRiskOpTable->findByAnr($anr) as $operationalInstanceRisk) { - $operationalInstanceRiskScale = $this->instanceRiskOpService->createOperationalInstanceRiskScaleObject( + $this->instanceRiskOpService->createOperationalInstanceRiskScaleObject( $operationalInstanceRisk, $operationalRiskScaleType ); - $this->operationalInstanceRiskScaleTable->save($operationalInstanceRiskScale, false); } $this->operationalRiskScaleTypeTable->save($operationalRiskScaleType); @@ -304,6 +285,20 @@ public function updateMinMaxForOperationalRiskProbability(Entity\Anr $anr, $data } } + public function getFromCacheOrFindLikelihoodScale(Entity\Anr $anr): Entity\OperationalRiskScale + { + $typeLikelihood = CoreEntity\OperationalRiskScaleSuperClass::TYPE_LIKELIHOOD; + if (!isset($this->operationalRiskScales[$typeLikelihood])) { + $this->operationalRiskScales[$typeLikelihood] = $this->operationalRiskScaleTable->findByAnrAndType( + $anr, + $typeLikelihood + ); + } + + /* There is only one scale of the TYPE_LIKELIHOOD. */ + return current($this->operationalRiskScales[$typeLikelihood]); + } + protected function getCreatedOperationalRiskScaleTypeObject( Entity\Anr $anr, Entity\OperationalRiskScale $operationalRiskScale diff --git a/src/Table/ObjectCategoryTable.php b/src/Table/ObjectCategoryTable.php index c9258668..de304ea6 100755 --- a/src/Table/ObjectCategoryTable.php +++ b/src/Table/ObjectCategoryTable.php @@ -5,16 +5,13 @@ * @license MONARC is licensed under GNU Affero General Public License version 3 */ - namespace Monarc\FrontOffice\Table; use Doctrine\ORM\EntityManager; -use Monarc\Core\Model\Entity\ObjectCategorySuperClass; use Monarc\Core\Table\ObjectCategoryTable as CoreObjectCategoryTable; use Monarc\FrontOffice\Model\Entity\Anr; use Monarc\FrontOffice\Model\Entity\ObjectCategory; -// TODO: move me to the right place and refactor all the references!!! class ObjectCategoryTable extends CoreObjectCategoryTable { public function __construct(EntityManager $entityManager, string $entityName = ObjectCategory::class) @@ -68,13 +65,4 @@ public function findMaxPositionByAnrAndParent(Anr $anr, ?ObjectCategory $parentO ->getQuery() ->getSingleScalarResult(); } - - public function saveEntity(ObjectCategorySuperClass $objectCategory, bool $flushAll = true): void - { - $em = $this->getDb()->getEntityManager(); - $em->persist($objectCategory); - if ($flushAll) { - $em->flush(); - } - } } diff --git a/src/Validator/InputValidator/InstanceRisk/PostSpecificInstanceRiskDataInputValidator.php b/src/Validator/InputValidator/InstanceRisk/PostSpecificInstanceRiskDataInputValidator.php index 40607c63..acc60baf 100644 --- a/src/Validator/InputValidator/InstanceRisk/PostSpecificInstanceRiskDataInputValidator.php +++ b/src/Validator/InputValidator/InstanceRisk/PostSpecificInstanceRiskDataInputValidator.php @@ -18,6 +18,7 @@ protected function getRules(): array [ 'name' => 'instance', 'required' => true, + 'allow_empty' => false, 'filters' => [ ['name' => 'ToInt'], ], @@ -26,6 +27,7 @@ protected function getRules(): array [ 'name' => 'threat', 'required' => true, + 'allow_empty' => false, 'filters' => [], 'validators' => [ [ @@ -40,6 +42,7 @@ protected function getRules(): array [ 'name' => 'vulnerability', 'required' => true, + 'allow_empty' => false, 'filters' => [], 'validators' => [ [ diff --git a/src/Validator/InputValidator/InstanceRiskOp/PostSpecificInstanceRiskOpDataInputValidator.php b/src/Validator/InputValidator/InstanceRiskOp/PostSpecificInstanceRiskOpDataInputValidator.php new file mode 100644 index 00000000..39e1dc7a --- /dev/null +++ b/src/Validator/InputValidator/InstanceRiskOp/PostSpecificInstanceRiskOpDataInputValidator.php @@ -0,0 +1,104 @@ +initialData['source']) + && (int)$this->initialData['source'] === AnrInstanceRiskOpService::CREATION_SOURCE_FROM_RISK; + + return [ + [ + 'name' => 'source', + 'required' => true, + 'allow_empty' => false, + 'filters' => [ + ['name' => 'ToInt'], + ], + 'validators' => [ + [ + 'name' => InArray::class, + 'options' => [ + 'haystack' => [ + AnrInstanceRiskOpService::CREATION_SOURCE_FROM_RISK, + AnrInstanceRiskOpService::CREATION_SOURCE_NEW_RISK, + ], + ] + ] + ], + ], + [ + 'name' => 'instance', + 'required' => true, + 'allow_empty' => false, + 'filters' => [ + ['name' => 'ToInt'], + ], + 'validators' => [], + ], + [ + 'name' => 'risk', + 'required' => $isSourceFromRisk, + 'allow_empty' => !$isSourceFromRisk, + 'filters' => [ + ['name' => 'ToInt'], + ], + 'validators' => [], + ], + [ + 'name' => 'code', + 'required' => !$isSourceFromRisk, + 'filters' => [ + ['name' => StringTrim::class], + ], + 'validators' => [ + [ + 'name' => StringLength::class, + 'options' => [ + 'min' => 1, + 'max' => 100, + ] + ], + ], + ], + [ + 'name' => 'label', + 'required' => !$isSourceFromRisk, + 'filters' => [ + ['name' => StringTrim::class], + ], + 'validators' => [ + [ + 'name' => StringLength::class, + 'options' => [ + 'min' => 1, + 'max' => 255, + ] + ], + ], + ], + [ + 'name' => 'description', + 'required' => !$isSourceFromRisk, + 'filters' => [ + ['name' => StringTrim::class], + ], + 'validators' => [ + ], + ], + ]; + } +} diff --git a/src/Validator/InputValidator/InstanceRiskOp/UpdateInstanceRiskOpDataInputValidator.php b/src/Validator/InputValidator/InstanceRiskOp/UpdateInstanceRiskOpDataInputValidator.php new file mode 100644 index 00000000..85a50bc4 --- /dev/null +++ b/src/Validator/InputValidator/InstanceRiskOp/UpdateInstanceRiskOpDataInputValidator.php @@ -0,0 +1,42 @@ + 'owner', + 'required' => false, + 'filters' => [ + [ + 'name' => StringTrim::class, + ], + ], + 'validators' => [], + ], + [ + 'name' => 'context', + 'required' => false, + 'filters' => [ + [ + 'name' => StringTrim::class, + ], + ], + 'validators' => [], + ], + ]); + } +}