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;
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\Bill\BillKind;
use App\Confession;
use App\Country;
use App\Gender;
use App\Group;
use App\Payment\Subscription;
use App\Http\Controllers\Controller;
use App\Http\Views\MemberView;
use App\Member\DeleteJob;
use App\Nationality;
use App\Payment\Subscription;
use App\Region;
use Illuminate\Http\Request;
use Inertia\Response;
class MemberController extends Controller
@ -27,7 +27,8 @@ class MemberController extends Controller
$payload = app(MemberView::class)->index($request);
$payload['toolbar'] = [
['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);

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)}";
}
public function allLabel(): string
{
return 'Rechnungen versenden';
}
}

View File

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

View File

@ -3,6 +3,7 @@
namespace App\Pdf;
use App\Member\Member;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
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
{
$members = Member::where($member->only(['lastname', 'address', 'zip', 'location']))
@ -43,6 +55,15 @@ class PdfRepositoryFactory
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
{
return new $kind($members);

View File

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

View File

@ -17,7 +17,7 @@
<div class="flex">
<span class="text-xl font-semibold text-white leading-none" v-html="$page.props.title"></span>
<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>
</inertia-link>
</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\Payment\AllpaymentController;
use App\Payment\PaymentController;
use App\Payment\SendpaymentController;
use App\Payment\SubscriptionController;
use App\Pdf\MemberPdfController;
Route::group(['namespace' => 'App\\Http\\Controllers'], function() {
Route::group(['namespace' => 'App\\Http\\Controllers'], function(): void {
Auth::routes(['register' => false]);
});
Route::group(['middleware' => 'auth:web'], function () {
Route::group(['middleware' => 'auth:web'], function (): void {
Route::get('/', HomeController::class)->name('home');
Route::resource('initialize', InitializeController::class);
Route::resource('member', MemberController::class);
@ -23,5 +24,6 @@ Route::group(['middleware' => 'auth:web'], function () {
Route::post('/member/{member}/confirm', MemberConfirmController::class);
Route::get('/member/{member}/pdf', MemberPdfController::class)
->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,
red: colors.red,
blue: {
100: colors.blue[100],
300: colors.blue[300],
500: colors.blue[500],
700: colors.blue[700],
},