diff --git a/app/Pdf/BillType.php b/app/Pdf/BillType.php index 8dc69efc..feaf1a2a 100644 --- a/app/Pdf/BillType.php +++ b/app/Pdf/BillType.php @@ -2,12 +2,14 @@ namespace App\Pdf; +use App\Payment\Payment; use Illuminate\Support\Collection; -class BillType implements PdfRepository +class BillType extends Repository implements PdfRepository { public string $filename; + public Collection $pages; public function __construct(Collection $pages) { @@ -41,4 +43,36 @@ class BillType implements PdfRepository return 'default'; } + public function getPositions(Collection $page): array + { + $memberIds = $page->pluck('id')->toArray(); + $payments = Payment::whereIn('member_id', $memberIds)->whereNeedsBill()->get(); + + return $payments->mapWithKeys(function (Payment $payment) { + $key = "Beitrag für {$payment->nr} ({$payment->subscription->name})"; + + return [$key => $this->number($payment->subscription->amount)]; + })->toArray(); + } + + public function getFamilyName(Collection $page): string + { + return $page->first()->lastname; + } + + public function getAddress(Collection $page): string + { + return $page->first()->address; + } + + public function getZip(Collection $page): string + { + return $page->first()->zip; + } + + public function getLocation(Collection $page): string + { + return $page->first()->location; + } + } diff --git a/app/Pdf/PdfRepository.php b/app/Pdf/PdfRepository.php index b9e2e3e4..c3ba4e4e 100644 --- a/app/Pdf/PdfRepository.php +++ b/app/Pdf/PdfRepository.php @@ -17,4 +17,14 @@ interface PdfRepository public function getTemplate(): string; + public function getPositions(Collection $page): array; + + public function getFamilyName(Collection $page): string; + + public function getAddress(Collection $page): string; + + public function getZip(Collection $page): string; + + public function getLocation(Collection $page): string; + } diff --git a/resources/views/tex/bill.tex b/resources/views/tex/bill.tex index ebf2e6a9..57532996 100644 --- a/resources/views/tex/bill.tex +++ b/resources/views/tex/bill.tex @@ -1,18 +1,21 @@ \documentclass[silvaletter,12pt]{scrlttr2} -\setkomavar{subject}{Rechnung} +\setkomavar{subject}{<<< $data->getSubject() >>>} \begin{document} -\begin{letter}{Familie Charnay\\Junkerstr 4\\42699 Solingen} +@foreach($data->pages as $page) +\begin{letter}{Familie <<< $data->getFamilyName($page) >>>\\<<< $data->getAddress($page) >>>\\<<< $data->getZip($page) >>> <<< $data->getLocation($page) >>>} \sffamily \gdef\TotalHT{0} - \opening{Liebe Familie Charnay,} + \opening{Liebe Familie <<< $data->getFamilyName($page) >>>,} Hiermit stellen wir Ihnen den aktuellen Mitgliedsbeitrag für den \usekomavar*{fromname} und die DPSG in Rechnung. Dieser setzt sich wie folgt zusammen: \begin{center} \begin{tabular}{@{}p{0.5\textwidth}|r} - \product{Beitrag FE 2021 für Noah Charnay (1. HJ)}{25.00} + @foreach($data->getPositions($page) as $desc => $price) + \product{<<< $desc >>>}{<<< $price >>>} + @endforeach \hline \textbf{Gesamt} & \textbf{\numprint[€]{\TotalHT}} \\ \end{tabular} @@ -33,6 +36,6 @@ \closing{Viele Grüße \\ Nils Montag $\cdot$ Kassenwart} \end{letter} - +@endforeach \end{document} diff --git a/tests/Feature/Pdf/GenerateTest.php b/tests/Feature/Pdf/GenerateTest.php index b0a9f69b..2edff6fa 100644 --- a/tests/Feature/Pdf/GenerateTest.php +++ b/tests/Feature/Pdf/GenerateTest.php @@ -50,12 +50,18 @@ class GenerateTest extends TestCase 'members' => [ [ 'factory' => fn (MemberFactory $member): MemberFactory => $member - ->state(['firstname' => '::firstname::', 'lastname' => '::lastname::']), + ->state([ + 'firstname' => '::firstname::', + 'lastname' => '::lastname::', + 'address' => '::street::', + 'zip' => '::zip::', + 'location' => '::location::', + ]), 'payments' => [ fn (PaymentFactory $payment): PaymentFactory => $payment ->notPaid() ->nr('1995') - ->subscription('::subName::', 1200), + ->subscription('::subName::', 1500), ], ], ], @@ -63,40 +69,15 @@ class GenerateTest extends TestCase 'type' => BillType::class, 'filename' => 'rechnung-fur-firstname-lastname.pdf', 'output' => [ - '12.00', - 'Familie ::lastname::', + 'Rechnung', + '15.00', + 'Beitrag für 1995 (::subName::)', + 'Familie ::lastname::\\\\::street::\\\\::zip:: ::location::', ], ], ]; } - /** @dataProvider generatorProvider */ - public function testItGeneratesAPdf( - array $members, - callable $urlCallable, - string $type, - ?string $filename = null, - ?array $output = null - ): void { - $this->withoutExceptionHandling(); - $this->login(); - $members = $this->setupMembers($members); - - $urlId = call_user_func($urlCallable, $members); - $response = $this->call('GET', "/member/{$urlId}/pdf", [ - 'type' => $type, - ]); - - if ($filename === null) { - $response->assertStatus(204); - - return; - } - - $this->assertEquals('application/pdf', $response->headers->get('content-type')); - $this->assertEquals('inline; filename="' . $filename . '"', $response->headers->get('content-disposition')); - } - /** @dataProvider generatorProvider */ public function testItGeneratesTheLayout( array $members, @@ -126,6 +107,33 @@ class GenerateTest extends TestCase } } + /** @dataProvider generatorProvider */ + public function testItGeneratesAPdf( + array $members, + callable $urlCallable, + string $type, + ?string $filename = null, + ?array $output = null + ): void { + $this->withoutExceptionHandling(); + $this->login(); + $members = $this->setupMembers($members); + + $urlId = call_user_func($urlCallable, $members); + $response = $this->call('GET', "/member/{$urlId}/pdf", [ + 'type' => $type, + ]); + + if ($filename === null) { + $response->assertStatus(204); + + return; + } + + $this->assertEquals('application/pdf', $response->headers->get('content-type')); + $this->assertEquals('inline; filename="' . $filename . '"', $response->headers->get('content-disposition')); + } + private function setupMembers(array $members): Collection { return collect($members)->map(function (array $member): Member {