<?php
namespace App\Controller\AppBundle\Acceptation;
use App\Controller\AppBundle\Connector\Awacs\AwacsViewRequest;
use App\Controller\AppBundle\Connector\Awacs\Collection;
use App\Controller\AppBundle\Connector\Awacs\FieldLabel;
use App\Controller\AppBundle\Connector\Awacs\FieldNumberMap;
use App\Controller\AppBundle\Connector\Awacs\FieldPrimary;
use App\Controller\AppBundle\Connector\Awacs\Filter;
use App\Controller\AppBundle\Entity\PolisInformation;
use App\Entity\Slotvraag;
use Doctrine\ORM\EntityManagerInterface;
class KennisRegels
{
/**
* @param string $polis
* @return array
* @throws \Exception
*/
public static function checkKennisregel(string $poliskey, EntityManagerInterface $em, $premie, $pakketFactor = 1, $pakketFactorASR = 1, &$cart = null, $isNNFixedPrice = false, $exclAssBel = 0.0, $num, $process)
{
if (str_contains($poliskey, 'WACBES')) {
$type = 'wachtpolissen';
} else {
$type = 'polissen';
}
$collection = new Collection($type);
$slotvragen = $em->getRepository(Slotvraag::class)->findAll();
foreach ($slotvragen as $slotvraag) {
$collection->addField(new FieldLabel($slotvraag->getValue()));
}
for ($i = 1; $i < 13; $i++) {
$collection->addField(FieldLabel::name('polis', 'kr'.$i));
}
$collection->addField(FieldLabel::name('polis', 'incassobedrag'));
$collection->addField(FieldLabel::name('polis', 'acceptatie'));
$collection->addField(FieldLabel::name('polis', 'prolongatiekosten'));
$collection->addField(FieldLabel::name('polis', 'maatschappij'));
$collection->addField(FieldLabel::name('polis', 'hoofdbranche'));
$collection->addField(FieldLabel::name('polis', 'branche'));
if ($isNNFixedPrice) {
self::nnFixedPriceAdditions($collection);
}
$collection->addFilter(new Filter(new FieldPrimary(), $poliskey, '='));
$request = new AwacsViewRequest($collection);
$res = $request->send('Bedrijf8', $slotvragen);
$kr = [];
$succes = true;
$financial = [];
$entity = $res->entities()[0];
$kr['acceptatie'] = $entity->field('acceptatie')->value();
if ($entity->field('acceptatie')->value() === '') {
$kr['acceptatie'] = '1';
}
$maatschappij = $entity->field('maatschappij')->value();
$branche = $entity->field('branche')->value();
$hoofdbranche = $entity->field('hoofdbranche')->value();
$cart->kennisregelsText[$num] = [];
if ($kr['acceptatie'] !== '1') {
$list = [];
foreach ($slotvragen as $slotvraag) {
/** @var Slotvraag $slotvraag */
if ($slotvraag->branche == $branche && $slotvraag->hoofdbranche == $hoofdbranche && $slotvraag->maatschappijCode == $maatschappij) {
if ($entity->fieldByNumber($slotvraag->getValue())->value() == '2' || $entity->fieldByNumber($slotvraag->getValue())->value() == '3') {
$cart->kennisregelsText[$num][] = $slotvraag->getName();
$list[] = $slotvraag->getValue();
}
}
}
for ($i = 1; $i < 13; $i++) {
if (!in_array(FieldNumberMap::getNumber('polis', 'kr'.$i), $list) && ($entity->field('kr'.$i)->value() == '2' || $entity->field('kr'.$i)->value() == '3')) {
$cart->kennisregelsText[$num][] = 'Kennisregel ' . $i . ' (niet gemapped)';
}
}
}
try {
if ($process->isMutation()) {
$financial['Bestaande polis pakketkortingfactor'] = $process->mutationPakketkortingFactor;
} else {
$financial['a.s.r. factor'] = $pakketFactorASR;
$financial['NN/DAS factor'] = $pakketFactor;
}
} catch (\Throwable $e) {
}
$brutoPremie = ((floatval($premie) - $exclAssBel) / 1.21) + $exclAssBel;
$financial['portaal bruto premie'] = $brutoPremie;
if ($res->entities()[0]->field('hoofdbranche')->value() == 20000) { //abbonnement
$financial['portaal pakketkorting'] = 0.0;
$exclAssBelInclPakketkorting = $exclAssBel;
} else {
if ($res->entities()[0]->field('maatschappij')->value() != 'V059') {
$financial['portaal pakketkorting'] = (1 - $pakketFactor) * floatval($brutoPremie);
$exclAssBelInclPakketkorting = $exclAssBel * $pakketFactor;
} else {
$financial['portaal pakketkorting'] = (1 - $pakketFactorASR) * floatval($brutoPremie);
$exclAssBelInclPakketkorting = $exclAssBel * $pakketFactorASR;
}
}
if (!$process->isMutation()) {
if ($res->entities()[0]->field('prolongatiekosten')->value() == "2.07") {
$financial['portaal prologantie kosten'] = 2.07;
} else {
$financial['portaal prologantie kosten'] = 0;
}
} else {
$financial['portaal prologantie kosten'] = $process->mutationProlongatiekosten;
}
if ($res->entities()[0]->field('maatschappij')->value() == 'V059') {
$financial['portaal netto premie'] = $brutoPremie - $financial['portaal pakketkorting'] + floatval($financial['portaal prologantie kosten']);
} else {
$financial['portaal netto premie'] = $brutoPremie - $financial['portaal pakketkorting'] + floatval($financial['portaal prologantie kosten']);
}
$financial['portaal assurantiebelasting'] = ($financial['portaal netto premie'] - $exclAssBelInclPakketkorting) * 0.21;
$financial['portaal incassobedrag'] = $financial['portaal netto premie'] + $financial['portaal assurantiebelasting'];
$financial['ANVA incassobedrag'] = floatval($res->entities()[0]->field('incassobedrag')->value());
$financial['Verschil (portaal - anva) incassobedrag'] = round(($financial['portaal incassobedrag']) - floatval($res->entities()[0]->field('incassobedrag')->value()), 2);
$financial['Premieverschil'] = abs($financial['Verschil (portaal - anva) incassobedrag']) < 0.05 ? 'Nee' : 'Ja';
$kr['premie'] = abs($financial['portaal incassobedrag'] - floatval($res->entities()[0]->field('incassobedrag')->value())) < 0.05;
$kr['abs'] = abs($financial['portaal incassobedrag'] - floatval($res->entities()[0]->field('incassobedrag')->value()));
if ($isNNFixedPrice) {
$kr['premie'] = true;
}
$financial['poliskey'] = $poliskey;
$cart->financial[] = $financial;
$kr['success'] = $succes;
if ($isNNFixedPrice) {
$kr['tariferingsfactor_1'] = $res->entities()[0]->field('tariferingsfactor_1')->value();
$kr['tariferingsfactor_2'] = $res->entities()[0]->field('tariferingsfactor_2')->value();
$wa = 0.0;
$vcbc = 0.0;
foreach ($res->entities()[0]->collection('dekkingen') as $dekking) {
if ($dekking->field('dekking')->value() == '2010') {
$wa = $dekking->field('incassobedrag')->value();
} elseif ($dekking->field('dekking')->value() == '2020' || $dekking->field('dekking')->value() == '2030') {
$vcbc = $dekking->field('incassobedrag')->value();
}
}
if ($vcbc != 0.0) {
$kr['ratio'] = $wa / ($vcbc + $wa);
} else {
$kr['ratio'] = 1;
}
$kr['b/m_terugvaltrede'] = $res->entities()[0]->field('b/m_percentage')->value();
$kr['nnAuto'] = true;
}
return $kr;
}
public static function nnFixedPriceAdditions(&$collection) {
$collection->addField(FieldLabel::name('polis', 'tariferingsfactor_1'));
$collection->addField(FieldLabel::name('polis', 'tariferingsfactor_2'));
$collection->addField(FieldLabel::name('polis', 'b/m_percentage'));
$dekkingen = new Collection('dekkingen');
$dekkingen->addField(FieldLabel::name('dekking', 'incassobedrag'));
$dekkingen->addField(FieldLabel::name('dekking', 'dekking'));
$collection->addCollection($dekkingen);
}
}