HOME


Mini Shell 1.0
La Pieza.DO | Todo lo que buscas!

Bienvenido de nuevo!

Acceso Cuenta Delivery
DIR: /var/www/devs.lapieza.net/app/Http/Controllers/
Upload File :
Current File : /var/www/devs.lapieza.net/app/Http/Controllers/CheckoutController_old.php
<?php

namespace App\Http\Controllers;

use App\Mail\InvoiceEmailManager;
use App\Models\Address;
use App\Models\Cart;
use App\Models\CombinedOrder;
use App\Models\Coupon;
use App\Models\CouponUsage;
use App\Models\Order;
use App\Models\Product;
use App\Models\User;
use App\Utility\NotificationUtility;
use Auth;
use Illuminate\Http\Request;
use Mail;
use Session;

class CheckoutController extends Controller {
    public function checkout(Request $request) {
        echo 1;
        $combined_order_id = $request->session()->get('combined_order_id');


        // Minumum order amount check
        if (get_setting('minimum_order_amount_check') == 1) {
            $subtotal = 0;

            foreach (Cart::with('product')->ownedByCurrentUser()->get() as $cart) {
                $product = $cart->product;
                $subtotal += cart_product_price($cart, $product, false, false) * $cart->quantity;
            }

            if ($subtotal < get_setting('minimum_order_amount')) {
                flash(translate('You order amount is less than the minimum order amount'))->warning();
                return redirect()->route('home');
            }
        }

        // Minumum order amount check end
        if ($request->payment_option != null) {
            (new OrderController)->store($request);

            $request->session()->put('payment_type', 'cart_payment');

            $data['combined_order_id'] = $combined_order_id;

            $request->session()->put('payment_data', $data);

            if ($combined_order_id != null) {
                // If block for Online payment, wallet and cash on delivery. Else block for Offline payment
                $decorator = __NAMESPACE__ . '\\Payment\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $request->payment_option))) . "Controller";

                if (class_exists($decorator)) {
                    return (new $decorator)->pay($request);
                } else {
                    return $this->makeManualPaymet($combined_order_id, $request);
                }
            }
        } else {
            flash(translate('Select Payment Option.'))->warning();
            return back();
        }
    }

    public function makeManualPaymet(int $combined_order_id, Request $request) {
        echo 2;
        $combined_order = CombinedOrder::with('orders')->findOrFail($combined_order_id);
        $manual_payment_data = [
            'name' => $request->payment_option,
            'amount' => $combined_order->grand_total,
            'trx_id' => $request->trx_id,
            'photo' => $request->photo
        ];

        $orderIds = $combined_order->orders->pluck('id');

        Order::whereIn('id', $orderIds)->update([
            'manual_payment' => true,
            'manual_payment_data' => json_encode($manual_payment_data),
        ]);

        flash(translate('Your order has been placed successfully. Please submit payment information from purchase history'))->success();

        return redirect()->route('checkout.order_confirmed');
    }

    public function checkout_done($combined_order_id, $payment) {
        dd($combined_order_id, $payment);
        $combined_order = CombinedOrder::with('orders')->findOrFail($combined_order_id);
        $orders = $combined_order->orders;

        foreach ($orders as $order) {
            $order->update([
                'payment_status' => 'paid',
                'payment_details' => $payment
            ]);

            NotificationUtility::sendOrderPlacedNotification($order);
        }

        Session::put('combined_order_id', $combined_order_id);

        return redirect()->route('checkout.order_confirmed');
    }

    public function getShippingInfo() {
        return view('frontend.shipping_info', [
            'addresses' => Address::ownedByCurrentUser()->get()
        ]);
    }

    public function storeDeliveryInfo(Request $request) {
        dd($request->all());
        $carts = Cart::with(['address', 'product'])->ownedByCurrentUser()->get();
        $shipping_info = $carts->first()->address;

        $tax = 0;
        $shipping = 0;
        $subtotal = 0;

        foreach ($carts->groupBy('shop_id') as $shop_id => $shopCarts) {
            $added_shipping_types = [];

            foreach ($shopCarts as $cart) {
                $product = $cart->product;

                $tax += cart_product_tax($cart, $product, false) * $cart->quantity;
                $subtotal += cart_product_price($cart, $product, false, false) * $cart->quantity;


                if (!isset($added_shipping_types[$cart->shipping_type])) {
                    if (!isset($shipping_costs_by_shop[$shop_id])) {
                        $shipping_costs_by_shop[$shop_id] = 0;
                    }
                    $shipping_costs_by_shop[$shop_id] += $cart->shipping_cost;

                    // Marcar el costo de envío para este tipo como ya agregado para esta tienda
                    $added_shipping_types[$cart->shipping_type] = true;
                }
            }
        }

        // Sumar todos los costos de envío por tienda al total de envío
        $shipping = array_sum($shipping_costs_by_shop);

        $total = $subtotal + $tax + $shipping;

        return view('frontend.payment_select', compact('carts', 'shipping_info', 'total'));
    }

    public function applyCouponCode(Request $request) {
        $coupon = Coupon::where('code', $request->code)->first();
        $response_message = array();

        if ($coupon != null) {
            if (strtotime(date('d-m-Y')) >= $coupon->start_date && strtotime(date('d-m-Y')) <= $coupon->end_date) {
                if (CouponUsage::where('user_id', Auth::user()->id)->where('coupon_id', $coupon->id)->first() == null) {
                    $coupon_details = json_decode($coupon->details);

                    $carts = Cart::where('user_id', Auth::user()->id)
                        ->where('owner_id', $coupon->user_id)
                        ->get();

                    $coupon_discount = 0;

                    if ($coupon->type == 'cart_base') {
                        $subtotal = 0;
                        $tax = 0;
                        $shipping = 0;
                        foreach ($carts as $key => $cartItem) {
                            $product = Product::find($cartItem['product_id']);
                            $subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
                            $tax += cart_product_tax($cartItem, $product, false) * $cartItem['quantity'];
                            $shipping += $cartItem['shipping_cost'];
                        }
                        $sum = $subtotal + $tax + $shipping;
                        if ($sum >= $coupon_details->min_buy) {
                            if ($coupon->discount_type == 'percent') {
                                $coupon_discount = ($sum * $coupon->discount) / 100;
                                if ($coupon_discount > $coupon_details->max_discount) {
                                    $coupon_discount = $coupon_details->max_discount;
                                }
                            } elseif ($coupon->discount_type == 'amount') {
                                $coupon_discount = $coupon->discount;
                            }

                        }
                    } elseif ($coupon->type == 'product_base') {
                        foreach ($carts as $key => $cartItem) {
                            $product = Product::find($cartItem['product_id']);
                            foreach ($coupon_details as $key => $coupon_detail) {
                                if ($coupon_detail->product_id == $cartItem['product_id']) {
                                    if ($coupon->discount_type == 'percent') {
                                        $coupon_discount += (cart_product_price($cartItem, $product, false, false) * $coupon->discount / 100) * $cartItem['quantity'];
                                    } elseif ($coupon->discount_type == 'amount') {
                                        $coupon_discount += $coupon->discount * $cartItem['quantity'];
                                    }
                                }
                            }
                        }
                    }

                    if ($coupon_discount > 0) {
                        Cart::where('user_id', Auth::user()->id)
                            ->where('owner_id', $coupon->user_id)
                            ->update(
                                [
                                    'discount' => $coupon_discount / count($carts),
                                    'coupon_code' => $request->code,
                                    'coupon_applied' => 1
                                ]
                            );
                        $response_message['response'] = 'success';
                        $response_message['message'] = translate('Coupon has been applied');
                    } else {
                        $response_message['response'] = 'warning';
                        $response_message['message'] = translate('This coupon is not applicable to your cart products!');
                    }

                } else {
                    $response_message['response'] = 'warning';
                    $response_message['message'] = translate('You already used this coupon!');
                }
            } else {
                $response_message['response'] = 'warning';
                $response_message['message'] = translate('Coupon expired!');
            }
        } else {
            $response_message['response'] = 'danger';
            $response_message['message'] = translate('Invalid coupon!');
        }

        $carts = Cart::ownedByCurrentUser()->get();
        $shipping_info = Address::where('id', $carts[0]['address_id'])->first();

        $returnHTML = view('frontend.partials.cart_summary', compact('coupon', 'carts', 'shipping_info'))->render();
        return response()->json(array('response_message' => $response_message, 'html' => $returnHTML));
    }

    public function removeCouponCode(Request $request) {
        Cart::where('user_id', Auth::user()->id)
            ->update(
                [
                    'discount' => 0.00,
                    'coupon_code' => '',
                    'coupon_applied' => 0
                ]
            );

        $coupon = Coupon::where('code', $request->code)->first();
        $carts = Cart::where('user_id', Auth::user()->id)
            ->get();

        $shipping_info = Address::where('id', $carts[0]['address_id'])->first();

        return view('frontend.partials.cart_summary', compact('coupon', 'carts', 'shipping_info'));
    }

    public function applyClubPoint(Request $request) {
        if (addon_is_activated('club_point')) {

            $point = $request->point;

            if (Auth::user()->point_balance >= $point) {
                $request->session()->put('club_point', $point);
                flash(translate('Point has been redeemed'))->success();
            } else {
                flash(translate('Invalid point!'))->warning();
            }
        }
        return back();
    }

    public function removeClubPoint(Request $request) {
        $request->session()->forget('club_point');
        return back();
    }

    public function orderConfirmed() {
        $combined_order = CombinedOrder::findOrFail(Session::get('combined_order_id'));
        $isAvailableToWorkshop = false;

        //elimina del cart las compra que se realizo
        Cart::where('user_id', $combined_order->user_id)
            ->delete();

        // Get all children categories From Vehículos and Motocicletas
        $availableCategories = CategoryController::getCategoryWithChildrens(['Vehículos', 'Motocicletas']);

        // Get all children categories From Vehículos and Motocicletas
        $orders = collect();
        $products_to_install = collect();

        $combined_order->orders()->each(function ($order) use ($orders, $availableCategories, &$isAvailableToWorkshop, &$products_to_install) {
            // Check if some product can be installed
            $orderDetails = $order->orderDetails()->get();

            $array['view'] = 'emails.invoice';
            $array['subject'] = 'Tu orden ah sido creada - ' . $order->code;
            $array['from'] = env('MAIL_USERNAME');
            $array['order'] = $order;

            Mail::to(User::find($order->user_id)->email)->bcc($order->shop->user->email)->queue(new InvoiceEmailManager($array));

            foreach ($orderDetails as $orderDetail) {
                // Get the category name of product
                $productName = $orderDetail->product->category->name ?? null;
                if ($productName && $availableCategories->contains($productName)) {
                    $isAvailableToWorkshop = true;
                    $products_to_install->push(
                        [
                            'order_id' => $order->id,
                            'product' => $orderDetail->product
                        ]
                    );
                    break;
                }
            }

            $orders->push($orderDetails);
        });

        return view('frontend.order_confirmed', compact('combined_order', 'orders', 'isAvailableToWorkshop', 'products_to_install'));
    }
}