Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/Console/Commands/BadgesPrintCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace App\Console\Commands;

use App\Models\Badge\Badge;
use App\Models\Badge\States\Printed;
use App\Models\Badge\State_Fulfillment\Printed;
use Illuminate\Console\Command;

class BadgesPrintCommand extends Command
Expand All @@ -16,7 +16,7 @@ public function handle(): void
{
// Prints all badges
Badge::whereNull('printed_at')->update([
'status' => Printed::$name,
'status_fulfillment' => Printed::$name,
'printed_at' => now(),
]);
}
Expand Down
4 changes: 2 additions & 2 deletions app/Console/Commands/BadgesUnprintCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace App\Console\Commands;

use App\Models\Badge\Badge;
use App\Models\Badge\States\Pending;
use App\Models\Badge\State_Fulfillment\Pending;
use Illuminate\Console\Command;

class BadgesUnprintCommand extends Command
Expand All @@ -16,7 +16,7 @@ public function handle(): void
{
// Unprint all badges
Badge::whereNotNull('printed_at')->update([
'status' => Pending::$name,
'status_fulfillment' => Pending::$name,
'printed_at' => null,
]);
}
Expand Down
11 changes: 5 additions & 6 deletions app/Domain/Checkout/Models/Checkout/States/Active.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@

namespace App\Domain\Checkout\Models\Checkout\States;

use App\Models\Badge\States\BadgeStatusState;

class Active extends CheckoutStatusState
{
public static string $name = 'ACTIVE';
public function color(): string
{
// TODO: Implement color() method.
}
public static string $name = 'ACTIVE';
public function color(): string
{
// TODO: Implement color() method.
}
}
12 changes: 5 additions & 7 deletions app/Domain/Checkout/Models/Checkout/States/Cancelled.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@

namespace App\Domain\Checkout\Models\Checkout\States;

use App\Models\Badge\States\BadgeStatusState;

class Cancelled extends CheckoutStatusState
{
public static string $name = 'CANCELLED';
public function color(): string
{
// TODO: Implement color() method.
}
public static string $name = 'CANCELLED';
public function color(): string
{
// TODO: Implement color() method.
}
}
12 changes: 5 additions & 7 deletions app/Domain/Checkout/Models/Checkout/States/Finished.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@

namespace App\Domain\Checkout\Models\Checkout\States;

use App\Models\Badge\States\BadgeStatusState;

class Finished extends CheckoutStatusState
{
public static string $name = 'FINISHED';
public function color(): string
{
// TODO: Implement color() method.
}
public static string $name = 'FINISHED';
public function color(): string
{
// TODO: Implement color() method.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
use App\Domain\Checkout\Models\Checkout\States\Cancelled;
use App\Domain\Checkout\Models\Checkout\States\Finished;
use App\Domain\Checkout\Services\FiskalyService;
use App\Models\Badge\States\ReadyForPickup;
use App\Models\Badge\State_Fulfillment\ReadyForPickup;
use App\Models\Badge\State_Payment\Paid;
use Illuminate\Support\Facades\DB;
use Spatie\ModelStates\Transition;

Expand All @@ -26,8 +27,8 @@ public function handle()
$fiskalyService->updateOrCreateTransaction($this->checkout);

$this->checkout->items->each(function ($item) {
if ($item->payable->status->canTransitionTo(ReadyForPickup::class)) {
$item->payable->status->transitionTo(ReadyForPickup::class);
if ($item->payable->status_payment->canTransitionTo(Paid::class)) {
$item->payable->status_payment->transitionTo(Paid::class);
}
});

Expand Down
48 changes: 31 additions & 17 deletions app/Filament/Resources/BadgeResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
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\Badge\State_Fulfillment\BadgeFulfillmentStatusState;
use App\Models\Badge\State_Fulfillment\Pending;
use App\Models\Badge\State_Fulfillment\PickedUp;
use App\Models\Badge\State_Fulfillment\Printed;
use App\Models\Badge\State_Fulfillment\ReadyForPickup;
use App\Models\Badge\State_Payment\BadgePaymentStatusState;
use App\Models\Badge\State_Payment\Paid;
use App\Models\Badge\State_Payment\Unpaid;
use App\Models\Fursuit\States\FursuitStatusState;
use App\Models\Machine;
use Filament\Forms;
Expand Down Expand Up @@ -37,9 +40,13 @@ public static function form(Form $form): Form
->relationship('fursuit', 'name')
->required(),
// Status
Forms\Components\Select::make('status')
->label('Status')
->options(BadgeStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [$key => ucfirst($key)]))
Forms\Components\Select::make('status_fulfillment')
->label('status_fulfillment')
->options(BadgeFulfillmentStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [$key => ucfirst($key)]))
->required(),
Forms\Components\Select::make('status_payment')
->label('status_payment')
->options(BadgePaymentStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [$key => ucfirst($key)]))
->required(),
Forms\Components\Group::make([
// Total
Expand All @@ -64,25 +71,32 @@ public static function table(Table $table): Table
Tables\Columns\TextColumn::make('custom_id')
->sortable()
->searchable()
->label('Fursuit'),
->label('Custom ID'),
Tables\Columns\TextColumn::make('fursuit.user.attendee_id')
->sortable()
->searchable()
->label('Fursuit'),
->label('Attendee ID'),
Tables\Columns\TextColumn::make('fursuit.name')
->searchable()
->label('Fursuit'),
Tables\Columns\TextColumn::make('status')->badge()->colors([
Tables\Columns\TextColumn::make('status_fulfillment')->badge()->colors([
Pending::$name => 'default',
Printed::$name => 'success',
ReadyForPickup::$name => 'success',
PickedUp::$name => 'warning',
]),
Tables\Columns\TextColumn::make('status_payment')->badge()->colors([
Unpaid::$name => 'warning',
Paid::$name => 'success',
]),
])
->filters([
Tables\Filters\SelectFilter::make('status')
->options(BadgeStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [ucfirst($key) => $key]))
->label('Badge Status'),
Tables\Filters\SelectFilter::make('status_fulfillment')
->options(BadgeFulfillmentStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [ucfirst($key) => $key]))
->label('Badge Fulfillment Status'),
Tables\Filters\SelectFilter::make('status_payment')
->options(BadgePaymentStatusState::getStateMapping()->keys()->mapWithKeys(fn($key) => [ucfirst($key) => $key]))
->label('Badge Payment Status'),
// Duplex Bool Filter
Tables\Filters\TernaryFilter::make('dual_side_print')
->label('Double Sided'),
Expand Down Expand Up @@ -114,10 +128,10 @@ public static function table(Table $table): Table
->defaultSort('fursuit.user.attendee_id', 'asc');
}

public static function printBadge(Badge $badge,$mass = 0): Badge
public static function printBadge(Badge $badge, $mass = 0): Badge
{
if ($badge->status !== Printed::class && $badge->status->canTransitionTo(Printed::class)) {
$badge->status->transitionTo(Printed::class);
if ($badge->status_fulfillment->canTransitionTo(Printed::class)) {
$badge->status_fulfillment->transitionTo(Printed::class);
}
// Add delay for mass printing so they are generated in order
PrintBadgeJob::dispatch($badge)->delay(now()->addSeconds($mass * 15));
Expand Down
19 changes: 12 additions & 7 deletions app/Http/Controllers/BadgeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
use App\Http\Requests\BadgeCreateRequest;
use App\Http\Requests\BadgeUpdateRequest;
use App\Models\Badge\Badge;
use App\Models\Badge\State_Payment\Paid;
use App\Models\Badge\State_Payment\Unpaid;
use App\Models\Event;
use App\Models\Fursuit\States\Pending;
use App\Models\Species;
use App\Models\User;
use App\Notifications\BadgeCreatedNotification;
use App\Notifications\FursuitApprovedNotification;
use App\Services\BadgeCalculationService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
Expand Down Expand Up @@ -56,7 +56,7 @@ public function store(BadgeCreateRequest $request)
$validated = $request->validated();
// Create Fursuit
$fursuit = $request->user()->fursuits()->create([
'status' => Pending::$name,
'status' => \App\Models\Fursuit\States\Pending::$name,
'event_id' => $event->id,
'species_id' => Species::firstOrCreate([
'name' => $validated['species'],
Expand All @@ -80,18 +80,20 @@ public function store(BadgeCreateRequest $request)
);

// Tax is 19% in Germany
$subtotal = round($total / 1.19,);
$subtotal = round($total / 1.19, );
$tax = round($total - $subtotal);

$badge = $fursuit->badges()->create([
'status' => \App\Models\Badge\States\Pending::$name,
'status_fulfillment' => \App\Models\Badge\State_Fulfillment\Pending::$name,
'status_payment' => $total === 0 ? Paid::$name : Unpaid::class,
'subtotal' => round($subtotal),
'tax_rate' => 0.19,
'tax' => round($tax),
'total' => round($total),
'dual_side_print' => true,
'is_free_badge' => $isFreeBadge,
'apply_late_fee' => $event->preorder_ends_at->isPast(),
'paid_at' => $total === 0 ? now() : null,
]);
// Pay for Badge (force pay as we allow negative balance)
$request->user()->forcePay($badge);
Expand All @@ -105,9 +107,12 @@ public function store(BadgeCreateRequest $request)
$clone->subtotal = round($total / 1.19);
$clone->tax = round($clone->total - $clone->subtotal);
$clone->extra_copy_of = $badge->id;
$clone->status_payment = Unpaid::class;
$clone->paid_at = null; // Spare copies are not paid immediately
$clone->save();
$request->user()->forcePay($clone->fresh());
}

return $badge;
});

Expand Down Expand Up @@ -158,7 +163,7 @@ public function update(BadgeUpdateRequest $request, Badge $badge)
}
// if species_id, name or image changed, status goes back to pending review
if ($fursuit->isDirty(['species_id', 'name', 'image'])) {
$fursuit->status = Pending::$name;
$fursuit->status = \App\Models\Badge\State_Fulfillment\Pending::$name;
}
$fursuit->save();
/**
Expand All @@ -169,7 +174,7 @@ public function update(BadgeUpdateRequest $request, Badge $badge)
isFreeBadge: $badge->is_free_badge,
isLate: $badge->apply_late_fee,
);
if($previousTotal !== $total) {
if ($previousTotal !== $total) {
$badge->fursuit->user->refund($badge);
}
$badge->total = round($total);
Expand Down
16 changes: 8 additions & 8 deletions app/Http/Controllers/POS/BadgeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

use App\Http\Controllers\Controller;
use App\Models\Badge\Badge;
use App\Models\Badge\States\PickedUp;
use App\Models\Badge\States\ReadyForPickup;
use App\Models\Badge\State_Fulfillment\PickedUp;
use App\Models\Badge\State_Fulfillment\ReadyForPickup;
use Illuminate\Http\Request;
use function Symfony\Component\String\b;

Expand All @@ -17,8 +17,8 @@ public function handoutBulk(Request $request)
$badgeIds = $request->input('badge_ids');
$badges = Badge::whereIn('id', $badgeIds)->get();
$badges->each(function ($badge) {
if($badge->status->canTransitionTo(PickedUp::class)) {
$badge->status->transitionTo(PickedUp::class);
if($badge->status_fulfillment->canTransitionTo(PickedUp::class)) {
$badge->status_fulfillment->transitionTo(PickedUp::class);
} else {
$someError = true;
}
Expand All @@ -30,8 +30,8 @@ public function handoutBulk(Request $request)
}
public function handout(Badge $badge)
{
if($badge->status->canTransitionTo(PickedUp::class)) {
$badge->status->transitionTo(PickedUp::class);
if($badge->status_fulfillment->canTransitionTo(PickedUp::class)) {
$badge->status_fulfillment->transitionTo(PickedUp::class);
return back()->with('success', 'Badge handed out');
} else {
return back()->with('error', 'Badge cannot be handed out');
Expand All @@ -40,8 +40,8 @@ public function handout(Badge $badge)

public function handoutUndo(Badge $badge)
{
if($badge->status->canTransitionTo(ReadyForPickup::class)) {
$badge->status->transitionTo(ReadyForPickup::class);
if($badge->status_fulfillment->canTransitionTo(ReadyForPickup::class)) {
$badge->status_fulfillment->transitionTo(ReadyForPickup::class);
return back()->with('success', 'Badge handout undone');
}
return back()->with('error', 'Badge handout cannot be undone');
Expand Down
5 changes: 3 additions & 2 deletions app/Http/Controllers/POS/CheckoutController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use App\Domain\Checkout\Services\FiskalyService;
use App\Http\Controllers\Controller;
use App\Models\Badge\Badge;
use App\Models\Badge\State_Payment\Unpaid;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
Expand Down Expand Up @@ -63,12 +64,12 @@ public function store(Request $request)
if (empty($data['badge_ids'])) {
$data['badge_ids'] = Badge::whereHas('fursuit.user', function ($query) use ($data) {
$query->where('id', $data['user_id']);
})->where('status', 'unpaid')->pluck('id')->toArray();
})->where('status_payment', Unpaid::$name)->pluck('id')->toArray();
} else {

$data['badge_ids'] = Badge::whereHas('fursuit.user', function ($query) use ($data) {
$query->where('id', $data['user_id']);
})->where('status', 'unpaid')
})->where('status_payment', Unpaid::$name)
->whereIn('id', $data['badge_ids'])
->pluck('id')->toArray();
}
Expand Down
12 changes: 4 additions & 8 deletions app/Http/Controllers/POS/Printing/PrintBadgeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,19 @@

namespace App\Http\Controllers\POS\Printing;

use App\Badges\EF28_Badge;
use App\Enum\PrintJobStatusEnum;
use App\Enum\PrintJobTypeEnum;

use App\Http\Controllers\Controller;
use App\Jobs\Printing\PrintBadgeJob;
use App\Models\Badge\Badge;
use App\Models\Badge\States\Printed;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Models\Badge\State_Fulfillment\Printed;

class PrintBadgeController extends Controller
{
public function __invoke(Badge $badge)
{
PrintBadgeJob::dispatch($badge);
if($badge->status !== Printed::class && $badge->status->canTransitionTo(Printed::class)) {
$badge->status->transitionTo(Printed::class);
if($badge->status_fulfillment->canTransitionTo(Printed::class)) {
$badge->status_fulfillment->transitionTo(Printed::class);
}
// dispatch print job
return redirect()->back()->with('success', 'Badge has been added to the print queue');
Expand Down
6 changes: 3 additions & 3 deletions app/Jobs/Printing/PrintBadgeJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use App\Enum\PrintJobStatusEnum;
use App\Enum\PrintJobTypeEnum;
use App\Models\Badge\Badge;
use App\Models\Badge\States\Printed;
use App\Models\Badge\State_Fulfillment\Printed;
use App\Models\Machine;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
Expand All @@ -26,8 +26,8 @@ public function __construct(private readonly Badge $badge)

public function handle(): void
{
if($this->badge->status !== Printed::class && $this->badge->status->canTransitionTo(Printed::class)) {
$this->badge->status->transitionTo(Printed::class);
if($this->badge->status_fulfillment->canTransitionTo(Printed::class)) {
$this->badge->status_fulfillment->transitionTo(Printed::class);
}


Expand Down
Loading