Files
Verde-Web/app/Http/Controllers/Api/V1/Store/StoreQrPurchaseController.php

113 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1\Store;
use App\Http\Controllers\Api\V1\ApiController;
use App\Models\QrCode;
use App\Models\QrPurchaseOrder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\URL;
class StoreQrPurchaseController extends ApiController
{
public function pending(Request $request): JsonResponse
{
$orders = QrPurchaseOrder::with(['resident'])
->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.');
}
}