Skip to content

Commit

Permalink
add mass print func
Browse files Browse the repository at this point in the history
  • Loading branch information
Thiritin committed Sep 12, 2024
1 parent db5f120 commit 15b1856
Show file tree
Hide file tree
Showing 10 changed files with 225 additions and 8 deletions.
138 changes: 138 additions & 0 deletions app/Filament/Resources/BadgeResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

namespace App\Filament\Resources;

use App\Filament\Resources\BadgeResource\Pages;
use App\Jobs\Printing\PrintBadgeJob;
use App\Models\Badge\Badge;
use App\Models\Badge\States\BadgeStatusState;
use App\Models\Badge\States\Pending;
use App\Models\Badge\States\PickedUp;
use App\Models\Badge\States\Printed;
use App\Models\Badge\States\ReadyForPickup;
use App\Models\Fursuit\States\FursuitStatusState;
use App\Models\Machine;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Support\Collection;

class BadgeResource extends Resource
{
protected static ?string $model = Badge::class;

protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';

public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('fursuit_id')
->label('Fursuit')
->disabled()
->relationship('fursuit', 'name')
->required(),
// Status
Forms\Components\Select::make('status')
->label('Status')
->options(BadgeStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [$key => ucfirst($key)]))
->required(),
Forms\Components\Group::make([
// Total
Forms\Components\TextInput::make('total')
->label('Total'),
// Tax
Forms\Components\TextInput::make('tax')
->label('Tax')
->disabled(),
// Subtotal
Forms\Components\TextInput::make('subtotal')
->label('Sub-Total')
->disabled(),
])->columnSpanFull()->columns(3)
]);
}

public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('fursuit.user.attendee_id')
->sortable()
->label('Fursuit'),
Tables\Columns\TextColumn::make('fursuit.name')
->label('Fursuit'),
Tables\Columns\TextColumn::make('status')->badge()->colors([
Pending::$name => 'default',
Printed::$name => 'success',
ReadyForPickup::$name => 'success',
PickedUp::$name => 'warning',
]),
])
->filters([
Tables\Filters\SelectFilter::make('status')
->options(BadgeStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [ucfirst($key) => $key]))
->label('Badge Status'),
Tables\Filters\SelectFilter::make('fursuit_status')
->options(FursuitStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [$key => ucfirst($key)]))
->query(function (Builder $query, array $data) {
$query->when($data, fn($query, $data) => $query->whereHas('fursuit', function (Builder $query) use ($data) {
$query->where('status', $data);
}));
})
->label('Fursuit Status'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\Action::make('printBadge')
->color('warning')
->icon('heroicon-o-printer')
->requiresConfirmation(true)
->label('Print Badge')
->action(function (Badge $record) {
return static::printBadge($record);
}),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
Tables\Actions\BulkAction::make('printBadgeBulk')
->label('Print Badge')
->requiresConfirmation()
->action(fn(Collection $records) => $records->each(fn(Badge $record) => static::printBadge($record))),
])
->selectCurrentPageOnly()
->paginationPageOptions([10, 25, 50, 100])
->defaultSort('fursuit.user.attendee_id', 'asc');
}

public static function printBadge(Badge $badge)
{
if ($badge->status !== Printed::class && $badge->status->canTransitionTo(Printed::class)) {
$badge->status->transitionTo(Printed::class);
}
PrintBadgeJob::dispatch($badge, Machine::first());
return $badge;
}

public static function getRelations(): array
{
return [
//
];
}

public static function getPages(): array
{
return [
'index' => Pages\ListBadges::route('/'),
'create' => Pages\CreateBadge::route('/create'),
'edit' => Pages\EditBadge::route('/{record}/edit'),
];
}
}
12 changes: 12 additions & 0 deletions app/Filament/Resources/BadgeResource/Pages/CreateBadge.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace App\Filament\Resources\BadgeResource\Pages;

use App\Filament\Resources\BadgeResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;

class CreateBadge extends CreateRecord
{
protected static string $resource = BadgeResource::class;
}
19 changes: 19 additions & 0 deletions app/Filament/Resources/BadgeResource/Pages/EditBadge.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace App\Filament\Resources\BadgeResource\Pages;

use App\Filament\Resources\BadgeResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;

class EditBadge extends EditRecord
{
protected static string $resource = BadgeResource::class;

protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}
19 changes: 19 additions & 0 deletions app/Filament/Resources/BadgeResource/Pages/ListBadges.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace App\Filament\Resources\BadgeResource\Pages;

use App\Filament\Resources\BadgeResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;

class ListBadges extends ListRecords
{
protected static string $resource = BadgeResource::class;

protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}
4 changes: 4 additions & 0 deletions app/Jobs/Printing/PrintBadgeJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Enum\PrintJobStatusEnum;
use App\Enum\PrintJobTypeEnum;
use App\Models\Badge\Badge;
use App\Models\Badge\States\Printed;
use App\Models\Machine;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
Expand All @@ -24,6 +25,9 @@ public function __construct(private readonly Badge $badge, private Machine $mach

public function handle(): void
{
if($this->badge->status !== Printed::class && $this->badge->status->canTransitionTo(Printed::class)) {
$this->badge->status->transitionTo(Printed::class);
}
$printer = new EF28_Badge();
$pdfContent = $printer->getPdf($this->badge);
// Store PDF Content in PrintJobs Storage
Expand Down
18 changes: 18 additions & 0 deletions app/Observers/BadgeObserver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace App\Observers;

use App\Models\Badge\Badge;

class BadgeObserver
{
public function updated(Badge $badge): void
{
// Based on tax_rate, calculate tax and update subtotal
if ($badge->isDirty('total')) {
$badge->subtotal = round($badge->total / 1.19,);
$badge->tax = round($badge->total - $badge->subtotal);
$badge->save();
}
}
}
17 changes: 11 additions & 6 deletions app/Policies/BadgePolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ public function view(User $user, Badge $badge): bool

public function create(User $user): bool
{
// Admin can override
if ($user->is_admin && request()->routeIs('filament.*')) {
return true;
}

// Do not allow ordering badges if there is no active event
$event = \App\Models\Event::getActiveEvent();
if ($event === null) {
return false;
}

// Admin can override
if ($user->is_admin && request()->routeIs('filament.*')) {
return true;
}

// Safety check if in CLOSED OR LATE return false
if ($event->state === \App\Enum\EventStateEnum::CLOSED || $event->state === \App\Enum\EventStateEnum::COUNTDOWN) {
return false;
Expand All @@ -49,11 +49,16 @@ public function create(User $user): bool

public function update(User $user, Badge $badge): bool
{
$event = \App\Models\Event::getActiveEvent();
// Copies cannot be edited
if ($badge->extra_copy_of !== null) {
return false;
}
// Admin can override
if ($user->is_admin && request()->routeIs('filament.*')) {
return true;
}

$event = \App\Models\Event::getActiveEvent();
return $this->delete($user, $badge);
}

Expand Down
2 changes: 2 additions & 0 deletions app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Providers;

use App\Models\Badge\Badge;
use App\Models\Fursuit\Fursuit;
use App\Providers\Socialite\SocialiteIdentityProvider;
use Illuminate\Support\Facades\Http;
Expand All @@ -25,6 +26,7 @@ public function register(): void
public function boot(): void
{
Fursuit::observe(\App\Observers\FursuitObserver::class);
Badge::observe(\App\Observers\BadgeObserver::class);
$socialite = $this->app->make(Factory::class);
$socialite->extend('identity', function () use ($socialite) {
$config = config('services.identity');
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ services:
- '${APP_PORT:-80}:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=swoole --watch --host=0.0.0.0 --port=80"
# SUPERVISOR_PHP_COMMAND: "/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan octane:start --server=swoole --watch --host=0.0.0.0 --port=80"
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 15b1856

Please sign in to comment.