Exemplo n.º 1
0
 /**
  * Checkout event
  *
  * @param CheckoutRequest $request
  * @param Cart $cart
  * @return \Illuminate\Http\RedirectResponse
  */
 public function checkout(CheckoutRequest $request, Cart $cart)
 {
     foreach ($cart->cart_items as $cartItem) {
         $numberToDeduct = $cartItem->amount;
         $product = $cartItem->product;
         if ($product->in_stock < $numberToDeduct) {
             return redirect()->route('checkout.index')->withErrors('Not enough of product: ' . $product->name);
         }
     }
     $cash = $request->has('cash');
     $total = $cart->total();
     $change = 0;
     if ($cash) {
         $amountGiven = $request->amountGiven;
         if ($amountGiven < $total) {
             return redirect()->route('checkout.index')->withErrors('Not enough money given');
         } else {
             $change = $amountGiven - $total;
         }
     }
     DB::transaction(function () use($request, $cart, $cash, $total) {
         if (!$cash) {
             $user = User::findOrFail($request->user_id);
         }
         foreach ($cart->cart_items as $cartItem) {
             $numberToDeduct = $cartItem->amount;
             $product = $cartItem->product;
             if (!$cash) {
                 $user->balance -= $product->price * $numberToDeduct;
             }
             $stocks = $product->stocks()->hasStock()->get();
             foreach ($stocks as $stock) {
                 if ($stock->in_stock == 0) {
                     continue;
                 }
                 if ($stock->in_stock - $numberToDeduct >= 0) {
                     $stock->in_stock -= $numberToDeduct;
                     $stock->save();
                     if (!$cash) {
                         $product->sales()->create(['price' => $product->price, 'amount' => $numberToDeduct, 'cpu' => $stock->cpu, 'user_id' => $request->user_id]);
                     } else {
                         $product->sales()->create(['price' => $product->price, 'amount' => $numberToDeduct, 'cpu' => $stock->cpu]);
                     }
                     break;
                 } else {
                     if (!$cash) {
                         $product->sales()->create(['price' => $product->price, 'amount' => $stock->in_stock, 'cpu' => $stock->cpu, 'user_id' => $request->user_id]);
                     } else {
                         $product->sales()->create(['price' => $product->price, 'amount' => $stock->in_stock, 'cpu' => $stock->cpu]);
                     }
                     $numberToDeduct -= $stock->in_stock;
                     $stock->in_stock = 0;
                     $stock->save();
                 }
             }
             $product->updateStock();
             $cartItem->delete();
         }
         if (!$cash) {
             $user->save();
             $services = new Services();
             $user->logs()->create(['title' => 'Goods Purchased', 'description' => $services->displayCurrency($total) . ' worth of items have been purchased.', 'details' => "Balance\t=>\t" . $services->displayCurrency($user->balance)]);
         }
     });
     if ($change == 0) {
         return redirect()->route('checkout.index')->with('success', 'Purchase made');
     } else {
         $service = new Services();
         return redirect()->route('checkout.index')->with('success', 'Purchase made. Change: ' . $service->displayCurrency($change));
     }
 }
Exemplo n.º 2
0
 /**
  * Loan an amount
  *
  * @param LoanUserRequest $request
  * @param  User $user
  * @return \Illuminate\Http\Response
  */
 public function loan(LoanUserRequest $request, User $user)
 {
     DB::transaction(function () use($request, $user) {
         $user->balance -= $request->amountToLoan;
         $user->save();
         $services = new Services();
         $user->payments()->create(['amount' => -$request->amountToLoan]);
         $user->logs()->create(['title' => 'Amount Loaned', 'description' => $services->displayCurrency($request->amountToLoan) . ' has been loaned.', 'details' => "Balance\t=>\t" . $services->displayCurrency($user->balance)]);
     });
     return redirect()->route('user.show', $user)->with('success', 'Amount Loaned');
 }