113 lines
3.7 KiB
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.');
|
|
}
|
|
}
|