Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
16.88% covered (danger)
16.88%
13 / 77
7.69% covered (danger)
7.69%
1 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
AnalyseImpactExtension
16.88% covered (danger)
16.88%
13 / 77
7.69% covered (danger)
7.69%
1 / 13
619.99
0.00% covered (danger)
0.00%
0 / 1
 getFunctions
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 compareStrings
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getFormattedActionProtectionsFromQuestion
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 isScenarioMenaceImpactResiduelImpactNotNegligeable
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getConformiteLabel
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
20
 getScenarioMenaceImpactPotentiel
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getScenarioMenaceImpactResiduel
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getScenarioMenaceImpactPotentielLabel
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getScenarioMenaceImpactResiduelLabel
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getImpactLabel
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 getScenarioMenaceIndicateurResiduel
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getCritereLabel
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 getLastAnalyseImpact
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3declare(strict_types=1);
4
5namespace App\Domain\AIPD\Twig\Extension;
6
7use App\Domain\AIPD\Calculator\AnalyseEvaluationCalculator;
8use App\Domain\AIPD\Dictionary\ReponseCritereFondamentalDictionary;
9use App\Domain\AIPD\Dictionary\VraisemblanceGraviteDictionary;
10use App\Domain\AIPD\Model\AnalyseImpact;
11use App\Domain\AIPD\Model\AnalyseQuestionConformite;
12use App\Domain\AIPD\Model\AnalyseScenarioMenace;
13use App\Domain\AIPD\Model\CriterePrincipeFondamental;
14use App\Domain\Registry\Model\ConformiteTraitement\ConformiteTraitement;
15use App\Domain\Registry\Model\Mesurement;
16use Twig\Extension\AbstractExtension;
17use Twig\TwigFunction;
18
19class 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}