Skip to main content

Black Friday 2025! Only until December 1st: coupon FRIDAY25 for 40% off Yearly/Lifetime membership!

Read more here

archboard/tidal-ptc

4 stars
4 code files
View archboard/tidal-ptc on GitHub

app/Enums/UserType.php

Open in GitHub
use App\Enums\Traits\HasOptions;
use App\Exceptions\UnknownPersonaException;
use App\Models\Tenant;
use Illuminate\Support\Collection;
 
enum UserType: string
{
use HasOptions;
 
case staff = 'staff';
case guardian = 'guardian';
case student = 'student';
 
public function label(): string
{
return match ($this) {
self::staff => __('Staff'),
self::guardian => __('Contact'),
self::student => __('Student'),
};
}
 
public static function fromData(Collection $data): UserType
{
if ($persona = $data->get('persona', $data->get('usertype'))) {
return match ($persona) {
'student' => self::student,
'staff', 'teacher' => self::staff,
'guardian', 'parent' => self::guardian,
};
}
 
throw new UnknownPersonaException("Unknown persona type from data: {$data->toJson()}");
}
 
public function getSisKeyFromData(Collection $data): string
{
$tenant = Tenant::current();
$id = $data->get('usersDCID') ??
$data->get('ps_dcid') ??
$data->get('dcid');
 
return "{$tenant->id}|{$this->value}|{$id}";
}
 
public function getSisKeyFromSisId(string|int $sisId): string
{
$tenant = Tenant::current();
 
return "{$tenant->id}|{$this->value}|{$sisId}";
}
}

app/Models/User.php

Open in GitHub
use App\Enums\UserType;
 
class User extends Authenticatable implements ExistsInSis
{
// ...
 
protected $casts = [
'user_type' => UserType::class,
'is_24h' => 'boolean',
'can_book' => 'boolean',
'notification_config' => 'collection',
];
 
// ...
}

app/Enums/Traits/HasOptions.php

Open in GitHub
use Illuminate\Support\Collection;
 
trait HasOptions
{
public static function options(): array
{
return array_reduce(
static::cases(),
function (array $carry, $sis) {
$carry[$sis->value] = $sis->label();
 
return $carry;
},
[]
);
}
 
public static function collect(): Collection
{
return collect(static::cases());
}
 
public static function selectOptions(): array
{
return array_map(fn ($sis) => [
'label' => $sis->label(),
'value' => $sis->value,
], static::cases());
}
 
public function label(): string
{
return 'Default label';
}
}

app/Models/User.php

Open in GitHub
class User extends Authenticatable implements ExistsInSis
{
// ...
 
public function filters(): array
{
return [
TextFilter::make('search', __('Search'))
->hide()
->using(fn (Builder $builder, string $search) => $builder->search($search)),
TextFilter::make('first_name', __('First name')),
TextFilter::make('last_name', __('Last name')),
MultipleSelectFilter::make('user_type', __('User type'))
->options(UserType::options()),
MultipleSelectFilter::make('teacher', __('Teachers'))
->hide()
->using(fn (Builder $builder) => $builder
->whereHas('sections')
->orWhereHas('altSections')),
];
}
 
// ...
}

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.