Add create all payment pdf

This commit is contained in:
philipp lang 2021-07-17 18:46:02 +02:00
parent 21bb6aadf6
commit 78a05ec82a
11 changed files with 121 additions and 16 deletions

View File

@ -2,19 +2,19 @@
namespace App\Member; namespace App\Member;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Gender;
use App\Region;
use App\Country;
use App\Nationality;
use App\Confession;
use App\Bill\BillKind;
use App\Activity; use App\Activity;
use App\Bill\BillKind;
use App\Confession;
use App\Country;
use App\Gender;
use App\Group; use App\Group;
use App\Payment\Subscription; use App\Http\Controllers\Controller;
use App\Http\Views\MemberView; use App\Http\Views\MemberView;
use App\Member\DeleteJob; use App\Member\DeleteJob;
use App\Nationality;
use App\Payment\Subscription;
use App\Region;
use Illuminate\Http\Request;
use Inertia\Response; use Inertia\Response;
class MemberController extends Controller class MemberController extends Controller
@ -27,7 +27,8 @@ class MemberController extends Controller
$payload = app(MemberView::class)->index($request); $payload = app(MemberView::class)->index($request);
$payload['toolbar'] = [ $payload['toolbar'] = [
['href' => route('member.create'), 'label' => 'Mitglied anlegen', 'color' => 'primary', 'icon' => 'plus'], ['href' => route('member.create'), 'label' => 'Mitglied anlegen', 'color' => 'primary', 'icon' => 'plus'],
['href' => route('allpayment.create'), 'label' => 'Rechnungen erstellen', 'color' => 'primary', 'icon' => 'plus'] ['href' => route('allpayment.create'), 'label' => 'Rechnungen erstellen', 'color' => 'primary', 'icon' => 'plus'],
['href' => route('sendpayment.create'), 'label' => 'Rechnungen versenden', 'color' => 'info', 'icon' => 'envelope'],
]; ];
return \Inertia::render('member/Index', $payload); return \Inertia::render('member/Index', $payload);

View File

@ -22,4 +22,16 @@ class ActionFactory
}); });
} }
public function allLinks(): Collection
{
return app(PdfRepositoryFactory::class)->getTypes()->map(function(string $repo) {
$repo = app($repo);
return [
'href' => route('sendpayment.pdf', ['type' => get_class($repo)]),
'label' => $repo->allLabel(),
];
});
}
} }

View File

@ -0,0 +1,34 @@
<?php
namespace App\Payment;
use App\Http\Controllers\Controller;
use App\Pdf\PdfGenerator;
use App\Pdf\PdfRepositoryFactory;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response as InertiaResponse;
class SendpaymentController extends Controller
{
public function create(): InertiaResponse
{
session()->put('menu', 'member');
session()->put('title', 'Rechnungen versenden');
return Inertia::render('sendpayment/Form', [
'links' => app(ActionFactory::class)->allLinks(),
]);
}
public function send(Request $request)
{
$repo = app(PdfRepositoryFactory::class)->forAll($request->type);
return $repo === null
? response()->noContent()
: app(PdfGenerator::class)->setRepository($repo)->render();
}
}

View File

@ -92,4 +92,9 @@ class BillType extends Repository implements PdfRepository
return "Mitgliedsbeitrag für {$this->getFamilyName($page)}"; return "Mitgliedsbeitrag für {$this->getFamilyName($page)}";
} }
public function allLabel(): string
{
return 'Rechnungen versenden';
}
} }

View File

@ -37,4 +37,6 @@ interface PdfRepository
public function getUsage(Collection $page): string; public function getUsage(Collection $page): string;
public function allLabel(): string;
} }

View File

@ -3,6 +3,7 @@
namespace App\Pdf; namespace App\Pdf;
use App\Member\Member; use App\Member\Member;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@ -34,6 +35,17 @@ class PdfRepositoryFactory
); );
} }
public function forAll(string $type): ?PdfRepository
{
$members = $this->allMemberCollection($type);
if ($members->isEmpty()) {
return null;
}
return $this->resolve($type, $members)->setFilename('alle-rechnungen');
}
public function singleMemberCollection(Member $member, string $type): Collection public function singleMemberCollection(Member $member, string $type): Collection
{ {
$members = Member::where($member->only(['lastname', 'address', 'zip', 'location'])) $members = Member::where($member->only(['lastname', 'address', 'zip', 'location']))
@ -43,6 +55,15 @@ class PdfRepositoryFactory
return $this->toMemberGroup($members); return $this->toMemberGroup($members);
} }
public function allMemberCollection(string $type): Collection
{
$members = Member::whereHas('billKind', fn (Builder $q) => $q->where('name', 'Post'))
->get()
->filter(fn (Member $member) => app($type)->createable($member));
return $this->toMemberGroup($members);
}
private function resolve(string $kind, Collection $members): PdfRepository private function resolve(string $kind, Collection $members): PdfRepository
{ {
return new $kind($members); return new $kind($members);

View File

@ -26,9 +26,9 @@
} }
} }
&.btn-info { &.btn-info {
@apply bg-blue-700; @apply bg-blue-700 text-blue-300;
&:not(.disabled):hover { &:not(.disabled):hover {
@apply bg-blue-500; @apply bg-blue-500 text-blue-100;
} }
} }
&.btn-danger { &.btn-danger {

View File

@ -17,7 +17,7 @@
<div class="flex"> <div class="flex">
<span class="text-xl font-semibold text-white leading-none" v-html="$page.props.title"></span> <span class="text-xl font-semibold text-white leading-none" v-html="$page.props.title"></span>
<div class="flex ml-4"> <div class="flex ml-4">
<inertia-link v-for="link, index in $page.props.toolbar" :key="index" :href="link.href" v-text="link.label" class="btn label btn-primary mr-2" :class="link.color"> <inertia-link v-for="link, index in $page.props.toolbar" :key="index" :href="link.href" v-text="link.label" class="btn label mr-2" :class="`btn-${link.color}`">
<sprite :src="link.icon"></sprite> <sprite :src="link.icon"></sprite>
</inertia-link> </inertia-link>
</div> </div>

View File

@ -0,0 +1,26 @@
<template>
<div class="p-6">
<a :href="link.href" target="_BLANK" v-for="link in links" class="btn btn-primary" v-text="link.label"></a>
</div>
</template>
<script>
export default {
data: function() {
return {
inner: {},
};
},
props: {
links: {}
},
methods: {
submit() {
this.$inertia.post(`/allpayment`, this.inner)
}
}
};
</script>

View File

@ -6,14 +6,15 @@ use App\Member\MemberConfirmController;
use App\Member\MemberController; use App\Member\MemberController;
use App\Payment\AllpaymentController; use App\Payment\AllpaymentController;
use App\Payment\PaymentController; use App\Payment\PaymentController;
use App\Payment\SendpaymentController;
use App\Payment\SubscriptionController; use App\Payment\SubscriptionController;
use App\Pdf\MemberPdfController; use App\Pdf\MemberPdfController;
Route::group(['namespace' => 'App\\Http\\Controllers'], function() { Route::group(['namespace' => 'App\\Http\\Controllers'], function(): void {
Auth::routes(['register' => false]); Auth::routes(['register' => false]);
}); });
Route::group(['middleware' => 'auth:web'], function () { Route::group(['middleware' => 'auth:web'], function (): void {
Route::get('/', HomeController::class)->name('home'); Route::get('/', HomeController::class)->name('home');
Route::resource('initialize', InitializeController::class); Route::resource('initialize', InitializeController::class);
Route::resource('member', MemberController::class); Route::resource('member', MemberController::class);
@ -23,5 +24,6 @@ Route::group(['middleware' => 'auth:web'], function () {
Route::post('/member/{member}/confirm', MemberConfirmController::class); Route::post('/member/{member}/confirm', MemberConfirmController::class);
Route::get('/member/{member}/pdf', MemberPdfController::class) Route::get('/member/{member}/pdf', MemberPdfController::class)
->name('member.singlepdf'); ->name('member.singlepdf');
Route::get('/sendpayment', [SendpaymentController::class, 'create'])->name('sendpayment.create');
Route::get('/sendpayment/pdf', [SendpaymentController::class, 'send'])->name('sendpayment.pdf');
}); });

2
tailwind.config.js vendored
View File

@ -29,6 +29,8 @@ module.exports = {
white: colors.white, white: colors.white,
red: colors.red, red: colors.red,
blue: { blue: {
100: colors.blue[100],
300: colors.blue[300],
500: colors.blue[500], 500: colors.blue[500],
700: colors.blue[700], 700: colors.blue[700],
}, },