diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index a3a2f6e04..d996ff3b8 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -10,16 +10,6 @@ parameters: count: 1 path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldsGroupController.php - - - message: "#^Instantiated class PhpOffice\\\\PhpWord\\\\TemplateProcessor not found\\.$#" - count: 1 - path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorController.php - - - - message: "#^Instantiated class PhpOffice\\\\PhpWord\\\\TemplateProcessor not found\\.$#" - count: 1 - path: src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php - - message: "#^Variable \\$participation might not be defined\\.$#" count: 3 diff --git a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextInterface.php b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextInterface.php index d9faeeb3f..9bca0444d 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextInterface.php @@ -20,12 +20,11 @@ use Symfony\Component\Form\FormBuilderInterface; */ interface DocGeneratorContextInterface { - /** - * Get the data that will be injected to the generated document. - * - * @param mixed $entity - */ - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array; + public function adminFormReverseTransform(array $data): array; + + public function adminFormTransform(array $data): array; + + public function buildAdminForm(FormBuilderInterface $builder): void; /** * Generate the form that display. @@ -34,11 +33,22 @@ interface DocGeneratorContextInterface */ public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void; + /** + * Get the data that will be injected to the generated document. + * + * @param mixed $entity + */ + public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array; + + public function getDescription(): string; + + public function getEntityClass(): string; + public static function getKey(): string; public function getName(): string; - public function getDescription(): string; + public function hasAdminForm(): bool; /** * has form. @@ -47,15 +57,5 @@ interface DocGeneratorContextInterface */ public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool; - public function hasAdminForm(): bool; - - public function buildAdminForm(FormBuilderInterface $builder): void; - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void; - - public function getEntityClass(): string; - - public function adminFormTransform(array $data): array; - - public function adminFormReverseTransform(array $data): array; } diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/AdminDocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/AdminDocGeneratorTemplateController.php index aa0e34476..e41c0c186 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/AdminDocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/AdminDocGeneratorTemplateController.php @@ -30,12 +30,24 @@ class AdminDocGeneratorTemplateController extends CRUDController public function new(Request $request): Response { if (!$request->query->has('context')) { - return $this->redirectToRoute("chill_docgen_admin_template_pick-context"); + return $this->redirectToRoute('chill_docgen_admin_template_pick-context'); } return parent::new($request); } + /** + * @Route("{_locale}/admin/docgen/template/pick-context", name="chill_docgen_admin_template_pick-context") + */ + public function pickContext(Request $request): Response + { + $this->denyAccessUnlessGranted('ROLE_ADMIN'); + + return $this->render('ChillDocGeneratorBundle:Admin/DocGeneratorTemplate:pick-context.html.twig', [ + 'contexts' => $this->contextManager->getContexts(), + ]); + } + protected function createEntity(string $action, Request $request): object { /** @var DocGeneratorTemplate $entity */ @@ -47,19 +59,4 @@ class AdminDocGeneratorTemplateController extends CRUDController return $entity; } - - /** - * @Route("{_locale}/admin/docgen/template/pick-context", name="chill_docgen_admin_template_pick-context") - * @param Request $request - * @return Response - */ - public function pickContext(Request $request): Response - { - $this->denyAccessUnlessGranted('ROLE_ADMIN'); - - return $this->render('ChillDocGeneratorBundle:Admin/DocGeneratorTemplate:pick-context.html.twig', [ - 'contexts' => $this->contextManager->getContexts() - ]); - } - } diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorController.php deleted file mode 100644 index 50201f6b0..000000000 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorController.php +++ /dev/null @@ -1,76 +0,0 @@ -generate( - 'GET', - 'FORMULAIRE_AEB.docx', - $request->query->has('expires_delay') ? $request->query->getInt('expires_delay', 0) : null - ); - - $tmpfname = tempnam(sys_get_temp_dir(), 'DOC_TEMPLATE'); - file_put_contents($tmpfname, file_get_contents($p->url)); - - $templateProcessor = new TemplateProcessor($tmpfname); - $templateProcessor->setValues(['firstname' => 'John', 'lastname' => 'Doe']); - - $tmpfname2 = tempnam(sys_get_temp_dir(), 'DOC_GENERATED'); - $templateProcessor->saveAs($tmpfname2); - - unlink($tmpfname); - - $fileContent = fopen($tmpfname2, 'rb'); // the generated file content - $response = new Response(fread($fileContent, filesize($tmpfname2))); - - $disposition = HeaderUtils::makeDisposition( - HeaderUtils::DISPOSITION_ATTACHMENT, - 'foo.docx' - ); - - $response->headers->set('Content-Disposition', $disposition); - unlink($tmpfname2); - - return $response; - } - - /** - * @Route( - * "{_locale}/doc/gen/test", - * name="chill_docgenerator_test" - * ) - */ - public function testAction(): Response - { - return (new Response())->setContent('Test'); - } -} diff --git a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php index a0768cdca..a4dd27f2e 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php +++ b/src/Bundle/ChillDocGeneratorBundle/Controller/DocGeneratorTemplateController.php @@ -21,22 +21,22 @@ use Chill\DocGeneratorBundle\Repository\DocGeneratorTemplateRepository; use Chill\DocStoreBundle\Entity\StoredObject; use Chill\MainBundle\Pagination\PaginatorFactory; use Chill\MainBundle\Serializer\Model\Collection; +use Exception; use GuzzleHttp\Client; use GuzzleHttp\Exception\TransferException; -use PhpOffice\PhpWord\TemplateProcessor; use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; + use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; - // TODO à mettre dans services +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Contracts\HttpClient\HttpClientInterface; final class DocGeneratorTemplateController extends AbstractController @@ -47,6 +47,8 @@ final class DocGeneratorTemplateController extends AbstractController private DocGeneratorTemplateRepository $docGeneratorTemplateRepository; + private DriverInterface $driver; + private KernelInterface $kernel; private LoggerInterface $logger; @@ -55,8 +57,6 @@ final class DocGeneratorTemplateController extends AbstractController private TempUrlGeneratorInterface $tempUrlGenerator; - private DriverInterface $driver; - public function __construct( ContextManager $contextManager, DocGeneratorTemplateRepository $docGeneratorTemplateRepository, @@ -66,7 +66,6 @@ final class DocGeneratorTemplateController extends AbstractController TempUrlGeneratorInterface $tempUrlGenerator, KernelInterface $kernel, HttpClientInterface $client - ) { $this->contextManager = $contextManager; $this->docGeneratorTemplateRepository = $docGeneratorTemplateRepository; @@ -93,7 +92,7 @@ final class DocGeneratorTemplateController extends AbstractController $entity = $this->getDoctrine()->getRepository($entityClassName)->find($entityId); if (null === $entity) { - throw new NotFoundHttpException("Entity with classname $entityClassName and id $entityId is not found"); + throw new NotFoundHttpException("Entity with classname {$entityClassName} and id {$entityId} is not found"); } try { @@ -102,6 +101,8 @@ final class DocGeneratorTemplateController extends AbstractController throw new NotFoundHttpException($e->getMessage(), $e); } + $contextGenerationData = []; + if ($context->hasPublicForm($template, $entity)) { $builder = $this->createFormBuilder(); $context->buildPublicForm($builder, $template, $entity); @@ -115,8 +116,6 @@ final class DocGeneratorTemplateController extends AbstractController return $this->render($template, $templateOptions); } - } else { - $contextGenerationData = []; } $getUrlGen = $this->tempUrlGenerator->generate( @@ -137,11 +136,11 @@ final class DocGeneratorTemplateController extends AbstractController $dataDecrypted = openssl_decrypt($data->getContent(), $method, $keyGoodFormat, 1, $ivGoodFormat); if (false === $dataDecrypted) { - throw new \Exception('Error during Decrypt ', 1); + throw new Exception('Error during Decrypt ', 1); } - if (false === $templateResource = fopen('php://memory', 'r+')) { - $this->logger->error("Could not write data to memory"); + if (false === $templateResource = fopen('php://memory', 'r+b')) { + $this->logger->error('Could not write data to memory'); throw new HttpException(500); } @@ -156,7 +155,7 @@ final class DocGeneratorTemplateController extends AbstractController fclose($templateResource); - $genDocName = 'doc_' . sprintf('%010d', mt_rand()).'odt'; + $genDocName = 'doc_' . sprintf('%010d', mt_rand()) . 'odt'; $getUrlGen = $this->tempUrlGenerator->generate( 'PUT', @@ -181,7 +180,7 @@ final class DocGeneratorTemplateController extends AbstractController try { $context->storeGenerated($template, $storedObject, $entity, $contextGenerationData); - } catch (\Exception $e) { + } catch (Exception $e) { $this->logger->error('Could not store the associated document to entity', [ 'entityClassName' => $entityClassName, 'entityId' => $entityId, @@ -202,7 +201,7 @@ final class DocGeneratorTemplateController extends AbstractController throw $e; } - throw new \Exception('Unable to generate document.'); + throw new Exception('Unable to generate document.'); } /** diff --git a/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/ChillDocGeneratorExtension.php b/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/ChillDocGeneratorExtension.php index 0622377f9..9712ffac8 100644 --- a/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/ChillDocGeneratorExtension.php +++ b/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/ChillDocGeneratorExtension.php @@ -44,25 +44,6 @@ class ChillDocGeneratorExtension extends Extension implements PrependExtensionIn $this->prependClientConfig($container); } - private function prependClientConfig(ContainerBuilder $container) - { - $configs = $container->getExtensionConfig($this->getAlias()); - $resolvingBag = $container->getParameterBag(); - $configs = $resolvingBag->resolveValue($configs); - - $config = $this->processConfiguration(new Configuration(), $configs); - - $container->prependExtensionConfig('framework', [ - 'http_client' => [ - 'scoped_clients' => [ - 'relatorio.client' => [ - 'scope' => $config['driver']['relatorio']['url'], - ] - ] - ] - ]); - } - protected function prependCruds(ContainerBuilder $container) { $container->prependExtensionConfig('chill_main', [ @@ -102,4 +83,23 @@ class ChillDocGeneratorExtension extends Extension implements PrependExtensionIn ], ]); } + + private function prependClientConfig(ContainerBuilder $container) + { + $configs = $container->getExtensionConfig($this->getAlias()); + $resolvingBag = $container->getParameterBag(); + $configs = $resolvingBag->resolveValue($configs); + + $config = $this->processConfiguration(new Configuration(), $configs); + + $container->prependExtensionConfig('framework', [ + 'http_client' => [ + 'scoped_clients' => [ + 'relatorio.client' => [ + 'scope' => $config['driver']['relatorio']['url'], + ], + ], + ], + ]); + } } diff --git a/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/Configuration.php index 678a871f7..1117a5fc0 100644 --- a/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillDocGeneratorBundle/DependencyInjection/Configuration.php @@ -23,27 +23,26 @@ class Configuration implements ConfigurationInterface $rootNode ->children() - ->arrayNode('driver') - ->addDefaultsIfNotSet() - ->children() - ->enumNode('type') - ->isRequired() - ->values(['relatorio']) - ->defaultValue('relatorio') - ->end() - ->arrayNode('relatorio') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('url') - ->isRequired() - ->defaultValue('http://relatorio:8888/') - ->end() - ->end() - ->end() - ->end() - ->end() + ->arrayNode('driver') + ->addDefaultsIfNotSet() + ->children() + ->enumNode('type') + ->isRequired() + ->values(['relatorio']) + ->defaultValue('relatorio') ->end() - ; + ->arrayNode('relatorio') + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('url') + ->isRequired() + ->defaultValue('http://relatorio:8888/') + ->end() + ->end() + ->end() + ->end() + ->end() + ->end(); return $treeBuilder; } diff --git a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php index 61e604757..ee93f74fb 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php +++ b/src/Bundle/ChillDocGeneratorBundle/Entity/DocGeneratorTemplate.php @@ -25,7 +25,7 @@ use Symfony\Component\Serializer\Annotation as Serializer; class DocGeneratorTemplate { /** - * @ORM\Column(type="boolean", options={"default":true}) + * @ORM\Column(type="boolean", options={"default": true}) */ private bool $active = true; @@ -48,16 +48,9 @@ class DocGeneratorTemplate /** * Class name of the entity for which this template can be used. * - * @ORM\Column(type="string", options={"default":""}) + * @ORM\Column(type="string", options={"default": ""}) */ - private string $entity = ""; - - /** - * Options for the template - * - * @ORM\Column(type="json", name="template_options", options={"default":"[]"}) - */ - private array $options = []; + private string $entity = ''; /** * @ORM\ManyToOne(targetEntity=StoredObject::class, cascade={"persist"})) @@ -78,17 +71,12 @@ class DocGeneratorTemplate */ private array $name = []; - public function isActive(): bool - { - return $this->active; - } - - public function setActive(bool $active): DocGeneratorTemplate - { - $this->active = $active; - - return $this; - } + /** + * Options for the template. + * + * @ORM\Column(type="json", name="template_options", options={"default":"[]"}) + */ + private array $options = []; public function getContext(): ?string { @@ -100,6 +88,11 @@ class DocGeneratorTemplate return $this->description; } + public function getEntity(): string + { + return $this->entity; + } + public function getFile(): ?StoredObject { return $this->file; @@ -115,6 +108,23 @@ class DocGeneratorTemplate return $this->name; } + public function getOptions(): array + { + return $this->options; + } + + public function isActive(): bool + { + return $this->active; + } + + public function setActive(bool $active): DocGeneratorTemplate + { + $this->active = $active; + + return $this; + } + public function setContext(string $context): self { $this->context = $context; @@ -129,6 +139,13 @@ class DocGeneratorTemplate return $this; } + public function setEntity(string $entity): self + { + $this->entity = $entity; + + return $this; + } + public function setFile(StoredObject $file): self { $this->file = $file; @@ -143,23 +160,6 @@ class DocGeneratorTemplate return $this; } - public function getEntity(): string - { - return $this->entity; - } - - public function setEntity(string $entity): self - { - $this->entity = $entity; - - return $this; - } - - public function getOptions(): array - { - return $this->options; - } - public function setOptions(array $options): self { $this->options = $options; diff --git a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php index 474ac0571..158c7bddc 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php +++ b/src/Bundle/ChillDocGeneratorBundle/Form/DocGeneratorTemplateType.php @@ -12,14 +12,11 @@ declare(strict_types=1); namespace Chill\DocGeneratorBundle\Form; use Chill\DocGeneratorBundle\Context\ContextManager; -use Chill\DocGeneratorBundle\Context\DocGeneratorContextInterface; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Chill\DocStoreBundle\Form\StoredObjectType; use Chill\MainBundle\Form\Type\TranslatableStringFormType; -use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -45,17 +42,16 @@ class DocGeneratorTemplateType extends AbstractType ->add('description') ->add('file', StoredObjectType::class, [ 'error_bubbling' => true, - ]) - ; + ]); if ($context->hasAdminForm()) { $sub = $builder ->create('options', null, ['compound' => true]) ->addModelTransformer(new CallbackTransformer( - function (array $data) use ($context) { + static function (array $data) use ($context) { return $context->adminFormTransform($data); }, - function (array $data) use ($context) { + static function (array $data) use ($context) { return $context->adminFormReverseTransform($data); } )); diff --git a/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/DriverInterface.php b/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/DriverInterface.php index 0e1828f3e..2572484e1 100644 --- a/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/DriverInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/GeneratorDriver/DriverInterface.php @@ -1,12 +1,22 @@ url = $parameterBag->get('chill_doc_generator')['driver']['relatorio']['url']; } - public function generateFromResource($template, string $resourceType, array $data, string $templateName = null) + public function generateFromResource($template, string $resourceType, array $data, ?string $templateName = null) { $formFields = [ - 'variables' => \json_encode($data), + 'variables' => json_encode($data), 'template' => new DataPart($template, $templateName ?? uniqid('template_'), $resourceType), ]; $form = new FormDataPart($formFields); @@ -47,7 +54,7 @@ class RelatorioDriver implements DriverInterface return $response->toStream(); } catch (HttpExceptionInterface $e) { - $this->logger->error("relatorio: error while generating document", [ + $this->logger->error('relatorio: error while generating document', [ 'msg' => $e->getMessage(), 'response' => $e->getResponse()->getStatusCode(), 'content' => $e->getResponse()->getContent(false), @@ -55,14 +62,14 @@ class RelatorioDriver implements DriverInterface throw $e; } catch (TransportExceptionInterface $e) { - $this->logger->error("relatorio: transport exception", [ + $this->logger->error('relatorio: transport exception', [ 'msg' => $e->getMessage(), 'e' => $e->getTraceAsString(), ]); throw $e; } catch (DecodingExceptionInterface $e) { - $this->logger->error("relatorio: could not decode response", [ + $this->logger->error('relatorio: could not decode response', [ 'msg' => $e->getMessage(), 'e' => $e->getTraceAsString(), ]); diff --git a/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211201191757.php b/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211201191757.php index 2ce380d69..814974d7b 100644 --- a/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211201191757.php +++ b/src/Bundle/ChillDocGeneratorBundle/migrations/Version20211201191757.php @@ -1,5 +1,12 @@ addSql('ALTER TABLE chill_docgen_template DROP active'); + $this->addSql('ALTER TABLE chill_docgen_template DROP entity'); + $this->addSql('ALTER TABLE chill_docgen_template DROP template_options'); + $this->addSql('ALTER TABLE chill_docgen_template ADD entities TEXT'); + $this->addSql('COMMENT ON COLUMN chill_docgen_template.entities IS \'(DC2Type:simple_array)\''); + } + public function getDescription(): string { return 'Add options, active and link to entity in docgen_template'; @@ -22,13 +38,4 @@ final class Version20211201191757 extends AbstractMigration $this->addSql('COMMENT ON COLUMN chill_docgen_template.template_options IS \'(DC2Type:json)\''); $this->addSql('ALTER TABLE chill_docgen_template DROP entities'); } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE chill_docgen_template DROP active'); - $this->addSql('ALTER TABLE chill_docgen_template DROP entity'); - $this->addSql('ALTER TABLE chill_docgen_template DROP template_options'); - $this->addSql('ALTER TABLE chill_docgen_template ADD entities TEXT'); - $this->addSql('COMMENT ON COLUMN chill_docgen_template.entities IS \'(DC2Type:simple_array)\''); - } } diff --git a/src/Bundle/ChillDocStoreBundle/Entity/DocumentCategory.php b/src/Bundle/ChillDocStoreBundle/Entity/DocumentCategory.php index cfe6e9643..55850b157 100644 --- a/src/Bundle/ChillDocStoreBundle/Entity/DocumentCategory.php +++ b/src/Bundle/ChillDocStoreBundle/Entity/DocumentCategory.php @@ -15,7 +15,7 @@ use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table("chill_doc.document_category") - * @ORM\Entity() + * @ORM\Entity */ class DocumentCategory { diff --git a/src/Bundle/ChillDocStoreBundle/Repository/DocumentCategoryRepository.php b/src/Bundle/ChillDocStoreBundle/Repository/DocumentCategoryRepository.php index 09ae5075a..f930e8ece 100644 --- a/src/Bundle/ChillDocStoreBundle/Repository/DocumentCategoryRepository.php +++ b/src/Bundle/ChillDocStoreBundle/Repository/DocumentCategoryRepository.php @@ -14,38 +14,25 @@ namespace Chill\DocStoreBundle\Repository; use Chill\DocStoreBundle\Entity\DocumentCategory; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; -use Doctrine\ORM\Mapping\Entity; use Doctrine\Persistence\ObjectRepository; -use UnexpectedValueException; /** * Get an available idInsideBUndle. */ class DocumentCategoryRepository implements ObjectRepository { - private EntityRepository $repository; - private EntityManagerInterface $em; + private EntityRepository $repository; + public function __construct(EntityManagerInterface $em) { $this->em = $em; $this->repository = $em->getRepository(DocumentCategory::class); } - public function nextIdInsideBundle() - { - $array_res = $this->em - ->createQuery( - 'SELECT MAX(c.idInsideBundle) + 1 FROM ChillDocStoreBundle:DocumentCategory c' - ) - ->getSingleResult(); - - return reset($array_res); - } - /** - * @return DocumentCategory|null + * @param mixed $id */ public function find($id): ?DocumentCategory { @@ -75,5 +62,14 @@ class DocumentCategoryRepository implements ObjectRepository return DocumentCategory::class; } + public function nextIdInsideBundle() + { + $array_res = $this->em + ->createQuery( + 'SELECT MAX(c.idInsideBundle) + 1 FROM ChillDocStoreBundle:DocumentCategory c' + ) + ->getSingleResult(); + return reset($array_res); + } } diff --git a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php index 31d237f1c..182f7aab9 100644 --- a/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php +++ b/src/Bundle/ChillPersonBundle/Service/DocGenerator/AccompanyingPeriodContext.php @@ -15,10 +15,8 @@ use Chill\DocGeneratorBundle\Context\DocGeneratorContextInterface; use Chill\DocGeneratorBundle\Context\Exception\UnexpectedTypeException; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Chill\DocStoreBundle\Entity\AccompanyingCourseDocument; -use Chill\DocStoreBundle\Entity\DocumentCategory; use Chill\DocStoreBundle\Entity\StoredObject; use Chill\DocStoreBundle\Repository\DocumentCategoryRepository; -use Chill\EventBundle\Entity\Participation; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; @@ -31,19 +29,20 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use function array_key_exists; class AccompanyingPeriodContext implements DocGeneratorContextInterface { + private DocumentCategoryRepository $documentCategoryRepository; + private EntityManagerInterface $em; private NormalizerInterface $normalizer; - private TranslatableStringHelperInterface $translatableStringHelper; - - private DocumentCategoryRepository $documentCategoryRepository; - private PersonRender $personRender; + private TranslatableStringHelperInterface $translatableStringHelper; + public function __construct( DocumentCategoryRepository $documentCategoryRepository, NormalizerInterface $normalizer, @@ -58,94 +57,28 @@ class AccompanyingPeriodContext implements DocGeneratorContextInterface $this->personRender = $personRender; } - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function adminFormReverseTransform(array $data): array { - if (!$entity instanceof AccompanyingPeriod) { - throw new UnexpectedTypeException($entity, AccompanyingPeriod::class); - } - $options = $template->getOptions(); - - $data['course'] = $this->normalizer->normalize($entity, 'docgen', ['docgen:expects' => AccompanyingPeriod::class]); - - foreach (['mainPerson', 'person1', 'person2'] as $k) { - if ($options[$k]) { - $data[$k] = $this->normalizer->normalize($contextGenerationData[$k], 'docgen', ['docgen:expects' => Person::class]); - } - } - - return $data; + return [ + 'mainPerson' => $data['mainPerson'], + 'person1' => $data['person1'], + 'person2' => $data['person2'], + 'category' => [ + 'idInsideBundle' => $data['category']->getIdInsideBundle(), + 'bundleId' => $data['category']->getBundleId(), + ], + ]; } - /** - * @param AccompanyingPeriod $entity - */ - public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void + public function adminFormTransform(array $data): array { - $options = $template->getOptions(); - $persons = $entity->getCurrentParticipations()->map(function (AccompanyingPeriodParticipation $p) { return $p->getPerson(); }) - ->toArray(); - - foreach (['mainPerson', 'person1', 'person2'] as $key) { - if ($options[$key] ?? false) { - $builder->add($key, EntityType::class, [ - 'class' => Person::class, - 'choices' => $persons, - 'choice_label' => function (Person $p) { return $this->personRender->renderString($p, []); }, - 'multiple' => false, - 'expanded' => true, - ]); - } - } - } - - public static function getKey(): string - { - return self::class; - } - - public function getName(): string - { - return 'Accompanying Period basic'; - } - - public function getDescription(): string - { - return "A basic context for accompanying period"; - } - - public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool - { - $options = $template->getOptions(); - - return $options['mainPerson'] || $options['person1'] || $options['person2']; - } - - /** - * @param AccompanyingPeriod $entity - */ - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void - { - $doc = new AccompanyingCourseDocument(); - $doc->setTitle($this->translatableStringHelper->localize($template->getName())) - ->setDate(new DateTime()) - ->setDescription($this->translatableStringHelper->localize($template->getName())) - ->setCourse($entity) - ->setObject($storedObject) - ; - - if (array_key_exists('category', $template->getOptions()['category'])) { - $doc - ->setCategory($this->documentCategoryRepository->find( - $template->getOptions()['category']) - ); - } - - $this->em->persist($doc); - } - - public function hasAdminForm(): bool - { - return true; + return [ + 'mainPerson' => $data['mainPerson'] ?? false, + 'person1' => $data['person1'] ?? false, + 'person2' => $data['person2'] ?? false, + 'category' => array_key_exists('category', $data) ? + $this->documentCategoryRepository->find($data['category']) : null, + ]; } public function buildAdminForm(FormBuilderInterface $builder): void @@ -172,37 +105,102 @@ class AccompanyingPeriodContext implements DocGeneratorContextInterface return $entity ? $this->translatableStringHelper->localize($entity->getName()) : ''; }, ]); - ; } - public function adminFormTransform(array $data): array + /** + * @param AccompanyingPeriod $entity + */ + public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void { - return [ - 'mainPerson' => $data['mainPerson'] ?? false, - 'person1' => $data['person1'] ?? false, - 'person2' => $data['person2'] ?? false, - 'category' => - array_key_exists('category', $data) ? - $this->documentCategoryRepository->find($data['category']) : null, - ]; + $options = $template->getOptions(); + $persons = $entity->getCurrentParticipations()->map(static function (AccompanyingPeriodParticipation $p) { return $p->getPerson(); }) + ->toArray(); + + foreach (['mainPerson', 'person1', 'person2'] as $key) { + if ($options[$key] ?? false) { + $builder->add($key, EntityType::class, [ + 'class' => Person::class, + 'choices' => $persons, + 'choice_label' => function (Person $p) { return $this->personRender->renderString($p, []); }, + 'multiple' => false, + 'expanded' => true, + ]); + } + } } - public function adminFormReverseTransform(array $data): array + public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { - return [ - 'mainPerson' => $data['mainPerson'], - 'person1' => $data['person1'], - 'person2' => $data['person2'], - 'category' => [ - 'idInsideBundle' => $data['category']->getIdInsideBundle(), - 'bundleId' => $data['category']->getBundleId() - ], - ]; + if (!$entity instanceof AccompanyingPeriod) { + throw new UnexpectedTypeException($entity, AccompanyingPeriod::class); + } + $options = $template->getOptions(); + + $data = []; + $data['course'] = $this->normalizer->normalize($entity, 'docgen', ['docgen:expects' => AccompanyingPeriod::class]); + + foreach (['mainPerson', 'person1', 'person2'] as $k) { + if ($options[$k]) { + $data[$k] = $this->normalizer->normalize($contextGenerationData[$k], 'docgen', ['docgen:expects' => Person::class]); + } + } + + return $data; } + public function getDescription(): string + { + return 'A basic context for accompanying period'; + } public function getEntityClass(): string { return AccompanyingPeriod::class; } + + public static function getKey(): string + { + return self::class; + } + + public function getName(): string + { + return 'Accompanying Period basic'; + } + + public function hasAdminForm(): bool + { + return true; + } + + public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool + { + $options = $template->getOptions(); + + return $options['mainPerson'] || $options['person1'] || $options['person2']; + } + + /** + * @param AccompanyingPeriod $entity + */ + public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void + { + $doc = new AccompanyingCourseDocument(); + $doc->setTitle($this->translatableStringHelper->localize($template->getName())) + ->setDate(new DateTime()) + ->setDescription($this->translatableStringHelper->localize($template->getName())) + ->setCourse($entity) + ->setObject($storedObject); + + if (array_key_exists('category', $template->getOptions()['category'])) { + $doc + ->setCategory( + $this->documentCategoryRepository->find( + $template->getOptions()['category'] + ) + ); + } + + $this->em->persist($doc); + } }