qr_code_batches + qr_codes tables. State machine via
spatie/laravel-model-states (unassigned → allocated → active → used,
plus expired/voided). Serial format PH-{area}-{YYMM}-{batch}-{code}-
{checksum} with 2-char SHA-256-derived checksum. BatchGenerator
bulk-inserts in chunks. QrAllocator allocates free codes to verified
households (prefers area-targeted batch, falls back to any). Real
HouseholdVerified listener replaces the placeholder. QrBalanceLow
event for Module 11.
Admin: batch CRUD, mark-printed, void code, lifecycle search, PDF
print sheet (24/A4 via dompdf + endroid/qr-code + picqer/barcode).
Resident: list own codes, balance with low_balance flag, activate
allocated codes.
Removed explicit Event::listen for HouseholdVerified — Laravel 11
auto-discovers it via handle() type-hint, and double-registering was
causing double-dispatch.
130 feature tests passing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 lines
879 B
PHP
32 lines
879 B
PHP
<?php
|
|
|
|
namespace App\Http\Requests\Qr;
|
|
|
|
use App\Models\QrCodeBatch;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class GenerateBatchRequest extends FormRequest
|
|
{
|
|
public function authorize(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'quantity' => ['required', 'integer', 'min:1', 'max:50000'],
|
|
'purpose' => ['required', Rule::in([
|
|
QrCodeBatch::PURPOSE_FREE,
|
|
QrCodeBatch::PURPOSE_STORE,
|
|
QrCodeBatch::PURPOSE_PROMO,
|
|
])],
|
|
'target_area_id' => ['nullable', 'integer', 'exists:service_areas,id'],
|
|
'target_store_id' => ['nullable', 'integer'],
|
|
'expires_at' => ['nullable', 'date', 'after:today'],
|
|
'notes' => ['nullable', 'string', 'max:1000'],
|
|
];
|
|
}
|
|
}
|