refactored invoice and export screens (#1046)

This commit is contained in:
Kevin Papst
2019-08-22 18:56:21 +02:00
committed by GitHub
parent 405ea0076b
commit 46e5650882
55 changed files with 930 additions and 906 deletions

View File

@@ -22,14 +22,16 @@ use App\Repository\TimesheetRepository;
use App\Timesheet\UserDateTimeFactory;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\SubmitButton;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Controller used to manage invoices.
* Controller used to create invoices and manage invoice templates.
*
* @Route(path="/invoice")
* @Security("is_granted('view_invoice') or is_granted('view_invoice_template')")
* @Security("is_granted('view_invoice')")
*/
class InvoiceController extends AbstractController
{
@@ -58,26 +60,7 @@ class InvoiceController extends AbstractController
}
/**
* @return InvoiceQuery
* @throws \Exception
*/
protected function getDefaultQuery()
{
$begin = $this->dateTimeFactory->createDateTime('first day of this month');
$end = $this->dateTimeFactory->createDateTime('last day of this month');
$query = new InvoiceQuery();
$query->setOrder(InvoiceQuery::ORDER_ASC);
$query->setBegin($begin);
$query->setEnd($end);
$query->setState(InvoiceQuery::STATE_STOPPED);
$query->setCurrentUser($this->getUser());
return $query;
}
/**
* @Route(path="/", name="invoice", methods={"GET"})
* @Route(path="/", name="invoice", methods={"GET", "POST"})
* @Security("is_granted('view_invoice')")
*
* @param Request $request
@@ -87,9 +70,14 @@ class InvoiceController extends AbstractController
public function indexAction(Request $request, TimesheetRepository $repository)
{
if (!$this->invoiceRepository->hasTemplate()) {
return $this->redirectToRoute('admin_invoice_template_create');
if ($this->isGranted('manage_invoice_template')) {
return $this->redirectToRoute('admin_invoice_template_create');
}
$this->flashWarning('invoice.first_template');
}
$showPreview = false;
$maxItemsPreview = 500;
$entries = [];
$query = $this->getDefaultQuery();
@@ -97,8 +85,22 @@ class InvoiceController extends AbstractController
$form->setData($query);
$form->submit($request->query->all(), false);
if ($form->isValid()) {
$entries = $this->getEntries($query, $repository);
if ($this->isGranted('create_invoice')) {
if ($form->isValid()) {
/** @var SubmitButton $createButton */
$createButton = $form->get('create');
if ($createButton->isClicked()) {
return $this->renderInvoice($query, $repository);
}
/** @var SubmitButton $previewButton */
$previewButton = $form->get('preview');
if ($previewButton->isClicked()) {
$showPreview = true;
$query->setPageSize($maxItemsPreview);
$entries = $this->getEntries($query, $repository);
}
}
}
$model = $this->prepareModel($query, $entries);
@@ -106,34 +108,29 @@ class InvoiceController extends AbstractController
return $this->render('invoice/index.html.twig', [
'model' => $model,
'form' => $form->createView(),
'preview_max' => $maxItemsPreview,
'preview_show' => $showPreview,
]);
}
/**
* @Route(path="/print", name="invoice_print", methods={"POST"})
* @Security("is_granted('create_invoice')")
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Exception
*/
public function printAction(Request $request, TimesheetRepository $repository)
protected function getDefaultQuery(): InvoiceQuery
{
if (!$this->invoiceRepository->hasTemplate()) {
return $this->redirectToRoute('admin_invoice_template_create');
}
$begin = $this->dateTimeFactory->createDateTime('first day of this month');
$end = $this->dateTimeFactory->createDateTime('last day of this month');
$query = $this->getDefaultQuery();
$form = $this->getToolbarForm($query, 'POST');
$query = new InvoiceQuery();
$query->setOrder(InvoiceQuery::ORDER_ASC);
$query->setBegin($begin);
$query->setEnd($end);
$query->setExported(InvoiceQuery::STATE_NOT_EXPORTED);
$query->setState(InvoiceQuery::STATE_STOPPED);
$query->setCurrentUser($this->getUser());
$form->handleRequest($request);
return $query;
}
if (!$form->isSubmitted() || !$form->isValid()) {
return $this->redirectToRoute('invoice');
}
/** @var InvoiceQuery $query */
$query = $form->getData();
protected function renderInvoice(InvoiceQuery $query, TimesheetRepository $repository)
{
$entries = $this->getEntries($query, $repository);
$model = $this->prepareModel($query, $entries);
@@ -144,23 +141,28 @@ class InvoiceController extends AbstractController
foreach ($this->service->getRenderer() as $renderer) {
if ($renderer->supports($document)) {
return $renderer->render($document, $model);
$response = $renderer->render($document, $model);
if ($query->isMarkAsExported()) {
$repository->setExported($entries);
}
return $response;
}
}
$this->flashError('Cannot render invoice: ' . $model->getTemplate()->getRenderer() . ' (' . $document->getName() . ')');
$this->flashError(
sprintf('Cannot render invoice: %s (%s)', $model->getTemplate()->getRenderer(), $document->getName())
);
return $this->render('invoice/index.html.twig', [
'model' => $model,
'form' => $form->createView(),
]);
return $this->redirectToRoute('invoice');
}
/**
* @param InvoiceQuery $query
* @param TimesheetRepository $repository
* @return Timesheet[]
*/
protected function getEntries(InvoiceQuery $query, TimesheetRepository $repository)
protected function getEntries(InvoiceQuery $query, TimesheetRepository $repository): iterable
{
// customer needs to be defined, as we need the currency for the invoice
if (null === $query->getCustomer()) {
@@ -181,11 +183,11 @@ class InvoiceController extends AbstractController
/**
* @param InvoiceQuery $query
* @param array $entries
* @param Timesheet[] $entries
* @return InvoiceModel
* @throws \Exception
*/
protected function prepareModel(InvoiceQuery $query, array $entries)
protected function prepareModel(InvoiceQuery $query, array $entries): InvoiceModel
{
$model = new InvoiceModel();
$model
@@ -214,33 +216,23 @@ class InvoiceController extends AbstractController
}
/**
* @Route(path="/template", defaults={"page": 1}, name="admin_invoice_template", methods={"GET", "POST"})
* @Route(path="/template/page/{page}", requirements={"page": "[1-9]\d*"}, name="admin_invoice_template_paginated", methods={"GET", "POST"})
* @Security("is_granted('view_invoice_template')")
*
* @param int $page
* @return \Symfony\Component\HttpFoundation\Response
* @Route(path="/template", name="admin_invoice_template", methods={"GET", "POST"})
* @Security("is_granted('manage_invoice_template')")
*/
public function listTemplateAction($page)
public function listTemplateAction(): Response
{
$templates = $this->invoiceRepository->findByQuery(new BaseQuery());
return $this->render('invoice/templates.html.twig', [
'entries' => $templates,
'page' => $page,
]);
}
/**
* @Route(path="/template/{id}/edit", name="admin_invoice_template_edit", methods={"GET", "POST"})
* @Security("is_granted('edit', template)")
*
* @param InvoiceTemplate $template
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Exception
* @Security("is_granted('manage_invoice_template')")
*/
public function editTemplateAction(InvoiceTemplate $template, Request $request)
public function editTemplateAction(InvoiceTemplate $template, Request $request): Response
{
return $this->renderTemplateForm($template, $request);
}
@@ -248,14 +240,9 @@ class InvoiceController extends AbstractController
/**
* @Route(path="/template/create", name="admin_invoice_template_create", methods={"GET", "POST"})
* @Route(path="/template/create/{id}", name="admin_invoice_template_copy", methods={"GET", "POST"})
* @Security("is_granted('create_invoice_template')")
*
* @param Request $request
* @param InvoiceTemplate|null $copyFrom
* @return \Symfony\Component\HttpFoundation\Response
* @throws \Exception
* @Security("is_granted('manage_invoice_template')")
*/
public function createTemplateAction(Request $request, ?InvoiceTemplate $copyFrom)
public function createTemplateAction(Request $request, ?InvoiceTemplate $copyFrom): Response
{
if (!$this->invoiceRepository->hasTemplate()) {
$this->flashWarning('invoice.first_template');
@@ -281,16 +268,10 @@ class InvoiceController extends AbstractController
}
/**
* The route to delete an existing template.
*
* @Route(path="/template/{id}/delete", name="admin_invoice_template_delete", methods={"GET", "POST"})
* @Security("is_granted('delete', template)")
*
* @param InvoiceTemplate $template
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
* @Security("is_granted('manage_invoice_template')")
*/
public function deleteTemplate(InvoiceTemplate $template, Request $request)
public function deleteTemplate(InvoiceTemplate $template, Request $request): Response
{
try {
$this->invoiceRepository->removeTemplate($template);
@@ -299,15 +280,10 @@ class InvoiceController extends AbstractController
$this->flashError('action.delete.error', ['%reason%' => $ex->getMessage()]);
}
return $this->redirectToRoute('admin_invoice_template_paginated', ['page' => $request->get('page')]);
return $this->redirectToRoute('admin_invoice_template');
}
/**
* @param InvoiceTemplate $template
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
protected function renderTemplateForm(InvoiceTemplate $template, Request $request)
protected function renderTemplateForm(InvoiceTemplate $template, Request $request): Response
{
$editForm = $this->createEditForm($template);
@@ -341,11 +317,7 @@ class InvoiceController extends AbstractController
]);
}
/**
* @param InvoiceTemplate $template
* @return \Symfony\Component\Form\FormInterface
*/
private function createEditForm(InvoiceTemplate $template)
private function createEditForm(InvoiceTemplate $template): FormInterface
{
if ($template->getId() === null) {
$url = $this->generateUrl('admin_invoice_template_create');