| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | 
							- <?php
 
- namespace App\Http\Controllers\Front;
 
- use App\Shop\Addresses\Repositories\Interfaces\AddressRepositoryInterface;
 
- use App\Shop\Cart\Requests\CartCheckoutRequest;
 
- use App\Shop\Carts\Repositories\Interfaces\CartRepositoryInterface;
 
- use App\Shop\Carts\Requests\PayPalCheckoutExecutionRequest;
 
- use App\Shop\Carts\Requests\StripeExecutionRequest;
 
- use App\Shop\Couriers\Repositories\Interfaces\CourierRepositoryInterface;
 
- use App\Shop\Customers\Customer;
 
- use App\Shop\Customers\Repositories\CustomerRepository;
 
- use App\Shop\Customers\Repositories\Interfaces\CustomerRepositoryInterface;
 
- use App\Shop\Orders\Repositories\Interfaces\OrderRepositoryInterface;
 
- use App\Shop\PaymentMethods\Paypal\Exceptions\PaypalRequestError;
 
- use App\Shop\PaymentMethods\Paypal\Repositories\PayPalExpressCheckoutRepository;
 
- use App\Shop\PaymentMethods\Stripe\Exceptions\StripeChargingErrorException;
 
- use App\Shop\PaymentMethods\Stripe\StripeRepository;
 
- use App\Shop\Products\Repositories\Interfaces\ProductRepositoryInterface;
 
- use App\Shop\Products\Transformations\ProductTransformable;
 
- use App\Shop\Shipping\ShippingInterface;
 
- use Exception;
 
- use App\Http\Controllers\Controller;
 
- use Gloudemans\Shoppingcart\Facades\Cart;
 
- use Illuminate\Http\Request;
 
- use Illuminate\Support\Collection;
 
- use Illuminate\Support\Facades\Log;
 
- use PayPal\Exception\PayPalConnectionException;
 
- class CheckoutController extends Controller
 
- {
 
-     use ProductTransformable;
 
-     /**
 
-      * @var CartRepositoryInterface
 
-      */
 
-     private $cartRepo;
 
-     /**
 
-      * @var CourierRepositoryInterface
 
-      */
 
-     private $courierRepo;
 
-     /**
 
-      * @var AddressRepositoryInterface
 
-      */
 
-     private $addressRepo;
 
-     /**
 
-      * @var CustomerRepositoryInterface
 
-      */
 
-     private $customerRepo;
 
-     /**
 
-      * @var ProductRepositoryInterface
 
-      */
 
-     private $productRepo;
 
-     /**
 
-      * @var OrderRepositoryInterface
 
-      */
 
-     private $orderRepo;
 
-     /**
 
-      * @var PayPalExpressCheckoutRepository
 
-      */
 
-     private $payPal;
 
-     /**
 
-      * @var ShippingInterface
 
-      */
 
-     private $shippingRepo;
 
-     public function __construct(
 
-         CartRepositoryInterface $cartRepository,
 
-         CourierRepositoryInterface $courierRepository,
 
-         AddressRepositoryInterface $addressRepository,
 
-         CustomerRepositoryInterface $customerRepository,
 
-         ProductRepositoryInterface $productRepository,
 
-         OrderRepositoryInterface $orderRepository,
 
-         ShippingInterface $shipping
 
-     ) {
 
-         $this->cartRepo = $cartRepository;
 
-         $this->courierRepo = $courierRepository;
 
-         $this->addressRepo = $addressRepository;
 
-         $this->customerRepo = $customerRepository;
 
-         $this->productRepo = $productRepository;
 
-         $this->orderRepo = $orderRepository;
 
-         $this->payPal = new PayPalExpressCheckoutRepository;
 
-         $this->shippingRepo = $shipping;
 
-     }
 
-     /**
 
-      * Display a listing of the resource.
 
-      *
 
-      * @param Request $request
 
-      *
 
-      * @return \Illuminate\Http\Response
 
-      */
 
-     public function index(Request $request)
 
-     {
 
-         $products = $this->cartRepo->getCartItems();
 
-         $customer = $request->user();
 
-         $rates = null;
 
-         $shipment_object_id = null;
 
-         if (env('ACTIVATE_SHIPPING') == 1) {
 
-             $shipment = $this->createShippingProcess($customer, $products);
 
-             if (!is_null($shipment)) {
 
-                 $shipment_object_id = $shipment->object_id;
 
-                 $rates = $shipment->rates;
 
-             }
 
-         }
 
-         // Get payment gateways
 
-         $paymentGateways = collect(explode(',', config('payees.name')))->transform(function ($name) {
 
-             return config($name);
 
-         })->all();
 
-         $billingAddress = $customer->addresses()->first();
 
-         return view('front.checkout', [
 
-             'customer' => $customer,
 
-             'billingAddress' => $billingAddress,
 
-             'addresses' => $customer->addresses()->get(),
 
-             'products' => $this->cartRepo->getCartItems(),
 
-             'subtotal' => $this->cartRepo->getSubTotal(),
 
-             'tax' => $this->cartRepo->getTax(),
 
-             'total' => $this->cartRepo->getTotal(2),
 
-             'payments' => $paymentGateways,
 
-             'cartItems' => $this->cartRepo->getCartItemsTransformed(),
 
-             'shipment_object_id' => $shipment_object_id,
 
-             'rates' => $rates
 
-         ]);
 
-     }
 
-     /**
 
-      * Checkout the items
 
-      *
 
-      * @param CartCheckoutRequest $request
 
-      *
 
-      * @return \Illuminate\Http\RedirectResponse
 
-      * @throws \App\Shop\Addresses\Exceptions\AddressNotFoundException
 
-      * @throws \App\Shop\Customers\Exceptions\CustomerPaymentChargingErrorException
 
-      * @codeCoverageIgnore
 
-      */
 
-     public function store(CartCheckoutRequest $request)
 
-     {
 
-         $shippingFee = 0;
 
-         switch ($request->input('payment')) {
 
-             case 'paypal':
 
-                 return $this->payPal->process($shippingFee, $request);
 
-                 break;
 
-             case 'stripe':
 
-                 $details = [
 
-                     'description' => 'Stripe payment',
 
-                     'metadata' => $this->cartRepo->getCartItems()->all()
 
-                 ];
 
-                 $customer = $this->customerRepo->findCustomerById(auth()->id());
 
-                 $customerRepo = new CustomerRepository($customer);
 
-                 $customerRepo->charge($this->cartRepo->getTotal(2, $shippingFee), $details);
 
-                 break;
 
-             default:
 
-         }
 
-     }
 
-     /**
 
-      * Execute the PayPal payment
 
-      *
 
-      * @param PayPalCheckoutExecutionRequest $request
 
-      * @return \Illuminate\Http\RedirectResponse
 
-      */
 
-     public function executePayPalPayment(PayPalCheckoutExecutionRequest $request)
 
-     {
 
-         try {
 
-             $this->payPal->execute($request);
 
-             $this->cartRepo->clearCart();
 
-             return redirect()->route('checkout.success');
 
-         } catch (PayPalConnectionException $e) {
 
-             throw new PaypalRequestError($e->getData());
 
-         } catch (Exception $e) {
 
-             throw new PaypalRequestError($e->getMessage());
 
-         }
 
-     }
 
-     /**
 
-      * @param StripeExecutionRequest $request
 
-      * @return \Stripe\Charge
 
-      */
 
-     public function charge(StripeExecutionRequest $request)
 
-     {
 
-         try {
 
-             $customer = $this->customerRepo->findCustomerById(auth()->id());
 
-             $stripeRepo = new StripeRepository($customer);
 
-             $stripeRepo->execute(
 
-                 $request->all(),
 
-                 Cart::total(),
 
-                 Cart::tax()
 
-             );
 
-             return redirect()->route('checkout.success')->with('message', 'Stripe payment successful!');
 
-         } catch (StripeChargingErrorException $e) {
 
-             Log::info($e->getMessage());
 
-             return redirect()->route('checkout.index')->with('error', 'There is a problem processing your request.');
 
-         }
 
-     }
 
-     /**
 
-      * Cancel page
 
-      *
 
-      * @param Request $request
 
-      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 
-      */
 
-     public function cancel(Request $request)
 
-     {
 
-         return view('front.checkout-cancel', ['data' => $request->all()]);
 
-     }
 
-     /**
 
-      * Success page
 
-      *
 
-      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 
-      */
 
-     public function success()
 
-     {
 
-         return view('front.checkout-success');
 
-     }
 
-     /**
 
-      * @param Customer $customer
 
-      * @param Collection $products
 
-      *
 
-      * @return mixed
 
-      */
 
-     private function createShippingProcess(Customer $customer, Collection $products)
 
-     {
 
-         $customerRepo = new CustomerRepository($customer);
 
-         if ($customerRepo->findAddresses()->count() > 0 && $products->count() > 0) {
 
-             $this->shippingRepo->setPickupAddress();
 
-             $deliveryAddress = $customerRepo->findAddresses()->first();
 
-             $this->shippingRepo->setDeliveryAddress($deliveryAddress);
 
-             $this->shippingRepo->readyParcel($this->cartRepo->getCartItems());
 
-             return $this->shippingRepo->readyShipment();
 
-         }
 
-     }
 
- }
 
 
  |