Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
AnalyseEvaluationCalculator
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 4
182
0.00% covered (danger)
0.00%
0 / 1
 calculateImpactPotentiel
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 calculateImpactResiduel
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getImpactFromGraviteAndVraisemblance
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
56
 calculateIndicateurResiduel
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3declare(strict_types=1);
4
5namespace App\Domain\AIPD\Calculator;
6
7use App\Domain\AIPD\Dictionary\ReponseMesureProtectionDictionary;
8use App\Domain\AIPD\Dictionary\VraisemblanceGraviteDictionary;
9use App\Domain\AIPD\Model\AnalyseScenarioMenace;
10
11class AnalyseEvaluationCalculator
12{
13    public static function calculateImpactPotentiel(AnalyseScenarioMenace $scenarioMenace)
14    {
15        $vraisemblance = VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getVraisemblance());
16        $gravite       = VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getGravite());
17
18        return self::getImpactFromGraviteAndVraisemblance($gravite, $vraisemblance);
19    }
20
21    public static function calculateImpactResiduel(AnalyseScenarioMenace $scenarioMenace)
22    {
23        $vraisemblanceResiduel = self::calculateIndicateurResiduel($scenarioMenace, VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getVraisemblance()), 'vraisemblance');
24        $graviteResiduel       = self::calculateIndicateurResiduel($scenarioMenace, VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getGravite()));
25
26        return self::getImpactFromGraviteAndVraisemblance($graviteResiduel, $vraisemblanceResiduel);
27    }
28
29    public static function getImpactFromGraviteAndVraisemblance($gravite, $vraisemblance)
30    {
31        $value = 1;
32        if ($gravite > 2 && $vraisemblance > 2) {
33            $value = 4;
34        } elseif ($gravite > 2 && $vraisemblance <= 2) {
35            $value = 3;
36        } elseif ($gravite <= 2 && $vraisemblance > 2) {
37            $value = 2;
38        }
39
40        return $value;
41    }
42
43    public static function calculateIndicateurResiduel(AnalyseScenarioMenace $scenarioMenace, $indicateurPotentiel, string $poidsType = 'gravite'): float
44    {
45        // Gr = max[Gi - (Gi * <mG/<pG); 0,01]
46
47        /* S'il n'y a pas de mesures de protection, il n'y a rien à pondérer car le risque n'est pas traité.
48        On retourne alors le risque potentiel (= initial) */
49        if ($scenarioMenace->getMesuresProtections()->isEmpty()) {
50            return $indicateurPotentiel;
51        }
52        $s = array_map(function ($value) use ($poidsType) {
53            if ('gravite' === $poidsType) {
54                return $value->getPoidsGravite();
55            }
56
57            return $value->getPoidsVraisemblance();
58        }, $scenarioMenace->getMesuresProtections()->toArray());
59        $sommePoids         = array_sum($s);
60        $sommePoidsPonderes = array_sum(array_map(function ($value) use ($poidsType, $scenarioMenace) {
61            if ('gravite' === $poidsType) {
62                return $value->getPoidsGravite() * ReponseMesureProtectionDictionary::getPoidsIndexFromReponse($value->getReponse(), $scenarioMenace->getAnalyseImpact());
63            }
64
65            return $value->getPoidsVraisemblance() * ReponseMesureProtectionDictionary::getPoidsIndexFromReponse($value->getReponse(), $scenarioMenace->getAnalyseImpact());
66        }, $scenarioMenace->getMesuresProtections()->toArray()));
67
68        $indicateurResiduel = max($indicateurPotentiel - ($indicateurPotentiel * ($sommePoidsPonderes / $sommePoids)), 0.25);
69
70        return $indicateurResiduel;
71    }
72}