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.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Api\V2\Delivery\PedidosYaController;
use App\Http\Controllers\NfcVouchersController;
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\NfcVoucher;
use App\Models\Product;
use App\Models\Order;
use App\Models\User;
use App\Utility\NotificationUtility;
use Auth;
use Illuminate\Http\Request;
use Mail;
use Session;
use Illuminate\Support\Facades\Log;
use App\Models\DeliveryService;


class CheckoutController extends Controller
{
    public function checkout(Request $request)
    {
        // Minumum order amount check...
        if ($request->payment_option != null) {
            // Guardar la orden y obtener el objeto combined_order
            $combined_order = (new OrderController)->store($request);
            $combined_order_id = $combined_order->id;

            // Actualizar la sesión con el ID correcto
            $request->session()->put('combined_order_id', $combined_order_id);
            $request->session()->put('payment_type', 'cart_payment');

            $data['combined_order_id'] = $combined_order_id;
            $request->session()->put('payment_data', $data);

            Log::info('Combined order ID después de store: ' . $combined_order_id);

            // Resto del código igual
            if ($combined_order_id != null) {
                $decorator = __NAMESPACE__ . '\\Payment\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $request->payment_option))) . "Controller";
                Log::info('Verificando decorador: ' . $decorator);

                if (class_exists($decorator)) {
                    Log::info('Usando decorador: ' . $decorator);
                    return (new $decorator)->pay($request);
                } else {
                    Log::info('Usando makeManualPaymet');
                    return $this->makeManualPaymet($request);
                }
            } else {
                Log::error('No se pudo obtener combined_order_id después de store');
                flash(translate('Error al procesar su orden.'))->error();
                return redirect()->route('home');
            }
        } else {
            flash(translate('Select Payment Option.'))->warning();
            return back();
        }
    }

    public function makeManualPaymet(Request $request)
{
    try {
        Log::info('Ejecutando makeManualPaymet');
        $combined_order_id = $request->session()->get('combined_order_id');
        Log::info('Combined order ID en makeManualPaymet: ' . $combined_order_id);
        
        if (!$combined_order_id) {
            Log::error('No hay combined_order_id en la sesión');
            flash(translate('No se pudo encontrar la información de su orden.'))->error();
            return redirect()->route('home');
        }
        
        $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');

        // Actualizar el estado de pago de las órdenes
        Order::whereIn('id', $orderIds)->update([
            'manual_payment' => true,
            'manual_payment_data' => json_encode($manual_payment_data),
        ]);

        $orders = Order::whereIn('id', $orderIds)->get();
        $order = $orders->first(); // Solo para notificación

        NotificationUtility::sendOrderPlacedNotification($order, 'Pendiente por verificar');
        
        // Asegurarse de que la sesión tenga el combined_order_id para orderConfirmed
        Session::put('combined_order_id', $combined_order_id);

        flash(translate('Su orden ha sido realizada exitosamente. Por favor, envíe información de pago desde el historial de compras'))->success();

        Log::info('Redireccionando a checkout.order_confirmed desde makeManualPaymet');
        
        // Usar return para asegurarse de que la ejecución termine aquí
        return redirect()->route('checkout.order_confirmed');
    } catch (\Exception $e) {
        Log::error('Error en makeManualPaymet: ' . $e->getMessage());
        Log::error($e->getTraceAsString());
        flash(translate('Error al procesar su orden: ') . $e->getMessage())->error();
        return redirect()->route('home');
    }
}

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

            // Logging para debug
            \Log::info('Processing checkout_done for order: ' . $combined_order_id);

            $response = PedidosYaController::confirmShipping(
                session()->get('estimateId'),
                session()->get('deliveryOfferId')
            );

            $ncfData = NfcVouchersController::updateNfcOrder();
            $deliveryService = DeliveryService::create([
                'delivery_company' => session()->get('shippingType'),
                'py_info' => json_encode($response)
            ]);
            $deliveryService = DeliveryService::create([
                'delivery_company' => session()->get('shippingType'),
                'py_info' => json_encode($response)
            ]);

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

                $order->orderDetails()->each(function ($orderDetail) use ($deliveryService) {
                    $orderDetail->update([
                        'payment_status' => 'paid',
                        'delivery_service_id' => $deliveryService->id
                    ]);
                });
            }

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

            // Logging exitoso
            \Log::info('Checkout completed successfully for order: ' . $combined_order_id);

            return redirect()->route('checkout.order_confirmed')->with('success', 'Order processed successfully');
        } catch (\Exception $e) {
            // Log el error
            \Log::error('Error in checkout_done: ' . $e->getMessage());
            \Log::error($e->getTraceAsString());

            return redirect()->route('home')->with('error', 'There was an error processing your order.');
        }
    }

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

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

        $tax = 0;
        $shipping = 0;
        $subtotal = 0;
        $added_shipping_costs = [];

        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()
{
    try {
        $combined_order_id = Session::get('combined_order_id');
        Log::info('Ejecutando orderConfirmed para combined_order_id: ' . $combined_order_id);
        
        if (!$combined_order_id) {
            Log::error('No se encontró combined_order_id en la sesión en orderConfirmed');
            flash(translate('No se pudo encontrar la información de su orden.'))->error();
            return redirect()->route('home');
        }

        $combined_order = CombinedOrder::findOrFail($combined_order_id);

        $isAvailableToWorkshop = false;

        // Elimina del cart las compras que se realizaron
        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();

            try {
                $array['view'] = 'emails.invoice';
                $array['subject'] = 'Tu orden ha 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)
                    ->send(new InvoiceEmailManager($array));
            } catch (\Exception $e) {
                Log::error('Error al enviar email de confirmación: ' . $e->getMessage());
                // No interrumpir el flujo por un error de correo
            }

            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);
        });

        Log::info('orderConfirmed ejecutado correctamente. Mostrando vista de confirmación.');
        return view('frontend.order_confirmed', compact('combined_order', 'orders', 'isAvailableToWorkshop', 'products_to_install'));
    } catch (\Exception $e) {
        Log::error('Error en orderConfirmed: ' . $e->getMessage());
        Log::error($e->getTraceAsString());
        flash(translate('Error al mostrar la información de su orden.'))->error();
        return redirect()->route('home');
    }
}
    // public function orderConfirmed()
    // {
    //     try {

    //         $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)->send(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'));
    //     } catch (\Exception $e) {
    //         \Log::error('Error in orderConfirmed: ' . $e->getMessage());
    //         return redirect()->route('home')->with('error', 'There was an error displaying your order.');
    //     }
    // }
}