81 lines
2.6 KiB
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,
|
|
],
|
|
];
|
|
}
|
|
}
|