suivi/src/Controller/ExpenseReportAdminController.php

243 lines
8.8 KiB
PHP
Raw Normal View History

2022-04-29 11:31:12 +02:00
<?php
namespace App\Controller;
use App\Core\Controller\Admin\Crud\CrudController;
use App\Core\Crud\CrudConfiguration;
use App\Core\Crud\Field;
use App\Core\Entity\EntityInterface;
use App\Core\Form\FileUploadHandler;
use App\Core\Manager\EntityManager;
use App\Entity\ExpenseReport as Entity;
use App\Factory\ExpenseReportFactory as Factory;
use App\Form\ExpenseReportType as Type;
use App\Repository\ExpenseReportRepositoryQuery as RepositoryQuery;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
class ExpenseReportAdminController extends CrudController
{
protected FileUploadHandler $fileUpload;
protected Filesystem $fs;
public function __construct(FileUploadHandler $fileUpload, Filesystem $fs)
{
$this->fileUpload = $fileUpload;
$this->fs = $fs;
}
/**
* @Route("/admin/expense_report/{page}", name="admin_expense_report_index", methods={"GET"}, requirements={"page":"\d+"})
*/
public function index(RepositoryQuery $query, Request $request, Session $session, int $page = 1): Response
{
if (!$this->isGranted('ROLE_TREASURER')) {
$query->filterByUser($this->getUser());
}
return $this->doIndex($page, $query, $request, $session);
}
/**
* @Route("/admin/expense_report/new", name="admin_expense_report_new", methods={"GET", "POST"})
*/
public function new(Factory $factory, EntityManager $entityManager, Request $request): Response
{
return $this->doNew($factory->create($this->getUser()), $entityManager, $request);
}
/**
* @Route("/admin/expense_report/show/{entity}", name="admin_expense_report_show", methods={"GET"})
*/
public function show(Entity $entity): Response
{
if (!$this->isGranted('ROLE_TREASURER')) {
if ($entity->getUser()->getId() !== $entity->getUser()->getId()) {
throw $this->createAccessDeniedException();
}
}
return $this->doShow($entity);
}
/**
* @Route("/admin/expense_report/filter", name="admin_expense_report_filter", methods={"GET"})
*/
public function filter(Session $session): Response
{
return $this->doFilter($session);
}
/**
* @Route("/admin/expense_report/edit/{entity}", name="admin_expense_report_edit", methods={"GET", "POST"})
*/
public function edit(Entity $entity, EntityManager $entityManager, Request $request): Response
{
if (!$this->isGranted('ROLE_TREASURER')) {
if ($entity->getUser()->getId() !== $entity->getUser()->getId()) {
throw $this->createAccessDeniedException();
}
}
return $this->doEdit($entity, $entityManager, $request, [$this, 'beforeUpdate']);
}
protected function beforeUpdate(EntityInterface $entity, FormInterface $form, Request $request)
{
$deleteBills = $request->request->get($form->getName())['deleteBills']['bills'] ?? [];
$bills = $entity->getBills();
foreach ($bills as $key => $value) {
if (in_array($value, $deleteBills)) {
unset($bills[$key]);
$this->fs->remove($value);
}
}
$directory = sprintf(
'uploads/Notes de frais/%d/%d',
$this->getUser()->getId(),
$entity->getId()
);
$newBills = $request->files->get($form->getName())['newBills'] ?? [];
foreach ($newBills as $data) {
$this->fileUpload->handleForm(
$data['file'],
$directory,
function ($filename) use ($directory, &$bills) {
$bills[] = $directory.'/'.$filename;
},
true
);
}
$entity->setBills($bills);
}
/**
* @Route("/admin/expense_report/sort/{page}", name="admin_expense_report_sort", methods={"POST"}, requirements={"page":"\d+"})
*/
public function sort(RepositoryQuery $query, EntityManager $entityManager, Request $request, Session $session, int $page = 1): Response
{
return $this->doSort($page, $query, $entityManager, $request, $session);
}
/**
* @Route("/admin/expense_report/batch/{page}", name="admin_expense_report_batch", methods={"POST"}, requirements={"page":"\d+"})
*/
public function batch(RepositoryQuery $query, EntityManager $entityManager, Request $request, Session $session, int $page = 1): Response
{
if (!$this->isGranted('ROLE_TREASURER')) {
$query->filterByUser($this->getUser());
}
return $this->doBatch($page, $query, $entityManager, $request, $session);
}
/**
* @Route("/admin/expense_report/delete/{entity}", name="admin_expense_report_delete", methods={"DELETE"})
*/
public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response
{
if (!$this->isGranted('ROLE_TREASURER')) {
if ($entity->getUser()->getId() !== $entity->getUser()->getId()) {
throw $this->createAccessDeniedException();
}
}
return $this->doDelete($entity, $entityManager, $request);
}
protected function getConfiguration(): CrudConfiguration
{
return CrudConfiguration::create()
->setPageTitle('index', 'Notes de frais')
->setPageTitle('edit', 'Note de frais {id}')
->setPageTitle('new', 'Nouvelle note de frais')
->setPageTitle('show', 'Note de frais {id}')
->setPageRoute('index', 'admin_expense_report_index')
->setPageRoute('new', 'admin_expense_report_new')
->setPageRoute('edit', 'admin_expense_report_edit')
->setPageRoute('show', 'admin_expense_report_show')
->setPageRoute('sort', 'admin_expense_report_sort')
->setPageRoute('batch', 'admin_expense_report_batch')
->setPageRoute('delete', 'admin_expense_report_delete')
->setPageRoute('filter', 'admin_expense_report_filter')
->setFormOptions('new', [
'is_treasurer' => $this->isGranted('ROLE_TREASURER'),
])
->setFormOptions('edit', [
'is_treasurer' => $this->isGranted('ROLE_TREASURER'),
])
->setView('form', 'admin/expense_report/_form.html.twig')
->setForm('edit', Type::class, [])
->setForm('new', Type::class)
// ->setForm('filter', Type::class)
// ->setMaxPerPage('index', 20)
// ->setIsSortableCollection('index', false)
// ->setSortableCollectionProperty('sortOrder')
// ->setAction('index', 'new', true)
// ->setAction('index', 'show', true)
// ->setAction('index', 'edit', true)
// ->setAction('index', 'delete', true)
// ->setAction('edit', 'back', true)
// ->setAction('edit', 'show', true)
// ->setAction('edit', 'delete', true)
// ->setAction('show', 'back', true)
// ->setAction('show', 'edit', true)
->setDefaultSort('index', 'dateTo', 'desc')
->setField('index', 'Personne', Field\TextField::class, [
'property_builder' => function (EntityInterface $entity) {
return $entity->getUser()->getDisplayName();
},
'attr' => ['class' => 'col-md-3'],
])
->setField('index', 'Date from', Field\DateField::class, [
'property' => 'dateFrom',
'sort' => ['dateFrom', '.dateFrom'],
'format' => 'd/m/Y',
'attr' => ['class' => 'col-md-3'],
])
->setField('index', 'Date to', Field\DateField::class, [
'property' => 'dateTo',
'sort' => ['dateTo', '.dateTo'],
'format' => 'd/m/Y',
'attr' => ['class' => 'col-md-3'],
])
->setField('index', 'Payée', Field\ButtonField::class, [
'property_builder' => function (EntityInterface $entity) {
return $entity->getIsPaid() ? 'Yes' : 'No';
},
'attr' => ['class' => 'col-md-3'],
'button_attr_builder' => function (EntityInterface $entity) {
return ['class' => 'btn btn-sm btn-'.($entity->getIsPaid() ? 'success' : 'info')];
},
])
// ->setBatchAction('index', 'delete', 'Delete', function (EntityInterface $entity, EntityManager $manager) {
// $manager->delete($entity);
// })
;
}
protected function getSection(): string
{
return 'expense_report';
}
}