Skip to content

Commit

Permalink
[Procuration] slots administration
Browse files Browse the repository at this point in the history
  • Loading branch information
Remg committed Jul 15, 2024
1 parent 580705f commit 3f9ee12
Show file tree
Hide file tree
Showing 7 changed files with 361 additions and 1 deletion.
2 changes: 2 additions & 0 deletions config/packages/security.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ security:
ROLE_ADMIN_TERRITOIRES_PROCURATION_V2_MANAGERS:
- ROLE_APP_ADMIN_PROCURATION_V2_REQUEST_ALL
- ROLE_APP_ADMIN_PROCURATION_V2_PROXY_ALL
- ROLE_APP_ADMIN_PROCURATION_V2_REQUEST_SLOT_ALL
- ROLE_APP_ADMIN_PROCURATION_V2_PROXY_SLOT_ALL
- ROLE_APP_ADMIN_PROCURATION_V2_PROCURATION_REQUEST_ALL

## Application Mobile
Expand Down
16 changes: 16 additions & 0 deletions config/services/admin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,22 @@
<argument />
</service>

<service id="app.admin.procuration_v2.request_slot" class="App\Admin\Procuration\RequestSlotAdmin">
<tag name="sonata.admin" manager-type="orm" label="Procurations » Slots Mandants" group="Élections" />

<argument />
<argument>App\Entity\ProcurationV2\RequestSlot</argument>
<argument />
</service>

<service id="app.admin.procuration_v2.proxy_slot" class="App\Admin\Procuration\ProxySlotAdmin">
<tag name="sonata.admin" manager-type="orm" label="Procurations » Slots Mandataires" group="Élections" />

<argument />
<argument>App\Entity\ProcurationV2\ProxySlot</argument>
<argument />
</service>

<service id="app.admin.vote_place_admin" class="App\Admin\VotePlaceAdmin">
<tag name="sonata.admin" manager-type="orm" label="Assesseur(e)s » Bureaux de vote" group="Élections" />

Expand Down
155 changes: 155 additions & 0 deletions src/Admin/Procuration/ProxySlotAdmin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php

namespace App\Admin\Procuration;

use App\Entity\ProcurationV2\Request;
use App\Query\Utils\MultiColumnsSearchHelper;
use Doctrine\ORM\QueryBuilder;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Filter\Model\FilterData;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelAutocompleteType;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
use Sonata\DoctrineORMAdminBundle\Filter\BooleanFilter;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class ProxySlotAdmin extends AbstractAdmin
{
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->clearExcept(['list', 'edit']);
}

protected function configureFormFields(FormMapper $form): void
{
$form
->with('Matching')
->add('requestSlot', ModelAutocompleteType::class, [
'label' => 'Mandant',
'required' => false,
'multiple' => false,
'minimum_input_length' => 1,
'items_per_page' => 20,
'property' => [],
'callback' => static function (
AbstractAdmin $admin,
array $properties,
string $value
): void {
/** @var QueryBuilder $qb */
$qb = $admin->getDatagrid()->getQuery();
$alias = $qb->getRootAliases()[0];

$qb->join("$alias.request", 'request');

MultiColumnsSearchHelper::updateQueryBuilderForMultiColumnsSearch(
$qb,
$value,
[
['request.firstNames', 'request.lastName'],
['request.lastName', 'request.firstNames'],
['request.email', 'request.email'],
],
[
'request.phone',
],
[
'request.id',
'request.uuid',
]
);
},
'btn_add' => false,
])
->end()
;
}

protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('search', CallbackFilter::class, [
'label' => 'Recherche',
'show_filter' => true,
'field_type' => TextType::class,
'callback' => function (ProxyQuery $qb, string $alias, string $field, FilterData $value) {
if (!$value->hasValue()) {
return false;
}

MultiColumnsSearchHelper::updateQueryBuilderForMultiColumnsSearch(
$qb->getQueryBuilder(),
$value->getValue(),
[
["$alias.firstNames", "$alias.lastName"],
["$alias.lastName", "$alias.firstNames"],
["$alias.email", "$alias.email"],
],
[
"$alias.phone",
],
[
"$alias.id",
"$alias.uuid",
]
);

return true;
},
])
->add('manual', BooleanFilter::class, [
'label' => 'Traitement manuel',
'show_filter' => true,
])
;
}

protected function configureListFields(ListMapper $list): void
{
$list
->addIdentifier('id', null, [
'label' => 'ID',
])
->add('proxy', null, [
'label' => 'Mandataire',
])
->add('round', null, [
'label' => 'Tour',
])
->add('createdAt', null, [
'label' => 'Créé le',
])
->add(ListMapper::NAME_ACTIONS, null, [
'virtual_field' => true,
'actions' => [
'edit' => [],
],
])
;
}

/**
* @param Request $object
*/
protected function alterObject(object $object): void
{
}

/**
* @param Request $object
*/
protected function postUpdate(object $object): void
{
}

/** @required */
public function setEventDispatcher(EventDispatcherInterface $eventDispatcher): void
{
$this->eventDispatcher = $eventDispatcher;
}
}
155 changes: 155 additions & 0 deletions src/Admin/Procuration/RequestSlotAdmin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php

namespace App\Admin\Procuration;

use App\Entity\ProcurationV2\Request;
use App\Query\Utils\MultiColumnsSearchHelper;
use Doctrine\ORM\QueryBuilder;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Filter\Model\FilterData;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelAutocompleteType;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
use Sonata\DoctrineORMAdminBundle\Filter\BooleanFilter;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class RequestSlotAdmin extends AbstractAdmin
{
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->clearExcept(['list', 'edit']);
}

protected function configureFormFields(FormMapper $form): void
{
$form
->with('Matching')
->add('proxySlot', ModelAutocompleteType::class, [
'label' => 'Mandataire',
'required' => false,
'multiple' => false,
'minimum_input_length' => 1,
'items_per_page' => 20,
'property' => [],
'callback' => static function (
AbstractAdmin $admin,
array $properties,
string $value
): void {
/** @var QueryBuilder $qb */
$qb = $admin->getDatagrid()->getQuery();
$alias = $qb->getRootAliases()[0];

$qb->join("$alias.proxy", 'proxy');

MultiColumnsSearchHelper::updateQueryBuilderForMultiColumnsSearch(
$qb,
$value,
[
['proxy.firstNames', 'proxy.lastName'],
['proxy.lastName', 'proxy.firstNames'],
['proxy.email', 'proxy.email'],
],
[
'proxy.phone',
],
[
'proxy.id',
'proxy.uuid',
]
);
},
'btn_add' => false,
])
->end()
;
}

protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
->add('search', CallbackFilter::class, [
'label' => 'Recherche',
'show_filter' => true,
'field_type' => TextType::class,
'callback' => function (ProxyQuery $qb, string $alias, string $field, FilterData $value) {
if (!$value->hasValue()) {
return false;
}

MultiColumnsSearchHelper::updateQueryBuilderForMultiColumnsSearch(
$qb->getQueryBuilder(),
$value->getValue(),
[
["$alias.firstNames", "$alias.lastName"],
["$alias.lastName", "$alias.firstNames"],
["$alias.email", "$alias.email"],
],
[
"$alias.phone",
],
[
"$alias.id",
"$alias.uuid",
]
);

return true;
},
])
->add('manual', BooleanFilter::class, [
'label' => 'Traitement manuel',
'show_filter' => true,
])
;
}

protected function configureListFields(ListMapper $list): void
{
$list
->addIdentifier('id', null, [
'label' => 'ID',
])
->add('request', null, [
'label' => 'Mandant',
])
->add('round', null, [
'label' => 'Tour',
])
->add('createdAt', null, [
'label' => 'Créé le',
])
->add(ListMapper::NAME_ACTIONS, null, [
'virtual_field' => true,
'actions' => [
'edit' => [],
],
])
;
}

/**
* @param Request $object
*/
protected function alterObject(object $object): void
{
}

/**
* @param Request $object
*/
protected function postUpdate(object $object): void
{
}

/** @required */
public function setEventDispatcher(EventDispatcherInterface $eventDispatcher): void
{
$this->eventDispatcher = $eventDispatcher;
}
}
22 changes: 22 additions & 0 deletions src/Entity/ProcurationV2/ProxySlot.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,28 @@ public function __construct(Round $round, Proxy $proxy, ?UuidInterface $uuid = n
$this->actions = new ArrayCollection();
}

public function __toString(): string
{
return sprintf(
'%s [%s]',
$this->proxy,
$this->round
);
}

public function setRequestSlot(?RequestSlot $requestSlot): void
{
if ($this->requestSlot && $requestSlot !== $this->requestSlot) {
$this->requestSlot->proxySlot = null;
}

if ($requestSlot) {
$requestSlot->proxySlot = $this;
}

$this->requestSlot = $requestSlot;
}

#[Groups(['procuration_matched_proxy', 'procuration_proxy_list', 'procuration_proxy_slot_read'])]
public function getRequest(): ?Request
{
Expand Down
9 changes: 9 additions & 0 deletions src/Entity/ProcurationV2/RequestSlot.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ public function __construct(Round $round, Request $request, ?UuidInterface $uuid
$this->actions = new ArrayCollection();
}

public function __toString(): string
{
return sprintf(
'%s [%s]',
$this->request,
$this->round
);
}

#[Groups(['procuration_request_read', 'procuration_request_list', 'procuration_request_slot_read'])]
public function getProxy(): ?Proxy
{
Expand Down
Loading

0 comments on commit 3f9ee12

Please sign in to comment.