243 lines
8.8 KiB
PHP
243 lines
8.8 KiB
PHP
|
<?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';
|
||
|
}
|
||
|
}
|