mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-20 14:43:49 +00:00
Generate a context for docgen, on accompanying period
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
namespace Chill\PersonBundle\Serializer\Normalizer;
|
||||
|
||||
use Chill\MainBundle\Entity\Scope;
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Security\Resolver\ScopeResolverDispatcher;
|
||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
|
||||
use Chill\PersonBundle\Templating\Entity\ClosingMotiveRender;
|
||||
use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
|
||||
use Symfony\Component\Serializer\Exception\CircularReferenceException;
|
||||
use Symfony\Component\Serializer\Exception\ExceptionInterface;
|
||||
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
|
||||
use Symfony\Component\Serializer\Exception\LogicException;
|
||||
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
||||
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
class AccompanyingPeriodDocGenNormalizer implements ContextAwareNormalizerInterface, NormalizerAwareInterface
|
||||
{
|
||||
use NormalizerAwareTrait;
|
||||
|
||||
private TranslatorInterface $translator;
|
||||
|
||||
private TranslatableStringHelper $translatableStringHelper;
|
||||
|
||||
private SocialIssueRender $socialIssueRender;
|
||||
|
||||
private ClosingMotiveRender $closingMotiveRender;
|
||||
|
||||
private ScopeResolverDispatcher $scopeResolverDispatcher;
|
||||
|
||||
private const IGNORE_FIRST_PASS_KEY = 'acc_period_ignore_first_pass';
|
||||
|
||||
private const PERIOD_NULL = [
|
||||
'id' => "",
|
||||
'closingDate' => \DateTime::class,
|
||||
'confidential' => "",
|
||||
'confidentialText' => '',
|
||||
'createdAt' => \DateTime::class,
|
||||
'createdBy' => User::class,
|
||||
'emergency' => "",
|
||||
'emergencyText' => '',
|
||||
'openingDate' => \DateTime::class,
|
||||
'originText' => '',
|
||||
'requestorAnonymous' => false,
|
||||
'socialIssues' => [],
|
||||
'intensity' => '',
|
||||
'step' => '',
|
||||
'closingMotiveText' => '',
|
||||
'socialIssuesText' => '',
|
||||
'scopes' => [],
|
||||
'scopesText' => '',
|
||||
'ref' => User::class,
|
||||
'participations' => [],
|
||||
];
|
||||
|
||||
public function __construct(
|
||||
TranslatorInterface $translator,
|
||||
TranslatableStringHelper $translatableStringHelper,
|
||||
SocialIssueRender $socialIssueRender,
|
||||
ClosingMotiveRender $closingMotiveRender,
|
||||
ScopeResolverDispatcher $scopeResolverDispatcher
|
||||
) {
|
||||
$this->translator = $translator;
|
||||
$this->translatableStringHelper = $translatableStringHelper;
|
||||
$this->socialIssueRender = $socialIssueRender;
|
||||
$this->closingMotiveRender = $closingMotiveRender;
|
||||
$this->scopeResolverDispatcher = $scopeResolverDispatcher;
|
||||
}
|
||||
|
||||
|
||||
public function supportsNormalization($data, string $format = null, array $context = []): bool
|
||||
{
|
||||
if ('docgen' !== $format) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($data instanceof AccompanyingPeriod) {
|
||||
if (array_key_exists(self::IGNORE_FIRST_PASS_KEY, $context)
|
||||
&& in_array(spl_object_hash($data), $context[self::IGNORE_FIRST_PASS_KEY])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} elseif (null === $data && ($context['docgen:expects'] ?? null) === AccompanyingPeriod::class) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AccompanyingPeriod|null $period
|
||||
*/
|
||||
public function normalize($period, string $format = null, array $context = [])
|
||||
{
|
||||
if ($period instanceof AccompanyingPeriod) {
|
||||
$ignored = $context[self::IGNORE_FIRST_PASS_KEY] ?? [];
|
||||
$ignored[] = spl_object_hash($period);
|
||||
$initial =
|
||||
$this->normalizer->normalize($period, $format, \array_merge($context,
|
||||
[self::IGNORE_FIRST_PASS_KEY => $ignored, AbstractNormalizer::GROUPS => 'docgen:read']));
|
||||
|
||||
// some transformation
|
||||
$user = $initial['user'];
|
||||
unset($initial['user']);
|
||||
|
||||
$scopes = $this->scopeResolverDispatcher->isConcerned($period) ? $this->scopeResolverDispatcher->resolveScope($period) : [];
|
||||
|
||||
if (!is_array($scopes)) {
|
||||
$scopes = [$scopes];
|
||||
}
|
||||
|
||||
return array_merge(
|
||||
// get a first default data
|
||||
$initial,
|
||||
// and add data custom
|
||||
[
|
||||
'intensity' => $this->translator->trans($period->getIntensity()),
|
||||
'step' => $this->translator->trans('accompanying_period.'.$period->getStep()),
|
||||
'emergencyText' => $period->isEmergency() ? $this->translator->trans('accompanying_period.emergency') : '',
|
||||
'confidentialText' => $period->isConfidential() ? $this->translator->trans('confidential') : '',
|
||||
'originText' => null !== $period->getOrigin() ? $this->translatableStringHelper->localize($period->getOrigin()->getLabel()) : '',
|
||||
'closingMotiveText' => null !== $period->getClosingMotive() ?
|
||||
$this->closingMotiveRender->renderString($period->getClosingMotive(), []) : '',
|
||||
'ref' => $user,
|
||||
'socialIssuesText' => implode(', ', array_map(function(SocialIssue $s) {
|
||||
return $this->socialIssueRender->renderString($s, []);
|
||||
}, $period->getSocialIssues()->toArray())),
|
||||
'scopesText' => implode(', ', array_map(function (Scope $s) {
|
||||
return $this->translatableStringHelper->localize($s->getName());
|
||||
}, $scopes)),
|
||||
'scopes' => $scopes,
|
||||
]
|
||||
);
|
||||
} elseif (null === $period) {
|
||||
return self::PERIOD_NULL;
|
||||
}
|
||||
|
||||
throw new InvalidArgumentException("this neither an accompanying period or null");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user