diff --git a/CHANGELOG.md b/CHANGELOG.md index a12d61e35..5d08ce42a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to ## Unreleased +* [person] household address: add a form for editing the validFrom date (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/541) * [person] householdmemberseditor: fix composition type bug in select form (vuejs) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/543) * [docgen] add more persons choices in docgen for course: amongst requestor (if person), resources of course (if person), and PersonResource (if person); * [docgen] add a new context with a list of activities in course diff --git a/src/Bundle/ChillMainBundle/Entity/Address.php b/src/Bundle/ChillMainBundle/Entity/Address.php index 8eac6668b..10679d2e0 100644 --- a/src/Bundle/ChillMainBundle/Entity/Address.php +++ b/src/Bundle/ChillMainBundle/Entity/Address.php @@ -480,8 +480,11 @@ class Address return $this; } - public function setStreet(string $street): self + public function setStreet(?string $street): self { + if (null === $street) { + $street = ''; + } $this->street = $street; return $this; @@ -515,8 +518,11 @@ class Address return $this; } - public function setStreetNumber(string $streetNumber): self + public function setStreetNumber(?string $streetNumber): self { + if (null === $streetNumber) { + $streetNumber = ''; + } $this->streetNumber = $streetNumber; return $this; diff --git a/src/Bundle/ChillMainBundle/Form/Type/AddressDateType.php b/src/Bundle/ChillMainBundle/Form/Type/AddressDateType.php new file mode 100644 index 000000000..299728d6e --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/Type/AddressDateType.php @@ -0,0 +1,37 @@ +add( + 'validFrom', + ChillDateType::class, + [ + 'required' => true, + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefault('data_class', Address::class); + } +} diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php index 0a8b7eea1..7b6dc201e 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php @@ -12,13 +12,16 @@ declare(strict_types=1); namespace Chill\PersonBundle\Controller; use Chill\MainBundle\Entity\Address; +use Chill\MainBundle\Form\Type\AddressDateType; use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Form\HouseholdType; use Chill\PersonBundle\Repository\Household\PositionRepository; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; +use Chill\PersonBundle\Security\Authorization\HouseholdVoter; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\FormInterface; +use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Security; @@ -186,6 +189,62 @@ class HouseholdController extends AbstractController ); } + /** + * @Route( + * "/{household_id}/address/edit_valid_from", + * name="chill_person_household_address_valid_from_edit", + * methods={"GET", "HEAD", "POST"} + * ) + * @ParamConverter("household", options={"id": "household_id"}) + */ + public function addressValidFromEdit(Request $request, Household $household) + { + $this->denyAccessUnlessGranted(HouseholdVoter::EDIT, $household); + + if (!$request->query->has('address_id')) { + throw new BadRequestException('parameter address_id is missing'); + } + + $address_id = $request->query->getInt('address_id'); + + // loop over adresses of the household, to be sure that the household is associated + // to the edited address + $address = null; + + foreach ($household->getAddresses() as $householdAddress) { + if ($householdAddress->getId() === $address_id) { + $address = $householdAddress; + } + } + + if (null === $address) { + throw new BadRequestException('The edited address does not belongs to the household'); + } + + $form = $this->createForm(AddressDateType::class, $address, []); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $household->makeAddressConsistent(); + + $this->getDoctrine()->getManager()->flush(); + + return $this->redirectToRoute('chill_person_household_addresses', [ + 'household_id' => $household->getId(), + ]); + } + + return $this->render( + '@ChillPerson/Household/address_valid_from_edit.html.twig', + [ + 'household' => $household, + 'address' => $address, + 'form' => $form->createView(), + ] + ); + } + /** * @Route( * "/{household_id}/members/metadata/edit", diff --git a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php index fed9f0af0..19bda3785 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Household/Household.php +++ b/src/Bundle/ChillPersonBundle/Entity/Household/Household.php @@ -151,6 +151,9 @@ class Household return $this->addresses; } + /** + * @return array|Address[] + */ public function getAddressesOrdered(): array { $addresses = $this->getAddresses()->toArray(); diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Household/address_valid_from_edit.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Household/address_valid_from_edit.html.twig new file mode 100644 index 000000000..b03538fa9 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/Household/address_valid_from_edit.html.twig @@ -0,0 +1,32 @@ +{% extends '@ChillPerson/Household/layout.html.twig' %} + +{% block title 'Edit household address valid from'|trans %} + +{% block content %} +