lms/Modules/PaymentGateways/app/Http/Controllers/OfflineController.php
2025-12-15 12:26:23 +01:00

159 lines
5.5 KiB
PHP

<?php
namespace Modules\PaymentGateways\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\PaymentHistory;
use App\Services\MediaService;
use App\Services\SettingsService;
use Illuminate\Support\Facades\Auth;
use Modules\PaymentGateways\Services\PaymentService;
use Illuminate\Support\Str;
use Inertia\Inertia;
class OfflineController extends Controller
{
private $offline;
public function __construct(
private MediaService $media,
private PaymentService $payment,
private SettingsService $settingsService,
) {
$this->offline = $this->settingsService->getSetting(['type' => 'payment', 'sub_type' => 'offline']);
}
/**
* Show offline payment instructions page
*/
public function index(Request $request)
{
$user = Auth::user();
$checkoutItem = $this->payment->getCheckoutItem(
$request->item_type,
$request->item_id,
$request->coupon
);
// Store checkout data in temporary storage
setTempStore([
'user_id' => $user->id,
'properties' => [
'from' => $request->from,
'item_type' => $request->item_type,
'item_id' => $request->item_id,
'tax_amount' => $checkoutItem['taxAmount'],
'final_price' => $checkoutItem['finalPrice'],
'coupon_code' => $checkoutItem['coupon'] ? $checkoutItem['coupon']->code : null,
]
]);
return Inertia::render('offline-payment/index', [
'user' => $user,
'item' => $checkoutItem['item'],
'amount' => $checkoutItem['finalPrice'],
'currency' => app('system_settings')->fields['selling_currency'] ?? 'USD',
'payment_instructions' => $this->offline->fields['payment_instructions'] ?? '',
'payment_details' => $this->offline->fields['payment_details'] ?? '',
]);
}
/**
* Submit offline payment proof
*/
public function submit(Request $request)
{
$request->validate([
'payment_info' => 'required|string|max:100',
'payment_date' => 'required|date',
'attachment' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:1024',
]);
$user = Auth::user();
$temp = getTempStore($user->id);
if (!$temp) {
return redirect()
->route('student.index', ['tab' => 'courses'])
->with('error', 'Session expired. Please try again.');
}
$from = $temp->properties['from'];
$item_type = $temp->properties['item_type'];
$item_id = $temp->properties['item_id'];
$tax_amount = $temp->properties['tax_amount'];
$final_price = $temp->properties['final_price'];
$coupon_code = $temp->properties['coupon_code'];
if (!in_array($item_type, ['course', 'exam'])) {
return redirect()->route('student.index', ['tab' => 'courses'])
->with('error', 'Invalid item type');
}
try {
// Generate unique transaction ID for offline payment
$transactionId = 'OFFLINE-' . strtoupper(Str::random(12));
// Create payment history with pending status
$this->payment->coursesBuy(
'offline',
$item_type,
$item_id,
$transactionId,
$tax_amount,
$final_price,
$coupon_code
);
// Update the payment history with offline payment details
$paymentHistory = PaymentHistory::where('transaction_id', $transactionId)->first();
if ($paymentHistory) {
$paymentHistory->update([
'meta' => [
'status' => 'pending',
'payment_info' => $request->payment_info,
'payment_date' => $request->payment_date,
'attachment' => $request->attachment ? $this->media->addNewDeletePrev($paymentHistory, $request->attachment, 'payment_attachment') : null,
'submitted_at' => now()->toDateTimeString(),
]
]);
}
if ($from == 'api') {
return redirect()->to(env('FRONTEND_URL') . '/student?payment=pending');
} else {
return redirect()
->route('student.index', ['tab' => 'courses'])
->with('success', 'Your payment details have been submitted successfully. Your enrollment will be activated once the payment is verified by our team.');
}
} catch (\Throwable $th) {
return redirect()
->route('payments.index', ['from' => $from, 'item' => $item_type, 'id' => $item_id])
->with('error', $th->getMessage());
}
}
/**
* Cancel offline payment
*/
public function cancel()
{
$user = Auth::user();
$temp = getTempStore($user->id);
if (!$temp) {
return redirect()->route('student.index', ['tab' => 'courses']);
}
$from = $temp->properties['from'];
$item_type = $temp->properties['item_type'];
$item_id = $temp->properties['item_id'];
return redirect()
->route('payments.index', ['from' => $from, 'item' => $item_type, 'id' => $item_id])
->with('error', 'Payment cancelled. Please try again.');
}
}