feat: add payment intent handling in PurchaseController with validation and QR generation
This commit is contained in:
@@ -50,7 +50,67 @@ class PurchaseController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function paymentIntent(\App\Domains\Purchase\Requests\PaymentIntentRequest $request, Tenant $tenant, Purchase $compra): JsonResponse
|
||||||
|
{
|
||||||
|
$compra = $this->resolveScopedPurchase($tenant, $request->user()->id, $compra);
|
||||||
|
$method = $request->validated('method');
|
||||||
|
|
||||||
|
$compra->update([
|
||||||
|
'payment_method' => $method,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($method === 'transfer') {
|
||||||
|
$bankAccount = $tenant->selectedBankAccount;
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'payment_method' => 'transfer',
|
||||||
|
'transfer_data' => $bankAccount ? [
|
||||||
|
'titular' => $bankAccount->titular,
|
||||||
|
'entidad' => $bankAccount->entidad,
|
||||||
|
'alias' => $bankAccount->alias,
|
||||||
|
'cvu' => $bankAccount->cvu,
|
||||||
|
] : null,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($method === 'qr') {
|
||||||
|
$telepagosQr = $compra->telepagosQr;
|
||||||
|
|
||||||
|
if (!$telepagosQr) {
|
||||||
|
$telepagosService = new \App\Domains\Integration\Services\TelepagosIntegrationService();
|
||||||
|
$telepagosService->forTenant($tenant->codigo);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$qrResponse = $telepagosService->generateQr(
|
||||||
|
$compra->getTotalAmount(),
|
||||||
|
'Compra',
|
||||||
|
"Compra #{$compra->id}"
|
||||||
|
);
|
||||||
|
|
||||||
|
$telepagosQr = $compra->telepagosQr()->create([
|
||||||
|
'qr_order_id' => (string) ($qrResponse['id'] ?? $qrResponse['order_id'] ?? $qrResponse['cashin_id'] ?? ''),
|
||||||
|
'qr_code' => $qrResponse['qr'] ?? $qrResponse['qr_code'] ?? $qrResponse['qr_data'] ?? '',
|
||||||
|
]);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Error generating QR: ' . $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'payment_method' => 'qr',
|
||||||
|
'qr_data' => [
|
||||||
|
'qr_code' => $telepagosQr->qr_code,
|
||||||
|
'qr_order_id' => $telepagosQr->qr_order_id,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Invalid payment method.',
|
||||||
|
], 400);
|
||||||
|
}
|
||||||
|
|
||||||
protected function resolveScopedPurchase(Tenant $tenant, int $userId, Purchase $purchase): Purchase
|
protected function resolveScopedPurchase(Tenant $tenant, int $userId, Purchase $purchase): Purchase
|
||||||
{
|
{
|
||||||
|
|||||||
24
app/Domains/Purchase/Requests/PaymentIntentRequest.php
Normal file
24
app/Domains/Purchase/Requests/PaymentIntentRequest.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domains\Purchase\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class PaymentIntentRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return $this->user() !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'method' => ['required', 'string', Rule::in(['qr', 'transfer'])],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,6 @@ class StorePurchaseRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'status' => ['sometimes', 'string', Rule::in(['pending', 'paid', 'cancelled'])],
|
'status' => ['sometimes', 'string', Rule::in(['pending', 'paid', 'cancelled'])],
|
||||||
'payment_method' => ['required', 'string'],
|
|
||||||
'dni' => ['required', 'string'],
|
'dni' => ['required', 'string'],
|
||||||
'telefono' => ['required', 'string'],
|
'telefono' => ['required', 'string'],
|
||||||
'nombre_apellido' => ['required', 'string'],
|
'nombre_apellido' => ['required', 'string'],
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ class CheckoutService
|
|||||||
...$purchaseData,
|
...$purchaseData,
|
||||||
'tenant_codigo' => $tenant->codigo,
|
'tenant_codigo' => $tenant->codigo,
|
||||||
'user_id' => $userId,
|
'user_id' => $userId,
|
||||||
|
'status' => 'pending',
|
||||||
|
'payment_status' => 'pending',
|
||||||
|
'payment_method' => null,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$purchase->items()->createMany($purchaseItemsPayload);
|
$purchase->items()->createMany($purchaseItemsPayload);
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ use Illuminate\Support\Facades\Route;
|
|||||||
|
|
||||||
Route::prefix('tenants/{tenant:codigo}')->middleware('auth:sanctum')->group(function (): void {
|
Route::prefix('tenants/{tenant:codigo}')->middleware('auth:sanctum')->group(function (): void {
|
||||||
Route::apiResource('compras', PurchaseController::class)->only(['index', 'store', 'show']);
|
Route::apiResource('compras', PurchaseController::class)->only(['index', 'store', 'show']);
|
||||||
|
Route::post('compras/{compra}/payment-intent', [PurchaseController::class, 'paymentIntent']);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user