namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Transaction; use App\Services\SimServerService; use DB; class VtuController extends Controller { public function buyData(Request $request) { $request->validate([ 'network' => 'required', 'phone' => 'required', 'plan' => 'required', 'amount' => 'required|numeric', 'request_id' => 'required|unique:transactions' ]); $user = $request->user(); if ($user->wallet->balance < $request->amount) { return response()->json(['error' => 'Insufficient balance'], 400); } DB::transaction(function () use ($user, $request) { $user->wallet->decrement('balance', $request->amount); Transaction::create([ 'user_id' => $user->id, 'request_id' => $request->request_id, 'type' => 'data', 'network' => $request->network, 'phone' => $request->phone, 'amount' => $request->amount, ]); }); SimServerService::sendDataRequest( $request->network, $request->phone, $request->plan, $request->request_id ); return response()->json([ 'status' => 'PROCESSING', 'request_id' => $request->request_id ]); } public function simCallback(Request $request) { $txn = Transaction::where('request_id', $request->request_id)->firstOrFail(); $txn->update([ 'status' => $request->status, 'sim_used' => $request->sim_used, 'response' => $request->response ]); if ($request->status === 'FAILED') { $txn->user->wallet->increment('balance', $txn->amount); } return response()->json(['ok' => true]); } }