diff --git a/app/Http/Controllers/Api/V1/Scanner/ScannerController.php b/app/Http/Controllers/Api/V1/Scanner/ScannerController.php index 4885a56..ed8702d 100644 --- a/app/Http/Controllers/Api/V1/Scanner/ScannerController.php +++ b/app/Http/Controllers/Api/V1/Scanner/ScannerController.php @@ -44,6 +44,7 @@ class ScannerController extends ApiController public function scan(Request $request): JsonResponse { + \Illuminate\Support\Facades\Log::info("DEBUG: Entering ScannerController::scan"); $data = $request->validate([ 'serial' => ['required', 'string', 'max:64'], 'drop_off_point_id' => ['required', 'integer', 'exists:drop_off_points,id'], @@ -63,22 +64,30 @@ class ScannerController extends ApiController $stop = isset($data['trip_stop_id']) ? TripStop::find($data['trip_stop_id']) : null; \Illuminate\Support\Facades\Log::info("Scan attempt", ['serial' => $data['serial'] ?? 'none']); - $result = $this->scanner->scan( - serial: $data['serial'], - dropOff: $dop, - scanner: $request->user(), - lat: (float) $data['lat'], - lng: (float) $data['lng'], - trip: $trip, - tripStop: $stop, - weightKg: $data['weight_kg'] ?? null, - wasteType: $data['waste_type'] ?? null, - photoPath: $data['photo_path'] ?? null, - notes: $data['notes'] ?? null, - scannedAt: isset($data['scanned_at']) ? Carbon::parse($data['scanned_at']) : null, - ); + try { + $result = $this->scanner->scan( + serial: $data['serial'], + dropOff: $dop, + scanner: $request->user(), + lat: (float) $data['lat'], + lng: (float) $data['lng'], + trip: $trip, + tripStop: $stop, + weightKg: $data['weight_kg'] ?? null, + wasteType: $data['waste_type'] ?? null, + photoPath: $data['photo_path'] ?? null, + notes: $data['notes'] ?? null, + scannedAt: isset($data['scanned_at']) ? Carbon::parse($data['scanned_at']) : null, + ); + } catch (\Throwable $e) { + \Illuminate\Support\Facades\Log::error("DEBUG: Scan Exception: " . $e->getMessage() . "\n" . $e->getTraceAsString()); + throw $e; + } + + \Illuminate\Support\Facades\Log::info("DEBUG: Scan completed", ['accepted' => $result->accepted, 'reason' => $result->rejectReason ?? 'none']); if (! $result->accepted) { + \Illuminate\Support\Facades\Log::warning("Scan rejected internally", ['serial' => $data['serial'], 'reason' => $result->rejectReason]); return $this->fail( 'Scan rejected', ['reason' => [$result->rejectReason]], @@ -86,11 +95,14 @@ class ScannerController extends ApiController ); } - return $this->ok([ + $res = [ 'serial' => $result->code->serial, 'log_id' => $result->log->id, 'status' => (string) $result->code->status, - ], 'Scan recorded'); + ]; + \Illuminate\Support\Facades\Log::info("Scan Response OK", $res); + + return $this->ok($res, 'Scan recorded'); } /** diff --git a/app/Services/Qr/BatchGenerator.php b/app/Services/Qr/BatchGenerator.php index c90efde..9de28e0 100644 --- a/app/Services/Qr/BatchGenerator.php +++ b/app/Services/Qr/BatchGenerator.php @@ -38,7 +38,21 @@ class BatchGenerator $batchNumber, $quantity, $purpose, $targetArea, $targetStoreId, $createdBy, $expiresAt, $notes, $now, $areaCode, $batchSeq, $householdId, ) { + $tenantId = null; + if ($householdId) { + $tenantId = \App\Models\Household::find($householdId)?->tenant_id; + } elseif ($targetArea) { + $tenantId = $targetArea->tenant_id; + } elseif ($targetStoreId) { + $tenantId = \App\Models\PartnerStore::find($targetStoreId)?->tenant_id; + } + + if (empty($tenantId)) { + $tenantId = Tenancy::current()?->id; + } + $batch = QrCodeBatch::create([ + 'tenant_id' => $tenantId, 'batch_number' => $batchNumber, 'quantity' => $quantity, 'purpose' => $purpose,