adrema/app/Member/Data/MembershipData.php

81 lines
2.6 KiB
PHP

<?php
namespace App\Member\Data;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Spatie\LaravelData\Mappers\SnakeCaseMapper;
use Carbon\Carbon;
use App\Member\Membership;
use App\Member\Member;
use App\Activity;
#[MapInputName(SnakeCaseMapper::class)]
#[MapOutputName(SnakeCaseMapper::class)]
class MembershipData extends Data
{
public function __construct(
public int $id,
public ActivityData $activity,
public SubactivityData $subactivity,
public GroupData $group,
public Carbon $from,
public ?Carbon $promisedAt,
public bool $isActive,
) {}
public static function fromModel(Membership $membership)
{
return static::factory()->withoutMagicalCreation()->from([
'id' => $membership->id,
'activity' => $membership->activity,
'subactivity' => $membership->subactivity,
'is_active' => $membership->isActive(),
'from' => $membership->from,
'group' => $membership->group,
'promised_at' => $membership->promised_at,
]);
}
/**
* @return array<string, mixed>
*/
public function with(): array
{
return [
'human_date' => $this->from->format('d.m.Y'),
'promised_at_human' => $this->promisedAt?->format('d.m.Y'),
'promised_at' => $this->promisedAt?->format('Y-m-d'),
'links' => [
'update' => route('membership.update', ['membership' => $this->id]),
'destroy' => route('membership.destroy', ['membership' => $this->id]),
]
];
}
/**
* @return array<string, mixed>
*/
public static function memberMeta(Member $member): array
{
$activities = Activity::with('subactivities')->get();
return [
'links' => [
'store' => route('member.membership.store', ['member' => $member]),
],
'groups' => NestedGroup::cacheForSelect(),
'activities' => $activities->map(fn($activity) => ['id' => $activity->id, 'name' => $activity->name]),
'subactivities' => $activities->mapWithKeys(fn($activity) => [$activity->id => $activity->subactivities->map(fn($subactivity) => ['id' => $subactivity->id, 'name' => $subactivity->name, 'is_age_group' => $subactivity->is_age_group])]),
'default' => [
'group_id' => $member->group_id,
'activity_id' => null,
'subactivity_id' => null,
'promised_at' => null,
],
];
}
}