where('serial', $serial) ->firstOrFail(); return $this->ok(new QrCodeResource($code)); } public function void(VoidQrCodeRequest $request, QrCode $qrCode): JsonResponse { if (! $qrCode->status->canTransitionTo(Voided::class)) { return $this->fail('Code cannot be voided from its current state', null, 422); } $qrCode->status->transitionTo(Voided::class); $existingMeta = $qrCode->metadata ?? []; $qrCode->forceFill([ 'metadata' => array_merge($existingMeta, [ 'voided_at' => now()->toIso8601String(), 'voided_by_admin_id' => $request->user()->id, 'void_reason' => $request->validated('reason'), ]), ])->save(); return $this->ok(new QrCodeResource($qrCode->fresh()), 'Code voided'); } }