diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fe60496a..52caa3ea5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to ## Unreleased +* [person] add person ressource to person docgen normaliser (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/517) * [person] AccompanyingCourseWorkEdit: fix deleting evaluation documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/546) * [person] AccompanyingCourseWorkEdit: download existing documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/512) * [person] AccompanyingCourseWorkEdit: replace document by a new one (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/511) diff --git a/src/Bundle/ChillMainBundle/Entity/Embeddable/CommentEmbeddable.php b/src/Bundle/ChillMainBundle/Entity/Embeddable/CommentEmbeddable.php index 61ebce10b..a29ad8f29 100644 --- a/src/Bundle/ChillMainBundle/Entity/Embeddable/CommentEmbeddable.php +++ b/src/Bundle/ChillMainBundle/Entity/Embeddable/CommentEmbeddable.php @@ -61,7 +61,7 @@ class CommentEmbeddable public function isEmpty() { - return empty($this->getComment()); + return null === $this->getComment() || '' === $this->getComment(); } public function setComment(?string $comment) diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php index bd812e036..10f43a2f6 100644 --- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php @@ -39,7 +39,7 @@ class CommentEmbeddableDocGenNormalizer implements ContextAwareNormalizerInterfa */ public function normalize($object, ?string $format = null, array $context = []): array { - if (null === $object) { + if (null === $object || ($object->isEmpty())) { return [ 'comment' => '', 'isNull' => true, diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/UserControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/UserControllerTest.php index 8a3c355b0..42f541d56 100644 --- a/src/Bundle/ChillMainBundle/Tests/Controller/UserControllerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Controller/UserControllerTest.php @@ -101,7 +101,9 @@ final class UserControllerTest extends WebTestCase // Check data in the show view $this->assertStringContainsString( - "Test_user", $crawler->text(), "page contains the name of the user" + 'Test_user', + $crawler->text(), + 'page contains the name of the user' ); //test the auth of the new client diff --git a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php index 3cd82680e..1d2343067 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResource.php @@ -39,13 +39,13 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface /** * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="comment_") - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ private CommentEmbeddable $comment; /** * @ORM\Column(type="text", nullable=true) - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ private ?string $freeText = null; @@ -53,24 +53,29 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") + * @Groups({"read", "docgen:read"}) */ private ?int $id; /** * @ORM\ManyToOne(targetEntity=PersonResourceKind::class, inversedBy="personResources") * @ORM\JoinColumn(nullable=true) - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ - private $kind; + private ?PersonResourceKind $kind = null; /** + * The person which host the owner of this resource. + * * @ORM\ManyToOne(targetEntity=Person::class, inversedBy="personResources") * @ORM\JoinColumn(nullable=true) - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ private ?Person $person = null; /** + * The person linked with this resource. + * * @ORM\ManyToOne(targetEntity=Person::class) * @ORM\JoinColumn(nullable=false) * @Groups({"read"}) @@ -80,7 +85,7 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface /** * @ORM\ManyToOne(targetEntity=ThirdParty::class, inversedBy="personResources") * @ORM\JoinColumn(nullable=true) - * @Groups({"read"}) + * @Groups({"read", "docgen:read"}) */ private ?ThirdParty $thirdParty = null; @@ -122,6 +127,26 @@ class PersonResource implements TrackCreationInterface, TrackUpdateInterface return $this->personOwner; } + /** + * @Groups({"read", "docgen:read"}) + */ + public function getResourceKind(): string + { + if ($this->getPerson() instanceof Person) { + return 'person'; + } + + if ($this->getThirdParty() instanceof ThirdParty) { + return 'thirdparty'; + } + + if (null !== $this->getFreeText()) { + return 'freetext'; + } + + return 'none'; + } + public function getThirdParty(): ?ThirdParty { return $this->thirdParty; diff --git a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResourceKind.php b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResourceKind.php index 4e65fda9f..f450997fa 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person/PersonResourceKind.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person/PersonResourceKind.php @@ -12,10 +12,9 @@ declare(strict_types=1); namespace Chill\PersonBundle\Entity\Person; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation as Serializer; /** - * **About denormalization**: this operation is operated by @see{AccompanyingPeriodResourdeNormalizer}. - * * @ORM\Entity * @ORM\Table(name="chill_person_resource_kind") */ @@ -25,8 +24,9 @@ class PersonResourceKind * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") + * @Serializer\Groups({"docgen:read"}) */ - private int $id; + private ?int $id = null; /** * @ORM\Column(type="boolean") @@ -35,6 +35,8 @@ class PersonResourceKind /** * @ORM\Column(type="json", length=255) + * @Serializer\Groups({"docgen:read"}) + * @Serializer\Context({"is-translatable": true}, groups={"docgen:read"}) */ private array $title; diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php index c6d132992..fb325ec4e 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php @@ -18,11 +18,13 @@ use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Entity\PersonAltName; +use Chill\PersonBundle\Repository\PersonResourceRepository; use Chill\PersonBundle\Repository\Relationships\RelationshipRepository; use Chill\PersonBundle\Templating\Entity\PersonRenderInterface; use DateTimeInterface; use Doctrine\Common\Collections\ArrayCollection; use Symfony\Component\Serializer\Exception\UnexpectedValueException; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; @@ -39,6 +41,8 @@ class PersonDocGenNormalizer implements private PersonRenderInterface $personRender; + private PersonResourceRepository $personResourceRepository; + private RelationshipRepository $relationshipRepository; private TranslatableStringHelper $translatableStringHelper; @@ -48,11 +52,13 @@ class PersonDocGenNormalizer implements public function __construct( PersonRenderInterface $personRender, RelationshipRepository $relationshipRepository, + PersonResourceRepository $personResourceRepository, TranslatorInterface $translator, TranslatableStringHelper $translatableStringHelper ) { $this->personRender = $personRender; $this->relationshipRepository = $relationshipRepository; + $this->personResourceRepository = $personResourceRepository; $this->translator = $translator; $this->translatableStringHelper = $translatableStringHelper; } @@ -63,6 +69,15 @@ class PersonDocGenNormalizer implements $dateContext = $context; $dateContext['docgen:expects'] = DateTimeInterface::class; $addressContext = array_merge($context, ['docgen:expects' => Address::class]); + $personResourceContext = array_merge($context, [ + 'docgen:expects' => Person\PersonResource::class, + // we simplify the list of attributes for the embedded persons + AbstractNormalizer::GROUPS => ['docgen:read'], + // when a person reference the same person... take care of circulare references + AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) { + return $this->normalize(null, $format, $context); + }, + ]); if (null === $person) { return $this->normalizeNullValue($format, $context); @@ -104,6 +119,7 @@ class PersonDocGenNormalizer implements 'memo' => $person->getMemo(), 'numberOfChildren' => (string) $person->getNumberOfChildren(), 'address' => $this->normalizer->normalize($person->getCurrentPersonAddress(), $format, $addressContext), + 'resources' => $this->normalizer->normalize($this->personResourceRepository->findBy(['personOwner' => $person]), $format, $personResourceContext), ]; if ($context['docgen:person:with-household'] ?? false) {