| 
<?php
 namespace App\Http\Controllers\Wallet;
 
 use App\Http\Controllers\Controller;
 use App\Models\Payment;
 use App\Models\Transaction;
 use App\Models\User;
 use App\Transformers\TransactionsTransformer;
 use Illuminate\Http\Request;
 
 /**
 * all transaction processes
 */
 class TransactionsController extends Controller
 {
 public function __construct()
 {
 // all method need admin except (total, create)
 $this->middleware(['admin'])->except(['total', 'create']);
 }
 
 /**
 * get all transaction
 * @return \Illuminate\Http\JsonResponse
 */
 public function index()
 {
 return response()->json(
 fractal()
 ->collection(Transaction::all())
 ->transformWith(new TransactionsTransformer())
 ->toArray()['data']
 );
 }
 
 /**
 * create new transaction
 * @param  Request  $request
 * @return \Illuminate\Http\JsonResponse
 */
 public function create(Request $request)
 {
 // get payment method choices by user
 $payment = Payment::where('slug', $request->payment_method)->first();
 if ($payment === null) // if payment method not found
 return $this->sendError(['Payment Method is not found'], 404);
 
 // create a transaction
 $response = $request->user()->wallet->tryCreateTransaction($request->all(), $payment);
 
 // check if transaction not created, then tell user about a problem
 if ($response['status'] === false) {
 return $this->sendError([$response['msg']], 422);
 }
 
 
 // return created transaction details
 return response()->json(fractal()
 ->item($response)
 ->transformWith(new TransactionsTransformer())
 ->toArray()['data']);
 }
 
 /**
 * confirm transaction from admin (approve/decline/set to pending)
 * @param  Request  $request
 * @param  Transaction  $transaction
 * @return \Illuminate\Http\JsonResponse
 */
 public function confirm(Request $request, Transaction $transaction)
 {
 $transaction->confirmation = $request->type;
 
 return $this->sendResponse([], 'Transaction Changed');
 }
 
 /**
 * get all approved transaction
 * @return \Illuminate\Http\JsonResponse
 */
 public function approved()
 {
 return response()->json(fractal()
 ->collection(Transaction::approved()->get())
 ->transformWith(new TransactionsTransformer())
 ->toArray()['data']);
 }
 
 /**
 * get all declined transaction
 * @return \Illuminate\Http\JsonResponse
 */
 public function declined()
 {
 return response()->json(fractal()
 ->collection(Transaction::declined()->get())
 ->transformWith(new TransactionsTransformer())
 ->toArray()['data']);
 }
 
 /**
 * get all pending transaction
 * @return \Illuminate\Http\JsonResponse
 */
 public function pending()
 {
 return response()->json(fractal()
 ->collection(Transaction::waiting()->get())
 ->transformWith(new TransactionsTransformer())
 ->toArray()['data']);
 }
 
 /**
 * get transactions count for user
 * @return \Illuminate\Http\JsonResponse
 */
 public function total()
 {
 return response()->json([
 'approved' => auth()->user()->totalApproved(),
 'declined' => auth()->user()->totalDeclined(),
 'pending' => auth()->user()->totalPending(),
 ]);
 }
 
 /**
 * get all transactions count for dashboard chart
 * @return \Illuminate\Http\JsonResponse
 */
 public function allTotals()
 {
 $transaction = new Transaction();
 return response()->json([
 'approved' => $transaction->approved()->count(),
 'declined' => $transaction->declined()->count(),
 'pending' => $transaction->waiting()->count(),
 ]);
 }
 }
 
 |