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/Seller/
Upload File :
Current File : /var/www/devs.lapieza.net/app/Http/Controllers/Seller/OrderController.php
<?php

namespace App\Http\Controllers\Seller;

use App\Models\Order;
use App\Models\ProductStock;
use App\Models\Shop;
use App\Models\SmsTemplate;
use App\Models\User;
use App\Utility\NotificationUtility;
use App\Utility\SmsUtility;
use Auth;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Mpdf\Mpdf;

//use Dompdf\Options;

//use PDF;


class OrderController extends Controller
{
    /**
     * Display a listing of the resource to seller.
     *
     * @return Response
     */
    public function index(Request $request)
    {
        if ($request->payment_status == null) {
            $request->payment_status = 'paid';
        }
        $delivery_status = null;
        $sort_search = null;
        $date_range = null;
        $orders = Order::where('seller_id', Auth::user()->id)
            ->orderBy('id', 'desc')
            ->select('id')
            ->distinct();
        if ($request->payment_status != null) {
            if ($request->payment_status != 'all') {
                $orders = $orders->where('payment_status', $request->payment_status);
            }
            $payment_status = $request->payment_status;
        }
        if ($request->delivery_status != null) {
            $orders = $orders->where('delivery_status', $request->delivery_status);
            $delivery_status = $request->delivery_status;
        }
        if ($request->has('search')) {
            $sort_search = $request->search;
            $orders = $orders->where('code', 'like', '%' . $sort_search . '%');
        }

        if ($request->date_range) {
            $date_range = $request->date_range;
            $date_range1 = explode(" / ", $request->date_range);
            $orders = $orders->where('created_at', '>=', "$date_range1[0] 00:00:00");
            $orders = $orders->where('created_at', '<=', "$date_range1[1] 23:59:59");
        }

        $today = Carbon::today()->toDateString();
        $orders_dia = Order::where('seller_id', Auth::user()->id)
            ->orderBy('id', 'desc')
            ->select('id')
            ->distinct()
            ->where('created_at', '>=', "$today 00:00:00")
            ->where('created_at', '<=', "$today 23:59:59");

        $today_orders = $orders_dia->get();

        $today = Carbon::today();
        $currentMonth = $today->month;
        $currentYear = $today->year;

        $orders_mes = Order::where('seller_id', Auth::user()->id)
            ->orderBy('id', 'desc')
            ->select('id')
            ->distinct()
            ->whereMonth('created_at', $currentMonth)
            ->whereYear('created_at', $currentYear);

        $current_month_orders = $orders_mes->get();

        $orders1 = $orders->get();
        $orders = $orders->paginate(15);

        //dd($orders);
        /*foreach ($orders as $key => $value) {
            $order = Order::find($value->id);
            $order->viewed = 1;
            $order->save();
        }*/

        //$orderDetails = OrderDetail::where('seller_id', Auth::user()->id)->get();

        return view('seller.orders.index', compact('orders', 'orders1', 'today_orders', 'current_month_orders', 'payment_status', 'delivery_status', 'sort_search', 'date_range'));
    }

    public function show($id)
    {
        $order = Order::findOrFail(decrypt($id));
        $order_shipping_address = json_decode($order->shipping_address);
        $delivery_boys = collect();
        if (!is_null($order_shipping_address)) {
            $delivery_boys = User::where('city', $order_shipping_address->city)
                ->where('user_type', 'delivery_boy')
                ->get();
        }
        $order->viewed = 1;
        $order->save();
        return view('seller.orders.show', compact('order', 'delivery_boys'));
    }

    // Update Delivery Status
    public function update_delivery_status(Request $request)
    {
        $order = Order::findOrFail($request->order_id);
        $order->delivery_viewed = '0';
        $order->delivery_status = $request->status;
        $order->save();
        if ($request->status == 'cancelled' && $order->payment_type == 'wallet') {
            $user = User::where('id', $order->user_id)->first();
            $user->balance += $order->grand_total;
            $user->save();
        }
        foreach ($order->orderDetails->where('seller_id', Auth::user()->id) as $key => $orderDetail) {
            $orderDetail->delivery_status = $request->status;
            $orderDetail->save();
            if ($request->status == 'cancelled') {
                $variant = $orderDetail->variation;
                if ($orderDetail->variation == null) {
                    $variant = '';
                }
                $product_stock = ProductStock::where('product_id', $orderDetail->product_id)
                    ->where('variant', $variant)
                    ->first();
                if ($product_stock != null) {
                    $product_stock->qty += $orderDetail->quantity;
                    $product_stock->save();
                }
            }
        }
        if (addon_is_activated('otp_system') && SmsTemplate::where('identifier', 'delivery_status_change')->first()->status == 1) {
            try {
                SmsUtility::delivery_status_change(json_decode($order->shipping_address)->phone, $order);
            } catch (Exception $e) {
            }
        }
        //sends Notifications to user
        NotificationUtility::sendNotification($order, $request->status);
        if (get_setting('google_firebase') == 1 && $order->user->device_token != null) {
            $request->device_token = $order->user->device_token;
            $request->title = "Order updated !";
            $status = str_replace("_", "", $order->delivery_status);
            $request->text = " Your order {$order->code} has been {$status}";
            $request->type = "order";
            $request->id = $order->id;
            $request->user_id = $order->user->id;
            NotificationUtility::sendFirebaseNotification($request);
        }
        if (addon_is_activated('delivery_boy')) {
            if (Auth::user()->user_type == 'delivery_boy') {
                $deliveryBoyController = new DeliveryBoyController;
                $deliveryBoyController->store_delivery_history($order);
            }
        }
        return 1;
    }

    // Update Payment Status
    public function update_payment_status(Request $request)
    {
        $order = Order::findOrFail($request->order_id);
        $order->payment_status_viewed = '0';
        $order->save();
        foreach ($order->orderDetails->where('seller_id', Auth::user()->id) as $key => $orderDetail) {
            $orderDetail->payment_status = $request->status;
            $orderDetail->save();
        }
        $status = 'paid';
        foreach ($order->orderDetails as $key => $orderDetail) {
            if ($orderDetail->payment_status != 'paid') {
                $status = 'unpaid';
            }
        }
        $order->payment_status = $status;
        $order->save();
        if ($order->payment_status == 'paid' && $order->commission_calculated == 0) {
            calculateCommissionAffilationClubPoint($order);
        }
        //sends Notifications to user
        NotificationUtility::sendNotification($order, $request->status);
        if (get_setting('google_firebase') == 1 && $order->user->device_token != null) {
            $request->device_token = $order->user->device_token;
            $request->title = "Order updated !";
            $status = str_replace("_", "", $order->payment_status);
            $request->text = " Your order {$order->code} has been {$status}";
            $request->type = "order";
            $request->id = $order->id;
            $request->user_id = $order->user->id;
            NotificationUtility::sendFirebaseNotification($request);
        }
        if (addon_is_activated('otp_system') && SmsTemplate::where('identifier', 'payment_status_change')->first()->status == 1) {
            try {
                SmsUtility::payment_status_change(json_decode($order->shipping_address)->phone, $order);
            } catch (Exception $e) {
            }
        }
        return 1;
    }

    public function generatePDF(Request $request)
{
    try {
        $ordersIds = $request->input('orders');
        $seller = Shop::where('user_id', Auth::user()->id)->first();
        
        if (!$seller) {
            throw new Exception('Vendedor no encontrado');
        }

        $total = 0;
        $total_venta = 0;
        $tax = 0;
        $descuento = 0;
        $shipping_cost = 0;
        $orderDetails = collect();
        $processedOrderDetailIds = collect();
        $processedOrderIdsForShipping = collect();

        // Get orders based on the request type
        if ($ordersIds == 'dia') {
            $today = Carbon::today();
            $orders = Order::where('seller_id', Auth::user()->id)
                ->where('payment_status', 'paid')
                ->whereDate('created_at', $today)
                ->get();
            $fecha = $today;
        } elseif ($ordersIds == 'mes') {
            $today = Carbon::today();
            $orders = Order::where('seller_id', Auth::user()->id)
                ->where('payment_status', 'paid')
                ->whereYear('created_at', $today->year)
                ->whereMonth('created_at', $today->month)
                ->get();
            $fecha = $today;
        } else {
            $orders = Order::whereIn('id', (array)$ordersIds)
                ->where('seller_id', Auth::user()->id)
                ->where('payment_status', 'paid')
                ->get();
            $fecha = $request->input('fecha', now());
        }

        // Process orders
        foreach ($orders as $order) {
            $total_venta += $order->grand_total;

            foreach ($order->orderDetails as $orderDetail) {
                if (!$processedOrderDetailIds->contains($orderDetail->id)) {
                    $total += $orderDetail->price;
                    
                    if (!$processedOrderIdsForShipping->contains($order->id)) {
                        $shipping_cost += $orderDetail->shipping_cost;
                        $processedOrderIdsForShipping->push($order->id);
                    }
                    
                    $tax += $orderDetail->tax;
                    $descuento += $orderDetail->cupon_discount;
                    $orderDetails->push($orderDetail);
                    $processedOrderDetailIds->push($orderDetail->id);
                }
            }
        }

        // Prepare data for PDF
        $data = $orders->map(function ($order) {
            return [
                'code' => $order->code,
                'price' => $order->grand_total,
                'date' => $order->created_at->format('Y-m-d'),
            ];
        });

        // Debug information
        \Log::info('PDF Generation Data', [
            'orders_count' => $orders->count(),
            'data_count' => $data->count(),
            'total' => $total,
            'shipping_cost' => $shipping_cost,
            'tax' => $tax
        ]);

        // Generate PDF
        $mpdf = new Mpdf([
            'margin_left' => 10,
            'margin_right' => 10,
            'margin_top' => 10,
            'margin_bottom' => 10,
        ]);

        $html = view('pdf.order', compact(
            'data',
            'total',
            'seller',
            'fecha',
            'descuento',
            'tax',
            'total_venta',
            'shipping_cost'
        ))->render();

        $mpdf->WriteHTML($html);

        return response($mpdf->Output('orders_report.pdf', 'I'))
            ->header('Content-Type', 'application/pdf')
            ->header('Content-Disposition', 'inline; filename="orders_report.pdf"');

    } catch (Exception $e) {
        \Log::error('PDF Generation Error: ' . $e->getMessage());
        return response()->json(['error' => 'Error al generar el PDF: ' . $e->getMessage()], 500);
    }
}
}