Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
16.88% |
13 / 77 |
|
7.69% |
1 / 13 |
CRAP | |
0.00% |
0 / 1 |
AnalyseImpactExtension | |
16.88% |
13 / 77 |
|
7.69% |
1 / 13 |
619.99 | |
0.00% |
0 / 1 |
getFunctions | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
1 | |||
compareStrings | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getFormattedActionProtectionsFromQuestion | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
12 | |||
isScenarioMenaceImpactResiduelImpactNotNegligeable | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
getConformiteLabel | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
20 | |||
getScenarioMenaceImpactPotentiel | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getScenarioMenaceImpactResiduel | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
getScenarioMenaceImpactPotentielLabel | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
getScenarioMenaceImpactResiduelLabel | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
getImpactLabel | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
42 | |||
getScenarioMenaceIndicateurResiduel | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
getCritereLabel | |
0.00% |
0 / 11 |
|
0.00% |
0 / 1 |
20 | |||
getLastAnalyseImpact | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
42 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace App\Domain\AIPD\Twig\Extension; |
6 | |
7 | use App\Domain\AIPD\Calculator\AnalyseEvaluationCalculator; |
8 | use App\Domain\AIPD\Dictionary\ReponseCritereFondamentalDictionary; |
9 | use App\Domain\AIPD\Dictionary\VraisemblanceGraviteDictionary; |
10 | use App\Domain\AIPD\Model\AnalyseImpact; |
11 | use App\Domain\AIPD\Model\AnalyseQuestionConformite; |
12 | use App\Domain\AIPD\Model\AnalyseScenarioMenace; |
13 | use App\Domain\AIPD\Model\CriterePrincipeFondamental; |
14 | use App\Domain\Registry\Model\ConformiteTraitement\ConformiteTraitement; |
15 | use App\Domain\Registry\Model\Mesurement; |
16 | use Twig\Extension\AbstractExtension; |
17 | use Twig\TwigFunction; |
18 | |
19 | class AnalyseImpactExtension extends AbstractExtension |
20 | { |
21 | public function getFunctions() |
22 | { |
23 | return [ |
24 | new TwigFunction('getFormattedActionProtectionsFromQuestion', [$this, 'getFormattedActionProtectionsFromQuestion']), |
25 | new TwigFunction('getConformiteLabel', [$this, 'getConformiteLabel']), |
26 | new TwigFunction('getCritereLabel', [$this, 'getCritereLabel']), |
27 | new TwigFunction('compareStrings', [$this, 'compareStrings']), |
28 | new TwigFunction('getLastAnalyseImpact', [$this, 'getLastAnalyseImpact']), |
29 | new TwigFunction('getScenarioMenaceImpactPotentielLabel', [$this, 'getScenarioMenaceImpactPotentielLabel']), |
30 | new TwigFunction('getScenarioMenaceImpactPotentiel', [$this, 'getScenarioMenaceImpactPotentiel']), |
31 | new TwigFunction('getScenarioMenaceImpactResiduelLabel', [$this, 'getScenarioMenaceImpactResiduelLabel']), |
32 | new TwigFunction('getScenarioMenaceImpactResiduel', [$this, 'getScenarioMenaceImpactResiduel']), |
33 | new TwigFunction('getScenarioMenaceIndicateurResiduel', [$this, 'getScenarioMenaceIndicateurResiduel']), |
34 | new TwigFunction('isScenarioMenaceImpactResiduelImpactNotNegligeable', [$this, 'isScenarioMenaceImpactResiduelImpactNotNegligeable']), |
35 | ]; |
36 | } |
37 | |
38 | public function compareStrings(string $a, string $b) |
39 | { |
40 | return strcmp($a, $b); |
41 | } |
42 | |
43 | public function getFormattedActionProtectionsFromQuestion(AnalyseQuestionConformite $questionAnalyse) |
44 | { |
45 | $reponseConformite = $questionAnalyse->getAnalyseImpact()->getConformiteTraitement()->getReponseOfName($questionAnalyse->getQuestion()); |
46 | $formattedString = ''; |
47 | if (!$reponseConformite) { |
48 | return '<li><a href="/conformite-traitement/modifier/' . $questionAnalyse->getAnalyseImpact()->getConformiteTraitement()->getId()->toString() . '">Veuillez évaluer à nouveau la conformité du traitement</a></li>'; |
49 | } |
50 | /** @var Mesurement $actionProtection */ |
51 | foreach ($reponseConformite->getActionProtections() as $actionProtection) { |
52 | $formattedString .= '<li><a target="_blank" href="/actions-de-protection/visualiser/' . $actionProtection->getId() . '">' . $actionProtection->getName() . '</a></li>'; |
53 | } |
54 | |
55 | return $formattedString; |
56 | } |
57 | |
58 | public function isScenarioMenaceImpactResiduelImpactNotNegligeable(AnalyseScenarioMenace $scenarioMenace): bool |
59 | { |
60 | $impact = VraisemblanceGraviteDictionary::getImpact($this->getScenarioMenaceImpactResiduel($scenarioMenace)); |
61 | |
62 | return VraisemblanceGraviteDictionary::NEGLIGEABLE !== $impact; |
63 | } |
64 | |
65 | public function getConformiteLabel(AnalyseQuestionConformite $questionAnalyse): string |
66 | { |
67 | $reponseConformite = $questionAnalyse->getAnalyseImpact()->getConformiteTraitement()->getReponseOfName($questionAnalyse->getQuestion()); |
68 | if (!$reponseConformite) { |
69 | return 'Inconnu'; |
70 | } |
71 | if ($reponseConformite->isConforme()) { |
72 | return '<span class="label label-success" style="min-width: 100%; display: inline-block;">Conforme</span>'; |
73 | } elseif (!$reponseConformite->getActionProtections()->isEmpty()) { |
74 | return '<span class="label label-warning" style="min-width: 100%; display: inline-block;">Non-conforme mineure</span>'; |
75 | } |
76 | |
77 | return '<span class="label label-danger" style="min-width: 100%; display: inline-block;">Non-conforme majeure</span>'; |
78 | } |
79 | |
80 | public function getScenarioMenaceImpactPotentiel(AnalyseScenarioMenace $scenarioMenace) |
81 | { |
82 | return AnalyseEvaluationCalculator::calculateImpactPotentiel($scenarioMenace); |
83 | } |
84 | |
85 | public function getScenarioMenaceImpactResiduel(AnalyseScenarioMenace $scenarioMenace) |
86 | { |
87 | return AnalyseEvaluationCalculator::calculateImpactResiduel($scenarioMenace); |
88 | } |
89 | |
90 | public function getScenarioMenaceImpactPotentielLabel(AnalyseScenarioMenace $scenarioMenace): string |
91 | { |
92 | $impact = VraisemblanceGraviteDictionary::getImpact($this->getScenarioMenaceImpactPotentiel($scenarioMenace)); |
93 | |
94 | return $this->getImpactLabel($impact); |
95 | } |
96 | |
97 | public function getScenarioMenaceImpactResiduelLabel(AnalyseScenarioMenace $scenarioMenace): string |
98 | { |
99 | $impact = VraisemblanceGraviteDictionary::getImpact($this->getScenarioMenaceImpactResiduel($scenarioMenace)); |
100 | |
101 | return $this->getImpactLabel($impact); |
102 | } |
103 | |
104 | private function getImpactLabel(string $impact): string |
105 | { |
106 | $labelColor = null; |
107 | switch ($impact) { |
108 | case VraisemblanceGraviteDictionary::NEGLIGEABLE: |
109 | $labelColor = 'label-success'; |
110 | break; |
111 | case VraisemblanceGraviteDictionary::LIMITEE: |
112 | $labelColor = 'label-warning'; |
113 | break; |
114 | case VraisemblanceGraviteDictionary::IMPORTANTE: |
115 | $labelColor = 'label-default'; |
116 | break; |
117 | default: |
118 | $labelColor = 'label-danger'; |
119 | break; |
120 | } |
121 | |
122 | return '<span class="label ' . $labelColor . '" style="min-width: 100%; display: inline-block;' . ('label-default' == $labelColor ? 'background:#605CA8; color:white;' : '') . '">' . VraisemblanceGraviteDictionary::getMasculineValues()[$impact] . '</span>'; |
123 | } |
124 | |
125 | public function getScenarioMenaceIndicateurResiduel(AnalyseScenarioMenace $scenarioMenace, string $poidsType) |
126 | { |
127 | if ('vraisemblance' === $poidsType) { |
128 | $indicateurInitial = VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getVraisemblance()); |
129 | } else { |
130 | $indicateurInitial = VraisemblanceGraviteDictionary::getPoidsFromImpact($scenarioMenace->getGravite()); |
131 | } |
132 | |
133 | return AnalyseEvaluationCalculator::calculateIndicateurResiduel($scenarioMenace, $indicateurInitial, $poidsType); |
134 | } |
135 | |
136 | public function getCritereLabel(CriterePrincipeFondamental $critere) |
137 | { |
138 | $labelColor = null; |
139 | switch ($critere->getReponse()) { |
140 | case ReponseCritereFondamentalDictionary::REPONSE_CONFORME: |
141 | $labelColor = 'label-success'; |
142 | break; |
143 | case ReponseCritereFondamentalDictionary::REPONSE_NON_CONFORME: |
144 | $labelColor = 'label-danger'; |
145 | break; |
146 | default: |
147 | $labelColor = 'label-default'; |
148 | break; |
149 | } |
150 | |
151 | return '<span class="label ' . $labelColor . '" style="min-width: 100%; display: inline-block;">' . ReponseCritereFondamentalDictionary::getLabelReponse($critere->getReponse()) . '</span>'; |
152 | } |
153 | |
154 | public function getLastAnalyseImpact(ConformiteTraitement $conformiteTraitement): ?AnalyseImpact |
155 | { |
156 | if (empty($conformiteTraitement->getAnalyseImpacts())) { |
157 | return null; |
158 | } |
159 | $lastAnalyse = null; |
160 | |
161 | foreach ($conformiteTraitement->getAnalyseImpacts() as $analyseImpact) { |
162 | /* Une seule analyse d'impact peut être sans date de validation, car on ne peut en commencer une nouvelle |
163 | tant que l'actuelle n'a pas été validé. S'il n'y a pas de date, cela indique donc que c'est la dernière analyse */ |
164 | if (is_null($analyseImpact->getDateValidation())) { |
165 | return $analyseImpact; |
166 | } |
167 | if (is_null($lastAnalyse)) { |
168 | $lastAnalyse = $analyseImpact; |
169 | continue; |
170 | } |
171 | if ($analyseImpact->getDateValidation() > $lastAnalyse->getDateValidation()) { |
172 | $lastAnalyse = $analyseImpact; |
173 | } |
174 | } |
175 | |
176 | return $lastAnalyse; |
177 | } |
178 | } |