403Webshell
Server IP : 14.225.204.176  /  Your IP : 216.73.216.252
Web Server : nginx/1.24.0
System : Linux nodejs-ybgk 6.8.0-40-generic #40-Ubuntu SMP PREEMPT_DYNAMIC Fri Jul 5 10:34:03 UTC 2024 x86_64
User : root ( 0)
PHP Version : 8.1.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/php/thanhphuong/app/Http/Controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/php/thanhphuong/app/Http/Controllers/ReportController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;
use App\ProductPurchase;
use App\Product_Sale;
use App\ProductQuotation;
use App\Sale;
use App\Purchase;
use App\Quotation;
use App\Transfer;
use Illuminate\Support\Collection;
use App\Returns;
use App\ProductReturn;
use App\ReturnPurchase;
use App\ProductTransfer;
use App\PurchaseProductReturn;
use App\Payment;
use App\Warehouse;
use App\Product_Warehouse;
use App\Expense;
use App\Payroll;
use App\User;
use App\Unit;
use App\Customer;
use App\Supplier;
use App\Variant;
use App\Biller;
use App\ProductVariant;
use App\ProductWarranty;
use App\Warranty;
use DB;
use Carbon\Carbon;
use Auth;use App\PosSetting;use App\GiftCard;use App\Account;use App\GeneralSetting;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class ReportController extends Controller
{

    public function productQuantityAlert()
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('product-qty-alert')){
            $lims_product_data = Product::select('name','code', 'image', 'qty', 'alert_quantity')->where('is_active', true)->whereColumn('alert_quantity', '>', 'qty')->get();
            return view('report.qty_alert_report', compact('lims_product_data'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function warehouseStock()
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('warehouse-stock-report')){
            $total_item = DB::table('product_warehouse')
                        ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                        ->where([
                            ['products.is_active', true],
                            ['product_warehouse.qty', '>' , 0]
                        ])->count();

            $total_qty = Product::where('is_active', true)->sum('qty');
            $total_price = DB::table('products')->where('is_active', true)->sum(DB::raw('price * qty'));
            $total_cost = DB::table('products')->where('is_active', true)->sum(DB::raw('cost * qty'));
            $lims_warehouse_list = Warehouse::where('is_active', true)->get();
            $warehouse_id = 0;
            return view('report.warehouse_stock', compact('total_item', 'total_qty', 'total_price', 'total_cost', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function warehouseStockById(Request $request)
    {
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();

        $total_item = DB::table('product_warehouse')
                        ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                        ->where([
                            ['products.is_active', true],
                            ['product_warehouse.qty', '>' , 0],
                            ['product_warehouse.warehouse_id', $data['warehouse_id']]
                        ])->count();
        $total_qty = DB::table('product_warehouse')
                        ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                        ->where([
                            ['products.is_active', true],
                            ['product_warehouse.warehouse_id', $data['warehouse_id']]
                        ])->sum('product_warehouse.qty');
        $total_price = DB::table('product_warehouse')
                        ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                        ->where([
                            ['products.is_active', true],
                            ['product_warehouse.warehouse_id', $data['warehouse_id']]
                        ])->sum(DB::raw('products.price * product_warehouse.qty'));
        $total_cost = DB::table('product_warehouse')
                        ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                        ->where([
                            ['products.is_active', true],
                            ['product_warehouse.warehouse_id', $data['warehouse_id']]
                        ])->sum(DB::raw('products.cost * product_warehouse.qty'));
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        $warehouse_id = $data['warehouse_id'];
        return view('report.warehouse_stock', compact('total_item', 'total_qty', 'total_price', 'total_cost', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function dailySale($year, $month)
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('daily-sale')){
            $start = 1;
            $number_of_day = cal_days_in_month(CAL_GREGORIAN,$month,$year);
            while($start <= $number_of_day)
            {
                if($start < 10)
                    $date = $year.'-'.$month.'-0'.$start;
                else
                    $date = $year.'-'.$month.'-'.$start;
                $query1 = array(
                    'SUM(total_discount) AS total_discount',
                    'SUM(order_discount) AS order_discount',
                    'SUM(total_tax) AS total_tax',
                    'SUM(order_tax) AS order_tax',
                    'SUM(shipping_cost) AS shipping_cost',
                    'SUM(grand_total) AS grand_total'
                );
                $sale_data = Sale::whereDate('created_at', $date)->selectRaw(implode(',', $query1))->get();
                $total_discount[$start] = $sale_data[0]->total_discount;
                $order_discount[$start] = $sale_data[0]->order_discount;
                $total_tax[$start] = $sale_data[0]->total_tax;
                $order_tax[$start] = $sale_data[0]->order_tax;
                $shipping_cost[$start] = $sale_data[0]->shipping_cost;
                $grand_total[$start] = $sale_data[0]->grand_total;
                $start++;
            }
            $start_day = date('w', strtotime($year.'-'.$month.'-01')) + 1;
            $prev_year = date('Y', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
            $prev_month = date('m', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
            $next_year = date('Y', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
            $next_month = date('m', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
            $lims_warehouse_list = Warehouse::where('is_active', true)->get();
            $warehouse_id = 0;
            return view('report.daily_sale', compact('total_discount','order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'start_day', 'year', 'month', 'number_of_day', 'prev_year', 'prev_month', 'next_year', 'next_month', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function dailySaleByWarehouse(Request $request,$year,$month)
    {
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();
        $start = 1;
        $number_of_day = cal_days_in_month(CAL_GREGORIAN,$month,$year);
        while($start <= $number_of_day)
        {
            if($start < 10)
                $date = $year.'-'.$month.'-0'.$start;
            else
                $date = $year.'-'.$month.'-'.$start;
            $query1 = array(
                'SUM(total_discount) AS total_discount',
                'SUM(order_discount) AS order_discount',
                'SUM(total_tax) AS total_tax',
                'SUM(order_tax) AS order_tax',
                'SUM(shipping_cost) AS shipping_cost',
                'SUM(grand_total) AS grand_total'
            );
            $sale_data = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', $date)->selectRaw(implode(',', $query1))->get();
            $total_discount[$start] = $sale_data[0]->total_discount;
            $order_discount[$start] = $sale_data[0]->order_discount;
            $total_tax[$start] = $sale_data[0]->total_tax;
            $order_tax[$start] = $sale_data[0]->order_tax;
            $shipping_cost[$start] = $sale_data[0]->shipping_cost;
            $grand_total[$start] = $sale_data[0]->grand_total;
            $start++;
        }
        $start_day = date('w', strtotime($year.'-'.$month.'-01')) + 1;
        $prev_year = date('Y', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
        $prev_month = date('m', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
        $next_year = date('Y', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
        $next_month = date('m', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        $warehouse_id = $data['warehouse_id'];
        return view('report.daily_sale', compact('total_discount','order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'start_day', 'year', 'month', 'number_of_day', 'prev_year', 'prev_month', 'next_year', 'next_month', 'lims_warehouse_list', 'warehouse_id'));

    }

    public function dailyPurchase($year, $month)
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('daily-purchase')){
            $start = 1;
            $number_of_day = cal_days_in_month(CAL_GREGORIAN,$month,$year);
            while($start <= $number_of_day)
            {
                if($start < 10)
                    $date = $year.'-'.$month.'-0'.$start;
                else
                    $date = $year.'-'.$month.'-'.$start;
                $query1 = array(
                    'SUM(total_discount) AS total_discount',
                    'SUM(order_discount) AS order_discount',
                    'SUM(total_tax) AS total_tax',
                    'SUM(order_tax) AS order_tax',
                    'SUM(shipping_cost) AS shipping_cost',
                    'SUM(grand_total) AS grand_total'
                );
                $purchase_data = Purchase::whereDate('created_at', $date)->selectRaw(implode(',', $query1))->get();
                $total_discount[$start] = $purchase_data[0]->total_discount;
                $order_discount[$start] = $purchase_data[0]->order_discount;
                $total_tax[$start] = $purchase_data[0]->total_tax;
                $order_tax[$start] = $purchase_data[0]->order_tax;
                $shipping_cost[$start] = $purchase_data[0]->shipping_cost;
                $grand_total[$start] = $purchase_data[0]->grand_total;
                $start++;
            }
            $start_day = date('w', strtotime($year.'-'.$month.'-01')) + 1;
            $prev_year = date('Y', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
            $prev_month = date('m', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
            $next_year = date('Y', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
            $next_month = date('m', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
            $lims_warehouse_list = Warehouse::where('is_active', true)->get();
            $warehouse_id = 0;
            return view('report.daily_purchase', compact('total_discount','order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'start_day', 'year', 'month', 'number_of_day', 'prev_year', 'prev_month', 'next_year', 'next_month', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function dailyPurchaseByWarehouse(Request $request, $year, $month)
    {        
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();
        $start = 1;
        $number_of_day = cal_days_in_month(CAL_GREGORIAN,$month,$year);
        while($start <= $number_of_day)
        {
            if($start < 10)
                $date = $year.'-'.$month.'-0'.$start;
            else
                $date = $year.'-'.$month.'-'.$start;
            $query1 = array(
                'SUM(total_discount) AS total_discount',
                'SUM(order_discount) AS order_discount',
                'SUM(total_tax) AS total_tax',
                'SUM(order_tax) AS order_tax',
                'SUM(shipping_cost) AS shipping_cost',
                'SUM(grand_total) AS grand_total'
            );
            $purchase_data = Purchase::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', $date)->selectRaw(implode(',', $query1))->get();
            $total_discount[$start] = $purchase_data[0]->total_discount;
            $order_discount[$start] = $purchase_data[0]->order_discount;
            $total_tax[$start] = $purchase_data[0]->total_tax;
            $order_tax[$start] = $purchase_data[0]->order_tax;
            $shipping_cost[$start] = $purchase_data[0]->shipping_cost;
            $grand_total[$start] = $purchase_data[0]->grand_total;
            $start++;
        }
        $start_day = date('w', strtotime($year.'-'.$month.'-01')) + 1;
        $prev_year = date('Y', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
        $prev_month = date('m', strtotime('-1 month', strtotime($year.'-'.$month.'-01')));
        $next_year = date('Y', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
        $next_month = date('m', strtotime('+1 month', strtotime($year.'-'.$month.'-01')));
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        $warehouse_id = $data['warehouse_id'];

        return view('report.daily_purchase', compact('total_discount','order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'start_day', 'year', 'month', 'number_of_day', 'prev_year', 'prev_month', 'next_year', 'next_month', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function monthlySale($year)
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('monthly-sale')){
            $start = strtotime($year .'-01-01');
            $end = strtotime($year .'-12-31');
            while($start <= $end)
            {
                $start_date = $year . '-'. date('m', $start).'-'.'01';
                $end_date = $year . '-'. date('m', $start).'-'.'31';

                $temp_total_discount = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_discount');
                $total_discount[] = number_format((float)$temp_total_discount, 0, '.', '');

                $temp_order_discount = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('order_discount');
                $order_discount[] = number_format((float)$temp_order_discount, 0, '.', '');

                $temp_total_tax = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_tax');
                $total_tax[] = number_format((float)$temp_total_tax, 0, '.', '');

                $temp_order_tax = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('order_tax');
                $order_tax[] = number_format((float)$temp_order_tax, 0, '.', '');

                $temp_shipping_cost = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('shipping_cost');
                $shipping_cost[] = number_format((float)$temp_shipping_cost, 0, '.', '');

                $temp_total = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('grand_total');
                $total[] = number_format((float)$temp_total, 0, '.', '');
                $start = strtotime("+1 month", $start);
            }
            $lims_warehouse_list = Warehouse::where('is_active',true)->get();
            $warehouse_id = 0;
            return view('report.monthly_sale', compact('year', 'total_discount', 'order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'total', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function monthlySaleByWarehouse(Request $request, $year)
    {
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();

        $start = strtotime($year .'-01-01');
        $end = strtotime($year .'-12-31');
        while($start <= $end)
        {
            $start_date = $year . '-'. date('m', $start).'-'.'01';
            $end_date = $year . '-'. date('m', $start).'-'.'31';

            $temp_total_discount = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_discount');
            $total_discount[] = number_format((float)$temp_total_discount, 0, '.', '');

            $temp_order_discount = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('order_discount');
            $order_discount[] = number_format((float)$temp_order_discount, 0, '.', '');

            $temp_total_tax = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_tax');
            $total_tax[] = number_format((float)$temp_total_tax, 0, '.', '');

            $temp_order_tax = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('order_tax');
            $order_tax[] = number_format((float)$temp_order_tax, 0, '.', '');

            $temp_shipping_cost = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('shipping_cost');
            $shipping_cost[] = number_format((float)$temp_shipping_cost, 0, '.', '');

            $temp_total = Sale::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('grand_total');
            $total[] = number_format((float)$temp_total, 0, '.', '');
            $start = strtotime("+1 month", $start);
        }
        $lims_warehouse_list = Warehouse::where('is_active',true)->get();
        $warehouse_id = $data['warehouse_id'];
        return view('report.monthly_sale', compact('year', 'total_discount', 'order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'total', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function monthlyPurchase($year)
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('monthly-purchase')){
            $start = strtotime($year .'-01-01');
            $end = strtotime($year .'-12-31');
            while($start <= $end)
            {
                $start_date = $year . '-'. date('m', $start).'-'.'01';
                $end_date = $year . '-'. date('m', $start).'-'.'31';

                $query1 = array(
                    'SUM(total_discount) AS total_discount',
                    'SUM(order_discount) AS order_discount',
                    'SUM(total_tax) AS total_tax',
                    'SUM(order_tax) AS order_tax',
                    'SUM(shipping_cost) AS shipping_cost',
                    'SUM(grand_total) AS grand_total'
                );
                $purchase_data = Purchase::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query1))->get();
                
                $total_discount[] = number_format((float)$purchase_data[0]->total_discount, 0, '.', '');
                $order_discount[] = number_format((float)$purchase_data[0]->order_discount, 0, '.', '');
                $total_tax[] = number_format((float)$purchase_data[0]->total_tax, 0, '.', '');
                $order_tax[] = number_format((float)$purchase_data[0]->order_tax, 0, '.', '');
                $shipping_cost[] = number_format((float)$purchase_data[0]->shipping_cost, 0, '.', '');
                $grand_total[] = number_format((float)$purchase_data[0]->grand_total, 0, '.', '');
                $start = strtotime("+1 month", $start);
            }
            $lims_warehouse_list = Warehouse::where('is_active', true)->get();
            $warehouse_id = 0;
            return view('report.monthly_purchase', compact('year', 'total_discount', 'order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function monthlyPurchaseByWarehouse(Request $request, $year)
    {
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();

        $start = strtotime($year .'-01-01');
        $end = strtotime($year .'-12-31');
        while($start <= $end)
        {
            $start_date = $year . '-'. date('m', $start).'-'.'01';
            $end_date = $year . '-'. date('m', $start).'-'.'31';

            $query1 = array(
                'SUM(total_discount) AS total_discount',
                'SUM(order_discount) AS order_discount',
                'SUM(total_tax) AS total_tax',
                'SUM(order_tax) AS order_tax',
                'SUM(shipping_cost) AS shipping_cost',
                'SUM(grand_total) AS grand_total'
            );
            $purchase_data = Purchase::where('warehouse_id', $data['warehouse_id'])->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query1))->get();
            
            $total_discount[] = number_format((float)$purchase_data[0]->total_discount, 0, '.', '');
            $order_discount[] = number_format((float)$purchase_data[0]->order_discount, 0, '.', '');
            $total_tax[] = number_format((float)$purchase_data[0]->total_tax, 0, '.', '');
            $order_tax[] = number_format((float)$purchase_data[0]->order_tax, 0, '.', '');
            $shipping_cost[] = number_format((float)$purchase_data[0]->shipping_cost, 0, '.', '');
            $grand_total[] = number_format((float)$purchase_data[0]->grand_total, 0, '.', '');
            $start = strtotime("+1 month", $start);
        }
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        $warehouse_id = $data['warehouse_id'];
        return view('report.monthly_purchase', compact('year', 'total_discount', 'order_discount', 'total_tax', 'order_tax', 'shipping_cost', 'grand_total', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function bestSeller()
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('best-seller')){
            $start = strtotime(date("Y-m", strtotime("-2 months")).'-01');
            $end = strtotime(date("Y").'-'.date("m").'-31');
            
            while($start <= $end)
            {
                $start_date = date("Y-m", $start).'-'.'01';
                $end_date = date("Y-m", $start).'-'.'31';

                $best_selling_qty = Product_Sale::select(DB::raw('product_id, sum(qty) as sold_qty'))->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->groupBy('product_id')->orderBy('sold_qty', 'desc')->take(1)->get();
                if(!count($best_selling_qty)){
                    $product[] = '';
                    $sold_qty[] = 0;
                }
                foreach ($best_selling_qty as $best_seller) {
                    $product_data = Product::find($best_seller->product_id);
                    $product[] = $product_data->name.': '.$product_data->code;
                    $sold_qty[] = $best_seller->sold_qty;
                }
                $start = strtotime("+1 month", $start);
            }
            $start_month = date("F Y", strtotime('-2 month'));
            $lims_warehouse_list = Warehouse::where('is_active', true)->get();
            $warehouse_id = 0;
            return view('report.best_seller', compact('product', 'sold_qty', 'start_month', 'lims_warehouse_list', 'warehouse_id'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }

    public function bestSellerByWarehouse(Request $request)
    {
        $data = $request->all();
        if($data['warehouse_id'] == 0)
            return redirect()->back();

        $start = strtotime(date("Y-m", strtotime("-2 months")).'-01');
        $end = strtotime(date("Y").'-'.date("m").'-31');

        while($start <= $end)
        {
            $start_date = date("Y-m", $start).'-'.'01';
            $end_date = date("Y-m", $start).'-'.'31';

            $best_selling_qty = DB::table('sales')
                                ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')->select(DB::raw('product_sales.product_id, sum(product_sales.qty) as sold_qty'))->where('sales.warehouse_id', $data['warehouse_id'])->whereDate('sales.created_at', '>=' , $start_date)->whereDate('sales.created_at', '<=' , $end_date)->groupBy('product_id')->orderBy('sold_qty', 'desc')->take(1)->get();
                                
            if(!count($best_selling_qty)) {
                $product[] = '';
                $sold_qty[] = 0;
            }
            foreach ($best_selling_qty as $best_seller) {
                $product_data = Product::find($best_seller->product_id);
                $product[] = $product_data->name.': '.$product_data->code;
                $sold_qty[] = $best_seller->sold_qty;
            }
            $start = strtotime("+1 month", $start);
        }
        $start_month = date("F Y", strtotime('-2 month'));
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        $warehouse_id = $data['warehouse_id'];
        return view('report.best_seller', compact('product', 'sold_qty', 'start_month', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function profitLoss(Request $request)
    {
        $start_date = $request['start_date'];
        $end_date = $request['end_date'];
        $query1 = array(
            'SUM(grand_total) AS grand_total',
            'SUM(paid_amount) AS paid_amount',
            'SUM(total_tax + order_tax) AS tax'
        );
        $query2 = array(
            'SUM(grand_total) AS grand_total',
            'SUM(total_tax + order_tax) AS tax'
        );
        $purchase = Purchase::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query1))->get();
        $total_purchase = Purchase::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $sale = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query1))->get();
        $total_sale = Sale::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $return = Returns::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
        $total_return = Returns::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $purchase_return = ReturnPurchase::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
        $total_purchase_return = ReturnPurchase::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $expense = Expense::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('amount');
        $total_expense = Expense::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $payroll = Payroll::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('amount');
        $total_payroll = Payroll::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
        $total_item = DB::table('product_warehouse')
                    ->join('products', 'product_warehouse.product_id', '=', 'products.id')
                    ->where([
                        ['products.is_active', true],
                        ['product_warehouse.qty', '>' , 0]
                    ])->count();
        $payment_recieved_number = DB::table('payments')->whereNotNull('sale_id')->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)->count();
        $payment_recieved = DB::table('payments')->whereNotNull('sale_id')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('payments.amount');
        $credit_card_payment_sale = DB::table('payments')
                            ->where('paying_method', 'Credit Card')
                            ->whereNotNull('payments.sale_id')
                            ->whereDate('payments.created_at', '>=' , $start_date)
                            ->whereDate('payments.created_at', '<=' , $end_date)->sum('payments.amount');
        $cheque_payment_sale = DB::table('payments')
                            ->where('paying_method', 'Cheque')
                            ->whereNotNull('payments.sale_id')
                            ->whereDate('payments.created_at', '>=' , $start_date)
                            ->whereDate('payments.created_at', '<=' , $end_date)->sum('payments.amount');
        $gift_card_payment_sale = DB::table('payments')
                            ->where('paying_method', 'Gift Card')
                            ->whereNotNull('sale_id')
                            ->whereDate('created_at', '>=' , $start_date)
                            ->whereDate('created_at', '<=' , $end_date)
                            ->sum('amount');
        $paypal_payment_sale = DB::table('payments')
                            ->where('paying_method', 'Paypal')
                            ->whereNotNull('sale_id')
                            ->whereDate('created_at', '>=' , $start_date)
                            ->whereDate('created_at', '<=' , $end_date)
                            ->sum('amount');
        $deposit_payment_sale = DB::table('payments')
                            ->where('paying_method', 'Deposit')
                            ->whereNotNull('sale_id')
                            ->whereDate('created_at', '>=' , $start_date)
                            ->whereDate('created_at', '<=' , $end_date)
                            ->sum('amount');
        $cash_payment_sale =  $payment_recieved - $credit_card_payment_sale - $cheque_payment_sale - $gift_card_payment_sale - $paypal_payment_sale - $deposit_payment_sale;
        $payment_sent_number = DB::table('payments')->whereNotNull('purchase_id')->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)->count();
        $payment_sent = DB::table('payments')->whereNotNull('purchase_id')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('payments.amount');
        $credit_card_payment_purchase = DB::table('payments')
                            ->where('paying_method', 'Gift Card')
                            ->whereNotNull('payments.purchase_id')
                            ->whereDate('payments.created_at', '>=' , $start_date)
                            ->whereDate('payments.created_at', '<=' , $end_date)->sum('payments.amount');
        $cheque_payment_purchase = DB::table('payments')
                            ->where('paying_method', 'Cheque')
                            ->whereNotNull('payments.purchase_id')
                            ->whereDate('payments.created_at', '>=' , $start_date)
                            ->whereDate('payments.created_at', '<=' , $end_date)->sum('payments.amount');
        $cash_payment_purchase =  $payment_sent - $credit_card_payment_purchase - $cheque_payment_purchase;
        $lims_warehouse_all = Warehouse::where('is_active',true)->get();
        $warehouse_name = [];
        foreach ($lims_warehouse_all as $warehouse) {
            $warehouse_name[] = $warehouse->name;
            $warehouse_sale[] = Sale::where('warehouse_id', $warehouse->id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
            $warehouse_purchase[] = Purchase::where('warehouse_id', $warehouse->id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
            $warehouse_return[] = Returns::where('warehouse_id', $warehouse->id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
            $warehouse_purchase_return[] = ReturnPurchase::where('warehouse_id', $warehouse->id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->selectRaw(implode(',', $query2))->get();
            $warehouse_expense[] = Expense::where('warehouse_id', $warehouse->id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('amount');
        }

        return view('report.profit_loss', compact('purchase', 'total_purchase', 'sale', 'total_sale', 'return', 'purchase_return', 'total_return', 'total_purchase_return', 'expense', 'payroll', 'total_expense', 'total_payroll', 'payment_recieved', 'payment_recieved_number', 'cash_payment_sale', 'cheque_payment_sale', 'credit_card_payment_sale', 'gift_card_payment_sale', 'paypal_payment_sale', 'deposit_payment_sale', 'payment_sent', 'payment_sent_number', 'cash_payment_purchase', 'cheque_payment_purchase', 'credit_card_payment_purchase', 'warehouse_name', 'warehouse_sale', 'warehouse_purchase', 'warehouse_return', 'warehouse_purchase_return', 'warehouse_expense', 'start_date', 'end_date'));
    }

    public function productReport(Request $request)
    {
        $data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $warehouse_id = $data['warehouse_id'];
        $product_id = [];
        $product_code = [];
        $variant_id = [];
        $product_name = [];
        $product_qty = [];
        $warehouse_name = "Tất cả kho";
        if($warehouse_id != 0){
            $warehouse_name = Warehouse::find($warehouse_id)->name;
        }
        
        $lims_product_all = Product::select('id', 'code', 'name', 'qty', 'is_variant')
            ->where('is_active', true)
            ->get();
            
        $lims_product_data = [];
        foreach ($lims_product_all as $product) {
            if($product->is_variant){
                $product_variant_data = ProductVariant::where('product_id', $product->id)->get();
                foreach ($product_variant_data as $key => $product_variant) {
                    $variant_data = Variant::find($product_variant->variant_id);
                    $product_variant->product_name = $variant_data->name;
                    $product_variant->product_code = $product_variant->item_code;
                    array_push($lims_product_data, $product_variant);
                }
            } else {
                $product->variant_id = null;
                $product->product_id = $product->id;
                $product->product_name = $product->name;
                $product->product_code = $product->code;
                array_push($lims_product_data, $product);
            }
        }

        $lims_data = array();
        foreach ($lims_product_data as $key => $product) { 
            $product_purchase_data = [];
            $product_sale_data = [];
            $purchased_cost = 0;

            $begin_product_purchase_data = [];
            $begin_product_sale_data = [];
            $begin_purchased_cost = 0;
            $begin_sold_price = 0;

            if($warehouse_id == 0){
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.qty', 'product_purchases.purchase_unit_id', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
                
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->whereNull('sales.method')                  
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
               
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            } else {
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            }

            $purchased_qty = 0;
            $unit_name = '';
            $sold_qty = 0;
            $created_at = '';
            $profit_unit = 0;
            $total_purchased_amount = 0;

            $begin_purchased_qty = 0;
            $begin_sold_qty = 0;
            $begin_inventory_qty = 0;
            $begin_inventory_amount = 0;
            $end_inventory_qty = 0;
            $end_inventory_amount = 0;
            
            foreach ($product_purchase_data as $product_purchase) {
                $created_at = $product_purchase->created_at;
                $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                if($unit->operator == '*'){
                    $purchased_qty += $product_purchase->qty * $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
                elseif($unit->operator == '/'){
                    $purchased_qty += $product_purchase->qty / $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
            }
            
            foreach ($product_sale_data as $product_sale) {
                $created_at = $product_sale->created_at;
                $unit = DB::table('units')->find($product_sale->sale_unit_id);
                if($unit){
                    if($unit->operator == '*'){
                        $sold_qty += $product_sale->qty * $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                        
                    elseif($unit->operator == '/'){
                        $sold_qty += $product_sale->qty / $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                }
                else
                    $sold_qty += $product_sale->qty;
            }
            
            if(!empty($begin_product_purchase_data)){
                foreach ($begin_product_purchase_data as $product_purchase) {
                    $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                    if($unit->operator == '*'){
                        $begin_purchased_qty += $product_purchase->qty * $unit->operation_value;
                    }
                    elseif($unit->operator == '/'){
                        $begin_purchased_qty += $product_purchase->qty / $unit->operation_value;
                    }
                }
            }
            
            if(!empty($begin_product_sale_data)){
                foreach ($begin_product_sale_data as $product_sale) {
                    $unit = DB::table('units')->find($product_sale->sale_unit_id);
                    if($unit){
                        if($unit->operator == '*'){
                            $begin_sold_qty += $product_sale->qty * $unit->operation_value;
                        }
                            
                        elseif($unit->operator == '/'){
                            $begin_sold_qty += $product_sale->qty / $unit->operation_value;
                        }
                    }
                    else
                        $begin_sold_qty += $product_sale->qty;
                }
            }

            if ($purchased_qty){
                $purchased_cost_qty = $purchased_cost/ $purchased_qty;
            } else {
                $purchased_cost_qty = $purchased_cost;
            }

            $total_purchased_amount = $purchased_cost_qty * $purchased_qty;          
            if(!$begin_purchased_cost){
                $begin_purchased_cost = 0;
            }
            if ($begin_purchased_qty){
                $begin_purchased_cost_qty = $begin_purchased_cost/ $begin_purchased_qty;
            } else {
                $begin_purchased_cost_qty = $begin_purchased_cost;
            }

            $begin_inventory_qty = $begin_purchased_qty - $begin_sold_qty;
            $begin_inventory_amount = $begin_purchased_cost_qty * $begin_inventory_qty;

            
            $unit_price_buy = 0;
            if($begin_inventory_qty + $purchased_qty > 0){
                $unit_price_buy = ($begin_inventory_amount + $total_purchased_amount) / ($begin_inventory_qty + $purchased_qty);
            }

            $total_sold_price = $unit_price_buy * $sold_qty;

            $end_inventory_qty = $begin_inventory_qty +  $purchased_qty - $sold_qty;
            $end_inventory_amount = $end_inventory_qty * $unit_price_buy;

            if($created_at){
                $modified_product = (object) [
                    'created_at' => $created_at,
                    'unit_name' => $unit_name,
                    'product_id' => $product->product_id,
                    'variant_id' => $product->variant_id,
                    'product_code' => $product->product_code,
                    'product_name' => $product->product_name,

                    'begin_inventory_qty' => number_format((float) $begin_inventory_qty, 0, '.', '.'),
                    'begin_inventory_amount' => number_format((float) $begin_inventory_amount, 0, '.', '.'),
                    
                    'purchased_qty' => number_format((float) $purchased_qty, 0, '.', '.'),
                    'total_purchased_amount' => number_format((float) $total_purchased_amount, 0, '.', '.'),
                    
                    'sold_qty' => number_format((float) $sold_qty, 0, '.', '.'),
                    'total_sold_price' => number_format((float) $total_sold_price, 0, '.', '.'),
                    
                    'end_inventory_qty' => number_format((float) $end_inventory_qty, 0, '.', '.'),
                    'end_inventory_amount' => number_format((float) $end_inventory_amount, 0, '.', '.'),
                    
                    'unit_price_buy' => number_format((float) ($unit_price_buy), 0, '.', '.'),
                    'sold_price' => number_format((float) $purchased_cost_qty, 0, '.', '.'),
                ];
    
                array_push($lims_data, $modified_product);
                
            }
        }
        
        $collection = new Collection($lims_data);
        $lims_data = $collection->sortBy('created_at')->values()->all();
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.product_report',compact('lims_data', 'start_date', 'end_date', 'lims_warehouse_list', 'warehouse_id', 'warehouse_name'));
    }

    public function productReportID($id, $variant_id, $start_date, $end_date, $warehouse_id)
    {
        if($warehouse_id != 0){
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            }
        } else {
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->whereNull('purchases.method')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->whereNull('sales.method')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
               
            }
        }
        
        foreach ($lims_product_purchase_data as $key => $product_purchase_data) {
            $purchase = Purchase::find($product_purchase_data->purchase_id);
            $product = Product::find($product_purchase_data->product_id);
            
            if($purchase){
                $purchase_customer = Customer::find($purchase->user_id);
                $purchase_warehouse = Warehouse::find($purchase->warehouse_id);
                $purchase_supplier = Supplier::find($purchase->supplier_id);
            }

            $unit_data = Unit::find($product_purchase_data->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';
            
            $product_report[0][$key] = '[' . $purchase_customer->name .'] ' . $purchase_customer->company_name ;
            $product_report[1][$key] = $purchase_warehouse == null ? '' : $purchase_warehouse->name;
            // $product_report[2][$key] = $purchase_supplier == null ? '' : $purchase_supplier->name;
            $product_report[2][$key] = $purchase->content  == null ? '' : $purchase->content;
            $product_report[3][$key] = $product_purchase_data->tax;
            $product_report[4][$key] = $product_purchase_data->qty;
            $product_report[5][$key] = $product_purchase_data->tax_rate;
            $product_report[6][$key] = $product_purchase_data->discount;
            $product_report[7][$key] = $product_purchase_data->total;
            $product_report[8][$key] = $purchase->created_at;
            $product_report[9][$key] = $product_purchase_data->invoice_number;
            $product_report[10][$key] = $product_purchase_data->serial_number;
            $product_report[11][$key] = $product_purchase_data->lot_number;
            $product_report[12][$key] = $product_purchase_data->batch_number;
            $product_report[13][$key] = $product_purchase_data->tr_number;
            $product_report[14][$key] = $unit;
            $product_report[42][$key] = $product_purchase_data->total/$product_purchase_data->qty;

        }

        foreach ($lims_product_sale_data as $key => $product_sale_data) {
            $sale = Sale::find($product_sale_data->sale_id);  
            $product = Product::find($product_sale_data->product_id);  
                    
            if($sale){
                $sale_warehouse = Warehouse::find($sale->warehouse_id);
                $sale_customer = Customer::find($sale->customer_id);
                $sale_biller = Biller::find($sale->biller_id);
            }
            $unit_data = Unit::find($product_sale_data->sale_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';

            $product_report[15][$key] = $sale->id;
            $product_report[16][$key] = $sale_warehouse == null ? '' : $sale_warehouse->name;
            $product_report[17][$key] = $sale_customer == null ? '' : $sale_customer->name;
            $product_report[18][$key] = $product_sale_data->tax;
            $product_report[19][$key] = $product_sale_data->qty;
            $product_report[20][$key] = $product_sale_data->tax_rate;
            $product_report[21][$key] = $product_sale_data->discount;
            $product_report[22][$key] = $product_sale_data->total;
            $product_report[23][$key] = $sale->created_at;
            $product_report[24][$key] = $sale->sale_note;
            $product_report[25][$key] = $sale_biller == null ? '' : $sale_biller->name ;
            $product_report[26][$key] = $unit;
            $product_report[27][$key] = $product_sale_data->total/$product_sale_data->qty;
            $product_report[28][$key] = $product_sale_data->invoice_number;
            $product_report[29][$key] = $product_sale_data->serial_number;
            $product_report[30][$key] = $product_sale_data->batch_number;
            $product_report[31][$key] = $product_sale_data->tr_number;
        }

        $begin_qty = $total_begin_qty_purchases - $total_begin_qty_sales;
        $begin_total = 0;
        if($total_begin_qty_purchases > 0){
            $begin_total = $begin_qty * ($total_begin_amount_purchases / $total_begin_qty_purchases);
        }

        // Tạo mảng kết quả để lưu các object đã được kết hợp
        $resultArray = [];

        // Lặp qua mảng A và thực hiện kết hợp
        foreach ($lims_product_purchase_data as $itemA) {
            $unit = "";
            $unit_data = Unit::find($itemA->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            $mergedItem = (object)[
                'created_at' => $itemA->created_at, 
                'quantity_buy' => $itemA->qty, 
                'total_buy' => $itemA->total,
                'quantity_sale' => 0,
                'total_sale' => 0,
                'content' => $itemA->content ?? "",
                'document_number' => $itemA->inventory_receiving_voucher ?? '',
                'unit' => $unit,
                'unit_price' => $itemA->net_unit_cost,
            ];
            
            // Tìm ngày trong mảng B
            foreach ($lims_product_sale_data as $itemB) {
                if ($itemB->created_at === $itemA->created_at) {
                    $mergedItem->quantity_sale = $itemB->qty;
                    $mergedItem->total_sale = $itemB->total;
                    $mergedItem->content = $itemB->content ?? "";
                    $mergedItem->document_number = $itemB->inventory_delivery_voucher ?? '';
                    $mergedItem->unit_price = $itemB->net_unit_price;
                    break;
                }
            }

            $resultArray[] = $mergedItem;
        }

        // Kiểm tra các ngày trong mảng B có trong mảng A không và thêm vào kết quả nếu chưa có
        foreach ($lims_product_sale_data as $itemB) {
            $found = false;
            foreach ($resultArray as $itemResult) {
                if ($itemResult->created_at === $itemB->created_at) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                $unit = "";
                $unit_data = Unit::find($itemB->sale_unit_id);
                if($unit_data){
                    $unit = $unit_data->unit_code;
                }
                $resultArray[] = (object)[
                    'created_at' => $itemB->created_at, 
                    'quantity_buy' => 0, 
                    'total_buy' => 0, 
                    'quantity_sale' => $itemB->qty,
                    'total_sale' => $itemB->total,
                    'content' => $itemB->content ?? "",
                    'document_number' => $itemB->inventory_delivery_voucher ?? '',
                    'unit' => $unit,
                    'unit_price' => $itemB->net_unit_price
                ];
            }
        }

        // Sắp xếp kết quả theo ngày
        usort($resultArray, function ($a, $b) {
            return strtotime($a->created_at) - strtotime($b->created_at);
        });

        foreach ($resultArray as $key => $product_data) {
            $product_report[32][$key] = $product_data->created_at;
            $product_report[33][$key] = $product_data->quantity_buy;
            $product_report[34][$key] = $product_data->total_buy;
            $product_report[35][$key] = $product_data->quantity_sale;
            $product_report[36][$key] = $product_data->total_sale;
            $product_report[37][$key] = $product_data->content;
            $product_report[38][$key] = $product_data->unit;
            $product_report[39][$key] = $product_data->unit_price;
            $product_report[40][$key] = $begin_qty;
            $product_report[41][$key] = $begin_total;
            $product_report[43][$key] = $product_data->document_number;

        }

        return $product_report;
    }

    public function productLendReport(Request $request)
    {
        $data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $warehouse_id = $data['warehouse_id'];
        $product_id = [];
        $product_code = [];
        $variant_id = [];
        $product_name = [];
        $product_qty = [];
        $warehouse_name = "Tất cả kho";
        if($warehouse_id != 0){
            $warehouse_name = Warehouse::find($warehouse_id)->name;
        }
        
        $lims_product_all = Product::select('id', 'code', 'name', 'qty', 'is_variant')
            ->where('is_active', true)
            ->get();
            
        $lims_product_data = [];
        foreach ($lims_product_all as $product) {
            if($product->is_variant){
                $product_variant_data = ProductVariant::where('product_id', $product->id)->get();
                foreach ($product_variant_data as $key => $product_variant) {
                    $variant_data = Variant::find($product_variant->variant_id);
                    $product_variant->product_name = $variant_data->name;
                    $product_variant->product_code = $product_variant->item_code;
                    array_push($lims_product_data, $product_variant);
                }
            } else {
                $product->variant_id = null;
                $product->product_id = $product->id;
                $product->product_name = $product->name;
                $product->product_code = $product->code;
                array_push($lims_product_data, $product);
            }
        }

        $lims_data = array();
        foreach ($lims_product_data as $key => $product) { 
            $product_purchase_data = [];
            $product_sale_data = [];
            $purchased_cost = 0;

            $begin_product_purchase_data = [];
            $begin_product_sale_data = [];
            $begin_purchased_cost = 0;
            $begin_sold_price = 0;

            if($warehouse_id == 0){
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.qty', 'product_purchases.purchase_unit_id', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
                
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
               
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            } else {
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            }

            $purchased_qty = 0;
            $unit_name = '';
            $sold_qty = 0;
            $created_at = '';
            $profit_unit = 0;
            $total_purchased_amount = 0;

            $begin_purchased_qty = 0;
            $begin_sold_qty = 0;
            $begin_inventory_qty = 0;
            $begin_inventory_amount = 0;
            $end_inventory_qty = 0;
            $end_inventory_amount = 0;
            
            foreach ($product_purchase_data as $product_purchase) {
                $created_at = $product_purchase->created_at;
                $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                if($unit->operator == '*'){
                    $purchased_qty += $product_purchase->qty * $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
                elseif($unit->operator == '/'){
                    $purchased_qty += $product_purchase->qty / $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
            }
            
            foreach ($product_sale_data as $product_sale) {
                $created_at = $product_sale->created_at;
                $unit = DB::table('units')->find($product_sale->sale_unit_id);
                if($unit){
                    if($unit->operator == '*'){
                        $sold_qty += $product_sale->qty * $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                        
                    elseif($unit->operator == '/'){
                        $sold_qty += $product_sale->qty / $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                }
                else
                    $sold_qty += $product_sale->qty;
            }
            
            if(!empty($begin_product_purchase_data)){
                foreach ($begin_product_purchase_data as $product_purchase) {
                    $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                    if($unit->operator == '*'){
                        $begin_purchased_qty += $product_purchase->qty * $unit->operation_value;
                    }
                    elseif($unit->operator == '/'){
                        $begin_purchased_qty += $product_purchase->qty / $unit->operation_value;
                    }
                }
            }
            
            if(!empty($begin_product_sale_data)){
                foreach ($begin_product_sale_data as $product_sale) {
                    $unit = DB::table('units')->find($product_sale->sale_unit_id);
                    if($unit){
                        if($unit->operator == '*'){
                            $begin_sold_qty += $product_sale->qty * $unit->operation_value;
                        }
                            
                        elseif($unit->operator == '/'){
                            $begin_sold_qty += $product_sale->qty / $unit->operation_value;
                        }
                    }
                    else
                        $begin_sold_qty += $product_sale->qty;
                }
            }

            if ($purchased_qty){
                $purchased_cost_qty = $purchased_cost/ $purchased_qty;
            } else {
                $purchased_cost_qty = $purchased_cost;
            }

            $total_purchased_amount = $purchased_cost_qty * $purchased_qty;          
            if(!$begin_purchased_cost){
                $begin_purchased_cost = 0;
            }
            if ($begin_purchased_qty){
                $begin_purchased_cost_qty = $begin_purchased_cost/ $begin_purchased_qty;
            } else {
                $begin_purchased_cost_qty = $begin_purchased_cost;
            }

            $begin_inventory_qty = $begin_purchased_qty - $begin_sold_qty;
            $begin_inventory_amount = $begin_purchased_cost_qty * $begin_inventory_qty;

            
            $unit_price_buy = 0;
            if($begin_inventory_qty > 0 || $purchased_qty > 0){
                $unit_price_buy = ($begin_inventory_amount + $total_purchased_amount) / ($begin_inventory_qty + $purchased_qty);
            }

            $total_sold_price = $unit_price_buy * $sold_qty;

            $end_inventory_qty = $begin_inventory_qty +  $purchased_qty - $sold_qty;
            $end_inventory_amount = $end_inventory_qty * $unit_price_buy;

            if($created_at){
                $modified_product = (object) [
                    'created_at' => $created_at,
                    'unit_name' => $unit_name,
                    'product_id' => $product->product_id,
                    'variant_id' => $product->variant_id,
                    'product_code' => $product->product_code,
                    'product_name' => $product->product_name,

                    'begin_inventory_qty' => number_format((float) $begin_inventory_qty, 0, '.', '.'),
                    'begin_inventory_amount' => number_format((float) $begin_inventory_amount, 0, '.', '.'),
                    
                    'purchased_qty' => number_format((float) $purchased_qty, 0, '.', '.'),
                    'total_purchased_amount' => number_format((float) $total_purchased_amount, 0, '.', '.'),
                    
                    'sold_qty' => number_format((float) $sold_qty, 0, '.', '.'),
                    'total_sold_price' => number_format((float) $total_sold_price, 0, '.', '.'),
                    
                    'end_inventory_qty' => number_format((float) $end_inventory_qty, 0, '.', '.'),
                    'end_inventory_amount' => number_format((float) $end_inventory_amount, 0, '.', '.'),
                    
                    'unit_price_buy' => number_format((float) ($unit_price_buy), 0, '.', '.'),
                    'sold_price' => number_format((float) $purchased_cost_qty, 0, '.', '.'),
                ];
    
                array_push($lims_data, $modified_product);
                
            }
        }
        
        $collection = new Collection($lims_data);
        $lims_data = $collection->sortBy('created_at')->values()->all();
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.product_lend_report',compact('lims_data', 'start_date', 'end_date', 'lims_warehouse_list', 'warehouse_id', 'warehouse_name'));
    }

    public function productLendReportID($id, $variant_id, $start_date, $end_date, $warehouse_id)
    {
        if($warehouse_id != 0){
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            }
        } else {
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
               
            }
        }
        
        foreach ($lims_product_purchase_data as $key => $product_purchase_data) {
            $purchase = Purchase::find($product_purchase_data->purchase_id);
            $product = Product::find($product_purchase_data->product_id);
            
            if($purchase){
                $purchase_customer = Customer::find($purchase->user_id);
                $purchase_warehouse = Warehouse::find($purchase->warehouse_id);
                $purchase_supplier = Supplier::find($purchase->supplier_id);
            }

            $unit_data = Unit::find($product_purchase_data->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';
            
            $product_report[0][$key] = '[' . $purchase_customer->name .'] ' . $purchase_customer->company_name ;
            $product_report[1][$key] = $purchase_warehouse == null ? '' : $purchase_warehouse->name;
            // $product_report[2][$key] = $purchase_supplier == null ? '' : $purchase_supplier->name;
            $product_report[2][$key] = $purchase->content  == null ? '' : $purchase->content;
            $product_report[3][$key] = $product_purchase_data->tax;
            $product_report[4][$key] = $product_purchase_data->qty;
            $product_report[5][$key] = $product_purchase_data->tax_rate;
            $product_report[6][$key] = $product_purchase_data->discount;
            $product_report[7][$key] = $product_purchase_data->total;
            $product_report[8][$key] = $purchase->created_at;
            $product_report[9][$key] = $product_purchase_data->invoice_number;
            $product_report[10][$key] = $product_purchase_data->serial_number;
            $product_report[11][$key] = $product_purchase_data->lot_number;
            $product_report[12][$key] = $product_purchase_data->batch_number;
            $product_report[13][$key] = $product_purchase_data->tr_number;
            $product_report[14][$key] = $unit;
            $product_report[42][$key] = $product_purchase_data->net_unit_cost;

        }

        foreach ($lims_product_sale_data as $key => $product_sale_data) {
            $sale = Sale::find($product_sale_data->sale_id);  
            $product = Product::find($product_sale_data->product_id);  
                    
            if($sale){
                $sale_warehouse = Warehouse::find($sale->warehouse_id);
                $sale_customer = Customer::find($sale->customer_id);
                $sale_biller = Biller::find($sale->biller_id);
            }
            $unit_data = Unit::find($product_sale_data->sale_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';

            $product_report[15][$key] = $sale->id;
            $product_report[16][$key] = $sale_warehouse == null ? '' : $sale_warehouse->name;
            $product_report[17][$key] = $sale_customer == null ? '' : $sale_customer->name;
            $product_report[18][$key] = $product_sale_data->tax;
            $product_report[19][$key] = $product_sale_data->qty;
            $product_report[20][$key] = $product_sale_data->tax_rate;
            $product_report[21][$key] = $product_sale_data->discount;
            $product_report[22][$key] = $product_sale_data->total;
            $product_report[23][$key] = $sale->created_at;
            $product_report[24][$key] = $sale->sale_note;
            $product_report[25][$key] = $sale_biller == null ? '' : $sale_biller->name ;
            $product_report[26][$key] = $unit;
            $product_report[27][$key] = $product_sale_data->net_unit_price;
            $product_report[28][$key] = $product_sale_data->invoice_number;
            $product_report[29][$key] = $product_sale_data->serial_number;
            $product_report[30][$key] = $product_sale_data->batch_number;
            $product_report[31][$key] = $product_sale_data->tr_number;
        }

        $begin_qty = $total_begin_qty_purchases - $total_begin_qty_sales;
        $begin_total = 0;
        if($total_begin_qty_purchases > 0){
            $begin_total = $begin_qty * ($total_begin_amount_purchases / $total_begin_qty_purchases);
        }

        // Tạo mảng kết quả để lưu các object đã được kết hợp
        $resultArray = [];

        // Lặp qua mảng A và thực hiện kết hợp
        foreach ($lims_product_purchase_data as $itemA) {
            $unit = "";
            $unit_data = Unit::find($itemA->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            $mergedItem = (object)[
                'created_at' => $itemA->created_at, 
                'quantity_buy' => $itemA->qty, 
                'total_buy' => $itemA->total,
                'quantity_sale' => 0,
                'total_sale' => 0,
                'content' => $itemA->content ?? "",
                'document_number' => $itemA->inventory_receiving_voucher ?? '',
                'unit' => $unit,
                'unit_price' => $itemA->net_unit_cost,
            ];
            
            // Tìm ngày trong mảng B
            foreach ($lims_product_sale_data as $itemB) {
                if ($itemB->created_at === $itemA->created_at) {
                    $mergedItem->quantity_sale = $itemB->qty;
                    $mergedItem->total_sale = $itemB->total;
                    $mergedItem->content = $itemB->content ?? "";
                    $mergedItem->document_number = $itemB->inventory_delivery_voucher ?? '';
                    $mergedItem->unit_price = $itemB->net_unit_price;
                    break;
                }
            }

            $resultArray[] = $mergedItem;
        }

        // Kiểm tra các ngày trong mảng B có trong mảng A không và thêm vào kết quả nếu chưa có
        foreach ($lims_product_sale_data as $itemB) {
            $found = false;
            foreach ($resultArray as $itemResult) {
                if ($itemResult->created_at === $itemB->created_at) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                $unit = "";
                $unit_data = Unit::find($itemB->sale_unit_id);
                if($unit_data){
                    $unit = $unit_data->unit_code;
                }
                $resultArray[] = (object)[
                    'created_at' => $itemB->created_at, 
                    'quantity_buy' => 0, 
                    'total_buy' => 0, 
                    'quantity_sale' => $itemB->qty,
                    'total_sale' => $itemB->total,
                    'content' => $itemB->content ?? "",
                    'document_number' => $itemB->inventory_delivery_voucher ?? '',
                    'unit' => $unit,
                    'unit_price' => $itemB->net_unit_price
                ];
            }
        }

        // Sắp xếp kết quả theo ngày
        usort($resultArray, function ($a, $b) {
            return strtotime($a->created_at) - strtotime($b->created_at);
        });

        foreach ($resultArray as $key => $product_data) {
            $product_report[32][$key] = $product_data->created_at;
            $product_report[33][$key] = $product_data->quantity_buy;
            $product_report[34][$key] = $product_data->total_buy;
            $product_report[35][$key] = $product_data->quantity_sale;
            $product_report[36][$key] = $product_data->total_sale;
            $product_report[37][$key] = $product_data->content;
            $product_report[38][$key] = $product_data->unit;
            $product_report[39][$key] = $product_data->unit_price;
            $product_report[40][$key] = $begin_qty;
            $product_report[41][$key] = $begin_total;
            $product_report[43][$key] = $product_data->document_number;

        }

        return $product_report;
    }

    public function productWarrantyReport(Request $request)
    {
        $data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $warehouse_id = $data['warehouse_id'];
        $product_id = [];
        $product_code = [];
        $variant_id = [];
        $product_name = [];
        $product_qty = [];
        $warehouse_name = "Tất cả kho";
        if($warehouse_id != 0){
            $warehouse_name = Warehouse::find($warehouse_id)->name;
        }
        
        $lims_product_all = Product::select('id', 'code', 'name', 'qty', 'is_variant')
            ->where('is_active', true)
            ->get();
            
        $lims_product_data = [];
        foreach ($lims_product_all as $product) {
            if($product->is_variant){
                $product_variant_data = ProductVariant::where('product_id', $product->id)->get();
                foreach ($product_variant_data as $key => $product_variant) {
                    $variant_data = Variant::find($product_variant->variant_id);
                    $product_variant->product_name = $variant_data->name;
                    $product_variant->product_code = $product_variant->item_code;
                    array_push($lims_product_data, $product_variant);
                }
            } else {
                $product->variant_id = null;
                $product->product_id = $product->id;
                $product->product_name = $product->name;
                $product->product_code = $product->code;
                array_push($lims_product_data, $product);
            }
        }

        $lims_data = array();
        foreach ($lims_product_data as $key => $product) { 
            $product_purchase_data = [];
            $product_sale_data = [];
            $purchased_cost = 0;

            $begin_product_purchase_data = [];
            $begin_product_sale_data = [];
            $begin_purchased_cost = 0;
            $begin_sold_price = 0;

            if($warehouse_id == 0){
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.qty', 'product_purchases.purchase_unit_id', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
                
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
               
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id]
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            } else {
                $begin_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $begin_purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');

                $begin_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                $begin_sold_price = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('total');

                $product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.purchase_unit_id', 'product_purchases.qty', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'desc')
                    ->get();
            
                $purchased_cost = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at')
                    ->where([
                        ['product_purchases.product_id', $product->product_id],
                        ['product_purchases.variant_id', $product->variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->sum('total');

                $product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.sale_unit_id', 'product_sales.qty', 'sales.created_at')
                    ->where([
                        ['product_sales.product_id', $product->product_id],
                        ['product_sales.variant_id', $product->variant_id],
                        ['sales.warehouse_id', $warehouse_id],

                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            }

            $purchased_qty = 0;
            $unit_name = '';
            $sold_qty = 0;
            $created_at = '';
            $profit_unit = 0;
            $total_purchased_amount = 0;

            $begin_purchased_qty = 0;
            $begin_sold_qty = 0;
            $begin_inventory_qty = 0;
            $begin_inventory_amount = 0;
            $end_inventory_qty = 0;
            $end_inventory_amount = 0;
            
            foreach ($product_purchase_data as $product_purchase) {
                $created_at = $product_purchase->created_at;
                $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                if($unit->operator == '*'){
                    $purchased_qty += $product_purchase->qty * $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
                elseif($unit->operator == '/'){
                    $purchased_qty += $product_purchase->qty / $unit->operation_value;
                    $unit_name = $unit->unit_name;
                }
            }
            
            foreach ($product_sale_data as $product_sale) {
                $created_at = $product_sale->created_at;
                $unit = DB::table('units')->find($product_sale->sale_unit_id);
                if($unit){
                    if($unit->operator == '*'){
                        $sold_qty += $product_sale->qty * $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                        
                    elseif($unit->operator == '/'){
                        $sold_qty += $product_sale->qty / $unit->operation_value;
                        $unit_name = $unit->unit_name;
                    }
                }
                else
                    $sold_qty += $product_sale->qty;
            }
            
            if(!empty($begin_product_purchase_data)){
                foreach ($begin_product_purchase_data as $product_purchase) {
                    $unit = DB::table('units')->find($product_purchase->purchase_unit_id);
                    if($unit->operator == '*'){
                        $begin_purchased_qty += $product_purchase->qty * $unit->operation_value;
                    }
                    elseif($unit->operator == '/'){
                        $begin_purchased_qty += $product_purchase->qty / $unit->operation_value;
                    }
                }
            }
            
            if(!empty($begin_product_sale_data)){
                foreach ($begin_product_sale_data as $product_sale) {
                    $unit = DB::table('units')->find($product_sale->sale_unit_id);
                    if($unit){
                        if($unit->operator == '*'){
                            $begin_sold_qty += $product_sale->qty * $unit->operation_value;
                        }
                            
                        elseif($unit->operator == '/'){
                            $begin_sold_qty += $product_sale->qty / $unit->operation_value;
                        }
                    }
                    else
                        $begin_sold_qty += $product_sale->qty;
                }
            }

            if ($purchased_qty){
                $purchased_cost_qty = $purchased_cost/ $purchased_qty;
            } else {
                $purchased_cost_qty = $purchased_cost;
            }

            $total_purchased_amount = $purchased_cost_qty * $purchased_qty;          
            if(!$begin_purchased_cost){
                $begin_purchased_cost = 0;
            }
            if ($begin_purchased_qty){
                $begin_purchased_cost_qty = $begin_purchased_cost/ $begin_purchased_qty;
            } else {
                $begin_purchased_cost_qty = $begin_purchased_cost;
            }

            $begin_inventory_qty = $begin_purchased_qty - $begin_sold_qty;
            $begin_inventory_amount = $begin_purchased_cost_qty * $begin_inventory_qty;

            
            $unit_price_buy = 0;
            if($begin_inventory_qty > 0 || $purchased_qty > 0){
                $unit_price_buy = ($begin_inventory_amount + $total_purchased_amount) / ($begin_inventory_qty + $purchased_qty);
            }

            $total_sold_price = $unit_price_buy * $sold_qty;

            $end_inventory_qty = $begin_inventory_qty +  $purchased_qty - $sold_qty;
            $end_inventory_amount = $end_inventory_qty * $unit_price_buy;

            if($created_at){
                $modified_product = (object) [
                    'created_at' => $created_at,
                    'unit_name' => $unit_name,
                    'product_id' => $product->product_id,
                    'variant_id' => $product->variant_id,
                    'product_code' => $product->product_code,
                    'product_name' => $product->product_name,

                    'begin_inventory_qty' => number_format((float) $begin_inventory_qty, 0, '.', '.'),
                    'begin_inventory_amount' => number_format((float) $begin_inventory_amount, 0, '.', '.'),
                    
                    'purchased_qty' => number_format((float) $purchased_qty, 0, '.', '.'),
                    'total_purchased_amount' => number_format((float) $total_purchased_amount, 0, '.', '.'),
                    
                    'sold_qty' => number_format((float) $sold_qty, 0, '.', '.'),
                    'total_sold_price' => number_format((float) $total_sold_price, 0, '.', '.'),
                    
                    'end_inventory_qty' => number_format((float) $end_inventory_qty, 0, '.', '.'),
                    'end_inventory_amount' => number_format((float) $end_inventory_amount, 0, '.', '.'),
                    
                    'unit_price_buy' => number_format((float) ($unit_price_buy), 0, '.', '.'),
                    'sold_price' => number_format((float) $purchased_cost_qty, 0, '.', '.'),
                ];
    
                array_push($lims_data, $modified_product);
                
            }
        }
        
        $collection = new Collection($lims_data);
        $lims_data = $collection->sortBy('created_at')->values()->all();
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.warranty_report',compact('lims_data', 'start_date', 'end_date', 'lims_warehouse_list', 'warehouse_id', 'warehouse_name'));
    }

    public function productWarrantyReportID($id, $variant_id, $start_date, $end_date, $warehouse_id)
    {
        if($warehouse_id != 0){
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                        ['purchases.warehouse_id', $warehouse_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            }
        } else {
            if( $variant_id != -1){
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', $variant_id],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', $variant_id],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
                
            } else {
                $lims_product_purchase_data = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id', 'purchases.content', 'purchases.inventory_receiving_voucher')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','>=', $start_date)
                    ->whereDate('purchases.created_at','<=', $end_date)
                    ->orderBy('purchases.created_at', 'asc')
                    ->get();
                $total_begin_qty_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('qty');
                $total_begin_amount_purchases = DB::table('purchases')
                    ->join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
                    ->select('product_purchases.*', 'purchases.created_at', 'purchases.supplier_id')
                    ->where([
                        ['product_purchases.product_id', $id],
                        ['product_purchases.variant_id', NULL],
                    ])
                    ->where('purchases.method', 'return')
                    ->whereDate('purchases.created_at','<', $start_date)
                    ->sum('total');
                $lims_product_sale_data = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id', 'sales.content', 'sales.inventory_delivery_voucher')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','>=', $start_date)
                    ->whereDate('sales.created_at','<=', $end_date)
                    ->orderBy('sales.created_at', 'asc')
                    ->get();
                $total_begin_qty_sales = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.*', 'sales.created_at', 'sales.customer_id')
                    ->where([
                        ['product_sales.product_id', $id],
                        ['product_sales.variant_id', NULL],
                    ])
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at','<', $start_date)
                    ->sum('qty');
               
            }
        }
        
        foreach ($lims_product_purchase_data as $key => $product_purchase_data) {
            $purchase = Purchase::find($product_purchase_data->purchase_id);
            $product = Product::find($product_purchase_data->product_id);
            
            if($purchase){
                $purchase_customer = Customer::find($purchase->user_id);
                $purchase_warehouse = Warehouse::find($purchase->warehouse_id);
                $purchase_supplier = Supplier::find($purchase->supplier_id);
            }

            $unit_data = Unit::find($product_purchase_data->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';
            
            $product_report[0][$key] = '[' . $purchase_customer->name .'] ' . $purchase_customer->company_name ;
            $product_report[1][$key] = $purchase_warehouse == null ? '' : $purchase_warehouse->name;
            // $product_report[2][$key] = $purchase_supplier == null ? '' : $purchase_supplier->name;
            $product_report[2][$key] = $purchase->content  == null ? '' : $purchase->content;
            $product_report[3][$key] = $product_purchase_data->tax;
            $product_report[4][$key] = $product_purchase_data->qty;
            $product_report[5][$key] = $product_purchase_data->tax_rate;
            $product_report[6][$key] = $product_purchase_data->discount;
            $product_report[7][$key] = $product_purchase_data->total;
            $product_report[8][$key] = $purchase->created_at;
            $product_report[9][$key] = $product_purchase_data->invoice_number;
            $product_report[10][$key] = $product_purchase_data->serial_number;
            $product_report[11][$key] = $product_purchase_data->lot_number;
            $product_report[12][$key] = $product_purchase_data->batch_number;
            $product_report[13][$key] = $product_purchase_data->tr_number;
            $product_report[14][$key] = $unit;
            $product_report[42][$key] = $product_purchase_data->net_unit_cost;

        }

        foreach ($lims_product_sale_data as $key => $product_sale_data) {
            $sale = Sale::find($product_sale_data->sale_id);  
            $product = Product::find($product_sale_data->product_id);  
                    
            if($sale){
                $sale_warehouse = Warehouse::find($sale->warehouse_id);
                $sale_customer = Customer::find($sale->customer_id);
                $sale_biller = Biller::find($sale->biller_id);
            }
            $unit_data = Unit::find($product_sale_data->sale_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';

            $product_report[15][$key] = $sale->id;
            $product_report[16][$key] = $sale_warehouse == null ? '' : $sale_warehouse->name;
            $product_report[17][$key] = $sale_customer == null ? '' : $sale_customer->name;
            $product_report[18][$key] = $product_sale_data->tax;
            $product_report[19][$key] = $product_sale_data->qty;
            $product_report[20][$key] = $product_sale_data->tax_rate;
            $product_report[21][$key] = $product_sale_data->discount;
            $product_report[22][$key] = $product_sale_data->total;
            $product_report[23][$key] = $sale->created_at;
            $product_report[24][$key] = $sale->sale_note;
            $product_report[25][$key] = $sale_biller == null ? '' : $sale_biller->name ;
            $product_report[26][$key] = $unit;
            $product_report[27][$key] = $product_sale_data->net_unit_price;
            $product_report[28][$key] = $product_sale_data->invoice_number;
            $product_report[29][$key] = $product_sale_data->serial_number;
            $product_report[30][$key] = $product_sale_data->batch_number;
            $product_report[31][$key] = $product_sale_data->tr_number;
        }

        $begin_qty = $total_begin_qty_purchases - $total_begin_qty_sales;
        $begin_total = 0;
        if($total_begin_qty_purchases > 0){
            $begin_total = $begin_qty * ($total_begin_amount_purchases / $total_begin_qty_purchases);
        }

        // Tạo mảng kết quả để lưu các object đã được kết hợp
        $resultArray = [];

        // Lặp qua mảng A và thực hiện kết hợp
        foreach ($lims_product_purchase_data as $itemA) {
            $unit = "";
            $unit_data = Unit::find($itemA->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            $mergedItem = (object)[
                'created_at' => $itemA->created_at, 
                'quantity_buy' => $itemA->qty, 
                'total_buy' => $itemA->total,
                'quantity_sale' => 0,
                'total_sale' => 0,
                'content' => $itemA->content ?? "",
                'document_number' => $itemA->inventory_receiving_voucher ?? '',
                'unit' => $unit,
                'unit_price' => $itemA->net_unit_cost,
            ];
            
            // Tìm ngày trong mảng B
            foreach ($lims_product_sale_data as $itemB) {
                if ($itemB->created_at === $itemA->created_at) {
                    $mergedItem->quantity_sale = $itemB->qty;
                    $mergedItem->total_sale = $itemB->total;
                    $mergedItem->content = $itemB->content ?? "";
                    $mergedItem->document_number = $itemB->inventory_delivery_voucher ?? '';
                    $mergedItem->unit_price = $itemB->net_unit_price;
                    break;
                }
            }

            $resultArray[] = $mergedItem;
        }

        // Kiểm tra các ngày trong mảng B có trong mảng A không và thêm vào kết quả nếu chưa có
        foreach ($lims_product_sale_data as $itemB) {
            $found = false;
            foreach ($resultArray as $itemResult) {
                if ($itemResult->created_at === $itemB->created_at) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                $unit = "";
                $unit_data = Unit::find($itemB->sale_unit_id);
                if($unit_data){
                    $unit = $unit_data->unit_code;
                }
                $resultArray[] = (object)[
                    'created_at' => $itemB->created_at, 
                    'quantity_buy' => 0, 
                    'total_buy' => 0, 
                    'quantity_sale' => $itemB->qty,
                    'total_sale' => $itemB->total,
                    'content' => $itemB->content ?? "",
                    'document_number' => $itemB->inventory_delivery_voucher ?? '',
                    'unit' => $unit,
                    'unit_price' => $itemB->net_unit_price
                ];
            }
        }

        // Sắp xếp kết quả theo ngày
        usort($resultArray, function ($a, $b) {
            return strtotime($a->created_at) - strtotime($b->created_at);
        });

        foreach ($resultArray as $key => $product_data) {
            $product_report[32][$key] = $product_data->created_at;
            $product_report[33][$key] = $product_data->quantity_buy;
            $product_report[34][$key] = $product_data->total_buy;
            $product_report[35][$key] = $product_data->quantity_sale;
            $product_report[36][$key] = $product_data->total_sale;
            $product_report[37][$key] = $product_data->content;
            $product_report[38][$key] = $product_data->unit;
            $product_report[39][$key] = $product_data->unit_price;
            $product_report[40][$key] = $begin_qty;
            $product_report[41][$key] = $begin_total;
            $product_report[43][$key] = $product_data->document_number;

        }

        return $product_report;
    }

    public function purchaseReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $warehouse_id = $data['warehouse_id'];
        $product_id = [];
        $variant_id = [];
        $product_name = [];
        $product_qty = [];

        $lims_product_purchase_all = DB::table('product_purchases')
            ->select('product_purchases.product_id', 'product_purchases.variant_id')
            ->join('purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
            ->where('purchases.method', '=', NULL)
            ->whereDate('purchases.created_at','>=', $start_date)
            ->whereDate('purchases.created_at','<=', $end_date)
            ->orderBy('purchases.created_at', 'asc')
            ->groupBy('product_purchases.product_id', 'product_purchases.variant_id')
            ->get();
           
        foreach ($lims_product_purchase_all as $product_purchase) {
            $lims_product_purchase_data = null;
            $variant_id_all = [];
            $product = Product::select('id', 'name', 'code', 'qty', 'is_variant')->where('id', $product_purchase->product_id)->where('is_active', true)->first();

            if($product && $product_purchase->variant_id) {
                $variant_data = Variant::find($product_purchase->variant_id);       
                $product_variant = ProductVariant::FindExactProduct($product->id, $variant_data->id)->first();
                $product_variant_code = $product_variant ? $product_variant->item_code : '';
                $variant_data_name = $variant_data ? $variant_data->name : '';
                $product_name[] = ' ['.$product_variant_code.'] '.$variant_data_name;
                $product_id[] = $product->id;
                $variant_id[] = $variant_data->id;
                if($warehouse_id == 0)
                    $product_qty[] = ProductVariant::FindExactProduct($product->id, $variant_data->id)->first()->qty;
                else
                    $product_qty[] = Product_Warehouse::where([
                                    ['product_id', $product->id],
                                    ['variant_id', $variant_data->id],
                                    ['warehouse_id', $warehouse_id]
                                ])->first()->qty;
            }
            elseif($product)  {
                $product_name[] = ' ['.$product->code.'] '.$product->name;
                $product_id[] = $product->id;
                $variant_id[] = null;
                if($warehouse_id == 0)
                    $product_qty[] = $product->qty;
                else
                    $product_qty[] = Product_Warehouse::where([
                                    ['product_id', $product->id],
                                    ['warehouse_id', $warehouse_id]
                                ])->sum('qty');
            }
            
        }

        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.purchase_report',compact('product_id', 'variant_id', 'product_name', 'product_qty', 'start_date', 'end_date', 'lims_warehouse_list', 'warehouse_id'));
    }

    public function productPurchaseReport($id, $variant_id, $start_date, $end_date)
    {
        if( $variant_id != -1){
            $lims_product_purchase_data = DB::table('product_purchases')
                ->where([
                    ['product_id', $id],
                    ['variant_id', $variant_id]
                ])
                ->whereDate('created_at','>=', $start_date)
                ->whereDate('created_at','<=', $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        } else {
            $lims_product_purchase_data = DB::table('product_purchases')
                ->where([
                    ['product_id', $id],
                    ['variant_id', NULL]
                ])
                ->whereDate('created_at','>=', $start_date)
                ->whereDate('created_at','<=', $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        }
        
        foreach ($lims_product_purchase_data as $key => $product_purchase_data) {
            $purchase = Purchase::find($product_purchase_data->purchase_id);
            $product = Product::find($product_purchase_data->product_id);
            
            if($purchase){
                $purchase_warehouse = Warehouse::find($purchase->warehouse_id);
                $purchase_supplier = Supplier::find($purchase->supplier_id);
            }

            $unit_data = Unit::find($product_purchase_data->purchase_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';

            $product_purchase_data->allocation_cost = $product_purchase_data->allocation_cost ?? 0;
            $product_purchase_data->tax_import = $product_purchase_data->tax_import ?? 0;
            $total_price_buy = $product_purchase_data->total + $product_purchase_data->discount - $product_purchase_data->allocation_cost - $product_purchase_data->tax_import - $product_purchase_data->tax;
            
            $product_purchase[0][$key] = '';
            $product_purchase[1][$key] = $purchase_warehouse == null ? '' : $purchase_warehouse->name;
            $product_purchase[2][$key] = $purchase_supplier == null ? '' : $purchase_supplier->name;
            $product_purchase[3][$key] = $product_purchase_data->tax;
            $product_purchase[4][$key] = $product_purchase_data->qty;
            $product_purchase[5][$key] = $product_purchase_data->tax_rate;
            $product_purchase[6][$key] = $product_purchase_data->discount;
            $product_purchase[7][$key] = $product_purchase_data->total;
            $product_purchase[8][$key] = date(config('date_format'), strtotime($purchase->created_at->toDateString()));
            $product_purchase[9][$key] = $product_purchase_data->invoice_number;
            $product_purchase[10][$key] = $product_purchase_data->serial_number;
            $product_purchase[11][$key] = $product_purchase_data->package_number;
            $product_purchase[12][$key] = $product_purchase_data->batch_number;
            $product_purchase[13][$key] = $product_purchase_data->tr_number;
            $product_purchase[14][$key] = $unit;
            $product_purchase[15][$key] = $product_purchase_data->oc_number;
            $product_purchase[16][$key] = $total_price_buy/$product_purchase_data->qty;

        }
        return $product_purchase;
    }

    public function saleReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $warehouse_id = $data['warehouse_id'];
        $product_id = [];
        $variant_id = [];
        $product_name = [];
        $product_qty = [];

        $lims_product_sale_all = DB::table('product_sales')
            ->select('product_sales.product_id', 'product_sales.variant_id')
            ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
            ->where('sales.method', '=', NULL)
            ->whereDate('sales.created_at','>=', $start_date)
            ->whereDate('sales.created_at','<=', $end_date)
            ->orderBy('sales.created_at', 'asc')
            ->groupBy('product_sales.product_id', 'product_sales.variant_id')
            ->get();

        foreach ($lims_product_sale_all as $product_sale) {
            $lims_product_sale_data = null;
            $variant_id_all = [];
            $product = Product::select('id', 'name', 'code', 'qty', 'is_variant')->where('id', $product_sale->product_id)->where('is_active', true)->first();

            if($product && $product_sale->variant_id) {
                $variant_data = Variant::find($product_sale->variant_id);       
                $product_variant = ProductVariant::FindExactProduct($product->id, $variant_data->id)->first();
                $product_variant_code = $product_variant->item_code;
  
                $product_name[] = ' ['.$product_variant_code.'] '.$variant_data->name;
                $product_id[] = $product->id;
                $variant_id[] = $variant_data->id;
                if($warehouse_id == 0)
                    $product_qty[] = ProductVariant::FindExactProduct($product->id, $variant_data->id)->first()->qty;
                else
                    $product_qty[] = Product_Warehouse::where([
                                    ['product_id', $product->id],
                                    ['variant_id', $variant_data->id],
                                    ['warehouse_id', $warehouse_id]
                                ])->first()->qty;
            }
            elseif($product)  {
                $product_name[] = ' ['.$product->code.'] '.$product->name;
                $product_id[] = $product->id;
                $variant_id[] = null;
                if($warehouse_id == 0)
                    $product_qty[] = $product->qty;
                else
                    $product_qty[] = Product_Warehouse::where([
                                    ['product_id', $product->id],
                                    ['warehouse_id', $warehouse_id]
                                ])->sum('qty');
            }
        }

        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.sale_report',compact('product_id', 'variant_id', 'product_name', 'product_qty', 'start_date', 'end_date', 'lims_warehouse_list','warehouse_id'));
    }

    public function productSaleReport($id, $variant_id, $start_date, $end_date)
    {
        if( $variant_id != -1){
            $lims_product_sale_data = DB::table('product_sales')
                ->where([
                    ['product_id', $id],
                    ['variant_id', $variant_id]
                ])
                ->whereDate('created_at','>=', $start_date)
                ->whereDate('created_at','<=', $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        } else {
            $lims_product_sale_data = DB::table('product_sales')
                ->where([
                    ['product_id', $id],
                    ['variant_id', NULL]
                ])
                ->whereDate('created_at','>=', $start_date)
                ->whereDate('created_at','<=', $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        }
        
        foreach ($lims_product_sale_data as $key => $product_sale_data) {
            $sale = Sale::find($product_sale_data->sale_id);  
            $product = Product::find($product_sale_data->product_id);  
                    
            if($sale){
                $sale_warehouse = Warehouse::find($sale->warehouse_id);
                $sale_customer = Customer::find($sale->customer_id);
                $sale_biller = Biller::find($sale->biller_id);
            }
            $unit_data = Unit::find($product_sale_data->sale_unit_id);
            if($unit_data){
                $unit = $unit_data->unit_code;
            }
            else
                $unit = '';

            $role = Role::find(Auth::user()->role_id);
            $permission_view_price = $role->hasPermissionTo('view_price');
            if(!$permission_view_price) {
                $product_sale_data->total = 0;
            }
            $product_sale[0][$key] = $sale->id;
            $product_sale[1][$key] = $sale_warehouse == null ? '' : $sale_warehouse->name;
            $product_sale[2][$key] = $sale_customer == null ? '' : $sale_customer->name;
            $product_sale[3][$key] = $product_sale_data->tax;
            $product_sale[4][$key] = $product_sale_data->qty;
            $product_sale[5][$key] = $product_sale_data->tax_rate;
            $product_sale[6][$key] = $product_sale_data->discount;
            $product_sale[7][$key] = $product_sale_data->total;
            $product_sale[8][$key] = date(config('date_format'), strtotime($sale->created_at->toDateString()));
            $product_sale[9][$key] = $sale->reference_no;
            $product_sale[10][$key] = $sale_biller == null ? '' : $sale_biller->name;
            $product_sale[11][$key] = $unit;
            $product_sale[12][$key] = $product_sale_data->total/$product_sale_data->qty;
        }
        return $product_sale;
    }

    public function paymentReportByDate(Request $request)
    {
        $data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        
        $lims_payment_data = Payment::whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->get();
        return view('report.payment_report',compact('lims_payment_data', 'start_date', 'end_date'));
    }

    public function warehouseReport(Request $request)
    {
        $data = $request->all();
        $warehouse_id = $data['warehouse_id'];
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];

        if($warehouse_id == 0){
            $lims_purchase_data = Purchase::
                whereNull('method')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
            $lims_sale_data = Sale::with('customer', 'biller')
                ->whereNull('method')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
            $lims_return_data = Sale::with('customer', 'biller')
                ->where('method', 'return')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        } else {
            $lims_purchase_data = Purchase::where('warehouse_id', $warehouse_id)
                ->whereNull('method')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
            $lims_sale_data = Sale::with('customer', 'biller')
                ->whereNull('method')
                ->where('warehouse_id', $warehouse_id)
                ->whereNull('method')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
            $lims_return_data = Sale::with('customer', 'biller')
                ->where('warehouse_id', $warehouse_id)
                ->where('method', 'return')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->orderBy('created_at', 'asc')
                ->get();
        }

        $lims_product_purchase_data = [];
        $lims_product_sale_data = [];
        $lims_product_return_data = [];

        foreach ($lims_purchase_data as $key => $purchase) {
            $lims_product_purchase_data[$key] = ProductPurchase::where('purchase_id', $purchase->id)->get();
        }
        foreach ($lims_sale_data as $key => $sale) {
            $lims_product_sale_data[$key] = Product_Sale::where('sale_id', $sale->id)->get();
        }
        foreach ($lims_return_data as $key => $return) {
            $lims_product_return_data[$key] = Product_Sale::where('sale_id', $return->id)->get();
        }
        $lims_warehouse_list = Warehouse::where('is_active', true)->get();
        return view('report.warehouse_report', compact('warehouse_id', 'start_date', 'end_date', 'lims_purchase_data', 'lims_product_purchase_data', 'lims_sale_data', 'lims_product_sale_data', 'lims_warehouse_list', 'lims_return_data', 'lims_product_return_data'));
    }

    public function userReport(Request $request)
    {
        $data = $request->all();
        $user_id = $data['user_id'];
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $lims_product_sale_data = [];
        $lims_product_purchase_data = [];
        $lims_product_quotation_data = [];
        $lims_product_transfer_data = [];

        $lims_sale_data = Sale::with('customer', 'warehouse')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();
        $lims_purchase_data = Purchase::with('warehouse')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();        
        $lims_quotation_data = Quotation::with('customer', 'warehouse')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();
        $lims_transfer_data = Transfer::with('fromWarehouse', 'toWarehouse')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();        
        $lims_payment_data = DB::table('payments')
                           ->where('user_id', $user_id)
                           ->whereDate('payments.created_at', '>=' , $start_date)
                           ->whereDate('payments.created_at', '<=' , $end_date)
                           ->orderBy('created_at', 'desc')
                           ->get();
        $lims_expense_data = Expense::with('warehouse', 'expenseCategory')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();
        $lims_payroll_data = Payroll::with('employee')->where('user_id', $user_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'desc')->get();

        foreach ($lims_sale_data as $key => $sale) {
            $lims_product_sale_data[$key] = Product_Sale::where('sale_id', $sale->id)->get();
        }
        foreach ($lims_purchase_data as $key => $purchase) {
            $lims_product_purchase_data[$key] = ProductPurchase::where('purchase_id', $purchase->id)->get();
        }
        foreach ($lims_quotation_data as $key => $quotation) {
            $lims_product_quotation_data[$key] = ProductQuotation::where('quotation_id', $quotation->id)->get();
        }
        foreach ($lims_transfer_data as $key => $transfer) {
            $lims_product_transfer_data[$key] = ProductTransfer::where('transfer_id', $transfer->id)->get();
        }

        $lims_user_list = User::where('is_active', true)->get();
        return view('report.user_report', compact('lims_sale_data','user_id', 'start_date', 'end_date', 'lims_product_sale_data', 'lims_payment_data', 'lims_user_list', 'lims_purchase_data', 'lims_product_purchase_data', 'lims_quotation_data', 'lims_product_quotation_data', 'lims_transfer_data', 'lims_product_transfer_data', 'lims_expense_data', 'lims_payroll_data') );
    }

    public function customerReport(Request $request)
    {
    	$data = $request->all();
        $customer_id = $data['customer_id'];
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $lims_data_sale = [];
        $lims_data_return = [];
        $lims_payment_data = [];

        $sale_customer = Customer::find($customer_id);
        
        $data_sale_customer = [];
        $data_return_customer = [];
        
        if($customer_id == 0){
            $lims_sale_product_all = DB::table('sales')
                ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                ->select('product_sales.product_id', 'product_sales.variant_id', 'product_sales.net_unit_price', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                ->whereNull('sales.method')
                ->whereDate('sales.created_at', '>=', $start_date)
                ->whereDate('sales.created_at', '<=', $end_date)
                ->groupBy('product_sales.product_id', 'product_sales.variant_id', 'product_sales.net_unit_price')
                ->orderBy('sales.created_at', 'asc')
                ->get();

            $lims_return_product_all = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.product_id', 'product_sales.variant_id', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at', '>=', $start_date)
                    ->whereDate('sales.created_at', '<=', $end_date)
                    ->groupBy('product_sales.product_id', 'product_sales.variant_id')
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            $lims_payment_data = DB::table('payments')
                    ->join('sales', 'payments.sale_id', '=', 'sales.id')
                    ->whereNull('sales.method')
                    ->whereDate('payments.created_at', '>=' , $start_date)
                    ->whereDate('payments.created_at', '<=' , $end_date)
                    ->select('payments.*', 'sales.reference_no as sale_reference')
                    ->orderBy('payments.created_at', 'desc')
                    ->get();

            foreach ($lims_sale_product_all as $key => $sale_product) {
                $latest_record_sale_product = DB::table('product_sales')
                    ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->whereNull('sales.method')
                    ->where('product_sales.product_id', $sale_product->product_id)
                    ->where('product_sales.variant_id', $sale_product->variant_id)
                    ->whereDate('product_sales.created_at', '>=' , $start_date)
                    ->whereDate('product_sales.created_at', '<=' , $end_date)
                    ->orderBy('product_sales.created_at', 'desc')
                    ->first();

                $lims_sale_data = Sale::with('biller', 'warehouse')
                ->find($latest_record_sale_product->sale_id);
                
                $lims_sale_product_all[$key]->product_name = "";
                $lims_sale_product_all[$key]->product_code = "";
                $lims_product_data = Product::select('name', 'code')->find($sale_product->product_id);
                if($lims_product_data){
                    $lims_sale_product_all[$key]->product_name = $lims_product_data->name;
                    $lims_sale_product_all[$key]->product_code = $lims_product_data->code;
                    if($sale_product->variant_id){
                        $lims_variant_data = Variant::find($sale_product->variant_id);
                        $lims_product_variant = ProductVariant::where('product_id', $sale_product->product_id)
                        ->where('variant_id', $sale_product->variant_id)
                        ->first();
                        if($lims_variant_data){
                            $lims_sale_product_all[$key]->product_name = $lims_variant_data->name;
                            $lims_sale_product_all[$key]->product_code = $lims_product_variant->item_code;
                        }
                    }
                }
                $lims_sale_product_all[$key]->biller = $lims_sale_data->biller == null ? "" : $lims_sale_data->biller->name;
                $lims_sale_product_all[$key]->warehouse = $lims_sale_data->warehouse->name;
                $lims_sale_product_all[$key]->created_at = $lims_sale_data->created_at;
                $lims_sale_product_all[$key]->unit = "";
                $unit_data = Unit::find($latest_record_sale_product->sale_unit_id);
                if($unit_data){
                    $lims_sale_product_all[$key]->unit = $unit_data->unit_code;
                }

            }

            $collection = new Collection($lims_sale_product_all);
            $lims_sale_product_all = $collection->sortBy('created_at');
            array_push($data_sale_customer, $lims_sale_product_all);
            array_push($data_sale_customer, $sale_customer);
            array_push($lims_data_sale, $data_sale_customer);
                
            foreach ($lims_return_product_all as $key => $return_product) {
                $latest_record_return_product = DB::table('product_sales')
                    ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->where('sales.method', 'return')
                    ->where('product_sales.product_id', $return_product->product_id)
                    ->where('product_sales.variant_id', $return_product->variant_id)
                    ->whereDate('product_sales.created_at', '>=' , $start_date)
                    ->whereDate('product_sales.created_at', '<=' , $end_date)
                    ->orderBy('product_sales.created_at', 'desc')
                    ->first();
                
                $lims_return_data = Sale::with('biller', 'warehouse')
                    ->find($latest_record_return_product->sale_id);
                
                $lims_return_product_all[$key]->product_name = "";
                $lims_return_product_all[$key]->product_code = "";
                $lims_product_data = Product::select('name', 'code')->find($return_product->product_id);
                if($lims_product_data){
                    $lims_return_product_all[$key]->product_name = $lims_product_data->name;
                    $lims_return_product_all[$key]->product_code = $lims_product_data->code;
                    if($return_product->variant_id){
                        $lims_variant_data = Variant::find($return_product->variant_id);
                        $lims_product_variant = ProductVariant::where('product_id', $return_product->product_id)
                        ->where('variant_id', $return_product->variant_id)
                        ->first();
                        if($lims_variant_data){
                            $lims_return_product_all[$key]->product_name = $lims_variant_data->name;
                            $lims_return_product_all[$key]->product_code = $lims_product_variant->item_code;
                        }
                    }
                }
                $lims_return_product_all[$key]->biller = $lims_return_data->biller == null ? "" : $lims_return_data->biller->name;
                $lims_return_product_all[$key]->warehouse = $lims_return_data->warehouse->name;
                $lims_return_product_all[$key]->created_at = $lims_return_data->created_at;
                $lims_return_product_all[$key]->unit = "";
                $unit_data = Unit::find($latest_record_return_product->sale_unit_id);
                if($unit_data){
                    $lims_return_product_all[$key]->unit = $unit_data->unit_code;
                }

            }
            $collection = new Collection($lims_return_product_all);
            $lims_return_product_all = $collection->sortBy('created_at');
            array_push($data_return_customer, $lims_return_product_all);
            array_push($data_return_customer, $sale_customer);
            array_push($lims_data_return, $data_return_customer);
        } else {
            $lims_sale_product_all = DB::table('sales')
                ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                ->select('product_sales.product_id', 'product_sales.variant_id', 'product_sales.net_unit_price', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                ->where('sales.customer_id', $customer_id)
                ->whereNull('sales.method')
                ->whereDate('sales.created_at', '>=', $start_date)
                ->whereDate('sales.created_at', '<=', $end_date)
                ->groupBy('product_sales.product_id', 'product_sales.variant_id', 'product_sales.net_unit_price')
                ->orderBy('sales.created_at', 'asc')
                ->get();

            $lims_return_product_all = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.product_id', 'product_sales.variant_id', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                    ->where('sales.customer_id', $customer_id)
                    ->where('sales.method', 'return')
                    ->whereDate('sales.created_at', '>=', $start_date)
                    ->whereDate('sales.created_at', '<=', $end_date)
                    ->groupBy('product_sales.product_id', 'product_sales.variant_id')
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

            $lims_payment_data = DB::table('payments')
                    ->join('sales', 'payments.sale_id', '=', 'sales.id')
                    ->whereNull('sales.method')
                    ->where('customer_id', $customer_id)
                    ->whereDate('payments.created_at', '>=' , $start_date)
                    ->whereDate('payments.created_at', '<=' , $end_date)
                    ->select('payments.*', 'sales.reference_no as sale_reference')
                    ->orderBy('payments.created_at', 'desc')
                    ->get();

            foreach ($lims_sale_product_all as $key => $sale_product) {
                $latest_record_sale_product = DB::table('product_sales')
                    ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->where('sales.customer_id', $customer_id)
                    ->whereNull('sales.method')
                    ->where('product_sales.product_id', $sale_product->product_id)
                    ->where('product_sales.variant_id', $sale_product->variant_id)
                    ->whereDate('product_sales.created_at', '>=' , $start_date)
                    ->whereDate('product_sales.created_at', '<=' , $end_date)
                    ->orderBy('product_sales.created_at', 'desc')
                    ->first();

                $lims_sale_data = Sale::with('biller', 'warehouse')
                ->find($latest_record_sale_product->sale_id);
                
                $lims_sale_product_all[$key]->product_name = "";
                $lims_sale_product_all[$key]->product_code = "";
                $lims_product_data = Product::select('name', 'code')->find($sale_product->product_id);
                if($lims_product_data){
                    $lims_sale_product_all[$key]->product_name = $lims_product_data->name;
                    $lims_sale_product_all[$key]->product_code = $lims_product_data->code;
                    if($sale_product->variant_id){
                        $lims_variant_data = Variant::find($sale_product->variant_id);
                        $lims_product_variant = ProductVariant::where('product_id', $sale_product->product_id)
                        ->where('variant_id', $sale_product->variant_id)
                        ->first();
                        if($lims_variant_data){
                            $lims_sale_product_all[$key]->product_name = $lims_variant_data->name;
                            $lims_sale_product_all[$key]->product_code = $lims_product_variant->item_code;
                        }
                    }
                }
                $lims_sale_product_all[$key]->biller = $lims_sale_data->biller == null ? "" : $lims_sale_data->biller->name;
                $lims_sale_product_all[$key]->warehouse = $lims_sale_data->warehouse->name;
                $lims_sale_product_all[$key]->created_at = $lims_sale_data->created_at;
                $lims_sale_product_all[$key]->unit = "";
                $unit_data = Unit::find($latest_record_sale_product->sale_unit_id);
                if($unit_data){
                    $lims_sale_product_all[$key]->unit = $unit_data->unit_code;
                }

            }

            $collection = new Collection($lims_sale_product_all);
            $lims_sale_product_all = $collection->sortBy('created_at');
            array_push($data_sale_customer, $lims_sale_product_all);
            array_push($data_sale_customer, $sale_customer);
            array_push($lims_data_sale, $data_sale_customer);
                
            foreach ($lims_return_product_all as $key => $return_product) {
                $latest_record_return_product = DB::table('product_sales')
                    ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->where('sales.customer_id', $customer_id)
                    ->where('sales.method', 'return')
                    ->where('product_sales.product_id', $return_product->product_id)
                    ->where('product_sales.variant_id', $return_product->variant_id)
                    ->whereDate('product_sales.created_at', '>=' , $start_date)
                    ->whereDate('product_sales.created_at', '<=' , $end_date)
                    ->orderBy('product_sales.created_at', 'desc')
                    ->first();
                
                $lims_return_data = Sale::with('biller', 'warehouse')
                    ->find($latest_record_return_product->sale_id);
                
                $lims_return_product_all[$key]->product_name = "";
                $lims_return_product_all[$key]->product_code = "";
                $lims_product_data = Product::select('name', 'code')->find($return_product->product_id);
                if($lims_product_data){
                    $lims_return_product_all[$key]->product_name = $lims_product_data->name;
                    $lims_return_product_all[$key]->product_code = $lims_product_data->code;
                    if($return_product->variant_id){
                        $lims_variant_data = Variant::find($return_product->variant_id);
                        $lims_product_variant = ProductVariant::where('product_id', $return_product->product_id)
                        ->where('variant_id', $return_product->variant_id)
                        ->first();
                        if($lims_variant_data){
                            $lims_return_product_all[$key]->product_name = $lims_variant_data->name;
                            $lims_return_product_all[$key]->product_code = $lims_product_variant->item_code;
                        }
                    }
                }
                $lims_return_product_all[$key]->biller = $lims_return_data->biller == null ? "" : $lims_return_data->biller->name;
                $lims_return_product_all[$key]->warehouse = $lims_return_data->warehouse->name;
                $lims_return_product_all[$key]->created_at = $lims_return_data->created_at;
                $lims_return_product_all[$key]->unit = "";
                $unit_data = Unit::find($latest_record_return_product->sale_unit_id);
                if($unit_data){
                    $lims_return_product_all[$key]->unit = $unit_data->unit_code;
                }

            }
            $collection = new Collection($lims_return_product_all);
            $lims_return_product_all = $collection->sortBy('created_at');
            array_push($data_return_customer, $lims_return_product_all);
            array_push($data_return_customer, $sale_customer);
            array_push($lims_data_return, $data_return_customer);
        }


        $lims_customer_list = Customer::where('is_active', true)->get();
        return view('report.customer_report', compact('lims_data_sale', 'lims_data_return','customer_id', 'sale_customer', 'start_date', 'end_date', 'lims_payment_data', 'lims_customer_list'));
    }

    public function saleAllCustomerReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $customer_id = $data['customer_id'];
        $lims_list_customer = [];
        $lims_data = [];
        $lims_sale_data = [];
        
        if($customer_id != 0){
            $sale_customer = Customer::find($customer_id);
            if($sale_customer != null){
                $data_customer = [];
                $limit_cost = Sale::with('warehouse')
                    ->where('customer_id', $customer_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('grand_total');
                $limit_qty = Sale::with('warehouse')
                    ->where('customer_id', $customer_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('total_qty');
                $lims_sale_product_all = DB::table('sales')
                    ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                    ->select('product_sales.product_id', 'product_sales.variant_id', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                    ->where('sales.customer_id', $customer_id)
                    ->whereDate('sales.created_at', '>=', $start_date)
                    ->whereDate('sales.created_at', '<=', $end_date)
                    ->groupBy('product_sales.product_id', 'product_sales.variant_id')
                    ->orderBy('sales.created_at', 'asc')
                    ->get();

                foreach ($lims_sale_product_all as $key => $sale_product) {
                    $latest_record_sale_product = DB::table('product_sales')
                        ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                        ->where('sales.customer_id', $customer_id)
                        ->where('product_sales.product_id', $sale_product->product_id)
                        ->where('product_sales.variant_id', $sale_product->variant_id)
                        ->whereDate('product_sales.created_at', '>=' , $start_date)
                        ->whereDate('product_sales.created_at', '<=' , $end_date)
                        ->orderBy('product_sales.created_at', 'desc')
                        ->first();

                    $lims_sale_data = Sale::with('biller', 'warehouse')
                    ->find($latest_record_sale_product->sale_id);
                   
                    $lims_sale_product_all[$key]->product_name = "";
                    $lims_sale_product_all[$key]->product_code = "";
                    $lims_product_data = Product::select('name', 'code')->find($sale_product->product_id);
                    if($lims_product_data){
                        $lims_sale_product_all[$key]->product_name = $lims_product_data->name;
                        $lims_sale_product_all[$key]->product_code = $lims_product_data->code;
                        if($sale_product->variant_id){
                            $lims_variant_data = Variant::find($sale_product->variant_id);
                            $lims_product_variant = ProductVariant::where('product_id', $sale_product->product_id)
                            ->where('variant_id', $sale_product->variant_id)
                            ->first();
                            if($lims_variant_data){
                                $lims_sale_product_all[$key]->product_name = $lims_variant_data->name;
                                $lims_sale_product_all[$key]->product_code = $lims_product_variant->item_code;
                            }
                        }
                    }
                    $lims_sale_product_all[$key]->biller = $lims_sale_data->biller == null ? "" : $lims_sale_data->biller->name;
                    $lims_sale_product_all[$key]->warehouse = $lims_sale_data->warehouse->name;
                    $lims_sale_product_all[$key]->created_at = $lims_sale_data->created_at;
                    $lims_sale_product_all[$key]->unit = "";
                    $unit_data = Unit::find($latest_record_sale_product->sale_unit_id);
                    if($unit_data){
                        $lims_sale_product_all[$key]->unit = $unit_data->unit_code;
                    }

                }
            
                $collection = new Collection($lims_sale_product_all);
                $lims_sale_product_all = $collection->sortBy('created_at');

                array_push($data_customer, $lims_sale_product_all);
                array_push($data_customer, $sale_customer);
                array_push($data_customer, $limit_qty);
                array_push($data_customer, $limit_cost);
                array_push($lims_data, $data_customer);
            }
        } else {
            $lims_list_customer = Sale::with('warehouse')
            ->select('customer_id')
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('customer_id')
            ->get();
        
            foreach ($lims_list_customer as $key => $customer) {
                $sale_customer = Customer::find($customer->customer_id);
                if($sale_customer != null){
                    $data_customer = [];
                    $limit_cost = Sale::with('warehouse')
                        ->where('customer_id', $customer->customer_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->sum('grand_total');
                    $limit_qty = Sale::with('warehouse')
                        ->where('customer_id', $customer->customer_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->sum('total_qty');
                    $lims_sale_product_all = DB::table('sales')
                        ->join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
                        ->select('product_sales.product_id', 'product_sales.variant_id', DB::raw('SUM(product_sales.qty) as total_quantity'), DB::raw('SUM(product_sales.total) as total_amount'))
                        ->where('sales.customer_id', $customer->customer_id)
                        ->whereDate('sales.created_at', '>=', $start_date)
                        ->whereDate('sales.created_at', '<=', $end_date)
                        ->groupBy('product_sales.product_id', 'product_sales.variant_id')
                        ->orderBy('sales.created_at', 'asc')
                        ->get();
    
                    foreach ($lims_sale_product_all as $key => $sale_product) {
                        $latest_record_sale_product = DB::table('product_sales')
                            ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                            ->where('sales.customer_id', $customer->customer_id)
                            ->where('product_sales.product_id', $sale_product->product_id)
                            ->where('product_sales.variant_id', $sale_product->variant_id)
                            ->whereDate('product_sales.created_at', '>=' , $start_date)
                            ->whereDate('product_sales.created_at', '<=' , $end_date)
                            ->orderBy('product_sales.created_at', 'desc')
                            ->first();
    
                        $lims_sale_data = Sale::with('biller', 'warehouse')
                        ->find($latest_record_sale_product->sale_id);
                       
                        $lims_sale_product_all[$key]->product_name = "";
                        $lims_sale_product_all[$key]->product_code = "";
                        $lims_product_data = Product::select('name', 'code')->find($sale_product->product_id);
                        if($lims_product_data){
                            $lims_sale_product_all[$key]->product_name = $lims_product_data->name;
                            $lims_sale_product_all[$key]->product_code = $lims_product_data->code;
                            if($sale_product->variant_id){
                                $lims_variant_data = Variant::find($sale_product->variant_id);
                                $lims_product_variant = ProductVariant::where('product_id', $sale_product->product_id)
                                ->where('variant_id', $sale_product->variant_id)
                                ->first();
                                if($lims_variant_data){
                                    $lims_sale_product_all[$key]->product_name = $lims_variant_data->name;
                                    $lims_sale_product_all[$key]->product_code = $lims_product_variant->item_code;
                                }
                            }
                        }
                        $lims_sale_product_all[$key]->biller = $lims_sale_data->biller == null ? "" : $lims_sale_data->biller->name;
                        $lims_sale_product_all[$key]->warehouse = $lims_sale_data->warehouse->name;
                        $lims_sale_product_all[$key]->created_at = $lims_sale_data->created_at;
                        $lims_sale_product_all[$key]->unit = "";
                        $unit_data = Unit::find($latest_record_sale_product->sale_unit_id);
                        if($unit_data){
                            $lims_sale_product_all[$key]->unit = $unit_data->unit_code;
                        }
    
                    }
                
                    $collection = new Collection($lims_sale_product_all);
                    $lims_sale_product_all = $collection->sortBy('created_at');
    
                    array_push($data_customer, $lims_sale_product_all);
                    array_push($data_customer, $sale_customer);
                    array_push($data_customer, $limit_qty);
                    array_push($data_customer, $limit_cost);
                    array_push($lims_data, $data_customer);
                }
            } 
             
        }

        $lims_customer_list = Customer::where('is_active', true)->get();
        return view('report.sale_all_customer', compact('customer_id', 'lims_customer_list', 'lims_data', 'lims_sale_data', 'start_date', 'end_date'));
    }

    public function saleAllProductReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $product_code = $data['product_code'];
        $lims_product_list = [];
        $lims_data = [];
        $lims_sale_product_data = [];

        if($product_code != 0){
            $lims_product_data = Product::where('code', $product_code)->first();
            
            if(!$lims_product_data){
                $product_variant_data = ProductVariant::where('item_code', $product_code)->first();
                if($product_variant_data){
                    $product_data = Product::find($product_variant_data->product_id);
                    if($product_data != null){
                        $data_product = [];
                        $lims_sale_product_data = Product_Sale::where('product_id', $product_variant_data->product_id)
                            ->where('variant_id', $product_variant_data->variant_id)
                            ->whereDate('created_at', '>=' , $start_date)
                            ->whereDate('created_at', '<=' , $end_date)
                            ->orderBy('created_at', 'asc')
                            ->get();
                    
                        $lims_total_cost = 0;
                        $lims_total_qty = 0;
        
                        foreach ($lims_sale_product_data as $key => $sale_product) {
                            $sale_data = Sale::find($sale_product->sale_id);
                            $sale_customer_data = Customer::find($sale_data->customer_id);
                            $sale_warehouse_data = Warehouse::find($sale_data->warehouse_id);
                            $sale_biller_data = Biller::find($sale_data->biller_id);
        
                            $lims_sale_product_data[$key]->customer = $sale_customer_data == null ? '' : $sale_customer_data->name;
                            $lims_sale_product_data[$key]->biller = $sale_biller_data == null ? '' : $sale_biller_data->name;
                            $lims_sale_product_data[$key]->warehouse = $sale_warehouse_data == null ? '' : $sale_warehouse_data->name;
                            if($sale_customer_data->phone_number){
                                $sale_customer_data->name .= ' ['.$sale_customer_data->phone_number.']';
                                $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                            }
                            else {
                                $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                            }
        
                            $lims_sale_product_data[$key]->reference_no = $sale_data->reference_no;
                            $lims_total_qty += $sale_product->qty;
                            $lims_total_cost += $sale_product->total;
                        }          
        
                        if($product_variant_data->variant_id){
                            $variant_data = Variant::find($product_variant_data->variant_id);
                            $product_variant_code = $product_variant_data->item_code;
                            $product_data->name = ' [' . $product_variant_code.'] ' .$variant_data->name;     
                        }
                        else {
                            $product_data->name = ' [' . $product_data->code.'] ' . $product_data->name;
                        }
        
                        array_push($data_product, $lims_sale_product_data);
                        array_push($data_product, $product_data->name);
                        array_push($data_product, $lims_total_qty);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                    
                }
            } else {
                $data_product = [];
                $lims_sale_product_data = Product_Sale::where('product_id', $lims_product_data->id)                      
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->orderBy('created_at', 'asc')
                    ->get();
            
                $lims_total_cost = 0;
                $lims_total_qty = 0;

                foreach ($lims_sale_product_data as $key => $sale_product) {
                    $sale_data = Sale::find($sale_product->sale_id);
                    $sale_customer_data = Customer::find($sale_data->customer_id);
                    $sale_warehouse_data = Warehouse::find($sale_data->warehouse_id);
                    $sale_biller_data = Biller::find($sale_data->biller_id);

                    $lims_sale_product_data[$key]->customer = $sale_customer_data == null ? '' : $sale_customer_data->name;
                    $lims_sale_product_data[$key]->biller = $sale_biller_data == null ? '' : $sale_biller_data->name;
                    $lims_sale_product_data[$key]->warehouse = $sale_warehouse_data == null ? '' : $sale_warehouse_data->name;
                    if($sale_customer_data->phone_number){
                        $sale_customer_data->name .= ' ['.$sale_customer_data->phone_number.']';
                        $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                    }
                    else {
                        $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                    }

                    $lims_sale_product_data[$key]->reference_no = $sale_data->reference_no;
                    $lims_total_qty += $sale_product->qty;
                    $lims_total_cost += $sale_product->total;
                }          

                $lims_product_data->name = ' [' . $lims_product_data->code.'] ' . $lims_product_data->name;

                array_push($data_product, $lims_sale_product_data);
                array_push($data_product, $lims_product_data->name);
                array_push($data_product, $lims_total_qty);
                array_push($data_product, $lims_total_cost);
                array_push($lims_data, $data_product);
            }
        } else{
            $lims_list_sale_all = DB::table('product_sales')
                ->select('product_sales.product_id', 'product_sales.variant_id')
                ->join('sales', 'sales.id', '=', 'product_sales.sale_id')
                ->whereDate('sales.created_at','>=', $start_date)
                ->whereDate('sales.created_at','<=', $end_date)
                ->groupBy('product_sales.product_id', 'product_sales.variant_id')
                ->get();
        
            foreach ($lims_list_sale_all as $key => $product) {
                $product_data = Product::find($product->product_id);
                if($product_data != null){
                    $data_product = [];
                    $lims_sale_product_data = Product_Sale::where('product_id', $product->product_id)
                        ->where('variant_id', $product->variant_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $lims_total_cost = 0;
                    $lims_total_qty = 0;
    
                    foreach ($lims_sale_product_data as $key => $sale_product) {
                        $sale_data = Sale::find($sale_product->sale_id);
                        $sale_customer_data = Customer::find($sale_data->customer_id);
                        $sale_warehouse_data = Warehouse::find($sale_data->warehouse_id);
                        $sale_biller_data = Biller::find($sale_data->biller_id);
    
                        $lims_sale_product_data[$key]->customer = $sale_customer_data == null ? '' : $sale_customer_data->name;
                        $lims_sale_product_data[$key]->biller = $sale_biller_data == null ? '' : $sale_biller_data->name;
                        $lims_sale_product_data[$key]->warehouse = $sale_warehouse_data == null ? '' : $sale_warehouse_data->name;
                        if($sale_customer_data->phone_number){
                            $sale_customer_data->name .= ' ['.$sale_customer_data->phone_number.']';
                            $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                        }
                        else {
                            $lims_sale_product_data[$key]->customer = $sale_customer_data->name;
                        }
    
                        $lims_sale_product_data[$key]->reference_no = $sale_data->reference_no;
                        $lims_total_qty += $sale_product->qty;
                        $lims_total_cost += $sale_product->total;
                    }          
    
                    if($product->variant_id){
                        $variant_data = Variant::find($product->variant_id);
                        $product_variant = ProductVariant::FindExactProduct($product->product_id, $variant_data->id)->first();
                        $product_variant_code = $product_variant->item_code;
                        $product_data->name = ' [' . $product_variant_code.'] ' .$variant_data->name;     
                    }
                    else {
                        $product_data->name = ' [' . $product_data->code.'] ' . $product_data->name;
                    }
    
                    array_push($data_product, $lims_sale_product_data);
                    array_push($data_product, $product_data->name);
                    array_push($data_product, $lims_total_qty);
                    array_push($data_product, $lims_total_cost);
                    array_push($lims_data, $data_product);
                }
            } 
        }

        $lims_product_data = Product::where('is_active', true)->get();
        if(count($lims_product_data) > 0){
            foreach ($lims_product_data as $key => $product) {
                if($product->is_variant == 1){
                    $lims_product_variant_data = Product::join('product_variants', 'products.id', '=', 'product_variants.product_id')
                        ->select('products.name', 'product_variants.item_code as code', 'product_variants.variant_id')
                        ->where('product_id', $product->id)
                        ->get();

                    if(count($lims_product_variant_data) > 0){
                        foreach ($lims_product_variant_data as $key => $product_variant) {
                            $variant_name = Variant::find($product_variant->variant_id)->name;
                            $product_variant->name = $variant_name;
                            $lims_product_list[] = $product_variant;
                        }
                    }
                } else {
                    $lims_product_list[] = $product;
                }
            }
        }

        return view('report.sale_all_product', compact('product_code', 'lims_product_list', 'lims_data', 'lims_sale_product_data', 'start_date', 'end_date'));
    }

    public function purchaseAllSupplierReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $supplier_id = $data['supplier_id'];
        $lims_list_supplier = [];
        $lims_data = [];
        $lims_purchase_data = [];

        if($supplier_id != 0){
            $purchase_supplier = Supplier::find($supplier_id);
            if($purchase_supplier->is_active == 1){
                $data_supplier = [];
                $lims_purchase_data = Purchase::with('warehouse')
                    ->where('method', NULL)
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->orderBy('created_at', 'asc')
                    ->get();
                $limit_cost = Purchase::with('warehouse')
                    ->where('method', NULL)
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('grand_total');
                $limit_qty = Purchase::with('warehouse')
                    ->where('method', NULL)
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('total_qty');

                foreach ($lims_purchase_data as $key => $purchase) {
                    $lims_purchase_data[$key]->product = ProductPurchase::where('purchase_id', $purchase->id)->get();
                }

                array_push($data_supplier, $lims_purchase_data);
                array_push($data_supplier, $purchase_supplier);
                array_push($data_supplier, $limit_qty);
                array_push($data_supplier, $limit_cost);
                array_push($lims_data, $data_supplier);
            }
        } else {
            $lims_list_supplier = Purchase::with('warehouse')
                ->where('method', NULL)
                ->select('supplier_id')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->groupBy('supplier_id')
                ->get();

            foreach ($lims_list_supplier as $key => $supplier) {
                if($supplier->supplier_id != null){
                    $purchase_supplier = Supplier::find($supplier->supplier_id);
                    if($purchase_supplier->is_active == 1){
                        $data_supplier = [];
                        $lims_purchase_data = Purchase::with('warehouse')->where('method', NULL)->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
                        $limit_cost = Purchase::with('warehouse')->where('method', NULL)->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('grand_total');
                        $limit_qty = Purchase::with('warehouse')->where('method', NULL)->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_qty');
    
                        foreach ($lims_purchase_data as $key => $purchase) {
                            $lims_purchase_data[$key]->product = ProductPurchase::where('purchase_id', $purchase->id)->get();
                        }
    
                        array_push($data_supplier, $lims_purchase_data);
                        array_push($data_supplier, $purchase_supplier);
                        array_push($data_supplier, $limit_qty);
                        array_push($data_supplier, $limit_cost);
                        array_push($lims_data, $data_supplier);
                    }
                }
            } 
        }
       
        $lims_supplier_list = Supplier::where('is_active', true)->get();
        return view('report.purchase_all_supplier', compact('supplier_id', 'lims_supplier_list', 'lims_data', 'lims_purchase_data', 'start_date', 'end_date'));
    }

    public function purchaseAllProductReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $product_id = $data['product_id'];
        $lims_data = [];
        $lims_purchase_product_data = [];

        if($product_id != 0){
            $lims_list_product = ProductPurchase::select('product_id')
            ->where('product_id', $product_id)
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();
            
            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_purchase_product_data = ProductPurchase::where('product_id', $product->product_id)                      
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;

                    if(count($lims_purchase_product_data) > 0){
                        foreach ($lims_purchase_product_data as $key => $purchase_product) {
                            $purchase_data = Purchase::where('id', $purchase_product->purchase_id)->where('method', NULL)->first();
                            if($purchase_data){
                                $purchase_supplier_data = Supplier::find($purchase_data->supplier_id);
                                $purchase_warehouse_data = Warehouse::find($purchase_data->warehouse_id);
        
                                $lims_purchase_product_data[$key]->warehouse = $purchase_warehouse_data == null ? '' : $purchase_warehouse_data->name;
                                if( $purchase_supplier_data && $purchase_supplier_data->phone_number){
                                    $purchase_supplier_data->name .= ' ['.$purchase_supplier_data->phone_number.']';
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data->name;
                                }
                                else {
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data == null ? '' : $purchase_supplier_data->name;
                                }
        
                                $lims_purchase_product_data[$key]->content = $purchase_data->content ?? '';
                                $lims_total_qty += $purchase_product->qty;
                                $lims_total_cost += $purchase_product->total;
                            } else {
                                unset($lims_purchase_product_data[$key]);
                            }
                            
                        }
                    }


                    if(count($lims_purchase_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
                        
                        array_push($data_product, $lims_purchase_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 
        } else{
            $lims_list_product = ProductPurchase::select('product_id')
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();

            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_purchase_product_data = ProductPurchase::
                        where('product_id', $product->product_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;

                    if(count($lims_purchase_product_data) > 0){
                        foreach ($lims_purchase_product_data as $key => $purchase_product) {
                            $purchase_data = Purchase::where('id', $purchase_product->purchase_id)->where('method', NULL)->first();
                            if($purchase_data ){
                                $purchase_supplier_data = Supplier::find($purchase_data->supplier_id);
                                $purchase_warehouse_data = Warehouse::find($purchase_data->warehouse_id);
    
                                $lims_purchase_product_data[$key]->warehouse = $purchase_warehouse_data == null ? '' : $purchase_warehouse_data->name;
                                if( $purchase_supplier_data && $purchase_supplier_data->phone_number){
                                    $purchase_supplier_data->name .= ' ['.$purchase_supplier_data->phone_number.']';
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data->name;
                                }
                                else {
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data == null ? '' : $purchase_supplier_data->name;
                                }
    
                                $lims_purchase_product_data[$key]->content = $purchase_data->content ?? '';
                                $lims_total_qty += $purchase_product->qty;
                                $lims_total_cost += $purchase_product->total;
                            } else {
                                unset($lims_purchase_product_data[$key]);
                            }
                        }
                    }

                    if(count($lims_purchase_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
                        
                        array_push($data_product, $lims_purchase_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 
        }

        $lims_product_list = Product::where('is_active', true)->get();
        return view('report.purchase_all_product', compact('product_id', 'lims_product_list', 'lims_data', 'lims_purchase_product_data', 'start_date', 'end_date'));
    }

    public function lendAllSupplierReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $supplier_id = $data['supplier_id'];
        $lims_list_supplier = [];
        $lims_data = [];
        $lims_purchase_data = [];

        if($supplier_id != 0){
            $purchase_supplier = Supplier::find($supplier_id);
            if($purchase_supplier->is_active == 1){
                $data_supplier = [];
                $lims_purchase_data = Purchase::with('warehouse')
                    ->where('method', 'return')
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->orderBy('created_at', 'asc')
                    ->get();
                $limit_cost = Purchase::with('warehouse')
                    ->where('method', 'return')
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('grand_total');
                $limit_qty = Purchase::with('warehouse')
                    ->where('method', 'return')
                    ->where('supplier_id', $supplier_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('total_qty');

                foreach ($lims_purchase_data as $key => $purchase) {
                    $lims_purchase_data[$key]->product = ProductPurchase::where('purchase_id', $purchase->id)->get();
                }

                array_push($data_supplier, $lims_purchase_data);
                array_push($data_supplier, $purchase_supplier);
                array_push($data_supplier, $limit_qty);
                array_push($data_supplier, $limit_cost);
                array_push($lims_data, $data_supplier);
            }
        } else {
            $lims_list_supplier = Purchase::with('warehouse')
                ->select('supplier_id')
                ->where('method', 'return')
                ->whereDate('created_at', '>=' , $start_date)
                ->whereDate('created_at', '<=' , $end_date)
                ->groupBy('supplier_id')
                ->get();

            foreach ($lims_list_supplier as $key => $supplier) {
                if($supplier->supplier_id != null){
                    $purchase_supplier = Supplier::find($supplier->supplier_id);
                    if($purchase_supplier->is_active == 1){
                        $data_supplier = [];
                        $lims_purchase_data = Purchase::with('warehouse')->where('method', 'return')->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
                        $limit_cost = Purchase::with('warehouse')->where('method', 'return')->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('grand_total');
                        $limit_qty = Purchase::with('warehouse')->where('method', 'return')->where('supplier_id', $supplier->supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->sum('total_qty');
    
                        foreach ($lims_purchase_data as $key => $purchase) {
                            $lims_purchase_data[$key]->product = ProductPurchase::where('purchase_id', $purchase->id)->get();
                        }
    
                        array_push($data_supplier, $lims_purchase_data);
                        array_push($data_supplier, $purchase_supplier);
                        array_push($data_supplier, $limit_qty);
                        array_push($data_supplier, $limit_cost);
                        array_push($lims_data, $data_supplier);
                    }
                }
            } 
        }
       
        $lims_supplier_list = Supplier::where('is_active', true)->get();
        return view('report.lend_all_supplier', compact('supplier_id', 'lims_supplier_list', 'lims_data', 'lims_purchase_data', 'start_date', 'end_date'));
    }

    public function lendAllProductReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $product_id = $data['product_id'];
        $lims_data = [];
        $lims_purchase_product_data = [];

        if($product_id != 0){
            $lims_list_product = ProductPurchase::select('product_id')
            ->where('product_id', $product_id)
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();
            
            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_purchase_product_data = ProductPurchase::where('product_id', $product->product_id)                      
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;

                    if(count($lims_purchase_product_data) > 0){
                        foreach ($lims_purchase_product_data as $key => $purchase_product) {
                            $purchase_data = Purchase::where('id', $purchase_product->purchase_id)->where('method', 'return')->first();
                            if($purchase_data){
                                $purchase_supplier_data = Supplier::find($purchase_data->supplier_id);
                                $purchase_warehouse_data = Warehouse::find($purchase_data->warehouse_id);
        
                                $lims_purchase_product_data[$key]->warehouse = $purchase_warehouse_data == null ? '' : $purchase_warehouse_data->name;
                                if( $purchase_supplier_data && $purchase_supplier_data->phone_number){
                                    $purchase_supplier_data->name .= ' ['.$purchase_supplier_data->phone_number.']';
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data->name;
                                }
                                else {
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data == null ? '' : $purchase_supplier_data->name;
                                }
        
                                $lims_purchase_product_data[$key]->content = $purchase_data->content ?? '';
                                $lims_total_qty += $purchase_product->qty;
                                $lims_total_cost += $purchase_product->total;
                            } else {
                                unset($lims_purchase_product_data[$key]);
                            }
                        }
                    }

                    if(count($lims_purchase_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
                        
                        array_push($data_product, $lims_purchase_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 
        } else{
            $lims_list_product = ProductPurchase::select('product_id')
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();

            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_purchase_product_data = ProductPurchase::
                        where('product_id', $product->product_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;

                    if(count($lims_purchase_product_data) > 0){
                        foreach ($lims_purchase_product_data as $key => $purchase_product) {
                            $purchase_data = Purchase::where('id', $purchase_product->purchase_id)->where('method', 'return')->first();
                            if($purchase_data){
                                $purchase_supplier_data = Supplier::find($purchase_data->supplier_id);
                                $purchase_warehouse_data = Warehouse::find($purchase_data->warehouse_id);
    
                                $lims_purchase_product_data[$key]->warehouse = $purchase_warehouse_data == null ? '' : $purchase_warehouse_data->name;
                                if( $purchase_supplier_data && $purchase_supplier_data->phone_number){
                                    $purchase_supplier_data->name .= ' ['.$purchase_supplier_data->phone_number.']';
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data->name;
                                }
                                else {
                                    $lims_purchase_product_data[$key]->supplier = $purchase_supplier_data == null ? '' : $purchase_supplier_data->name;
                                }
    
                                $lims_purchase_product_data[$key]->content = $purchase_data->content ?? '';
                                $lims_total_qty += $purchase_product->qty;
                                $lims_total_cost += $purchase_product->total;
                            } else {
                                unset($lims_purchase_product_data[$key]);
                            }
                        }
                    }

                    if(count($lims_purchase_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
    
                        array_push($data_product, $lims_purchase_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 
        }

        $lims_product_list = Product::where('is_active', true)->get();
        return view('report.lend_all_product', compact('product_id', 'lims_product_list', 'lims_data', 'lims_purchase_product_data', 'start_date', 'end_date'));
    }

    public function warrantyAllCustomerReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $customer_id = $data['customer_id'];
        $lims_list_customer = [];
        $lims_data = [];
        $lims_warranty_data = [];
        
        if($customer_id != 0){
            $warranty_customer = Customer::find($customer_id);
            if($warranty_customer != null){
                $data_customer = [];
                $limit_qty = Warranty::with('warehouse')
                    ->where('customer_id', $customer_id)
                    ->whereDate('created_at', '>=' , $start_date)
                    ->whereDate('created_at', '<=' , $end_date)
                    ->sum('total_qty');
                $lims_warranty_product_all = DB::table('warranties')
                    ->join('product_warranties', 'warranties.id', '=', 'product_warranties.warranty_id')
                    ->select('product_warranties.product_id', 'product_warranties.variant_id', DB::raw('SUM(product_warranties.qty) as total_quantity'))
                    ->where('warranties.customer_id', $customer_id)
                    ->whereDate('warranties.created_at', '>=', $start_date)
                    ->whereDate('warranties.created_at', '<=', $end_date)
                    ->groupBy('product_warranties.product_id', 'product_warranties.variant_id')
                    ->orderBy('warranties.created_at', 'asc')
                    ->get();

                foreach ($lims_warranty_product_all as $key => $warranty_product) {
                    $latest_record_warranty_product = DB::table('product_warranties')
                        ->join('warranties', 'warranties.id', '=', 'product_warranties.warranty_id')
                        ->where('warranties.customer_id', $customer_id)
                        ->where('product_warranties.product_id', $warranty_product->product_id)
                        ->where('product_warranties.variant_id', $warranty_product->variant_id)
                        ->whereDate('product_warranties.created_at', '>=' , $start_date)
                        ->whereDate('product_warranties.created_at', '<=' , $end_date)
                        ->orderBy('product_warranties.created_at', 'desc')
                        ->first();

                    $lims_warranty_data = Warranty::find($latest_record_warranty_product->warranty_id);
                   
                    $lims_warranty_product_all[$key]->product_name = "";
                    $lims_warranty_product_all[$key]->product_code = "";
                    $lims_product_data = Product::select('name', 'code')->find($warranty_product->product_id);
                    if($lims_product_data){
                        $lims_warranty_product_all[$key]->product_name = $lims_product_data->name;
                        $lims_warranty_product_all[$key]->product_code = $lims_product_data->code;
                        if($warranty_product->variant_id){
                            $lims_variant_data = Variant::find($warranty_product->variant_id);
                            $lims_product_variant = ProductVariant::where('product_id', $warranty_product->product_id)
                            ->where('variant_id', $warranty_product->variant_id)
                            ->first();
                            if($lims_variant_data){
                                $lims_warranty_product_all[$key]->product_name = $lims_variant_data->name;
                                $lims_warranty_product_all[$key]->product_code = $lims_product_variant->item_code;
                            }
                        }
                    }

                    $lims_warranty_product_all[$key]->created_at = $lims_warranty_data->created_at;
                    $lims_warranty_product_all[$key]->unit = "";
                    $unit_data = Unit::find($latest_record_warranty_product->unit_id);
                    if($unit_data){
                        $lims_warranty_product_all[$key]->unit = $unit_data->unit_code;
                    }

                }
            
                $collection = new Collection($lims_warranty_product_all);
                $lims_warranty_product_all = $collection->sortBy('created_at');

                array_push($data_customer, $lims_warranty_product_all);
                array_push($data_customer, $warranty_customer);
                array_push($data_customer, $limit_qty);
                array_push($lims_data, $data_customer);
            }
        } else {
            $lims_list_customer = Warranty::select('customer_id')
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('customer_id')
            ->get();
        
            foreach ($lims_list_customer as $key => $customer) {
                $warranty_customer = Customer::find($customer->customer_id);
                if($warranty_customer != null){
                    $data_customer = [];
                    $limit_qty = Warranty::where('customer_id', $customer->customer_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->sum('total_qty');
                    $lims_warranty_product_all = DB::table('warranties')
                        ->join('product_warranties', 'warranties.id', '=', 'product_warranties.warranty_id')
                        ->select('product_warranties.product_id', 'product_warranties.variant_id', DB::raw('SUM(product_warranties.qty) as total_quantity'))
                        ->where('warranties.customer_id', $customer->customer_id)
                        ->whereDate('warranties.created_at', '>=', $start_date)
                        ->whereDate('warranties.created_at', '<=', $end_date)
                        ->groupBy('product_warranties.product_id', 'product_warranties.variant_id')
                        ->orderBy('warranties.created_at', 'asc')
                        ->get();
    
                    foreach ($lims_warranty_product_all as $key => $warranty_product) {
                        $latest_record_warranty_product = DB::table('product_warranties')
                            ->join('warranties', 'warranties.id', '=', 'product_warranties.warranty_id')
                            ->where('warranties.customer_id', $customer->customer_id)
                            ->where('product_warranties.product_id', $warranty_product->product_id)
                            ->where('product_warranties.variant_id', $warranty_product->variant_id)
                            ->whereDate('product_warranties.created_at', '>=' , $start_date)
                            ->whereDate('product_warranties.created_at', '<=' , $end_date)
                            ->orderBy('product_warranties.created_at', 'desc')
                            ->first();
    
                        $lims_warranty_data = Warranty::find($latest_record_warranty_product->warranty_id);
                       
                        $lims_warranty_product_all[$key]->product_name = "";
                        $lims_warranty_product_all[$key]->product_code = "";
                        $lims_product_data = Product::select('name', 'code')->find($warranty_product->product_id);
                        if($lims_product_data){
                            $lims_warranty_product_all[$key]->product_name = $lims_product_data->name;
                            $lims_warranty_product_all[$key]->product_code = $lims_product_data->code;
                            if($warranty_product->variant_id){
                                $lims_variant_data = Variant::find($warranty_product->variant_id);
                                $lims_product_variant = ProductVariant::where('product_id', $warranty_product->product_id)
                                ->where('variant_id', $warranty_product->variant_id)
                                ->first();
                                if($lims_variant_data){
                                    $lims_warranty_product_all[$key]->product_name = $lims_variant_data->name;
                                    $lims_warranty_product_all[$key]->product_code = $lims_product_variant->item_code;
                                }
                            }
                        }

                        $lims_warranty_product_all[$key]->created_at = $lims_warranty_data->created_at;
                        if($lims_warranty_data->type = "import")
                            $lims_warranty_product_all[$key]->voucher = $lims_warranty_data->inventory_receiving_voucher;
                        else 
                            $lims_warranty_product_all[$key]->voucher = $lims_warranty_data->inventory_delivery_voucher;
                        $lims_warranty_product_all[$key]->note = $lims_warranty_data->note;
                        $lims_warranty_product_all[$key]->unit = "";
                        $unit_data = Unit::find($latest_record_warranty_product->unit_id);
                        if($unit_data){
                            $lims_warranty_product_all[$key]->unit = $unit_data->unit_code;
                        }
    
                    }
                
                    $collection = new Collection($lims_warranty_product_all);
                    $lims_warranty_product_all = $collection->sortBy('created_at');
    
                    array_push($data_customer, $lims_warranty_product_all);
                    array_push($data_customer, $warranty_customer);
                    array_push($data_customer, $limit_qty);
                    array_push($lims_data, $data_customer);
                }
            } 
             
        }

        $lims_customer_list = Customer::where('is_active', true)->get();
        return view('report.warranty_all_customer', compact('customer_id', 'lims_customer_list', 'lims_data', 'lims_warranty_data', 'start_date', 'end_date'));
    }

    public function warrantyAllProductReport(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $product_id = $data['product_id'];
        $lims_data = [];
        $lims_warranty_product_data = [];

        if($product_id != 0){
            $lims_list_product = ProductWarranty::select('product_id')
            ->where('product_id', $product_id)
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();
     
            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_warranty_product_data = ProductWarranty::where('product_id', $product->product_id)                      
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();
                        
                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;
              
                    if(count($lims_warranty_product_data) > 0){
                        foreach ($lims_warranty_product_data as $key => $warranty_product) {
                            $warranty_data = Warranty::where('id', $warranty_product->warranty_id)->first();
                            if($warranty_data){
                                $warranty_customer_data = Customer::find($warranty_data->customer_id);                              
        
                                if( $warranty_customer_data && $warranty_customer_data->phone_number){
                                    $warranty_customer_data->name .= ' ['.$warranty_customer_data->phone_number.']';
                                    $lims_warranty_product_data[$key]->customer = $warranty_customer_data->name;
                                }
                                else {
                                    $lims_warranty_product_data[$key]->customer = $warranty_customer_data == null ? '' : $warranty_customer_data->name;
                                }
        
                                $lims_warranty_product_data[$key]->content = $warranty_data->content ?? '';
                                $lims_total_qty += $warranty_product->qty;
                                $lims_total_cost += $warranty_product->total;
                            } else {
                                unset($lims_warranty_product_data[$key]);
                            }
                            
                        }
                    }

                    if(count($lims_warranty_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
                        
                        array_push($data_product, $lims_warranty_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 

            
        } else{
            $lims_list_product = ProductWarranty::select('product_id')
            ->whereDate('created_at', '>=' , $start_date)
            ->whereDate('created_at', '<=' , $end_date)
            ->groupBy('product_id')
            ->get();

            foreach ($lims_list_product as $key => $product) {
                $product_data = Product::find($product->product_id);
                
                if($product_data != null ){
                    $data_product = [];
                    $lims_warranty_product_data = ProductWarranty::
                        where('product_id', $product->product_id)
                        ->whereDate('created_at', '>=' , $start_date)
                        ->whereDate('created_at', '<=' , $end_date)
                        ->orderBy('created_at', 'asc')
                        ->get();

                    $count_variant = 1;
                    if($product_data->is_variant == 1) {
                        $product_variant_data = ProductVariant::where('product_id', $product_data->id)->get();
                        $count_variant = count($product_variant_data);
                    }
                    $lims_total_cost = 0;
                    $lims_total_qty = 0;

                    if(count($lims_warranty_product_data) > 0){
                        foreach ($lims_warranty_product_data as $key => $warranty_product) {
                            $warranty_data = Warranty::where('id', $warranty_product->warranty_id)->first();
                            if($warranty_data ){
                                $warranty_customer_data = Customer::find($warranty_data->customer_id);

                                if( $warranty_customer_data && $warranty_customer_data->phone_number){
                                    $warranty_customer_data->name .= ' ['.$warranty_customer_data->phone_number.']';
                                    $lims_warranty_product_data[$key]->customer = $warranty_customer_data->name;
                                }
                                else {
                                    $lims_warranty_product_data[$key]->customer = $warranty_customer_data == null ? '' : $warranty_customer_data->name;
                                }
    
                                $lims_warranty_product_data[$key]->content = $warranty_data->content ?? '';
                                $lims_total_qty += $warranty_product->qty;
                                $lims_total_cost += $warranty_product->total;
                            } else {
                                unset($lims_warranty_product_data[$key]);
                            }
                        }
                    }

                    if(count($lims_warranty_product_data) > 0){
                        $product_data_name = ' [' . $product_data->code.'] ' . $product_data->name;
                        
                        array_push($data_product, $lims_warranty_product_data);
                        array_push($data_product, $product_data_name);
                        array_push($data_product, $lims_total_qty/$count_variant);
                        array_push($data_product, $lims_total_cost);
                        array_push($lims_data, $data_product);
                    }
                }
            } 
        }

        $lims_product_list = Product::where('is_active', true)->get();
        return view('report.warranty_all_product', compact('product_id', 'lims_product_list', 'lims_data', 'lims_warranty_product_data', 'start_date', 'end_date'));
    }

    public function supplierReport(Request $request)
    {
        $data = $request->all();
        $supplier_id = $data['supplier_id'];
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
       
        if($supplier_id == 0){
            $lims_purchase_data = Purchase::with('warehouse')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
            $lims_return_data = ReturnPurchase::with('warehouse')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
            $lims_payment_data = DB::table('payments')
                            ->join('purchases', 'payments.purchase_id', '=', 'purchases.id')
                            ->whereDate('payments.created_at', '>=' , $start_date)
                            ->whereDate('payments.created_at', '<=' , $end_date)
                            ->select('payments.*', 'purchases.reference_no as purchase_reference')
                            ->orderBy('payments.created_at', 'asc')
                            ->get(); 
        } else {
            $lims_purchase_data = Purchase::with('warehouse')->where('supplier_id', $supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
            $lims_return_data = ReturnPurchase::with('warehouse')->where('supplier_id', $supplier_id)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->orderBy('created_at', 'asc')->get();
            $lims_payment_data = DB::table('payments')
                               ->join('purchases', 'payments.purchase_id', '=', 'purchases.id')
                               ->where('supplier_id', $supplier_id)
                               ->whereDate('payments.created_at', '>=' , $start_date)
                               ->whereDate('payments.created_at', '<=' , $end_date)
                               ->select('payments.*', 'purchases.reference_no as purchase_reference')
                               ->orderBy('payments.created_at', 'asc')
                               ->get();
        }
        $lims_product_purchase_data = [];
        $lims_product_quotation_data = [];
        $lims_product_return_data = [];

        foreach ($lims_purchase_data as $key => $purchase) {
            $lims_product_purchase_data[$key] = ProductPurchase::where('purchase_id', $purchase->id)->get();
        }
        foreach ($lims_return_data as $key => $return) {
            $lims_product_return_data[$key] = PurchaseProductReturn::where('return_id', $return->id)->get();
        }
        $lims_supplier_list = Supplier::where('is_active', true)->get();
        return view('report.supplier_report', compact('lims_purchase_data', 'lims_product_purchase_data', 'lims_payment_data', 'supplier_id', 'start_date', 'end_date', 'lims_supplier_list', 'lims_return_data', 'lims_product_return_data'));
    }

    public function dueReportByDate(Request $request)
    {
    	$data = $request->all();
        $start_date = $data['start_date'];
        $end_date = $data['end_date'];
        $lims_sale_data = Sale::where('payment_status', '!=', 4)->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->get();

        return view('report.due_report', compact('lims_sale_data', 'start_date', 'end_date'));
    }

    public function productAlert(Request $request)
    {
        $role = Role::find(Auth::user()->role_id);
        if($role->hasPermissionTo('product-qty-alert')){
            $lims_product_data = Product::select('name','code', 'image', 'qty', 'alert_quantity')->where('is_active', true)->whereColumn('alert_quantity', '>', 'qty')->get();
            // bán hàng thiết lập cảnh báo hàng giao quá 07 ngày chưa xuất hóa đơn
            $sevenDaysAgo = Carbon::now()->subDays(7);
            $lims_sale_data = Sale::with('customer')
                ->where('created_at', '<', $sevenDaysAgo)
                ->whereNull('biller_id')
                ->where('method', '=', NULL)
                ->orderBy('created_at', 'asc')
                ->get();

            // Hàng cho mượn quá 01 tháng thiết lập cảnh báo chưa lấy hàng về
            $monthAgo = Carbon::now()->subDays(30);
            $lims_return_data = Sale::with('customer')
                ->where('created_at', '<', $monthAgo)
                ->where('method', '=', 'return')
                ->orderBy('created_at', 'asc')
                ->get();

            // Hàng mượn của khách hàng quá 01 tháng thiết lập cảnh báo chưa trả hàng
            $lims_lend_data = Purchase::with('supplier')
                ->where('created_at', '<', $monthAgo)
                ->where('method', '=', 'return')
                ->orderBy('created_at', 'asc')
                ->get();

            // Hàng xuất đi sửa chữa, bảo hành quá 01 tháng thiết lập cảnh báo chưa nhập hàng về lại
            $lims_export_warranty_data = Warranty::with('customer')
                ->where('created_at', '<', $monthAgo)
                ->where('type', '=', 'export')
                ->orderBy('created_at', 'asc')
                ->get();
            return view('report.alert_report', compact('lims_product_data', 'lims_sale_data', 'lims_lend_data', 'lims_return_data', 'lims_export_warranty_data'));
        }
        else
            return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit