From a1a92e6a094472acdea3321898d84ead14dc601b Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 27 Jun 2023 12:30:59 +0200 Subject: [PATCH] wip calculation --- httpdocs/import/mpp_import_benchmark.xlsx | Bin 48012 -> 48028 bytes httpdocs/import/~$mpp_import_benchmark.xlsx | Bin 165 -> 0 bytes httpdocs/import/~$mpp_import_din.xlsx | Bin 165 -> 0 bytes httpdocs/public/assets/js/my-bim-score.js | 25 +++++++++-- httpdocs/src/Command/CmdImportDinAssets.php | 3 +- httpdocs/src/Controller/UserController.php | 39 +++++++++++++++++- httpdocs/src/Entity/DinAsset.php | 39 +++++++++++++++--- httpdocs/src/Utils/Utils.php | 25 ++++++----- .../templates/pages/risk_analysis.html.twig | 13 +++--- 9 files changed, 113 insertions(+), 31 deletions(-) delete mode 100644 httpdocs/import/~$mpp_import_benchmark.xlsx delete mode 100644 httpdocs/import/~$mpp_import_din.xlsx diff --git a/httpdocs/import/mpp_import_benchmark.xlsx b/httpdocs/import/mpp_import_benchmark.xlsx index 397d0daf2e7a82209c2b96fdb811c53e0ba73146..2dc42d99a822cc435ca27c1302f05d55169f70cd 100644 GIT binary patch delta 2019 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 CXwr%R diff --git a/httpdocs/import/~$mpp_import_benchmark.xlsx b/httpdocs/import/~$mpp_import_benchmark.xlsx deleted file mode 100644 index 4283e76f72a29e7db114d7cb1ea6bb2c602ba580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmd;cNzBVk%~9~qD@`d*%~K!}@G-bBBr@bNWHO{O' + data.benchmarkValues[i] + ''); + $('#benchmark').append(''); } if (Object.keys(data.benchmarkValues).length < 1) { @@ -151,6 +152,24 @@ function onChangeDinAsset() { }); } +function onFormSubmit() { + $("#submit").on("click", function(e) { + console.log($('#form-risk').serializeArray()); + $.ajax({ + url: "/calculate-risk", + method: "post", + data: $('#form-risk').serializeArray(), + success: function (data) { + console.log(data); + }, + error: function (xhr, msg, three) { + messageBox(false, "Fehler bei der Anfrage."); + }, + dataType: "json" + }); + }); +} + let savedCatalogueAnswer, savedCatalogueNote; $(document).ready(function() { diff --git a/httpdocs/src/Command/CmdImportDinAssets.php b/httpdocs/src/Command/CmdImportDinAssets.php index 56f2d2a..69972a6 100755 --- a/httpdocs/src/Command/CmdImportDinAssets.php +++ b/httpdocs/src/Command/CmdImportDinAssets.php @@ -92,7 +92,8 @@ class CmdImportDinAssets extends Command $dinAsset->setName($rowData[1]); $dinAsset->setCycleMonthsMin($rowData[11]); $dinAsset->setCycleMonthsMax($rowData[12]); - $dinAsset->setCycleMonthsRecommended($rowData[13]); + $dinAsset->setCycleMonthsRecInspection($rowData[13]); + $dinAsset->setCycleMonthsRecMaintenance($rowData[14]); $this->em->persist($dinAsset); $this->em->flush(); $dinAssetsByDinAndName[$key] = $dinAsset; diff --git a/httpdocs/src/Controller/UserController.php b/httpdocs/src/Controller/UserController.php index 04fdf50..5579e10 100644 --- a/httpdocs/src/Controller/UserController.php +++ b/httpdocs/src/Controller/UserController.php @@ -96,7 +96,6 @@ class UserController extends AbstractController ); } - /** * @Route("/get-benchmark-data", name="get_benchmark_data") */ @@ -111,13 +110,49 @@ class UserController extends AbstractController } $res = []; - $res['cycleRecommended'] = $dinAsset->getCycleMonthsRecommended(); + $res['cycleRecommended'] = $dinAsset->getCycleMonthsRecInspection(); $res['cycleMin'] = $dinAsset->getCycleMonthsMin(); $res['cycleMax'] = $dinAsset->getCycleMonthsMax(); $res['benchmarkValues'] = $dinAsset->getBenchMarkSelectValues(); return $this->json($res); } + /** + * @Route("/calculate-risk", name="calculate_risk") + */ + public function calculateRisk(Request $request) + { + $params = $request->request->all(); + $benchmark = $this->getDoctrine()->getRepository(DinAssetBenchmark::class)->find($params['benchmark']); + $asset = $benchmark->getDinAsset(); + $userCycle = $params['cycle']; + + $cycleDeviation = 1 - ($userCycle / ($asset->getCycleMonthsRecMaintenance())); + $costsCurrentPerYear = (12 / $userCycle) * $benchmark->getAverageCosts(); + $costsRecPerYear = (12 / $asset->getCycleMonthsRecMaintenance()) * $benchmark->getAverageCosts(); + $costsDiffPerYear = $costsRecPerYear - $costsCurrentPerYear; + $costsDiff5Years = $costsDiffPerYear * 5; + + $pointsFailure = Utils::$riskFailure[$params['failure']][1]; + $pointsCosts = Utils::$riskCosts[$params['costs']][1]; + if ($params['costs'] === Utils::PERSON_DAMAGE_INDEX) { + $pointsCosts = Utils::PERSON_DAMAGE_BASE - $pointsFailure; + } + $riskPoints = $pointsFailure + $pointsCosts; + $riskFactor = Utils::$riskPoints[$riskPoints]['factor']; + $recCycle = (int) ($asset->getCycleMonthsMax() * $riskFactor); + + $costsCurrentPerYear = (12 / $userCycle) * $benchmark->getAverageCosts(); + $costsRecPerYear = (12 / $recCycle) * $benchmark->getAverageCosts(); + + + + $res = []; + $res['cycleRecMaintenance'] = $asset->getCycleMonthsRecMaintenance(); + $res['cycleRecInspection'] = $asset->getCycleMonthsRecInspection(); + return $this->json($res); + } + /** * @Route("/download", name="download") * diff --git a/httpdocs/src/Entity/DinAsset.php b/httpdocs/src/Entity/DinAsset.php index a517cf4..65ab27c 100644 --- a/httpdocs/src/Entity/DinAsset.php +++ b/httpdocs/src/Entity/DinAsset.php @@ -40,7 +40,12 @@ class DinAsset /** * @ORM\Column(type="smallint", nullable=false, options={"unsigned" = true}) */ - protected $cycleMonthsRecommended; + protected $cycleMonthsRecInspection; + + /** + * @ORM\Column(type="smallint", nullable=false, options={"unsigned" = true}) + */ + protected $cycleMonthsRecMaintenance; /** * @ORM\OneToMany(targetEntity="DinAssetTask", mappedBy="dinAsset", cascade={"persist", "remove"}) @@ -135,17 +140,39 @@ class DinAsset /** * @return mixed */ - public function getCycleMonthsRecommended() + public function getCycleMonthsRecInspection() { - return $this->cycleMonthsRecommended; + return $this->cycleMonthsRecInspection; } /** - * @param mixed $cycleMonthsRecommended + * @param mixed $cycleMonthsRecInspection */ - public function setCycleMonthsRecommended($cycleMonthsRecommended): void + public function setCycleMonthsRecInspection($cycleMonthsRecInspection): void { - $this->cycleMonthsRecommended = $cycleMonthsRecommended; + if ($cycleMonthsRecInspection <= 0) { + throw new \Exception('invalid value'); + } + $this->cycleMonthsRecInspection = $cycleMonthsRecInspection; + } + + /** + * @return mixed + */ + public function getCycleMonthsRecMaintenance() + { + return $this->cycleMonthsRecMaintenance; + } + + /** + * @param mixed $cycleMonthsRecMaintenance + */ + public function setCycleMonthsRecMaintenance($cycleMonthsRecMaintenance): void + { + if ($cycleMonthsRecMaintenance <= 0) { + throw new \Exception('invalid value'); + } + $this->cycleMonthsRecMaintenance = $cycleMonthsRecMaintenance; } /** diff --git a/httpdocs/src/Utils/Utils.php b/httpdocs/src/Utils/Utils.php index ed05b37..9cc9e81 100644 --- a/httpdocs/src/Utils/Utils.php +++ b/httpdocs/src/Utils/Utils.php @@ -10,8 +10,10 @@ class Utils const PASSWORD_MIN_LENGTH = 5; const PASSWORD_MAX_LENGTH = 50; + const PERSON_DAMAGE_BASE = 40; + const PERSON_DAMAGE_INDEX = 4; + public static $riskFailure = [ - ['-', 0], ['sehr niedrig', 5], ['niedrig', 10], ['mittel', 15], @@ -19,23 +21,24 @@ class Utils ]; public static $riskCosts = [ - ['-', 0], ['0 - 5.000 €', 5], ['5.001 - 50.000 €', 10], - ['mittel', 15], - ['hoch', 20] + ['50.001 - 250.000 €', 15], + ['> 1 Mio €', 20], + ['Personenschaden', 0] ]; public static $riskPoints = [ - ['factor' => 0, 'cycle' => 6, 'points' => 10], - ['factor' => 0.17, 'cycle' => 6, 'points' => 15], - ['factor' => 0.33, 'cycle' => 6, 'points' => 20], - ['factor' => 0.5, 'cycle' => 6, 'points' => 25], - ['factor' => 0.67, 'cycle' => 6, 'points' => 30], - ['factor' => 0.83, 'cycle' => 6, 'points' => 35], - ['factor' => 1, 'cycle' => 6, 'points' => 40], + 10 => ['factor' => 1, 'cycle' => 6], + 15 => ['factor' => 0.83, 'cycle' => 8], + 20 => ['factor' => 0.67, 'cycle' => 16], + 25 => ['factor' => 0.5, 'cycle' => 24], + 30 => ['factor' => 0.33, 'cycle' => 32], + 35 => ['factor' => 0.17, 'cycle' => 40], + 40 => ['factor' => 0, 'cycle' => 48] ]; + /** * Checks email format * @param $email diff --git a/httpdocs/templates/pages/risk_analysis.html.twig b/httpdocs/templates/pages/risk_analysis.html.twig index b3fbbd3..8a7a1c5 100644 --- a/httpdocs/templates/pages/risk_analysis.html.twig +++ b/httpdocs/templates/pages/risk_analysis.html.twig @@ -5,7 +5,7 @@ {% block body %}

MPP-Tool

Bitte füllen sie alle Felder aus, um eine Risikoanalyse zu erstellen.

-
+ - {% if initialDinAsset is not null %} - + {% else %} {% endif %} - - {% for key, benchmarkValue in benchmarkValues %} {% endfor %} - + Berechnen
{% endblock %}