From 98fc5fbf8b2e91138f7d68de4d59f7290ad6c894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Fri, 13 Oct 2023 14:48:55 +0200 Subject: [PATCH] Feat: Implement invoice pdf download for teamer --- assets/images/invoice_thumb.jpg | Bin 0 -> 42322 bytes config/services.yaml | 4 ++ .../Disposition/InvoicePdfController.php | 36 ++++++++++++++++++ src/Security/Voter/DispositionVoter.php | 13 +++++-- templates/teamer/disposition/detail.html.twig | 4 +- 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 assets/images/invoice_thumb.jpg create mode 100644 src/Controller/Teamer/Disposition/InvoicePdfController.php diff --git a/assets/images/invoice_thumb.jpg b/assets/images/invoice_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4aac49566ac5ca72986e799a8aa99a270d5e3e0 GIT binary patch literal 42322 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Ð%N+%=_ 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 literal 0 HcmV?d00001 diff --git a/config/services.yaml b/config/services.yaml index a40437b..8d46b37 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -109,3 +109,7 @@ services: App\Service\Pdf\ContractRenderer: arguments: $options: { 'project_dir': '%kernel.project_dir%' } + + App\Service\Pdf\InvoiceRenderer: + arguments: + $options: { 'project_dir': '%kernel.project_dir%' } diff --git a/src/Controller/Teamer/Disposition/InvoicePdfController.php b/src/Controller/Teamer/Disposition/InvoicePdfController.php new file mode 100644 index 0000000..10d29c3 --- /dev/null +++ b/src/Controller/Teamer/Disposition/InvoicePdfController.php @@ -0,0 +1,36 @@ +renderer->render($disposition); + + $teamer = $disposition->getTeamer(); + + $filename = sprintf('Honorarnote_%s_%s.pdf', $teamer, $disposition->getAssignment()->getDestination()); + $disposition = HeaderUtils::makeDisposition(HeaderUtils::DISPOSITION_ATTACHMENT, $filename, md5($filename)); + + $response = new Response($pdf->Output('S')); + $response->setPrivate(); + $response->headers->set('Content-type', 'application/pdf'); + $response->headers->set('Content-Disposition', $disposition); + + return $response; + } +} \ No newline at end of file diff --git a/src/Security/Voter/DispositionVoter.php b/src/Security/Voter/DispositionVoter.php index cc3dbeb..21cd1e9 100644 --- a/src/Security/Voter/DispositionVoter.php +++ b/src/Security/Voter/DispositionVoter.php @@ -13,6 +13,7 @@ class DispositionVoter extends Voter public const EDIT = 'EDIT'; public const DELETE = 'DELETE'; public const CONTRACT = 'CONTRACT'; + public const INVOICE = 'INVOICE'; protected function supports(string $attribute, mixed $subject): bool { @@ -20,7 +21,7 @@ class DispositionVoter extends Voter return false; } - return in_array($attribute, [static::VIEW, static::EDIT, static::DELETE, static::CONTRACT]); + return in_array($attribute, [static::VIEW, static::EDIT, static::DELETE, static::CONTRACT, static::INVOICE]); } protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool @@ -31,14 +32,20 @@ class DispositionVoter extends Voter } // Teamers may only view or edit their own dispositions - if (in_array('ROLE_TEAMER', $token->getRoleNames()) && in_array($attribute, [static::VIEW, static::EDIT, static::CONTRACT])) { + if (in_array('ROLE_TEAMER', $token->getRoleNames())) { /** @var User $user */ $user = $token->getUser(); $teamer = $user->getTeamer(); /** @var Disposition $disposition */ $disposition = $subject; - return $teamer === $disposition->getTeamer(); + switch ($attribute) { + case static::VIEW: + case static::EDIT: + case static::CONTRACT: + case static::INVOICE: + return $teamer === $disposition->getTeamer(); + } } return false; diff --git a/templates/teamer/disposition/detail.html.twig b/templates/teamer/disposition/detail.html.twig index e8ef6ae..771a018 100644 --- a/templates/teamer/disposition/detail.html.twig +++ b/templates/teamer/disposition/detail.html.twig @@ -68,8 +68,8 @@ Hier findest du deine Honorarnote