This commit is contained in:
philipp lang 2022-01-02 12:32:57 +01:00
parent 2920c57e69
commit ada4715a81
31 changed files with 107 additions and 73 deletions

View File

@ -5,6 +5,9 @@ namespace App\Course\Resources;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin \App\Course\Models\CourseMember
*/
class CourseResource extends JsonResource class CourseResource extends JsonResource
{ {
/** /**

View File

@ -11,7 +11,7 @@ class Handler extends ExceptionHandler
/** /**
* A list of the exception types that are not reported. * A list of the exception types that are not reported.
* *
* @var array * @var string[]
*/ */
protected $dontReport = [ protected $dontReport = [
// //
@ -20,7 +20,7 @@ class Handler extends ExceptionHandler
/** /**
* A list of the inputs that are never flashed for validation exceptions. * A list of the inputs that are never flashed for validation exceptions.
* *
* @var array * @var string[]
*/ */
protected $dontFlash = [ protected $dontFlash = [
'password', 'password',

View File

@ -15,7 +15,6 @@ class InertiaShareMiddleware
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param \Closure $next * @param \Closure $next
* @param GeneralSettings $settings
* @return mixed * @return mixed
*/ */
public function handle($request, Closure $next) public function handle($request, Closure $next)

View File

@ -30,10 +30,10 @@ class RedirectIfNotInitializedMiddleware
} }
public function shouldRedirect() { public function shouldRedirect() {
return !in_array(request()->route()->getName(), $this->dontRedirect) && auth()->check(); return !request()->routeIs($this->dontRedirect) && auth()->check();
} }
public function initialized() { public function initialized() {
return \App\Fee::get()->count() > 0; return \App\Fee::count() > 0;
} }
} }

View File

@ -5,6 +5,9 @@ namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use Storage; use Storage;
/**
* @mixin \Zoomyboy\LaravelNami\NamiUser
*/
class UserResource extends JsonResource class UserResource extends JsonResource
{ {
/** /**

View File

@ -12,7 +12,8 @@ use Illuminate\Http\Request;
class HomeView { class HomeView {
public function index(Request $request) { public function index(Request $request) {
$amount = Payment::whereNeedsPayment()->selectRaw('sum(subscriptions.amount) AS a')->join('subscriptions', 'subscriptions.id', 'payments.subscription_id')->first()->a; /** @var object{a: string} */
$amount = Payment::whereNeedsPayment()->selectRaw('sum(subscriptions.amount) AS a')->join('subscriptions', 'subscriptions.id', 'payments.subscription_id')->first();
$members = Member::whereHasPendingPayment()->count(); $members = Member::whereHasPendingPayment()->count();
return [ return [
@ -20,7 +21,7 @@ class HomeView {
'payments' => [ 'payments' => [
'users' => $members, 'users' => $members,
'all_users' => Member::count(), 'all_users' => Member::count(),
'amount' => number_format($amount / 100, 2, ',', '.').' €' 'amount' => number_format($amount->a / 100, 2, ',', '.').' €'
], ],
'groups' => Member::select('subactivities.slug', 'subactivities.name')->selectRaw('COUNT(members.id) AS count')->join('memberships', 'memberships.member_id', 'members.id') 'groups' => Member::select('subactivities.slug', 'subactivities.name')->selectRaw('COUNT(members.id) AS count')->join('memberships', 'memberships.member_id', 'members.id')
->join('activities', 'memberships.activity_id', 'activities.id') ->join('activities', 'memberships.activity_id', 'activities.id')

View File

@ -5,6 +5,9 @@ namespace App\Http\Views;
use App\Member\MemberResource; use App\Member\MemberResource;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin \App\Member\Member
*/
class MemberTriesResource extends MemberResource class MemberTriesResource extends MemberResource
{ {
/** /**

View File

@ -61,8 +61,8 @@ class MemberView {
private function additional($member, $overwrites = []) { private function additional($member, $overwrites = []) {
return (new MemberResource($member->load('payments'))) return (new MemberResource($member->load('payments')))
->additional(array_merge([ ->additional(array_merge([
'subscriptions' => Subscription::get()->pluck('name', 'id'), 'subscriptions' => Subscription::pluck('name', 'id'),
'statuses' => Status::get()->pluck('name', 'id'), 'statuses' => Status::pluck('name', 'id'),
], $overwrites)); ], $overwrites));
} }

View File

@ -35,7 +35,7 @@ class InitializeActivities {
$groups = []; $groups = [];
$this->api->subactivitiesOf($activity->nami_id)->each(function($group) use ($activity, &$groups) { $this->api->subactivitiesOf($activity->nami_id)->each(function($group) use (&$groups) {
$group = \App\Subactivity::updateOrCreate(['nami_id' => $group->id], [ $group = \App\Subactivity::updateOrCreate(['nami_id' => $group->id], [
'nami_id' => $group->id, 'nami_id' => $group->id,
'name' => $group->name, 'name' => $group->name,

View File

@ -9,8 +9,8 @@ use Zoomyboy\LaravelNami\NamiUser;
class InitializeCourses { class InitializeCourses {
private Progress $bar;
private Api $api; private Api $api;
private Progress $bar;
public function __construct(Progress $bar, Api $api) { public function __construct(Progress $bar, Api $api) {
$this->bar = $bar; $this->bar = $bar;
@ -19,8 +19,10 @@ class InitializeCourses {
public function handle(NamiUser $user): void public function handle(NamiUser $user): void
{ {
$this->bar->task('Synchronisiere Kurse', function() {
$this->api->courses()->each(function($course) { $this->api->courses()->each(function($course) {
Course::create(['nami_id' => $course->id, 'name' => $course->name]); Course::create(['nami_id' => $course->id, 'name' => $course->name]);
}); });
});
} }
} }

View File

@ -47,7 +47,6 @@ class InitializeMembers {
$m = Member::create([ $m = Member::create([
'firstname' => $member->firstname, 'firstname' => $member->firstname,
'lastname' => $member->lastname, 'lastname' => $member->lastname,
'nickname' => $member->nickname,
'joined_at' => $member->joined_at, 'joined_at' => $member->joined_at,
'birthday' => $member->birthday, 'birthday' => $member->birthday,
'send_newspaper' => $member->send_newspaper, 'send_newspaper' => $member->send_newspaper,

View File

@ -37,13 +37,12 @@ class CreateJob implements ShouldQueue
$this->member = Member::find($this->memberId); $this->member = Member::find($this->memberId);
if ($this->member->hasNami) { if ($this->member->hasNami) {
return false; return;
} }
$response = $this->user->api()->putMember([ $response = $this->user->api()->putMember([
'firstname' => $this->member->firstname, 'firstname' => $this->member->firstname,
'lastname' => $this->member->lastname, 'lastname' => $this->member->lastname,
'nickname' => $this->member->nickname,
'joined_at' => $this->member->joined_at, 'joined_at' => $this->member->joined_at,
'birthday' => $this->member->birthday, 'birthday' => $this->member->birthday,
'send_newspaper' => $this->member->send_newspaper, 'send_newspaper' => $this->member->send_newspaper,

View File

@ -2,13 +2,13 @@
namespace App\Member; namespace App\Member;
use App\Confession;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Zoomyboy\LaravelNami\Nami; use Zoomyboy\LaravelNami\Nami;
use App\Confession;
class DeleteJob implements ShouldQueue class DeleteJob implements ShouldQueue
{ {
@ -34,7 +34,7 @@ class DeleteJob implements ShouldQueue
$this->member = Member::find($this->memberId); $this->member = Member::find($this->memberId);
if (!$this->member->hasNami) { if (!$this->member->hasNami) {
return false; return;
} }
Nami::login($this->user->mglnr)->deleteMember($this->member->nami_id); Nami::login($this->user->mglnr)->deleteMember($this->member->nami_id);

View File

@ -22,6 +22,13 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Zoomyboy\LaravelNami\Api; use Zoomyboy\LaravelNami\Api;
/**
* @property string $subscription_name
* @property int $pending_payment
* @property bool $is_confirmed
* @property string $age_group_icon
* @property \Carbon\Carbon $try_created_at
*/
class Member extends Model class Member extends Model
{ {
use Notifiable; use Notifiable;

View File

@ -46,7 +46,7 @@ class MemberController extends Controller
['href' => route('sendpayment.create'), 'label' => 'Rechnungen versenden', 'color' => 'info', 'icon' => 'envelope', 'show' => $settings->hasModule('bill')], ['href' => route('sendpayment.create'), 'label' => 'Rechnungen versenden', 'color' => 'info', 'icon' => 'envelope', 'show' => $settings->hasModule('bill')],
]; ];
$payload['query'] = $query; $payload['query'] = $query;
$payload['billKinds'] = BillKind::get()->pluck('name', 'id'); $payload['billKinds'] = BillKind::pluck('name', 'id');
return \Inertia::render('member/Index', $payload); return \Inertia::render('member/Index', $payload);
} }
@ -60,15 +60,15 @@ class MemberController extends Controller
return \Inertia::render('member/Form', [ return \Inertia::render('member/Form', [
'activities' => $activities->pluck('name', 'id'), 'activities' => $activities->pluck('name', 'id'),
'subactivities' => $activities->map(function(Activity $activity) { 'subactivities' => $activities->map(function(Activity $activity) {
return ['subactivities' => $activity->subactivities->pluck('name', 'id'), 'id' => $activity->id]; return ['subactivities' => $activity->subactivities()->pluck('name', 'id'), 'id' => $activity->id];
})->pluck('subactivities', 'id'), })->pluck('subactivities', 'id'),
'billKinds' => BillKind::get()->pluck('name', 'id'), 'billKinds' => BillKind::pluck('name', 'id'),
'genders' => Gender::get()->pluck('name', 'id'), 'genders' => Gender::pluck('name', 'id'),
'countries' => Country::get()->pluck('name', 'id'), 'countries' => Country::pluck('name', 'id'),
'regions' => Region::where('is_null', false)->get()->pluck('name', 'id'), 'regions' => Region::where('is_null', false)->pluck('name', 'id'),
'nationalities' => Nationality::get()->pluck('name', 'id'), 'nationalities' => Nationality::pluck('name', 'id'),
'confessions' => Confession::where('is_null', false)->get()->pluck('name', 'id'), 'confessions' => Confession::where('is_null', false)->pluck('name', 'id'),
'subscriptions' => Subscription::get()->pluck('name', 'id'), 'subscriptions' => Subscription::pluck('name', 'id'),
'data' => [ 'data' => [
'country_id' => Country::default() 'country_id' => Country::default()
], ],
@ -93,13 +93,13 @@ class MemberController extends Controller
'subactivities' => $activities->map(function($activity) { 'subactivities' => $activities->map(function($activity) {
return ['subactivities' => $activity->subactivities->pluck('name', 'id'), 'id' => $activity->id]; return ['subactivities' => $activity->subactivities->pluck('name', 'id'), 'id' => $activity->id];
})->pluck('subactivities', 'id'), })->pluck('subactivities', 'id'),
'billKinds' => BillKind::get()->pluck('name', 'id'), 'billKinds' => BillKind::pluck('name', 'id'),
'genders' => Gender::get()->pluck('name', 'id'), 'genders' => Gender::pluck('name', 'id'),
'countries' => Country::get()->pluck('name', 'id'), 'countries' => Country::pluck('name', 'id'),
'regions' => Region::where('is_null', false)->get()->pluck('name', 'id'), 'regions' => Region::where('is_null', false)->pluck('name', 'id'),
'nationalities' => Nationality::get()->pluck('name', 'id'), 'nationalities' => Nationality::pluck('name', 'id'),
'confessions' => Confession::where('is_null', false)->get()->pluck('name', 'id'), 'confessions' => Confession::where('is_null', false)->pluck('name', 'id'),
'subscriptions' => Subscription::get()->pluck('name', 'id'), 'subscriptions' => Subscription::pluck('name', 'id'),
'data' => new MemberResource($member), 'data' => new MemberResource($member),
'mode' => 'edit', 'mode' => 'edit',
]); ]);

View File

@ -2,13 +2,13 @@
namespace App\Member; namespace App\Member;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use App\Group;
use Illuminate\Support\Str;
use App\Activity; use App\Activity;
use App\Group;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class MemberRequest extends FormRequest class MemberRequest extends FormRequest
{ {

View File

@ -7,6 +7,9 @@ use App\Membership\MembershipResource;
use App\Payment\PaymentResource; use App\Payment\PaymentResource;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin \App\Member\Member
*/
class MemberResource extends JsonResource class MemberResource extends JsonResource
{ {
/** /**

View File

@ -2,13 +2,13 @@
namespace App\Member; namespace App\Member;
use App\Confession;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Zoomyboy\LaravelNami\Nami; use Zoomyboy\LaravelNami\Nami;
use App\Confession;
class UpdateJob implements ShouldQueue class UpdateJob implements ShouldQueue
{ {
@ -34,13 +34,12 @@ class UpdateJob implements ShouldQueue
$this->member = Member::find($this->memberId); $this->member = Member::find($this->memberId);
if (!$this->member->hasNami) { if (!$this->member->hasNami) {
return false; return;
} }
$response = Nami::login($this->user->mglnr)->putMember([ $response = Nami::login($this->user->mglnr)->putMember([
'firstname' => $this->member->firstname, 'firstname' => $this->member->firstname,
'lastname' => $this->member->lastname, 'lastname' => $this->member->lastname,
'nickname' => $this->member->nickname,
'joined_at' => $this->member->joined_at, 'joined_at' => $this->member->joined_at,
'birthday' => $this->member->birthday, 'birthday' => $this->member->birthday,
'send_newspaper' => $this->member->send_newspaper, 'send_newspaper' => $this->member->send_newspaper,

View File

@ -4,6 +4,9 @@ namespace App\Membership;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin \App\Member\Membership
*/
class MembershipResource extends JsonResource class MembershipResource extends JsonResource
{ {
/** /**

View File

@ -14,7 +14,7 @@ class PaymentController extends Controller
session()->put('menu', 'member'); session()->put('menu', 'member');
session()->put('title', "Zahlungen für Mitglied {$member->fullname}"); session()->put('title', "Zahlungen für Mitglied {$member->fullname}");
$payload = app(MemberView::class)->index($request); $payload = app(MemberView::class)->index($request, []);
$payload['single'] = app(MemberView::class)->paymentIndex($member); $payload['single'] = app(MemberView::class)->paymentIndex($member);
return \Inertia::render('member/Index', $payload); return \Inertia::render('member/Index', $payload);
@ -34,7 +34,7 @@ class PaymentController extends Controller
session()->put('menu', 'member'); session()->put('menu', 'member');
session()->put('title', "Zahlungen für Mitglied {$member->fullname}"); session()->put('title', "Zahlungen für Mitglied {$member->fullname}");
$payload = app(MemberView::class)->index($request); $payload = app(MemberView::class)->index($request, []);
$payload['single'] = app(MemberView::class)->paymentEdit($member, $payment); $payload['single'] = app(MemberView::class)->paymentEdit($member, $payment);
return \Inertia::render('member/Index', $payload); return \Inertia::render('member/Index', $payload);

View File

@ -4,6 +4,9 @@ namespace App\Payment;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin Payment
*/
class PaymentResource extends JsonResource class PaymentResource extends JsonResource
{ {
/** /**

View File

@ -44,6 +44,8 @@ class PaymentSendCommand extends Command
{ {
$this->sendBills(); $this->sendBills();
$this->sendRemembers(); $this->sendRemembers();
return 0;
} }
private function sendBills(): void private function sendBills(): void

View File

@ -21,7 +21,8 @@ class Status extends Model
return static::where('is_bill', true)->where('is_remember', true)->first()->id; return static::where('is_bill', true)->where('is_remember', true)->first()->id;
} }
public function isAccepted() { public function isAccepted(): bool
{
return $this->is_bill === false && $this->is_remember === false; return $this->is_bill === false && $this->is_remember === false;
} }

View File

@ -2,9 +2,10 @@
namespace App\Payment; namespace App\Payment;
use App\Fee;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use App\Fee; use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Subscription extends Model class Subscription extends Model
{ {
@ -12,7 +13,7 @@ class Subscription extends Model
public $fillable = ['name', 'amount', 'fee_id']; public $fillable = ['name', 'amount', 'fee_id'];
public function fee() { public function fee(): BelongsTo {
return $this->belongsTo(Fee::class); return $this->belongsTo(Fee::class);
} }
} }

View File

@ -2,9 +2,9 @@
namespace App\Payment; namespace App\Payment;
use App\Fee;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Fee;
class SubscriptionController extends Controller class SubscriptionController extends Controller
{ {
@ -23,7 +23,7 @@ class SubscriptionController extends Controller
session()->put('title', 'Beitrag erstellen'); session()->put('title', 'Beitrag erstellen');
return \Inertia::render('subscription/Form', [ return \Inertia::render('subscription/Form', [
'fees' => Fee::get()->pluck('name', 'id'), 'fees' => Fee::pluck('name', 'id'),
'mode' => 'create', 'mode' => 'create',
'data' => (object) [] 'data' => (object) []
]); ]);
@ -44,7 +44,7 @@ class SubscriptionController extends Controller
session()->put('title', "Beitrag {$subscription->name} bearbeiten"); session()->put('title', "Beitrag {$subscription->name} bearbeiten");
return \Inertia::render('subscription/Form', [ return \Inertia::render('subscription/Form', [
'fees' => Fee::get()->pluck('name', 'id'), 'fees' => Fee::pluck('name', 'id'),
'mode' => 'edit', 'mode' => 'edit',
'data' => new SubscriptionResource($subscription), 'data' => new SubscriptionResource($subscription),
]); ]);

View File

@ -4,6 +4,9 @@ namespace App\Payment;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
/**
* @mixin Subscription
*/
class SubscriptionResource extends JsonResource class SubscriptionResource extends JsonResource
{ {
/** /**

View File

@ -10,12 +10,6 @@ class BillType extends Repository implements PdfRepository
{ {
public string $filename; public string $filename;
public Collection $pages;
public function __construct(Collection $pages)
{
$this->pages = $pages;
}
public function getPayments(Member $member): Collection public function getPayments(Member $member): Collection
{ {

View File

@ -5,6 +5,7 @@ namespace App\Pdf;
use App\Member\Member; use App\Member\Member;
use App\Payment\Payment; use App\Payment\Payment;
use Carbon\Carbon; use Carbon\Carbon;
use Generator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
interface PdfRepository interface PdfRepository
@ -50,4 +51,6 @@ interface PdfRepository
public function getMailSubject(): string; public function getMailSubject(): string;
public function allPayments(): Generator;
} }

View File

@ -10,12 +10,6 @@ class RememberType extends Repository implements PdfRepository
{ {
public string $filename; public string $filename;
public Collection $pages;
public function __construct(Collection $pages)
{
$this->pages = $pages;
}
public function getPayments(Member $member): Collection public function getPayments(Member $member): Collection
{ {

View File

@ -5,10 +5,20 @@ namespace App\Pdf;
use App\Member\Member; use App\Member\Member;
use Carbon\Carbon; use Carbon\Carbon;
use Generator; use Generator;
use Illuminate\Support\Collection;
abstract class Repository abstract class Repository
{ {
abstract public function getPayments(Member $member): Collection;
public Collection $pages;
public function __construct(Collection $pages)
{
$this->pages = $pages;
}
public function number(int $number): string public function number(int $number): string
{ {
return number_format($number / 100, 2, '.', ''); return number_format($number / 100, 2, '.', '');

View File

@ -10,6 +10,8 @@ parameters:
level: 5 level: 5
ignoreErrors: ignoreErrors:
- '#Unsafe usage of new static#' - '#Call to an undefined method Illuminate\\Contracts\\Auth\\Authenticatable::api\(\)#'
- '#Call to an undefined method Illuminate\\Contracts\\Auth\\Authenticatable::getNamiGroupId\(\)#'
- '#Illuminate\\Contracts\\Auth\\Authenticatable\|null given#'
checkMissingIterableValueType: false checkMissingIterableValueType: false