suivi/src/Controller/BillAdminController.php
2023-04-08 17:47:43 +02:00

236 lines
9.4 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\Manager\EntityManager;
use App\Entity\Bill as Entity;
use App\Factory\BillFactory as Factory;
use App\Form\BillType as Type;
use App\Form\BillFilterType as FilterType;
use App\Repository\BillRepositoryQuery as RepositoryQuery;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use App\Core\Form\FileUploadHandler;
use Symfony\Component\Form\Form;
use function Symfony\Component\String\u;
use App\Repository\BillVendorRepositoryQuery;
use App\Factory\BillVendorFactory;
class BillAdminController extends CrudController
{
#[Route(path: '/admin/user/edit/{entity}', name: 'admin_user_edit', methods: ['GET', 'POST'])]
#[Route(path: "/admin/bill/{page}", name: "admin_bill_index", methods: ['GET'], requirements: ['page' => '\d+'])]
public function index(RepositoryQuery $query, Request $request, Session $session, int $page = 1): Response
{
return $this->doIndex($page, $query, $request, $session);
}
#[Route(path: "/admin/bill/new", name: "admin_bill_new", methods: ['GET', 'POST'])]
public function new(Factory $factory, EntityManager $entityManager, Request $request, FileUploadHandler $fileUpload): Response
{
return $this->doNew(
$factory->create(),
$entityManager,
$request,
function(Entity $entity, Form $form, Request $request) use ($fileUpload) {
$directory = 'uploads/Factures/';
$fileUpload->handleForm(
$form->get('file')->getData(),
$directory,
function ($filename) use ($entity, $directory) {
$entity->setFile($directory.'/'.$filename);
}
);
}
);
}
#[Route(path: "/admin/bill/show/{entity}", name: "admin_bill_show", methods: ['GET'])]
public function show(Entity $entity): Response
{
return $this->doShow($entity);
}
#[Route(path: "/admin/bill/filter", name: "admin_bill_filter", methods: ['GET'])]
public function filter(Session $session): Response
{
return $this->doFilter($session);
}
#[Route(path: "/admin/bill/edit/{entity}", name: "admin_bill_edit", methods: ['GET', 'POST'])]
public function edit(
Entity $entity,
EntityManager $entityManager,
BillVendorRepositoryQuery $vendorQuery,
BillVendorFactory $vendorFactory,
Request $request
): Response
{
return $this->doEdit(
$entity,
$entityManager,
$request,
function(Entity $entity, Form $form, Request $request) use ($entityManager, $vendorQuery, $vendorFactory) {
$vendor = $form->get('vendor')->getData();
$customVendor = $form->get('customVendor')->getData();
if ($customVendor !== null) {
$customVendor = u($customVendor)->upper();
$vendor = $vendorQuery->create()
->where('.label = :label')
->setParameter(':label', $customVendor)
->findOne()
;
if ($vendor === null) {
$vendor = $vendorFactory->create($customVendor);
$entityManager->create($vendor);
}
}
$entity->setVendor($vendor);
}
);
}
#[Route(path: "/admin/bill/sort/{page}", name: "admin_bill_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(path: "/admin/bill/batch/{page}", name: "admin_bill_batch", methods: ['POST'], requirements: ['page' => '\d+'])]
public function batch(RepositoryQuery $query, EntityManager $entityManager, Request $request, Session $session, int $page = 1): Response
{
return $this->doBatch($page, $query, $entityManager, $request, $session);
}
#[Route(path: "/admin/bill/delete/{entity}", name: "admin_bill_delete", methods: ['DELETE', 'POST'])]
public function delete(Entity $entity, EntityManager $entityManager, Request $request): Response
{
return $this->doDelete($entity, $entityManager, $request);
}
protected function getConfiguration(): CrudConfiguration
{
return CrudConfiguration::create()
->setPageTitle('index', 'Factures')
->setPageTitle('edit', 'Facture #{id}')
->setPageTitle('new', 'Nouvelle facture')
->setPageTitle('show', 'Facture #{id}')
->setPageRoute('index', 'admin_bill_index')
->setPageRoute('new', 'admin_bill_new')
->setPageRoute('edit', 'admin_bill_edit')
->setPageRoute('show', 'admin_bill_show')
->setPageRoute('sort', 'admin_bill_sort')
->setPageRoute('batch', 'admin_bill_batch')
->setPageRoute('delete', 'admin_bill_delete')
->setPageRoute('filter', 'admin_bill_filter')
->setForm('edit', Type::class, [])
->setForm('new', Type::class)
->setForm('filter', FilterType::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)
->setView('form', 'admin/bill/_form.html.twig')
->setView('show_entity', 'admin/bill/_show.html.twig')
->setDefaultSort('index', 'id', 'desc')
->setField('index', 'ID', Field\TextField::class, [
'property_builder' => function (EntityInterface $entity) {
return sprintf('#%d', $entity->getId());
},
'sort' => ['id', '.id'],
])
->setField('index', 'Rérérence', Field\ButtonField::class, [
'property' => 'reference',
'button_tag' => 'span',
'button_attr' => ['style' => 'user-select: all'],
'sort' => ['reference', '.reference'],
])
->setField('index', 'Fournisseur', Field\ButtonField::class, [
'property' => 'vendor',
'button_tag' => 'span',
'button_attr' => ['style' => 'user-select: all'],
'sort' => ['vendor', '.vendor'],
])
->setField('index', 'Date', Field\DateField::class, [
'property' => 'date',
'sort' => ['date', '.date'],
'format' => 'd/m/Y',
])
->setField('index', 'Date limite de paiement', Field\DateField::class, [
'property' => 'paymentDeadlineDate',
'sort' => ['paymentDeadlineDate', '.paymentDeadlineDate'],
'format' => 'd/m/Y',
])
->setField('index', 'Montant TTC', Field\TextField::class, [
'property_builder' => function(EntityInterface $entity) {
if ($entity->getAmountTtc()) {
return sprintf('<span style="user-select: all">%01.2f</span> €', $entity->getAmountTtc());
}
},
'raw' => true,
'sort' => ['amountTtc', '.amountTtc'],
'attr' => ['class' => 'text-right'],
])
->setField('index', 'Montant HT', Field\TextField::class, [
'property_builder' => function(EntityInterface $entity) {
if ($entity->getAmountHt()) {
return sprintf('<span style="user-select: all">%01.2f</span> €', $entity->getAmountHt());
}
},
'raw' => true,
'sort' => ['amountHt', '.amountHt'],
'attr' => ['class' => 'text-right'],
])
->setField('index', 'Statut', Field\ButtonField::class, [
'property' => 'humanStatus',
'button_attr_builder' => function(EntityInterface $entity) {
$classes = [
0 => 'btn btn-sm btn-light',
1 => 'btn btn-sm btn-warning',
2 => 'btn btn-sm btn-success',
];
return ['class' => $classes[$entity->getStatus()]];
},
'sort' => ['status', '.status'],
])
// ->setBatchAction('index', 'delete', 'Delete', function(EntityInterface $entity, EntityManager $manager) {
// $manager->delete($entity);
// })
;
}
protected function getSection(): string
{
return 'bill';
}
}