src/Controller/Admin/EcoleCrudController.php line 93

  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\ContactMember;
  4. use App\Entity\Ecole;
  5. use App\Entity\EcoleThematique;
  6. use App\Entity\FormatEcole;
  7. use App\Entity\Membre;
  8. use App\Entity\Orateur;
  9. use App\Entity\Subvention;
  10. use App\Entity\User;
  11. use App\Field\DateEcoleIndexField;
  12. use App\Field\TitreEcoleIndexField;
  13. use App\Filter\EcoleInscriptionOuvertFilter;
  14. use App\Form\EcoleFileType;
  15. use App\Repository\UserRepository;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Doctrine\ORM\QueryBuilder;
  18. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  19. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  20. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  21. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  22. use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
  23. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  24. use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
  25. use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
  26. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  27. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
  28. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  29. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  30. use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
  31. use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
  32. use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
  33. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  34. use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
  35. use EasyCorp\Bundle\EasyAdminBundle\Field\CountryField;
  36. use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
  37. use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
  38. use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
  39. use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
  40. use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
  41. use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
  42. use EasyCorp\Bundle\EasyAdminBundle\Field\TelephoneField;
  43. use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
  44. use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
  45. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  46. use EasyCorp\Bundle\EasyAdminBundle\Field\UrlField;
  47. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  48. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  49. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  50. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  51. use Symfony\Bundle\SecurityBundle\Security;
  52. use Symfony\Component\Form\Event\PreSubmitEvent;
  53. use Symfony\Component\Form\FormBuilderInterface;
  54. use Symfony\Component\Form\FormEvents;
  55. use Symfony\Component\Form\FormInterface;
  56. use Symfony\Component\HttpFoundation\RedirectResponse;
  57. use Symfony\Component\HttpFoundation\StreamedResponse;
  58. use Symfony\Component\Mailer\MailerInterface;
  59. use Symfony\Component\Mime\Email;
  60. use Symfony\Contracts\Translation\TranslatorInterface;
  61. use function Symfony\Component\Translation\t;
  62. class EcoleCrudController extends AbstractCrudController
  63. {
  64.     public function __construct(
  65.         private TranslatorInterface $translator,
  66.         private AdminUrlGenerator $adminUrlGenerator,
  67.         private Security $security,
  68.         private MailerInterface $mailer,
  69.         private UserRepository $userRepository
  70.     )
  71.     {
  72.     }
  73.     public static function getEntityFqcn(): string
  74.     {
  75.         return Ecole::class;
  76.     }
  77.     public function index(AdminContext $context)
  78.     {
  79.         /** @var User|null $user */
  80.         $user $this->getUser();
  81.         if ($user && ($user->isAdmin() || $user->isGestionnaireEcole())) {
  82.             return parent::index($context); // TODO: Change the autogenerated stub
  83.         } else {
  84.             return $this->redirect($this->adminUrlGenerator->setController(EcoleCrudController::class)->setAction('listEcole')->generateUrl());
  85.         }
  86.     }
  87.     public function listEcole(AdminContext $context)
  88.     {
  89.         $user $this->getUser();
  90.         if ($user && $user->isAdmin()) {
  91.             return $this->redirect($this->adminUrlGenerator->setController(EcoleCrudController::class)->setAction(Action::INDEX)->generateUrl());
  92.         } else {
  93.             return $this->render('ecole/listEcole.html.twig');
  94.         }
  95.     }
  96.     public function configureActions(Actions $actions): Actions
  97.     {
  98.         /** @var User|null $user */
  99.         $user $this->getUser();
  100.         $vuProgramme Action::new('vuProgramme''Vu programme''fa fa-calendar')
  101.             ->linkToCrudAction('listEcole')
  102.             ->displayIf(static function (Ecole $entity) use ($user) {
  103.                 return $user && ($user->isGestionnaireEcole());
  104.             })
  105.             ->createAsGlobalAction()
  106.         ;
  107.         $downloadExcel Action::new('downloadExcel'$this->translator->trans('ecole.action.download_excel', [], 'admin'), 'fa fa-file')
  108.             ->linkToCrudAction('downloadExcel')
  109.             ->displayIf(static function (Ecole $entity) use ($user) {
  110.                 return $user && ($user->isAdmin() || $entity->isGestionnaires($user)) ;
  111.             })
  112.         ;
  113.         $addRegister Action::new('newInscription'$this->translator->trans('ecole.action.inscription', [], 'admin'), 'fa fa-register')
  114.             ->linkToCrudAction('newInscription')
  115.             ->displayIf(static function (Ecole $entity) use ($user) {
  116.                 return
  117.                     $entity->isValider()
  118.                     && $user
  119.                     && $user->isOnlyUser()
  120.                     && $entity->getModeInscription() !== null;
  121.                     //&& !$user->hasAlreadyInscription($entity);
  122.             })
  123.             ->setTemplatePath('admin/action/ecoleNewInscription.html.twig')
  124.         ;
  125.         $showModal Action::new('showModal''''fa-solid fa-magnifying-glass')
  126.             ->linkToCrudAction('showModal')
  127.             ->addCssClass('show-ecole-modal')
  128.             ->setHtmlAttributes([
  129.                 'data-bs-toggle' => 'modal',
  130.                 'data-bs-target' => '#modal-info-ecole',
  131.             ])
  132.         ;
  133.         $urlVoirInscrit $this->adminUrlGenerator
  134.             ->setController(InscriptionCrudController::class)
  135.             //->set('filters[ecole]', '2')
  136.             ->generateUrl();
  137.         $voirInscrit Action::new('voirInscription''voir inscrit''fa-solid fa-calendar-circle-plus')
  138.             ->linkToUrl($urlVoirInscrit)
  139.             ->setTemplatePath('admin/action/voirInscrit.html.twig')
  140.             ->displayIf(static function (Ecole $entity) use ($user) {
  141.                 return $user && ($entity->isGestionnaires($user) || $user->isAdmin());
  142.             })
  143.         ;
  144.         if (!$user || $user->isGestionnaireEcole() || $user->isOnlyUser()) {
  145.             $actions->remove(Crud::PAGE_INDEXAction::NEW);
  146.         }
  147.         $actions->remove(Crud::PAGE_NEWAction::SAVE_AND_ADD_ANOTHER);
  148.         $actions->remove(Crud::PAGE_EDITAction::SAVE_AND_CONTINUE);
  149.         // bouton pour que le gestionnaire d'école puisse soumettre son école pour validation
  150.         $actions->add(
  151.             Crud::PAGE_EDITAction::new('submitToValidation''Soumettre pour validation')
  152.              ->linkToCrudAction(Action::EDIT)
  153.             ->displayAsButton()
  154.             ->setHtmlAttributes([
  155.                 'type' => 'submit',
  156.                 'name' => 'ea[newForm][btn]',
  157.                 'value' => 'saveAndSubmitToValidation'
  158.             ])
  159.                 ->addCssClass('btn btn-success')
  160.             ->displayIf(static function (Ecole $entity) use ($user) {
  161.                 return $entity->getStatut() === Ecole::STATUS_BROUILLON && !$user->isAdmin();
  162.             })
  163.         );
  164.         $actions
  165.             ->add(Crud::PAGE_INDEX$showModal)
  166.             ->add(Crud::PAGE_INDEX$voirInscrit)
  167.         ;
  168.         $actions->update(Crud::PAGE_INDEXAction::EDIT, function (Action $action) use ($user) {
  169.             return $action->displayIf(static function (Ecole $entity) use ($user) {
  170.                     return $user && ((in_array($entity->getStatut(), [Ecole::STATUS_BROUILLON]) && $user->isGestionnaireEcole()) || $user->isAdmin()) ;
  171.                 });
  172.         });
  173.         $actions->add(Crud::PAGE_INDEXAction::DETAIL);
  174.         $actions->update(Crud::PAGE_DETAILAction::DELETE, function (Action $action) use ($user) {
  175.             return $action->displayIf(static function (Ecole $ecole) use ($user) {
  176.                 return $user->isAdmin();
  177.             });
  178.         });
  179.         $actions->update(Crud::PAGE_DETAILAction::EDIT, function (Action $action) use ($user) {
  180.             return $action->displayIf(static function (Ecole $ecole) use ($user) {
  181.                 return $user->isAdmin();
  182.             });
  183.         });
  184.         $actions->update(Crud::PAGE_EDITAction::SAVE_AND_RETURN, function (Action $action) use ($user) {
  185.             return $action->displayIf(static function (Ecole $entity) use ($user) {
  186.                 return ((in_array($entity->getStatut(), [Ecole::STATUS_BROUILLON]) && $user->isGestionnaireEcole())) || $user->isAdmin() ;
  187.             });
  188.         });
  189.         // bouton pour que l'admin puisse valider une ecole
  190.         $actions->add(
  191.             Crud::PAGE_EDITAction::new('submitAndValidate''Valider l\'école')
  192.             ->linkToCrudAction(Action::EDIT)
  193.             ->displayAsButton()
  194.             ->setHtmlAttributes([
  195.                 'id' => 'submitAndValidate',
  196.                 'type' => 'submit',
  197.                 'name' => 'ea[newForm][btn]',
  198.                 'value' => 'submitAndValidate',
  199.             ])
  200.                 ->addCssClass('btn btn-success')
  201.             ->displayIf(static function (Ecole $entity) use ($user) {
  202.                 return $user->isAdmin();
  203.             })
  204.         );
  205.         $actions->add(
  206.             Crud::PAGE_EDITAction::new('submitAndValidateNoEmail''Valider l\'école sans envoi de l\'email')
  207.             ->linkToCrudAction(Action::EDIT)
  208.             ->displayAsButton()
  209.             ->setHtmlAttributes([
  210.                 'id' => 'submitAndValidateNoEmail',
  211.                 'type' => 'submit',
  212.                 'name' => 'ea[newForm][btn]',
  213.                 'value' => 'submitAndValidateNoEmail',
  214.             ])
  215.                 ->addCssClass('btn btn-success')
  216.             ->displayIf(static function (Ecole $entity) use ($user) {
  217.                 return $user->isAdmin();
  218.             })
  219.         );
  220.         // bouton pour que l'admin puisse abandonner une ecole
  221.         $actions->add(
  222.             Crud::PAGE_EDITAction::new('submitAndReject''Abandonner l\'école')
  223.             ->linkToCrudAction(Action::EDIT)
  224.             ->displayAsButton()
  225.             ->setHtmlAttributes([
  226.                 'id' => 'submitAndReject',
  227.                 'type' => 'submit',
  228.                 'name' => 'ea[newForm][btn]',
  229.                 'value' => 'submitAndReject',
  230.             ])
  231.                 ->addCssClass('btn btn-danger')
  232.             ->displayIf(static function (Ecole $entity) use ($user) {
  233.                 return $user->isAdmin();
  234.             })
  235.         );
  236.         // bouton pour que l'admin puisse renvoyer une ecole en brouillon
  237.         $actions->add(
  238.             Crud::PAGE_EDITAction::new('submitAndDraft''Renvoyer en brouillon l\'école')
  239.             ->linkToCrudAction(Action::EDIT)
  240.             ->displayAsButton()
  241.             ->setHtmlAttributes([
  242.                 'id' => 'submitAndDraft',
  243.                 'type' => 'submit',
  244.                 'name' => 'ea[newForm][btn]',
  245.                 'value' => 'submitAndDraft',
  246.             ])
  247.             ->addCssClass('btn btn-primary')
  248.             ->displayIf(static function (Ecole $entity) use ($user) {
  249.                 return $user->isAdmin() && $entity->getStatut() === Ecole::STATUS_SOUMIS;
  250.             })
  251.         );
  252.         $actions->add(
  253.             Crud::PAGE_EDITAction::new('backToList''Retour à la liste')
  254.             ->linkToCrudAction(Action::INDEX)
  255.         );
  256.         $actions->update(Crud::PAGE_INDEXAction::DELETE, function(Action $action) use ($user) {
  257.             return $action->displayIf(static function (Ecole $entity) use ($user) {
  258.                 return $entity->getStatut() === Ecole::STATUS_BROUILLON && $user->isGestionnaireEcole();
  259.             });
  260.         });
  261.         return $actions
  262.             ->add(Crud::PAGE_INDEX$downloadExcel)
  263.             ->add(Crud::PAGE_INDEX$addRegister)
  264.             ->add(Crud::PAGE_INDEX$vuProgramme)
  265.             ->remove(Crud::PAGE_INDEXAction::BATCH_DELETE)
  266.         ;
  267.     }
  268.     public function configureCrud(Crud $crud): Crud
  269.     {
  270.         return $crud
  271.             ->showEntityActionsInlined()
  272.             ->setEntityLabelInSingular('ecole')
  273.             ->setEntityLabelInPlural('écoles')
  274.             ->setDateFormat('d MMMM Y')
  275.             ->setTimeFormat('H:i:s')
  276.             ->setPageTitle('index''Liste des %entity_label_plural%')
  277.             // you can pass a PHP closure as the value of the title
  278.             ->setPageTitle('new''Ajouter un projet d\'%entity_label_singular%')
  279.             // in DETAIL and EDIT pages, the closure receives the current entity
  280.             // as the first argument
  281.             ->setPageTitle('detail''Détail de l\'%entity_label_singular%')
  282.             ->setPageTitle('edit''Edition de l\'%entity_label_singular%')
  283.             // the help message displayed to end users (it can contain HTML tags)
  284.             ->setHelp('edit''Vous pouvez ici modifier les informations de l\'école.')
  285.             //->overrideTemplate('')
  286.             ;
  287.     }
  288.     public function configureFilters(Filters|\EasyCorp\Bundle\EasyAdminBundle\Config\Filters $filters): \EasyCorp\Bundle\EasyAdminBundle\Config\Filters
  289.     {
  290.         return $filters
  291.             ->add(EcoleInscriptionOuvertFilter::new('Recherche'$this->security))
  292.             //->add('libelle')
  293.             //->add('published')
  294.             ;
  295.     }
  296.     public function configureFields(string $pageName): iterable
  297.     {
  298.         if ($pageName === Crud::PAGE_INDEX) {
  299.             return [
  300.                 IdField::new('id')->hideOnIndex(),
  301.                 DateEcoleIndexField::new('dateEcoleText'''),
  302.                 TitreEcoleIndexField::new('libelle''')->setSortable(false),
  303.                 //TextField::new('libelle', 'form.ecole.libele'),
  304.                 //TextField::new('PorteurProjetFullName', 'form.ecole.panel.porteurProjet'),
  305.                 //TextField::new('dateEcoleText', 'Date'),
  306.                 TextField::new('statut''form.ecole.statut'),
  307.                 IntegerField::new('nbInscrit''form.ecole.nbInscrit')->setSortable(false),
  308.             ];
  309.         }
  310.         $config = [
  311.             // panels usually display only a title
  312.             FormField::addTab('Informations générales'),
  313.             IdField::new('id')->hideOnForm(),
  314.             TextField::new('libelle''form.ecole.libele')->setColumns('col-md-12'),
  315.         ];
  316.         if ($this->getUser() && $this->getUser()->isAdmin()) {
  317.             $config[] = AssociationField::new('gestionnaires''form.ecole.creator')
  318.                 //->setFormTypeOption('choice_label',
  319.                 //    $this->translator->getLocale() === 'fr' ? 'labelFr' : 'labelEn'
  320.                 //)
  321.                 ->setQueryBuilder(static function (QueryBuilder $qb) {
  322.                     return $qb->andWhere($qb->expr()->orX(
  323.                         $qb->getAllAliases()[0].'.roles LIKE :roleInclude',
  324.                         $qb->getAllAliases()[0].'.roles LIKE :roleStart',
  325.                         $qb->getAllAliases()[0].'.roles LIKE :roleEnd',
  326.                     ))
  327.                         ->setParameter('roleInclude''%ROLE_GESTIONNAIRE_ECOLE%')
  328.                         ->setParameter('roleStart''ROLE_GESTIONNAIRE_ECOLE%')
  329.                         ->setParameter('roleEnd''%ROLE_GESTIONNAIRE_ECOLE')
  330.                         ;
  331.                 })
  332.                 ->setColumns('col-md-6');
  333.         }
  334.         $config[] = TextField::new('statut''statut')
  335.             ->setDisabled(true)
  336.             ->setColumns($this->getUser() && $this->getUser()->isAdmin() ? 'col-md-6' 'col-md-12');
  337.             ;
  338.         $config = [...$config,
  339.             FormField::addPanel('form.ecole.panel.dateDefinitive'),
  340.             DateField::new('dateDefinitiveValideDebut''form.ecole.dateFinitiveEcoleDebut')
  341.                 ->setColumns('col-md-6')
  342.                 ->setDisabled($this->getUser() && $this->getUser()->isAdmin() ? false true)
  343.             ,
  344.             DateField::new('dateDefinitiveValideFin''form.ecole.dateFinitiveEcoleFin')
  345.                 ->setColumns('col-md-6')
  346.                 ->setDisabled($this->getUser() && $this->getUser()->isAdmin() ? false true)
  347.             ,
  348.             FormField::addTab('form.ecole.tab.details'),
  349.             AssociationField::new('taillePrevue''form.ecole.taillePrevue')
  350.                 ->setFormTypeOption('choice_label',
  351.                     $this->translator->getLocale() === 'fr' 'labelFr' 'labelEn'
  352.                 )
  353.                 ->setColumns('col-md-3')
  354.             ,
  355.             AssociationField::new('formatPropose''form.ecole.formatPropose')
  356.                 ->setFormTypeOption('choice_label',
  357.                     $this->translator->getLocale() === 'fr' 'labelFr' 'labelEn'
  358.                 )
  359.                 ->setColumns('col-md-3')
  360.             ,
  361.             AssociationField::new('frequencePropose''form.ecole.frequencePropose')
  362.                 ->setFormTypeOption('choice_label',
  363.                     $this->translator->getLocale() === 'fr' 'labelFr' 'labelEn'
  364.                 )
  365.                 ->setColumns('col-md-3')
  366.             ,
  367.             NumberField::new('nbJours''form.ecole.nbJours')
  368.                 ->setColumns('col-md-3')
  369.             ,
  370.             FormField::addPanel('form.ecole.panel.calendar'),
  371.             FormField::addPanel('form.ecole.panel.marsToMay'),
  372.             DateField::new('marsAMaiDateDebut''form.ecole.marsAMaiDateDebut')
  373.                 ->setColumns('col-md-6'),
  374.             DateField::new('marsAMaiDateFin''form.ecole.marsAMaiDateFin')
  375.                 ->setColumns('col-md-6'),
  376.             FormField::addPanel('form.ecole.panel.juneToAugust'),
  377.             DateField::new('juinAAoutDateDebut''form.ecole.juinAAoutDateDebut')
  378.                 ->setColumns('col-md-6'),
  379.             DateField::new('juinAAoutDateFin''form.ecole.juinAAoutDateFin')
  380.                 ->setColumns('col-md-6'),
  381.             FormField::addPanel('form.ecole.panel.septemberToNovember'),
  382.             DateField::new('septembreANovembreDateDebut''form.ecole.septembreANovembreDateDebut')
  383.                 ->setColumns('col-md-6'),
  384.             DateField::new('septembreANovembreDateFin''form.ecole.septembreANovembreDateFin')
  385.                 ->setColumns('col-md-6'),
  386.             FormField::addTab('form.ecole.panel.porteurProjet'),
  387.             TextField::new('porteurProjetPrenom''form.ecole.porteurProjetPrenom')->setColumns('col-md-4'),
  388.             TextField::new('porteurProjetNom''form.ecole.porteurProjetNom')->setColumns('col-md-4'),
  389.             TextField::new('porteurProjetLaboratoire''form.ecole.porteurProjetLaboratoire')->setColumns('col-md-4'),
  390.             TextField::new('porterProjetAdressePostale''form.ecole.porterProjetAdressePostale')->setColumns('col-md-12'),
  391.             TextField::new('porteurProjetCodePostal''form.ecole.porteurProjetCodePostal')->setColumns('col-md-4'),
  392.             TextField::new('porteurProjetVille''form.ecole.porteurProjetVille')->setColumns('col-md-4'),
  393.             CountryField::new('porterProjetPays''form.ecole.porterProjetPays')->setColumns('col-md-4'),
  394.             TelephoneField::new('porteurProjetTel''form.ecole.porteurProjetTel')->setColumns('col-md-4'),
  395.             TelephoneField::new('porterProjetPortable''form.ecole.porterProjetPortable')->setColumns('col-md-4'),
  396.             EmailField::new('porteurProjetEmail''form.ecole.porteurProjetEmail')->setColumns('col-md-4'),
  397.             TextareaField::new('descriptionActivite''form.ecole.descriptionActivite')
  398.                 ->setColumns('col-md-12')
  399.                 ->setMaxLength(3000)
  400.             ,
  401.             CollectionField::new('membres''form.ecole.membres')
  402.                 ->allowAdd()
  403.                 ->allowDelete()
  404.                 ->renderExpanded()
  405.                 ->setEntryIsComplex()
  406.                 ->useEntryCrudForm()
  407.                 ->setColumns('col-md-12')
  408.             ,
  409.             FormField::addTab('form.ecole.panel.domaine_sujet'),
  410.             TextareaField::new('breveDescription''form.ecole.breveDescription')
  411.                 ->setColumns('col-md-12')
  412.                 ->setMaxLength(3000)
  413.             ,
  414.             UrlField::new('siteWeb''form.ecole.siteWeb')->setColumns('col-md-6'),
  415.             EmailField::new('emailGenerique''form.ecole.emailGenerique')->setColumns('col-md-6'),
  416.             CollectionField::new('thematiques''form.ecole.thematiques')
  417.                 ->allowAdd()
  418.                 ->allowDelete()
  419.                 ->renderExpanded()
  420.                 ->setEntryIsComplex()
  421.                 ->useEntryCrudForm()
  422.                 ->setColumns('col-md-12')
  423.             ,
  424.             ArrayField::new('motsCles''form.ecole.motsCles'),
  425.             FormField::addTab('form.ecole.panel.comiteScientifique'),
  426.             CollectionField::new('membresComiteScientifique''form.ecole.membresComiteScientifique')
  427.                 ->allowAdd()
  428.                 ->allowDelete()
  429.                 ->renderExpanded()
  430.                 ->setEntryIsComplex()
  431.                 ->useEntryCrudForm()
  432.                 ->setColumns('col-md-12')
  433.             ,
  434.             FormField::addTab('form.ecole.panel.comiteOrganisation'),
  435.             CollectionField::new('membresComiteOrganisation''form.ecole.membresComiteOrganisation')
  436.                 ->allowAdd()
  437.                 ->allowDelete()
  438.                 ->renderExpanded()
  439.                 ->setEntryIsComplex()
  440.                 ->useEntryCrudForm()
  441.                 ->setColumns('col-md-12')
  442.             ,
  443.             FormField::addTab('form.ecole.panel.public'),
  444.             ChoiceField::new('public''form.ecole.public')
  445.                 ->allowMultipleChoices()
  446.                 ->renderExpanded()
  447.                 ->setTranslatableChoices([
  448.                     'MASTER' => t('form.ecole.public.master', [], 'admin'),
  449.                     'POST_DOCS' => t('form.ecole.public.post_docs', [], 'admin'),
  450.                     'JEUNE_CHERCHEUR' => t('form.ecole.public.jeune_chercheur', [], 'admin'),
  451.                     'CHERCHEUR_CONFIRME' => t('form.ecole.public.chercheur_confirme', [], 'admin'),
  452.                     'INDUSTRIEL' => t('form.ecole.public.industriel', [], 'admin'),
  453.                     'AUTRES' => t('form.ecole.public.autre', [], 'admin'),
  454.                 ])
  455.             ,
  456.             FormField::addTab('form.ecole.panel.programme'),
  457.             TextareaField::new('programme''form.ecole.programme')
  458.                 ->setColumns('col-md-12')
  459.                 ->setMaxLength(3000)
  460.             ,
  461.             BooleanField::new('grandPublic''form.ecole.grandPublic'),
  462.             CollectionField::new('orateurs''form.ecole.orateurs')
  463.                 ->allowAdd()
  464.                 ->allowDelete()
  465.                 ->renderExpanded()
  466.                 ->setEntryIsComplex()
  467.                 ->useEntryCrudForm()
  468.                 ->setColumns('col-md-12')
  469.             ,
  470.             FormField::addTab('form.ecole.panel.subvention_financement'),
  471.             CollectionField::new('subventions''form.ecole.subventions')
  472.                 ->allowAdd()
  473.                 ->allowDelete()
  474.                 ->renderExpanded()
  475.                 ->setEntryIsComplex()
  476.                 ->useEntryCrudForm()
  477.                 ->setColumns('col-md-12')
  478.                 ->setCustomOption('allowHtml'true)
  479.                 ->setCustomOption('escape'false)
  480.                 /*->formatValue(function ($value, $entity) {
  481.                     return is_string($value) ? nl2br($value) : $value;
  482.                 })*/
  483.             ,
  484.             FormField::addTab('form.ecole.panel.commentaire'),
  485.             TextEditorField::new('commentaire''form.ecole.commentaire')
  486.                 ->setColumns('col-md-12')
  487.             ,
  488.             CollectionField::new('files''form.ecole.files')
  489.                 ->setEntryType(EcoleFileType::class),
  490.             FormField::addTab('form.ecole.panel.inscription'),
  491.             ChoiceField::new('modeInscription''form.ecole.inscription')
  492.                 ->renderExpanded()
  493.                 ->setFormTypeOptionIfNotSet('placeholder't('form.ecole.inscription.no_inscription', [], 'admin'))
  494.                 ->setTranslatableChoices([
  495.                     'ONE_STEP' => t('form.ecole.inscription.une_etape', [], 'admin'),
  496.                     'TWO_STEPS' => t('form.ecole.inscription.deux_etapes', [], 'admin'),
  497.                 ])
  498.             ,
  499.             ChoiceField::new('single''form.ecole.inscription.single')
  500.                 ->renderExpanded()
  501.                 ->setFormTypeOptionIfNotSet('placeholder't('form.ecole.inscription.single.empty', [], 'admin'))
  502.                 ->setTranslatableChoices([
  503.                     '1' => t('form.ecole.inscription.single.autoriser', [], 'admin'),
  504.                     '0' => t('form.ecole.inscription.single.interdire', [], 'admin'),
  505.                 ])
  506.                 ,
  507.             ChoiceField::new('accompagnants''form.ecole.inscription.accompagnants')
  508.                 ->renderExpanded()
  509.                 ->setFormTypeOptionIfNotSet('placeholder't('form.ecole.inscription.accompagnants.empty', [], 'admin'))
  510.                 ->setTranslatableChoices([
  511.                     '1' => t('form.ecole.inscription.accompagnants.autoriser', [], 'admin'),
  512.                     '0' => t('form.ecole.inscription.accompagnants.interdire', [], 'admin'),
  513.                 ])
  514.                 ,
  515.             ChoiceField::new('documentsInscription''form.ecole.documentsInscription')
  516.                 ->renderExpanded()
  517.                 ->allowMultipleChoices()
  518.                 ->setFormTypeOptionIfNotSet('placeholder't('form.ecole.inscription.no_documentInscription', [], 'admin'))
  519.                 ->setTranslatableChoices([
  520.                     'ABSTRACT' => t('form.ecole.inscription.document_abstract', [], 'admin'),
  521.                     'CV' => t('form.ecole.inscription.document_cv', [], 'admin'),
  522.                     'LETTRE_MOTIVATION' => t('form.ecole.inscription.document_lettre_motivation', [], 'admin'),
  523.                     'AUTRE' => t('form.ecole.inscription.document_autre', [], 'admin'),
  524.                 ])
  525.             ,
  526.             FormField::addPanel('form.ecole.panel.date_pre_inscription')->setColumns('col-md-6'),
  527.             DateField::new('datePreInscriptionDebut''form.ecole.dateInscriptionDebut')->setColumns('col-md-6')->setCssClass('full-width'),
  528.             DateField::new('datePreInscriptionFin''form.ecole.dateInscriptionFin')->setColumns('col-md-6')->setCssClass('full-width'),
  529.             FormField::addPanel('form.ecole.panel.date_inscription')->setColumns('col-md-6'),
  530.             DateField::new('dateInscriptionDebut''form.ecole.dateInscriptionDebut')->setColumns('col-md-6')->setCssClass('full-width'),
  531.             DateField::new('dateInscriptionFin''form.ecole.dateInscriptionFin')->setColumns('col-md-6')->setCssClass('full-width'),
  532.             TextEditorField::new('informationComplementaire''form.ecole.informationComplementaire')->setColumns('col-md-12'),
  533.             //DateTimeField::new('createdAt')->onlyOnDetail(),
  534.             // panels can also define their icon, CSS class and help message
  535.             //FormField::addPanel('Contact information')
  536.             //    ->setIcon('phone')->addCssClass('optional')
  537.             //    ->setHelp('Phone number is preferred'),
  538.             //TextField::new('phone'),
  539.             //TextField::new('email')->hideOnIndex(),
  540.             // panels can be collapsible too (useful if your forms are long)
  541.             // this makes the panel collapsible but renders it expanded by default
  542.             //FormField::addPanel('Contact information')->collapsible(),
  543.             // this makes the panel collapsible and renders it collapsed by default
  544.             //FormField::addPanel('Contact information')->renderCollapsed(),
  545.         ];
  546.         return $config;
  547.     }
  548.     public function downloadExcel(AdminContext $context)
  549.     {
  550.         /** @var Ecole $ecole */
  551.         $ecole $context->getEntity()->getInstance();
  552.         $spreadsheet = new Spreadsheet();
  553.         $activeWorksheet $spreadsheet->getActiveSheet();
  554.         $data = [
  555.             '#' => $ecole->getId(),
  556.             'libelle' => $ecole->getLibelle(),
  557.             'taillePrevue' => $ecole->getTaillePrevue()?->getCodeExport(),
  558.             'formatPropose' => $ecole->getFormatPropose()?->getCodeExport(),
  559.             'frequencePropose' => $ecole->getFrequencePropose()?->getCodeExport(),
  560.             'nbJours' => $ecole->getNbJours(),
  561.             'marsAMaiDateDebut' => $ecole->getMarsAMaiDateDebut()?->format('d/m/Y'),
  562.             'marsAMaiDateFin' => $ecole->getMarsAMaiDateFin()?->format('d/m/Y'),
  563.             'juinAAoutDateDebut' => $ecole->getJuinAAoutDateDebut()?->format('d/m/Y'),
  564.             'juinAAoutDateFin' => $ecole->getJuinAAoutDateFin()?->format('d/m/Y'),
  565.             'septembreANovembreDateDebut' => $ecole->getSeptembreANovembreDateDebut()?->format('d/m/Y'),
  566.             'septembreANovembreDateFin' => $ecole->getSeptembreANovembreDateFin()?->format('d/m/Y'),
  567.             'porteurProjetPrenom' => $ecole->getPorteurProjetPrenom(),
  568.             'porteurProjetNom' => $ecole->getPorteurProjetNom(),
  569.             'porteurProjetLaboratoire' => $ecole->getPorteurProjetLaboratoire(),
  570.             'porterProjetAdressePostale' => $ecole->getPorterProjetAdressePostale(),
  571.             'porteurProjetCodePostal' => $ecole->getPorteurProjetCodePostal(),
  572.             'porteurProjetVille' => $ecole->getPorteurProjetVille(),
  573.             'porterProjetPays' => $ecole->getPorterProjetPays(),
  574.             'porteurProjetTel' => $ecole->getPorteurProjetTel(),
  575.             'porterProjetPortable' => $ecole->getPorterProjetPortable(),
  576.             'porteurProjetEmail' => $ecole->getPorteurProjetEmail(),
  577.             //'breveDescription' => $ecole->getBreveDescription(),
  578.             'siteWeb' => $ecole->getSiteWeb(),
  579.             'emailGenerique' => $ecole->getEmailGenerique(),
  580.             'informationComplementaire' => $ecole->getInformationComplementaire(),
  581.         ];
  582.         foreach ($ecole->getMembres() as $index => $membre) {
  583.             $data'Prénom membre' $index 1] = $membre->getPrenom();
  584.             $data'Nom membre' $index 1] = $membre->getNom();
  585.             $data'Laboratoire membre' $index 1] = $membre->getLaboratoire();
  586.             $data['Adresse Postale membre' $index 1] = $membre->getAdressePostale();
  587.             $data['Code Postal membre' $index 1] = $membre->getCodePostal();
  588.             $data['Ville membre' $index 1] = $membre->getVille();
  589.             $data['Tel membre' $index 1] = $membre->getTel();
  590.             $data['Portable membre' $index 1] = $membre->getPortable();
  591.             $data['Email membre' $index 1] = $membre->getEmail();
  592.         }
  593.         /**
  594.          * @var int $index
  595.          * @var EcoleThematique $thematique
  596.          */
  597.         foreach ($ecole->getThematiques() as $index => $thematique) {
  598.             $data['Thématique' $index 1] = $thematique->getThematique()?->getCodeExport();
  599.             $data['Institut' $index 1] = $thematique->getInstitut()?->getCodeExport();
  600.         }
  601.         $data['descriptionActivite'] = $ecole->getDescriptionActivite();
  602.         $data['motsCles'] = implode(','$ecole->getMotsCles());
  603.         /**
  604.          * @var int $index
  605.          * @var Membre $membre
  606.          */
  607.         foreach ($ecole->getMembresComiteScientifique() as $index => $membre) {
  608.             $data'Prénom membre CS' $index 1] = $membre->getPrenom();
  609.             $data'Nom membre CS' $index 1] = $membre->getNom();
  610.             $data'Laboratoire membre CS' $index 1] = $membre->getLaboratoire();
  611.             $data['Ville membre CS' $index 1] = $membre->getVille();
  612.             $data['Pays membre CS' $index 1] = $membre->getCountry();
  613.             $data['Email membre CS' $index 1] = $membre->getEmail();
  614.         }
  615.         /**
  616.          * @var int $index
  617.          * @var Membre $membre
  618.          */
  619.         foreach ($ecole->getMembresComiteOrganisation() as $index => $membre) {
  620.             $data'Prénom membre CO' $index 1] = $membre->getPrenom();
  621.             $data'Nom membre CO' $index 1] = $membre->getNom();
  622.             $data'Laboratoire membre CO' $index 1] = $membre->getLaboratoire();
  623.             $data['Ville membre CO' $index 1] = $membre->getVille();
  624.             $data['Pays membre CO' $index 1] = $membre->getCountry();
  625.             $data['Email membre CO' $index 1] = $membre->getEmail();
  626.         }
  627.         $data['public'] = implode(','$ecole->getPublic());
  628.         $data['programme'] = $ecole->getProgramme();
  629.         if ($ecole->isGrandPublic()) {
  630.             $data['grandPublic'] = 'Oui';
  631.         } else if ($ecole->isGrandPublic() === false) {
  632.             $data['grandPublic'] = 'Non';
  633.         } else {
  634.             $data['grandPublic'] = '';
  635.         }
  636.         /**
  637.          * @var int $index
  638.          * @var Orateur $orateur
  639.          */
  640.         foreach ($ecole->getOrateurs() as $index => $orateur) {
  641.             $data'Prénom Orateur' $index 1] = $orateur->getPrenom();
  642.             $data'Nom Orateur' $index 1] = $orateur->getNom();
  643.             $data['Email Orateur' $index 1] = $orateur->getEmail();
  644.             $data'Theme Orateur' $index 1] = $orateur->getTheme();
  645.         }
  646.         /**
  647.          * @var int $index
  648.          * @var Subvention $subvention
  649.          */
  650.         foreach ($ecole->getSubventions() as $index => $subvention) {
  651.             $data'Organisme Subvention' $index 1] = $subvention->getOrganisme()?->getCodeExport();
  652.             $data'Statut Subvention' $index 1] = $subvention->getStatut();
  653.             $data'Montant Subvention' $index 1] = $subvention->getMontant();
  654.             $data'Observation Subvention' $index 1] = $subvention->getObservation();
  655.         }
  656.         $data['Commentaire'] = $ecole->getCommentaire();
  657.         $data['Mode inscription'] = $ecole->getModeInscription();
  658.         $data['Date inscription début'] = $ecole->getDateInscriptionDebut()?->format('d/m/Y');
  659.         $data['Date inscription fin'] = $ecole->getDateInscriptionFin()?->format('d/m/Y');
  660.         $data['Statut'] = $ecole->getStatut();
  661.         $data['Date pré inscription début'] = $ecole->getDatePreInscriptionDebut()?->format('d/m/Y');
  662.         $data['Date pré inscription fin'] = $ecole->getDatePreInscriptionFin()?->format('d/m/Y');
  663.         $activeWorksheet->fromArray([
  664.             array_keys($data),
  665.             array_values($data)
  666.         ]);
  667.         $filename sprintf('export_ecole_%s.xlsx'$ecole->getLibelle());
  668.         $writer = new Xlsx($spreadsheet);
  669.         $response = new StreamedResponse();
  670.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  671.         $response->headers->set('Content-Disposition''attachment;filename="'.$filename.'"');
  672.         $response->setPrivate();
  673.         $response->headers->addCacheControlDirective('no-cache'true);
  674.         $response->headers->addCacheControlDirective('must-revalidate'true);
  675.         $response->setCallback(function() use ($writer) {
  676.             $writer->save('php://output');
  677.         });
  678.         return $response;
  679.     }
  680.     public function showModal(AdminContext $context)
  681.     {
  682.     }
  683.     public function newInscription(AdminContext $context)
  684.     {
  685.         $ecole $context->getEntity()->getInstance();
  686.         $url $this->adminUrlGenerator->setController(InscriptionCrudController::class)
  687.             ->setAction('newInscription')
  688.             ->set('ecoleId'$ecole->getId())
  689.             ->unset('entityId')
  690.             ->generateUrl();
  691.         return $this->redirect($url);
  692.     }
  693.     public function configureAssets(Assets $assets): Assets
  694.     {
  695.         return $assets
  696.             ->addJsFile('https://kit.fontawesome.com/d47a3ede5e.js')
  697.             ->addJsFile('/static/admin/scripts/modalEcoleInformation.js')
  698.             ->addWebpackEncoreEntry('listEcole')
  699.         ;
  700.     }
  701.     public function createIndexQueryBuilder(SearchDto $searchDtoEntityDto $entityDtoFieldCollection $fieldsFilterCollection $filters): QueryBuilder
  702.     {
  703.         $qb parent::createIndexQueryBuilder($searchDto$entityDto$fields$filters); // TODO: Change the autogenerated stub
  704.         if ($this->getUser()) {
  705.             // utilisateur connecté
  706.             if (in_array(User::ROLE_GESTIONNAIRE_ECOLE$this->getUser()->getRoles())) {
  707.                 $qb->innerJoin('entity.gestionnaires''gestionnaires')
  708.                     ->andWhere('gestionnaires = :user')
  709.                     ->setParameter('user'$this->getUser());
  710.                 return $qb;
  711.             }
  712.             if (in_array(User::ROLE_ADMIN$this->getUser()->getRoles())) {
  713.                 return $qb;
  714.             }
  715.             if (in_array(User::ROLE_USER$this->getUser()->getRoles())) {
  716.                 $qb->andWhere('entity.statut = :statut')
  717.                     ->setParameter('statut'Ecole::STATUS_VALIDEE);
  718.                 return $qb;
  719.             }
  720.         } else {
  721.             // utilisateur non connecté
  722.             $qb->andWhere('entity.statut = :statut')
  723.                     ->setParameter('statut'Ecole::STATUS_VALIDEE);
  724.             return $qb;
  725.         }
  726.     }
  727.     public function edit(AdminContext $context)
  728.     {
  729.         return parent::edit($context); // TODO: Change the autogenerated stub
  730.     }
  731.     public function createEditFormBuilder(EntityDto $entityDtoKeyValueStore $formOptionsAdminContext $context): FormBuilderInterface
  732.     {
  733.         $mailer $this->mailer;
  734.         $userRepository $this->userRepository;
  735.         $form parent::createEditFormBuilder($entityDto$formOptions$context); // TODO: Change the autogenerated stub
  736.         $form->addEventListener(FormEvents::PRE_SUBMIT, function (PreSubmitEvent $event) use ($context$mailer$userRepository) {
  737.             $data $event->getForm()->getData();
  738.             $gestionnaires $data->getGestionnaires();
  739.             $ecole $data;
  740.             $btnSubmitValue $context->getRequest()->request->all()['ea']['newForm']['btn'];
  741.             if ($btnSubmitValue === 'saveAndSubmitToValidation') {
  742.                 /** @var Ecole $data */
  743.                 $data->setStatut(Ecole::STATUS_SOUMIS);
  744.                 $event->getForm()->setData($data);
  745.                 $admins $userRepository->getAdmins();
  746.                 $emails = [];
  747.                 foreach ($admins as $admin) {
  748.                     $emails[] = $admin->getEmail();
  749.                 }
  750.                 $email = (new TemplatedEmail())
  751.                     ->to(...$emails)
  752.                     ->subject(sprintf("L'ecole %s a été soumis à la validation"$data->getLibelle()))
  753.                     ->htmlTemplate('email/to_admin_ecole_soumission.html.twig')
  754.                     ->context([
  755.                         'ecole' => $data,
  756.                     ]);
  757.                 $mailer->send($email);
  758.             }
  759.             if ($btnSubmitValue === 'saveAndReject') {
  760.                 $data->setStatut(Ecole::STATUS_REJETEE);
  761.                 $event->getForm()->setData($data);
  762.             }
  763.             if ($btnSubmitValue === 'submitAndValidate') {
  764.                 // email gestionnaire
  765.                 foreach ($gestionnaires as $gestionnaire) {
  766.                     $email = (new TemplatedEmail())
  767.                         ->to($gestionnaire->getEmail())
  768.                         ->subject(sprintf("Votre école \"%s\" a été validée"$ecole->getLibelle()))
  769.                         ->htmlTemplate('email/to_gestionnaire_valider_ecole.html.twig')
  770.                         ->context([
  771.                             'ecole' => $ecole,
  772.                         ]);
  773.                     $mailer->send($email);
  774.                 }
  775.                 $data->setStatut(Ecole::STATUS_VALIDEE);
  776.                 $event->getForm()->setData($data);
  777.             }
  778.             if ($btnSubmitValue === 'submitAndValidateNoEmail') {
  779.                 $data->setStatut(Ecole::STATUS_VALIDEE);
  780.                 $event->getForm()->setData($data);
  781.             }
  782.             if ($btnSubmitValue === 'submitAndDraft') {
  783.                 // email gestionnaire
  784.                 foreach ($gestionnaires as $gestionnaire) {
  785.                     $email = (new TemplatedEmail())
  786.                         ->to($gestionnaire->getEmail())
  787.                         ->subject(sprintf("Votre école \"%s\" est à nouveau éditable pour correction"$ecole->getLibelle()))
  788.                         ->htmlTemplate('email/to_gestionnaire_retour_brouillon_ecole.html.twig')
  789.                         ->context([
  790.                             'ecole' => $ecole,
  791.                         ]);
  792.                     $mailer->send($email);
  793.                 }
  794.                 $data->setStatut(Ecole::STATUS_BROUILLON);
  795.                 $event->getForm()->setData($data);
  796.             }
  797.         });
  798.         return $form;
  799.     }
  800.     public function updateEntity(EntityManagerInterface $entityManager$entityInstance): void
  801.     {
  802.         parent::updateEntity($entityManager$entityInstance); // TODO: Change the autogenerated stub
  803.         if ($this->getUser()->isAdmin()) {
  804.             return;
  805.         }
  806.         $admins $this->userRepository->getAdmins();
  807.         $emails = [];
  808.         foreach ($admins as $admin) {
  809.             $emails[] = $admin->getEmail();
  810.         }
  811.         $email = (new TemplatedEmail())
  812.             ->to(...$emails)
  813.             ->subject(sprintf("L'ecole %s a été modifié"$entityInstance->getLibelle()))
  814.             ->htmlTemplate('email/to_admin_ecole_modification.html.twig')
  815.             ->context([
  816.                 'ecole' => $entityInstance,
  817.                 'modifyBy' => $this->getUser()->getEmail()
  818.             ]);
  819.         $this->mailer->send($email);
  820.     }
  821. }