Skip to content

Commit 0d14710

Browse files
committed
add pos
1 parent 0ecb669 commit 0d14710

41 files changed

Lines changed: 3172 additions & 215 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/Filament/Resources/BadgeResource.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,13 @@ public static function table(Table $table): Table
6868
->sortable()
6969
->searchable()
7070
->label('Custom ID'),
71-
Tables\Columns\TextColumn::make('fursuit.user.attendee_id')
71+
Tables\Columns\TextColumn::make('attendee_id')
7272
->sortable()
7373
->searchable()
74-
->label('Attendee ID'),
74+
->label('Attendee ID')
75+
->getStateUsing(function (Badge $record) {
76+
return $record->fursuit->user->eventUser()?->attendee_id ?? 'N/A';
77+
}),
7578
Tables\Columns\TextColumn::make('fursuit.name')
7679
->searchable()
7780
->label('Fursuit'),
@@ -121,7 +124,7 @@ public static function table(Table $table): Table
121124
])
122125
->selectCurrentPageOnly()
123126
->paginationPageOptions([10, 25, 50, 100])
124-
->defaultSort('fursuit.user.attendee_id', 'asc');
127+
->defaultSort('custom_id', 'asc');
125128
}
126129

127130
public static function printBadge(Badge $badge, $mass = 0): Badge
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace App\Filament\Resources;
4+
5+
use App\Filament\Resources\StaffResource\Pages;
6+
use App\Filament\Resources\StaffResource\RelationManagers;
7+
use App\Models\Staff;
8+
use Filament\Forms;
9+
use Filament\Forms\Form;
10+
use Filament\Resources\Resource;
11+
use Filament\Tables;
12+
use Filament\Tables\Table;
13+
14+
class StaffResource extends Resource
15+
{
16+
protected static ?string $model = Staff::class;
17+
18+
protected static ?string $navigationIcon = 'heroicon-o-users';
19+
20+
protected static ?string $navigationGroup = 'POS';
21+
22+
protected static ?int $navigationSort = 1;
23+
24+
public static function form(Form $form): Form
25+
{
26+
return $form
27+
->schema([
28+
Forms\Components\TextInput::make('name')
29+
->required()
30+
->maxLength(255),
31+
Forms\Components\TextInput::make('pin_code')
32+
->required()
33+
->numeric()
34+
->length(6)
35+
->label('PIN Code (6 digits)')
36+
->helperText('Enter a 6-digit PIN code for staff authentication'),
37+
Forms\Components\Toggle::make('is_active')
38+
->default(true)
39+
->label('Active')
40+
->helperText('Inactive staff cannot login to POS'),
41+
]);
42+
}
43+
44+
public static function table(Table $table): Table
45+
{
46+
return $table
47+
->columns([
48+
Tables\Columns\TextColumn::make('name')
49+
->searchable()
50+
->sortable(),
51+
Tables\Columns\TextColumn::make('pin_code')
52+
->label('PIN Code')
53+
->toggleable(isToggledHiddenByDefault: true),
54+
Tables\Columns\IconColumn::make('is_active')
55+
->boolean()
56+
->label('Active'),
57+
Tables\Columns\TextColumn::make('rfid_tags_count')
58+
->counts('rfidTags')
59+
->label('RFID Tags'),
60+
Tables\Columns\TextColumn::make('last_login_at')
61+
->dateTime()
62+
->sortable()
63+
->label('Last Login')
64+
->since(),
65+
Tables\Columns\TextColumn::make('created_at')
66+
->dateTime()
67+
->sortable()
68+
->toggleable(isToggledHiddenByDefault: true),
69+
])
70+
->filters([
71+
Tables\Filters\TernaryFilter::make('is_active')
72+
->label('Active Status'),
73+
])
74+
->actions([
75+
Tables\Actions\EditAction::make(),
76+
Tables\Actions\DeleteAction::make(),
77+
])
78+
->bulkActions([
79+
Tables\Actions\BulkActionGroup::make([
80+
Tables\Actions\DeleteBulkAction::make(),
81+
]),
82+
]);
83+
}
84+
85+
public static function getRelations(): array
86+
{
87+
return [
88+
RelationManagers\RfidTagsRelationManager::class,
89+
];
90+
}
91+
92+
public static function getPages(): array
93+
{
94+
return [
95+
'index' => Pages\ListStaff::route('/'),
96+
'create' => Pages\CreateStaff::route('/create'),
97+
'edit' => Pages\EditStaff::route('/{record}/edit'),
98+
];
99+
}
100+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\StaffResource\Pages;
4+
5+
use App\Filament\Resources\StaffResource;
6+
use Filament\Actions;
7+
use Filament\Resources\Pages\CreateRecord;
8+
9+
class CreateStaff extends CreateRecord
10+
{
11+
protected static string $resource = StaffResource::class;
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\StaffResource\Pages;
4+
5+
use App\Filament\Resources\StaffResource;
6+
use Filament\Actions;
7+
use Filament\Resources\Pages\EditRecord;
8+
9+
class EditStaff extends EditRecord
10+
{
11+
protected static string $resource = StaffResource::class;
12+
13+
protected function getHeaderActions(): array
14+
{
15+
return [
16+
Actions\DeleteAction::make(),
17+
];
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\StaffResource\Pages;
4+
5+
use App\Filament\Resources\StaffResource;
6+
use Filament\Actions;
7+
use Filament\Resources\Pages\ListRecords;
8+
9+
class ListStaff extends ListRecords
10+
{
11+
protected static string $resource = StaffResource::class;
12+
13+
protected function getHeaderActions(): array
14+
{
15+
return [
16+
Actions\CreateAction::make(),
17+
];
18+
}
19+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\StaffResource\RelationManagers;
4+
5+
use Filament\Forms;
6+
use Filament\Forms\Form;
7+
use Filament\Resources\RelationManagers\RelationManager;
8+
use Filament\Tables;
9+
use Filament\Tables\Table;
10+
use Illuminate\Database\Eloquent\Builder;
11+
use Illuminate\Database\Eloquent\SoftDeletingScope;
12+
13+
class RfidTagsRelationManager extends RelationManager
14+
{
15+
protected static string $relationship = 'rfidTags';
16+
17+
public function form(Form $form): Form
18+
{
19+
return $form
20+
->schema([
21+
Forms\Components\TextInput::make('content')
22+
->required()
23+
->unique(ignoreRecord: true)
24+
->maxLength(255)
25+
->label('RFID Code')
26+
->helperText('The unique identifier from the RFID tag'),
27+
Forms\Components\TextInput::make('name')
28+
->maxLength(255)
29+
->label('Tag Name (Optional)')
30+
->helperText('A friendly name for this RFID tag'),
31+
Forms\Components\Toggle::make('is_active')
32+
->default(true)
33+
->label('Active')
34+
->helperText('Inactive tags cannot be used for authentication'),
35+
]);
36+
}
37+
38+
public function table(Table $table): Table
39+
{
40+
return $table
41+
->recordTitleAttribute('content')
42+
->columns([
43+
Tables\Columns\TextColumn::make('content')
44+
->label('RFID Code')
45+
->searchable()
46+
->copyable(),
47+
Tables\Columns\TextColumn::make('name')
48+
->label('Tag Name')
49+
->searchable()
50+
->placeholder('No name set'),
51+
Tables\Columns\IconColumn::make('is_active')
52+
->boolean()
53+
->label('Active'),
54+
Tables\Columns\TextColumn::make('last_login_at')
55+
->dateTime()
56+
->sortable()
57+
->label('Last Used')
58+
->since()
59+
->placeholder('Never used'),
60+
Tables\Columns\TextColumn::make('created_at')
61+
->dateTime()
62+
->sortable()
63+
->label('Added')
64+
->since(),
65+
])
66+
->filters([
67+
Tables\Filters\TernaryFilter::make('is_active')
68+
->label('Active Status'),
69+
])
70+
->headerActions([
71+
Tables\Actions\CreateAction::make(),
72+
])
73+
->actions([
74+
Tables\Actions\EditAction::make(),
75+
Tables\Actions\DeleteAction::make(),
76+
])
77+
->bulkActions([
78+
Tables\Actions\BulkActionGroup::make([
79+
Tables\Actions\DeleteBulkAction::make(),
80+
]),
81+
]);
82+
}
83+
}

app/Filament/Resources/UserResource.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ public static function form(Form $form): Form
3737
->required(),
3838
Forms\Components\Toggle::make('is_admin')
3939
->required(),
40-
Forms\Components\Toggle::make('is_cashier')
41-
->required(),
42-
// pin_code 6 digits
43-
Forms\Components\TextInput::make('pin_code')
44-
->minLength(6)
45-
->maxLength(6),
4640

4741
]);
4842
}

app/Http/Controllers/BadgeController.php

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ public function index(Request $request)
5959
'badgeCount' => $badges->count(),
6060
'unpickedBadges' => $unpickedBadges,
6161
'canCreate' => Gate::allows('create', Badge::class),
62-
'hasFreeBadge' => $user->hasFreeBadge(),
63-
'freeBadgeCopies' => $user->free_badge_copies,
6462
'prepaidBadges' => $prepaidBadges,
6563
'prepaidBadgesLeft' => $prepaidBadgesLeft,
6664
'event' => $activeEvent ? [
@@ -84,8 +82,6 @@ public function create(Request $request)
8482

8583
return Inertia::render('Badges/BadgeForm', [
8684
'species' => Species::has('fursuits', count: 5)->orWhere('checked', true)->get('name'),
87-
'isFree' => $user->hasFreeBadge(),
88-
'freeBadgeCopies' => $user->hasFreeBadge() ? $user->free_badge_copies : 0,
8985
'prepaidBadgesLeft' => $prepaidBadgesLeft,
9086
]);
9187
}
@@ -134,12 +130,11 @@ public function store(BadgeCreateRequest $request)
134130
// prepaidBadges is now a max limit, not decremented
135131
$prepaidBadgesLeft = max(0, $prepaidBadges - $orderedBadges);
136132

137-
$isFreeBadge = $request->user()->hasFreeBadge();
138133
$isPrepaidBadge = $prepaidBadgesLeft > 0;
139134

140-
// Returns in cents
135+
// Returns in cents - all badges cost 2€ unless prepaid
141136
$total = BadgeCalculationService::calculate(
142-
isFreeBadge: $isFreeBadge || $isPrepaidBadge,
137+
isFreeBadge: $isPrepaidBadge, // Use prepaid logic for "free" calculation
143138
isLate: false, // No late fees in new system
144139
);
145140

@@ -155,43 +150,15 @@ public function store(BadgeCreateRequest $request)
155150
'tax' => round($tax),
156151
'total' => round($total),
157152
'dual_side_print' => true,
158-
'is_free_badge' => $isFreeBadge || $isPrepaidBadge,
153+
'is_free_badge' => $isPrepaidBadge,
159154
'apply_late_fee' => false, // No late fees in new system
160155
'paid_at' => $total === 0 ? now() : null,
161156
]);
162157
// Pay for Badge (force pay as we allow negative balance)
163158
$request->user()->forcePay($badge);
164159

165-
// No longer decrement prepaid_badges, just use as max limit
166-
167-
if ($isFreeBadge) {
168-
$eventUser = $request->user()->eventUser($event->id);
169-
$freeBadgeCopies = $eventUser ? $eventUser->free_badge_copies : 0;
170-
171-
$total = BadgeCalculationService::calculate(isSpareCopy: true);
172-
for ($i = 0; $i < $freeBadgeCopies; $i++) {
173-
$clone = $badge->replicate();
174-
$clone->is_free_badge = false;
175-
$clone->extra_copy = true;
176-
$clone->total = round($total);
177-
$clone->subtotal = round($total / 1.19);
178-
$clone->tax = round($clone->total - $clone->subtotal);
179-
$clone->extra_copy_of = $badge->id;
180-
$clone->save();
181-
$request->user()->forcePay($clone->fresh());
182-
}
183-
$request->user()->wallet->deposit($total * $freeBadgeCopies, ['title' => 'Fuirsuit Badge', 'description' => 'Already paid with the EF registration system']);
184-
185-
// No longer update prepaid_badges to 0
186-
187-
// Mark fursuitbadge as created
188-
\Illuminate\Support\Facades\Http::attsrv()
189-
->withToken($request->user()->token)
190-
->post('/attendees/'.$eventUser->attendee_id.'/additional-info/fursuitbadge', [
191-
'created' => true,
192-
]);
193-
194-
} elseif ($validated['upgrades']['spareCopy']) {
160+
// Handle spare copy if requested
161+
if ($validated['upgrades']['spareCopy']) {
195162
$total = BadgeCalculationService::calculate(isSpareCopy: true);
196163
$clone = $badge->replicate();
197164
$clone->is_free_badge = false;

0 commit comments

Comments
 (0)