where('store_id', $request->user()->id) ->where('status', 'pending_payment') ->orderBy('created_at') ->get(); return $this->ok($orders); } public function complete(Request $request, string $uuid, \App\Services\Store\StoreOperations $operations): JsonResponse { $storeOwner = $request->user(); $store = \App\Models\PartnerStore::where('owner_user_id', $storeOwner->id)->firstOrFail(); $order = QrPurchaseOrder::where('uuid', $uuid) ->where('store_id', $storeOwner->id) ->where('status', 'pending_payment') ->firstOrFail(); $resident = \App\Models\User::findOrFail($order->resident_id); $household = $resident->household; DB::transaction(function () use ($order, $store, $household, $resident, $operations, &$sale) { $sale = $operations->sell( $store, $household, $resident, $order->quantity, config('qr.default_retail_price_per_code_centavos', 1000) ); $order->update([ 'status' => 'completed', 'completed_at' => now(), ]); }); // Generate QR code data for the response matching sales receipt behavior $query = \App\Models\QrCode::where('status', \App\States\QrCode\Active::$name); if ($household) { $query->where('assigned_to_household_id', $household->id); } else { $query->where('assigned_to_user_id', $resident->id); } $codes = $query->latest('activated_at') ->limit($order->quantity) ->get(); $qrData = $codes->map(function ($code) { $qr = (new \Endroid\QrCode\Builder\Builder( writer: new \Endroid\QrCode\Writer\PngWriter(), data: $code->serial, errorCorrectionLevel: \Endroid\QrCode\ErrorCorrectionLevel::Medium, size: 300, margin: 10 ))->build(); return [ 'serial' => $code->serial, 'qr_base64' => base64_encode($qr->getString()), ]; }); return $this->ok([ 'sale' => [ 'id' => $sale->id, 'receipt_url' => URL::temporarySignedRoute( 'api.v1.store.sales.receipt', now()->addHours(24), ['sale' => $sale->id] ), 'codes_url' => URL::temporarySignedRoute( 'api.v1.store.sales.codes', now()->addHours(24), ['sale' => $sale->id] ), ], 'codes' => $qrData, ], 'QR Purchase completed successfully.'); } public function cancel(Request $request, string $uuid): JsonResponse { $order = QrPurchaseOrder::where('uuid', $uuid) ->where('store_id', $request->user()->id) ->where('status', 'pending_payment') ->firstOrFail(); $order->update([ 'status' => 'cancelled', ]); return $this->ok($order->fresh(), 'QR Reservation cancelled successfully.'); } }