<?php
namespace App\EventSubscriber;
use App\Entity\FormCustomField;
use App\Entity\Municipality;
use App\Event\AppEvents;
use App\Event\CustomFeeEvent;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\CustomField;
use App\Entity\MunicipalityFormCustomField;
use App\ValueObject\FormTypes;
use App\ValueObject\SearchCriteria\FormCustomFieldSearchCriteria;
use App\ValueObject\SearchCriteria\MunicipalityFormCustomFieldSearchCriteria;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class CustomFeeSubscriber
* @package App\EventSubscriber
*/
class CustomFeeSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
private $em;
/**
* CustomFeeSubscriber constructor.
*
* @param EntityManagerInterface $em
*/
public function __construct(
EntityManagerInterface $em
) {
$this->em = $em;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
AppEvents::CUSTOM_FIELD_TO_DEFAULT => 'addNewDefaultField',
AppEvents::CUSTOM_FIELD_DELETED => 'removeFormField'
];
}
/**
* Remove municipality fields that depends on the item.
* @param CustomFeeEvent $event
*/
public function removeMunicipalityField($event)
{
$em = $this->em;
/** @var CustomField $customField */
$customField = $event->getCustomField();
$criteria = new MunicipalityFormCustomFieldSearchCriteria();
$criteria->customField = $customField;
$fields = $this->em->getRepository(MunicipalityFormCustomField::class)->search($criteria);
foreach ($fields as $field) {
$em->remove($field);
}
try {
$em->flush();
} catch (\Exception $e) {
}
}
/**
* Remove answers on forms that depends on the item.
* @param CustomFeeEvent $event
*/
public function removeFormField($event)
{
$this->removeMunicipalityField($event);
$em = $this->em;
/** @var CustomField $customField */
$customField = $event->getCustomField();
$criteria = new FormCustomFieldSearchCriteria();
$criteria->customField = $customField;
$fields = $this->em->getRepository(FormCustomField::class)->search($criteria);
foreach ($fields as $field) {
$em->remove($field);
}
try {
$em->flush();
} catch (\Exception $e) {
}
}
/**
* Generate default form items for each form.
* @param CustomFeeEvent $event
*/
public function addNewDefaultField($event)
{
$em = $this->em;
/** @var CustomField $customField */
$customField = $event->getCustomField();
if ($customField->isRegistrationForm()) {
$type = FormTypes::REGISTRATION;
} elseif ($customField->isRenewalForm()) {
$type = FormTypes::RENEWAL;
} elseif ($customField->isDeregistrationForm()) {
$type = FormTypes::DEREGISTRATION;
} else {
$type = FormTypes::INSPECTION;
}
$municipalitiesIds = $this->em->getRepository(MunicipalityFormCustomField::class)->findMunicipalitiesWithDefaultField($customField);
$municipalities = $this->em->getRepository(Municipality::class)->findMunicipalitiesWithoutDefaultField($municipalitiesIds);
if ($customField->isRegistrationForm() ||
$customField->isRenewalForm() ||
$customField->isDeregistrationForm() ||
$customField->isInspectionForm()) {
//Check if the field is assigned to any form.
foreach ($municipalities as $municipality) {
$criteria = new MunicipalityFormCustomFieldSearchCriteria();
$criteria->municipality = $municipality;
$criteria->type = $type;
$pos = $this->em->getRepository(MunicipalityFormCustomField::class)->countByCriteria($criteria);
$formField = new MunicipalityFormCustomField($type, $municipality, $pos + 1);
$formField->setCustomField($customField);
$em->persist($formField);
}
$this->em->flush();
}
}
}