<?php

namespace App\Http\Controllers;

use App\Models\CategoriaProduto;
use Illuminate\Http\Request;
use App\Models\TipoDespesaFrete;
use App\Models\DespesaFrete;
use App\Models\Produto;
use App\Models\Cliente;
use App\Models\Reserva;
use App\Models\ComissaoVenda;
use App\Models\ContaPagar;
use App\Models\ContaReceber;
use App\Models\Fornecedor;
use App\Models\Acomodacao;
use App\Models\ItemNfe;
use App\Models\Empresa;
use App\Models\ItemNfce;
use App\Models\Nfe;
use App\Models\Nfce;
use App\Models\Cte;
use App\Models\Mdfe;
use App\Models\Funcionario;
use App\Models\OrdemServico;
use App\Models\Localizacao;
use App\Models\Marca;
use App\Models\TaxaPagamento;
use App\Models\Estoque;
use App\Models\MovimentacaoProduto;
use Dompdf\Dompdf;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\RelatorioEstoqueExport;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

class RelatorioController extends Controller
{
    public function index()
    {
        $marcas = Marca::where('empresa_id', request()->empresa_id)->get();
        $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
        // ->where('categoria_id', null)
        ->where('status', 1)->get();
        $funcionarios = Funcionario::where('empresa_id', request()->empresa_id)->get();
        $tiposDespesaFrete = TipoDespesaFrete::where('empresa_id', request()->empresa_id)->get();

        return view('relatorios.index', compact('funcionarios', 'marcas', 'categorias', 'tiposDespesaFrete'));
    }

    public function produtos(Request $request)
    {
        // dd($request);
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $estoque = $request->estoque;
        $tipo = $request->tipo;
        $marca_id = $request->marca_id;
        $categoria_id = $request->categoria_id;
        $local_id = $request->local_id;
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        $data = Produto::select('produtos.*')
        ->where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('produtos.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('produtos.created_at', '<=', $end_date);
        })
        ->when($estoque != '', function ($query) use ($estoque) {
            if ($estoque == 1) {
                return $query->join('estoques', 'estoques.produto_id', '=', 'produtos.id')
                ->where('estoques.quantidade', '>', 0);
            } elseif($estoque == -1) {
                // return $query->leftJoin('estoques', 'estoques.produto_id', '=', 'produtos.id')
                // ->whereNull('estoques.produto_id')
                // ->orWhere(function ($q) use ($query) {
                //     return $q->join('estoques', 'estoques.produto_id', '=', 'produtos.id')
                //     ->where('estoques.quantidade', '=', 0);
                // });
                return $query->leftJoin('estoques', 'estoques.produto_id', '=', 'produtos.id')
                ->where(function ($q) {
                   $q->whereNull('estoques.id')
                   ->orWhere('estoques.quantidade', '=', 0);
               });
            }else{
                return $query->join('estoques', 'estoques.produto_id', '=', 'produtos.id')
                ->whereColumn('estoques.quantidade', '<', 'produtos.estoque_minimo')
                ->where('produtos.estoque_minimo', '>', 0);
            }
        })
        ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
            return $query->where(function($t) use ($categoria_id) 
            {
                $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
            });
        })
        ->when(!empty($marca_id), function ($query) use ($marca_id) {
            return $query->where('marca_id', $marca_id);
        })
        ->when(!empty($local_id), function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        ->get();

        if ($tipo != '') {
            if ($tipo ==1 || $tipo == -1) {
                foreach ($data as $item) {
                    $sumNfe = ItemNfe::where('produto_id', $item->id)
                    ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
                    ->where('nves.tpNF', 1)
                    ->sum('quantidade');

                    $sumNfce = ItemNfce::where('produto_id', $item->id)
                    ->sum('quantidade');

                    $item->quantidade_vendida = $sumNfe + $sumNfce;
                }
            }else{
                foreach ($data as $item) {
                    $sumNfe = ItemNfe::where('produto_id', $item->id)
                    ->select('item_nves.*')
                    ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
                    ->where('nves.tpNF', 0)
                    ->sum('quantidade');

                    $item->quantidade_vendida = $sumNfe;
                }
            }

            $data = $data->filter(function ($item) {
                return $item->quantidade_vendida > 0;
            });

            if ($tipo ==1 || $tipo == -1) {
                if ($tipo == 1) {
                    $data = $data->sortByDesc('quantidade_vendida');
                } else {
                    $data = $data->sortBy('quantidade_vendida');
                }
            }else{
                if ($tipo == 2) {
                    $data = $data->sortByDesc('quantidade_vendida');
                } else {
                    $data = $data->sortBy('quantidade_vendida');
                }
            }
        }

        $marca = null;
        if($marca_id != null){
            $marca = Marca::findOrFail($marca_id);
        }

        $categoria = null;
        if($categoria_id != null){
            $categoria = CategoriaProduto::findOrFail($categoria_id);
        }

        $p = view('relatorios/produtos', compact('data', 'tipo', 'marca', 'categoria'))
        ->with('title', 'Relatório de Produtos');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);

        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Produtos.pdf", array("Attachment" => false));
    }

    public function clientes(Request $request)
    {
        $tipo = $request->tipo;
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        $data = Cliente::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })->get();

        if ($tipo != '') {
            foreach ($data as $item) {
                $sumNfe = Nfe::where('cliente_id', $item->id)
                ->sum('total');

                $sumNfce = Nfce::where('cliente_id', $item->id)
                ->sum('total');

                $item->total = $sumNfe + $sumNfce;
            }

            if ($tipo == 1) {
                $data = $data->sortByDesc('total');
            } else {
                $data = $data->sortBy('total');
            }
        }

        $p = view('relatorios/clientes', compact('data', 'tipo'))
        ->with('title', 'Relatório de Clientes');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Clientes.pdf", array("Attachment" => false));
    }

    public function fornecedores(Request $request)
    {
        $tipo = $request->tipo;
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        $data = Fornecedor::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })->get();

        if ($tipo != '') {
            foreach ($data as $item) {
                $sumNfe = Nfe::where('fornecedor_id', $item->id)
                ->where('tpNF', 0)
                ->sum('total');

                $item->total = $sumNfe;
            }

            if ($tipo == 1) {
                $data = $data->sortByDesc('total');
            } else {
                $data = $data->sortBy('total');
            }
        }

        $p = view('relatorios/fornecedores', compact('data', 'tipo'))
        ->with('title', 'Relatório de Fornecedores');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Fornecedores.pdf", array("Attachment" => false));
    }

    public function nfe(Request $request)
    {

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $tipo = $request->tipo;
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $finNFe = $request->finNFe;
        $cliente = $request->cliente;
        $estado = $request->estado;
        $local_id = $request->local_id;

        $data = Nfe::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('data_emissao', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('data_emissao', '<=', $end_date);
        })
        ->when(!empty($cliente), function ($query) use ($cliente) {
            return $query->where('cliente_id', $cliente);
        })
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado', $estado);
        })
        ->when(!empty($tipo), function ($query) use ($tipo) {
            return $query->where('tpNF', $tipo);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->where('orcamento', 0)
        ->when(!empty($finNFe), function ($query) use ($finNFe) {
            return $query->where('finNFe', $finNFe);
        })->get();

        $p = view('relatorios/nfe', compact('data'))
        ->with('title', 'Relatório de NFe');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de NFe.pdf", array("Attachment" => false));
    }

    public function nfce(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $cliente_id = $request->cliente;
        $estado = $request->estado;
        $local_id = $request->local_id;

        $data = Nfce::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('data_emissao', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('data_emissao', '<=', $end_date);
        })
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado', $estado);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->when(!empty($cliente_id), function ($query) use ($cliente_id) {
            return $query->where('cliente_id', $cliente_id);
        })->get();

        $p = view('relatorios/nfce', compact('data'))
        ->with('title', 'Relatório de NFCe');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de NFCe.pdf", array("Attachment" => false));
    }

    public function cte(Request $request)
    {

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $estado = $request->estado;
        $local_id = $request->local_id;

        $data = Cte::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado', $estado);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $p = view('relatorios/cte', compact('data'))
        ->with('title', 'Relatório de CTe');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de CTe.pdf", array("Attachment" => false));
    }

    public function mdfe(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $estado = $request->estado;
        $local_id = $request->local_id;

        $data = Mdfe::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado_emissao', $estado);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();


        $p = view('relatorios/mdfe', compact('data'))
        ->with('title', 'Relatório de MDFe');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de MDFe.pdf", array("Attachment" => false));
    }

    public function conta_pagar(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $status = $request->status;
        $local_id = $request->local_id;
        $fornecedor_id = $request->fornecedor_id;

        $data = ContaPagar::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('data_vencimento', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('data_vencimento', '<=', $end_date);
        })
        ->when(!empty($status), function ($query) use ($status) {
            if ($status == -1) {
                return $query->where('status', '!=', 1);
            } else {
                return $query->where('status', $status);
            }
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->when($fornecedor_id, function ($query) use ($fornecedor_id) {
            return $query->where('fornecedor_id', $fornecedor_id);
        })
        ->orderBy('data_vencimento')
        ->get();

        $p = view('relatorios/conta_pagar', compact('data'))
        ->with('title', 'Relatório de Contas a Pagar');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Contas a Pagar.pdf", array("Attachment" => false));
    }

    public function conta_receber(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $status = $request->status;
        $local_id = $request->local_id;
        $cliente_id = $request->cliente;

        $data = ContaReceber::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('data_vencimento', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('data_vencimento', '<=', $end_date);
        })
        ->when(!empty($status), function ($query) use ($status) {
            if ($status == -1) {
                return $query->where('status', '!=', 1);
            } else {
                return $query->where('status', $status);
            }
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->when($cliente_id, function ($query) use ($cliente_id) {
            return $query->where('cliente_id', $cliente_id);
        })
        ->orderBy('data_vencimento')
        ->get();

        $p = view('relatorios/conta_receber', compact('data'))
        ->with('title', 'Relatório de Contas a Receber');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Contas a Receber.pdf", array("Attachment" => false));
    }

    public function comissao(Request $request)
    {
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $funcionario_id = $request->funcionario_id;

        $data = ComissaoVenda::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when(!empty($funcionario_id), function ($query) use ($funcionario_id) {
            return $query->where('funcionario_id', $funcionario_id);
        })
        ->get();

        $p = view('relatorios/comissao', compact('data'))
        ->with('title', 'Relatório de Comissao');

        // if ($funcionario_id == null) {
        //     session()->flash('flash_error', 'Selecione um funcionário para continuar');
        //     return redirect()->back();
        // }

        $p = view('relatorios/comissao', compact('data'))
        ->with('funcionário', $funcionario_id)
        ->with('title', 'Relatório de Comissão');

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Comissão.pdf", array("Attachment" => false));
    }

    public function vendas(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $tipo = $request->tipo;
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;
        $cliente_id = $request->cliente;
        $start_time = $request->start_time;
        $end_time = $request->end_time;
        $estado = $request->estado;

        if ($start_date) {
            $start_date .= $start_time ? " $start_time:00" : " 00:00:00";
        }

        if ($end_date) {
            $end_date .= $end_time ? " $end_time:59" : " 23:59:59";
        }

        $vendas = Nfe::where('empresa_id', $request->empresa_id)->where('tpNF', 1)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('created_at', '<=', $end_date);
        })
        // ->where('nves.estado', '!=', 'cancelado')
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado', $estado);
        })
        ->when(empty($estado), function ($query) use ($estado) {
            return $query->where('estado', '!=', 'cancelado');
        })
        ->limit($total_resultados ?? 1000000)
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->when($cliente_id, function ($query) use ($cliente_id) {
            return $query->where('cliente_id', $cliente_id);
        })
        ->get();

        $vendasCaixa = Nfce::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('created_at', '<=', $end_date);
        })

        ->where('nfces.empresa_id', $request->empresa_id)
        ->when(!empty($estado), function ($query) use ($estado) {
            return $query->where('estado', $estado);
        })
        ->when(empty($estado), function ($query) use ($estado) {
            return $query->where('estado', '!=', 'cancelado');
        })
        ->limit($total_resultados ?? 1000000)
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->when($cliente_id, function ($query) use ($cliente_id) {
            return $query->where('cliente_id', $cliente_id);
        })
        ->get();

        // echo (sizeof($vendas)+sizeof($vendasCaixa));
        // die;

        $data = $this->uneArrayVendas($vendas, $vendasCaixa);

        usort($data, function($a, $b){
            return $a['data'] > $b['data'] ? 1 : -1;
        });
        // dd($data);
        $p = view('relatorios/vendas', compact('data', 'tipo'))
        ->with('title', 'Relatório de Vendas');
        // return $p;
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Vendas.pdf", array("Attachment" => false));
    }

    private function uneArrayVendas($vendas, $vendasCaixa)
    {
        $adicionados = [];
        $arr = [];
        foreach ($vendas as $v) {
            $temp = [
                'id' => $v->numero_sequencial,
                'data' => $v->created_at,
                'tipo' => 'Pedido',
                'total' => $v->total,
                'cliente' => $v->cliente ? $v->cliente->info : '--',
                'localizacao' => $v->localizacao
                // 'itens' => $v->itens
            ];
            array_push($adicionados, $v->id);
            array_push($arr, $temp);
        }
        foreach ($vendasCaixa as $v) {
            $temp = [
                'id' => $v->numero_sequencial,
                'data' => $v->created_at,
                'tipo' => 'PDV',
                'total' => $v->total,
                'cliente' => $v->cliente ? $v->cliente->info : '--',
                'localizacao' => $v->localizacao
                // 'itens' => $v->itens
            ];
            array_push($adicionados, $v->id);
            array_push($arr, $temp);
        }
        return $arr;
    }

    public function despesaFrete(Request $request)
    {

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $tipo_despesa_frete_id = $request->tipo_despesa_frete_id;

        $data = DespesaFrete::
        select('despesa_fretes.*')
        ->join('fretes', 'fretes.id', '=', 'despesa_fretes.frete_id')
        ->where('fretes.empresa_id', request()->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('despesa_fretes.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('despesa_fretes.created_at', '<=', $end_date);
        })
        ->when($tipo_despesa_frete_id, function ($query) use ($tipo_despesa_frete_id) {
            return $query->where('despesa_fretes.tipo_despesa_id', $tipo_despesa_frete_id);
        })
        ->get();

        $p = view('relatorios/despesa_fretes', compact('data'))
        ->with('title', 'Relatório de Despesas de Frete');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Despesas de Frete.pdf", array("Attachment" => false));
    }

    public function compras(Request $request)
    {

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;

        $data = Nfe::where('empresa_id', request()->empresa_id)->where('tpNF', 0)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->where('nves.empresa_id', $request->empresa_id)
        ->limit($total_resultados ?? 1000000)
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $p = view('relatorios/compras', compact('data'))
        ->with('title', 'Relatório de Compras');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Compras.pdf", array("Attachment" => false));
    }

    public function taxas(Request $request)
    {
        $data_inicial = $request->data_inicial;
        $data_final = $request->data_final;
        $local_id = $request->local_id;
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        
        if ($data_final && $data_final) {
            $data_inicial = $this->parseDate($data_inicial);
            $data_final = $this->parseDate($data_final);
        }
        $taxas = TaxaPagamento::where('empresa_id', request()->empresa_id)->get();
        $tipos = $taxas->pluck('tipo_pagamento')->toArray();
        $vendas = Nfe::where('empresa_id', request()->empresa_id)
        ->when($data_inicial != '', function ($q) use ($data_inicial) {
            return $q->whereDate('created_at', '>=', $data_inicial);
        })
        ->when($data_final != '', function ($q) use ($data_final) {
            return $q->whereDate('created_at', '<=', $data_final);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $data = [];
        foreach ($vendas as $v) {
            $bandeira_cartao = $v->bandeira_cartao;
            if (sizeof($v->fatura) > 1) {
                foreach ($v->fatura as $ft) {
                    $fp = $ft->tipo_pagamento;
                    if (in_array($fp, $tipos)) {
                        $taxa = TaxaPagamento::where('empresa_id', request()->empresa_id)
                        ->where('tipo_pagamento', $fp)
                        ->when($bandeira_cartao != '' && $bandeira_cartao != '99', function ($q) use ($bandeira_cartao) {
                            return $q->where('bandeira_cartao', $bandeira_cartao);
                        })
                        ->first();
                        if ($taxa != null) {
                            $item = [
                                'cliente' => $v->cliente ? ($v->cliente->razao_social . " " . $v->cliente->cpf_cnpj) :
                                'Consumidor final',
                                'total' => $ft->valor,
                                'taxa_perc' => $taxa ? $taxa->taxa : 0,
                                'taxa' => $taxa ? ($ft->valor * ($taxa->taxa / 100)) : 0,
                                'data' => \Carbon\Carbon::parse($v->created_at)->format('d/m/Y H:i'),
                                'tipo_pagamento' => Nfe::getTipo($fp),
                                'venda_id' => $v->id,
                                'tipo' => 'PEDIDO'
                            ];
                            array_push($data, $item);
                        }
                    }
                }
            } else {
                if (in_array($v->tipo_pagamento, $tipos)) {
                    $total = $v->valor_total - $v->desconto + $v->acrescimo;
                    $taxa = TaxaPagamento::where('empresa_id', request()->empresa_id)
                    ->when($bandeira_cartao != '' && $bandeira_cartao != '99', function ($q) use ($bandeira_cartao) {
                        return $q->where('bandeira_cartao', $bandeira_cartao);
                    })
                    ->where('tipo_pagamento', $v->tipo_pagamento)->first();
                    if ($taxa != null) {
                        $item = [
                            'cliente' => $v->cliente ? ($v->cliente->razao_social . " " . $v->cliente->cpf_cnpj) :
                            'Consumidor final',
                            'total' => $v->total,
                            'taxa_perc' => $taxa->taxa,
                            'taxa' => $taxa ? ($total * ($taxa->taxa / 100)) : 0,
                            'data' => \Carbon\Carbon::parse($v->created_at)->format('d/m/Y H:i'),
                            'tipo_pagamento' => Nfe::getTipo($v->tipo_pagamento),
                            'venda_id' => $v->id,
                            'tipo' => 'PEDIDO'
                        ];
                        array_push($data, $item);
                    } else {
                        echo $bandeira_cartao;
                        die;
                    }
                }
            }
        }

        $vendasCaixa = Nfce::where('empresa_id', request()->empresa_id)
        ->when($data_inicial != '', function ($q) use ($data_inicial) {
            return $q->whereDate('created_at', '>=', $data_inicial);
        })
        ->when($data_final != '', function ($q) use ($data_final) {
            return $q->whereDate('created_at', '<=', $data_final);
        })
        ->get();

        foreach ($vendasCaixa as $v) {
            $bandeira_cartao = $v->bandeira_cartao;
            if (sizeof($v->fatura) > 1) {
                foreach ($v->fatura as $ft) {
                    if (in_array($ft->tipo_pagamento, $tipos)) {
                        $taxa = TaxaPagamento::where('empresa_id', request()->empresa_id)
                        ->when($bandeira_cartao != '' && $bandeira_cartao != '99', function ($q) use ($bandeira_cartao) {
                            return $q->where('bandeira_cartao', $bandeira_cartao);
                        })
                        ->where('tipo_pagamento', $ft->tipo_pagamento)->first();

                        if ($taxa != null) {
                            $item = [
                                'cliente' => $v->cliente ? ($v->cliente->razao_social . " " . $v->cliente->cpf_cnpj) :
                                'Consumidor final',
                                'total' => $ft->valor,
                                'taxa_perc' => $taxa->taxa,
                                'taxa' => $taxa ? ($ft->valor * ($taxa->taxa / 100)) : 0,
                                'data' => \Carbon\Carbon::parse($v->created_at)->format('d/m/Y H:i'),
                                'tipo_pagamento' => Nfe::getTipo($ft->tipo_pagamento),
                                'venda_id' => $v->id,
                                'tipo' => 'PDV'
                            ];
                            array_push($data, $item);
                        }
                    }
                }
            } else {
                if (in_array($v->tipo_pagamento, $tipos)) {
                    $taxa = TaxaPagamento::where('empresa_id', request()->empresa_id)
                    ->when($bandeira_cartao != '' && $bandeira_cartao != '99', function ($q) use ($bandeira_cartao) {
                        return $q->where('bandeira_cartao', $bandeira_cartao);
                    })
                    ->where('tipo_pagamento', $v->tipo_pagamento)->first();

                    if ($taxa != null) {
                        $item = [
                            'cliente' => $v->cliente ? ($v->cliente->razao_social . " " . $v->cliente->cpf_cnpj) :
                            'Consumidor final',
                            'total' => $v->total,
                            'taxa_perc' => $taxa->taxa,
                            'taxa' => $taxa ? ($v->total * ($taxa->taxa / 100)) : 0,
                            'data' => \Carbon\Carbon::parse($v->created_at)->format('d/m/Y H:i'),
                            'tipo_pagamento' => Nfe::getTipo($v->tipo_pagamento),
                            'venda_id' => $v->id,
                            'tipo' => 'PDV'
                        ];
                        array_push($data, $item);
                    }
                }
            }
        }

        $p = view('relatorios/taxas')
        ->with('data', $data)
        ->with('title', 'Taxas de Pagamento');

        // return $p;
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Taxas de pagamento.pdf", array("Attachment" => false));
    }

    public function lucro(Request $request)
    {

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;

        $start_time = $request->start_time;
        $end_time = $request->end_time;

        if ($start_date) {
            $start_date .= $start_time ? " $start_time:00" : " 00:00:00";
        }

        if ($end_date) {
            $end_date .= $end_time ? " $end_time:59" : " 23:59:59";
        }

        $nfe = Nfe::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->where('orcamento', 0)
        ->where('tpNF', 1)
        ->get();

        $nfce = Nfce::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $data = [];

        foreach($nfe as $n){
            $item = [
                'cliente' => $n->cliente ? $n->cliente->info : 'CONSUMIDOR FINAL',
                'data' => ($n->created_at),
                'valor_venda' => $n->total,
                'valor_custo' => $this->calculaCusto($n->itens),
                'localizacao' => $n->localizacao
            ];
            array_push($data, $item);
        }

        foreach($nfce as $n){
            $item = [
                'cliente' => $n->cliente ? $n->cliente->info : 'CONSUMIDOR FINAL',
                'data' => ($n->created_at),
                'valor_venda' => $n->total,
                'valor_custo' => $this->calculaCusto($n->itens),
                'localizacao' => $n->localizacao
            ];
            array_push($data, $item);
        }

        usort($data, function($a, $b){
            return $a['data'] > $b['data'] ? 1 : -1;
        });

        $p = view('relatorios.lucro', compact('data'))
        ->with('title', 'Relatório de Lucros');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Lucros.pdf", array("Attachment" => false));
    }

    public function vendaProdutos(Request $request){
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;
        $marca_id = $request->marca_id;
        $categoria_id = $request->categoria_id;
        $produto_id = $request->produto_id;

        $diferenca = strtotime($end_date) - strtotime($start_date);
        $dias = floor($diferenca / (60 * 60 * 24));

        $dataAtual = $start_date;
        if($dias <= 0){
            $dias = 1;
        }

        $data = [];
        for($aux = 0; $aux < $dias; $aux++){
            $itensNfe = ItemNfe::
            select(\DB::raw('sum(sub_total) as subtotal, sum(quantidade) as soma_quantidade, item_nves.produto_id as produto_id, avg(item_nves.valor_unitario) as media, item_nves.valor_unitario as valor_unitario'))
            ->whereBetween('item_nves.created_at', 
                [
                    $dataAtual . " 00:00:00",
                    $dataAtual . " 23:59:59"
                ]
            )
            ->join('produtos', 'produtos.id', '=', 'item_nves.produto_id')
            ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
            ->groupBy('item_nves.produto_id')
            ->where('produtos.empresa_id', $request->empresa_id)
            ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
                return $query->join('categoria_produtos', 'categoria_produtos.id', '=', 'produtos.categoria_id')
                ->where(function($t) use ($categoria_id) 
                {
                    $t->where('produtos.categoria_id', $categoria_id)->orWhere('produtos.sub_categoria_id', $categoria_id);
                });
            })
            ->when(!empty($produto_id), function ($query) use ($produto_id) {
                return $query->where('item_nves.produto_id', $produto_id);
            })
            ->when(!empty($marca_id), function ($query) use ($marca_id) {
                return $query->join('marcas', 'marcas.id', '=', 'produtos.marca_id')
                ->where('produtos.marca_id', $marca_id);
            })
            ->when(!empty($local_id), function ($query) use ($local_id) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->where('produto_localizacaos.localizacao_id', $local_id);
            })
            ->get();

            $itensNfce = ItemNfce::
            select(\DB::raw('sum(sub_total) as subtotal, sum(quantidade) as soma_quantidade, item_nfces.produto_id as produto_id, avg(item_nfces.valor_unitario) as media, item_nfces.valor_unitario as valor_unitario'))
            ->whereBetween('item_nfces.created_at', 
                [
                    $dataAtual . " 00:00:00",
                    $dataAtual . " 23:59:59"
                ]
            )
            ->join('produtos', 'produtos.id', '=', 'item_nfces.produto_id')
            ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
            ->groupBy('item_nfces.produto_id')
            ->where('produtos.empresa_id', $request->empresa_id)
            ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
                // return $query->join('categoria_produtos', 'categoria_produtos.id', '=', 'produtos.categoria_id')
                // ->where('produtos.categoria_id', $categoria_id);
                return $query->join('categoria_produtos', 'categoria_produtos.id', '=', 'produtos.categoria_id')
                ->where(function($t) use ($categoria_id) 
                {
                    $t->where('produtos.categoria_id', $categoria_id)->orWhere('produtos.sub_categoria_id', $categoria_id);
                });
            })
            ->when(!empty($produto_id), function ($query) use ($produto_id) {
                return $query->where('item_nfces.produto_id', $produto_id);
            })
            ->when(!empty($marca_id), function ($query) use ($marca_id) {
                return $query->join('marcas', 'marcas.id', '=', 'produtos.marca_id')
                ->where('produtos.marca_id', $marca_id);
            })
            ->when(!empty($local_id), function ($query) use ($local_id) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->where('produto_localizacaos.localizacao_id', $local_id);
            })
            ->get();

            $itens = $this->uneArrayItens($itensNfe, $itensNfce, $request->ordem);
            $temp = [
                'data' => $dataAtual,
                'itens' => $itens,
            ];
            array_push($data, $temp);
            $dataAtual = date('Y-m-d', strtotime($dataAtual. '+1day'));
        }

        $p = view('relatorios/venda_por_produtos', compact('data', 'start_date', 'end_date'))
        ->with('title', 'Relatório de Venda por Produtos');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de venda por produtos.pdf", array("Attachment" => false));
    }

    private function uneArrayItens($itens, $itensCaixa, $ordem){
        $data = [];
        $adicionados = [];
        foreach($itens as $i){

            $temp = [
                'quantidade' => $i->soma_quantidade,
                'subtotal' => $i->subtotal,
                'valor' => $i->produto->valor_unitario,
                'media' => $i->media,
                'produto' => $i->produto,
            ];
            array_push($data, $temp);
            // array_push($adicionados, $i->produto->id);
        }

        // print_r($data[0]['produto']);
        foreach($itensCaixa as $i){
            $indiceAdicionado = $this->jaAdicionadoProduto($data, $i->produto->id);
            if($indiceAdicionado == -1){

                $temp = [
                    'quantidade' => $i->soma_quantidade,
                    'subtotal' => $i->subtotal,
                    'valor' => $i->produto->valor_unitario,
                    'media' => $i->media,
                    'produto' => $i->produto,
                ];
                array_push($data, $temp);
            }else{
                $data[$indiceAdicionado]['quantidade'] += $i->soma_quantidade; 
                $data[$indiceAdicionado]['subtotal'] += $i->subtotal; 
                $data[$indiceAdicionado]['media'] = ($data[$indiceAdicionado]['media'] + $i->media) / 2; 
            }
        }
        
        usort($data, function($a, $b) use ($ordem){
            if($ordem == 'asc') return $a['quantidade'] > $b['quantidade'] ? 1 : 0;
            else if($ordem == 'desc') return $a['quantidade'] < $b['quantidade'] ? 1 : 0;
            else return $a['produto']->nome > $b['produto']->nome ? 1 : 0;
        });
        return $data;
    }

    private function calculaCusto($itens){
        $custo = 0;
        foreach($itens as $i){
            $custo += $i->quantidade * $i->produto->valor_compra;
        }
        return $custo;
    }

    private function jaAdicionadoProduto($array, $produtoId){
        for($i=0; $i<sizeof($array); $i++){
            if($array[$i]['produto']->id == $produtoId){
                return $i;
            }
        }
        return -1;
    }

    public function estoque(Request $request){
        $estoque_minimo = $request->estoque_minimo;
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $categoria_id = $request->categoria_id;
        $esportar_excel = $request->esportar_excel;
        $local_id = $request->local_id;

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $data = [];

        if($estoque_minimo == 1){

            $produtosComEstoqueMinimo = Produto::where('produtos.empresa_id', $request->empresa_id)
            ->select('produtos.*')
            ->when($categoria_id, function ($query) use ($categoria_id) {
                return $query->where(function($t) use ($categoria_id) 
                {
                    $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
                });
            })
            ->when(!empty($local_id), function ($query) use ($local_id) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->where('produto_localizacaos.localizacao_id', $local_id);
            })
            ->when(!$local_id, function ($query) use ($locais) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->whereIn('produto_localizacaos.localizacao_id', $locais);
            })
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('produtos.created_at', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('produtos.created_at', '<=', $end_date);
            })
            // ->limit(20)
            ->where('produtos.estoque_minimo', '>', 0)->get();
            foreach($produtosComEstoqueMinimo as $produto){
                $estoque = Estoque::where('produto_id', $produto->id)->first();
                
                if($estoque == null || $estoque->quantidade <= $produto->estoque_minimo){

                    if(sizeof($produto->variacoes) == 0){
                        $qtd = $estoque ? $estoque->quantidade : '0';
                        if(!$local_id){
                            $qtd = $produto->estoqueTotalProduto();
                        }
                        $linha = [
                            'codigo' => $produto->numero_sequencial,
                            'produto' => $produto->nome,
                            'quantidade' => $qtd,
                            'estoque_minimo' => $produto->estoque_minimo,
                            'valor_compra' => $produto->valor_compra,
                            'valor_venda' => $produto->valor_unitario,
                            'categoria' => $produto->categoria ? $produto->categoria->nome : '--',
                            'data_cadastro' => __data_pt($produto->created_at)
                        ];
                        array_push($data, $linha);
                    }else{

                        foreach($produto->variacoes as $v){
                            $linha = [
                                'codigo' => $produto->numero_sequencial,
                                'produto' => $produto->nome . " " . $v->descricao,
                                'quantidade' => $v->estoque ? $v->estoque->quantidade : '',
                                'estoque_minimo' => $produto->estoque_minimo,
                                'valor_compra' => $produto->valor_compra,
                                'valor_venda' => $v->valor,
                                'categoria' => $produto->categoria ? $produto->categoria->nome : '--',
                                'data_cadastro' => __data_pt($produto->created_at)
                            ];
                            array_push($data, $linha);
                        }
                    }

                    
                }
            }
        }else if($start_date || $end_date){
            $movimentacoes = MovimentacaoProduto::
            select('movimentacao_produtos.*')
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('movimentacao_produtos.created_at', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('movimentacao_produtos.created_at', '<=', $end_date);
            })
            ->join('produtos', 'produtos.id', '=', 'movimentacao_produtos.produto_id')
            ->when($categoria_id, function ($query) use ($categoria_id) {
                return $query->where(function($t) use ($categoria_id) 
                {
                    $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
                });
            })
            ->when(!empty($local_id), function ($query) use ($local_id) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->where('produto_localizacaos.localizacao_id', $local_id);
            })
            ->when(!$local_id, function ($query) use ($locais) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->whereIn('produto_localizacaos.localizacao_id', $locais);
            })
            ->where('produtos.empresa_id', $request->empresa_id)
            ->groupBy('produtos.id')
            ->orderBy('movimentacao_produtos.created_at', 'desc')
            ->get();

            foreach($movimentacoes as $m){

                $produto = $m->produto;
                if(sizeof($produto->variacoes) == 0){
                    $linha = [
                        'codigo' => $m->produto->numero_sequencial,
                        'produto' => $m->produto->nome,
                        'quantidade' => $m->produto->estoqueTotalProduto(),
                        'estoque_minimo' => $m->produto->estoque_minimo,
                        'valor_compra' => $m->produto->valor_compra,
                        'valor_venda' => $m->produto->valor_unitario,
                        'categoria' => $m->produto->categoria ? $m->produto->categoria->nome : '--',
                        'data_cadastro' => __data_pt($m->produto->created_at)
                    ];
                    array_push($data, $linha);
                }else{
                    foreach($produto->variacoes as $v){
                        $linha = [
                            'codigo' => $m->produto->numero_sequencial,
                            'produto' => $m->produto->nome . " " . $v->descricao,
                            'quantidade' => $v->estoque ? $v->estoque->quantidade : '',
                            'estoque_minimo' => $m->produto->estoque_minimo,
                            'valor_compra' => $m->produto->valor_compra,
                            'valor_venda' => $v->valor,
                            'categoria' => $m->produto->categoria ? $m->produto->categoria->nome : '--',
                            'data_cadastro' => __data_pt($m->produto->created_at)
                        ];
                        array_push($data, $linha);
                    }
                }
            }

        }else{

            $estoque = Estoque::
            select('estoques.*')
            ->join('produtos', 'produtos.id', '=', 'estoques.produto_id')
            ->groupBy('produtos.id')
            ->when(!empty($local_id), function ($query) use ($local_id) {
                return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
                ->where('estoques.local_id', $local_id);
            })
            ->when($categoria_id, function ($query) use ($categoria_id) {
                return $query->where(function($t) use ($categoria_id) 
                {
                    $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
                });
            })
            ->where('produtos.empresa_id', $request->empresa_id)->get();

            foreach($estoque as $m){
                $produto = $m->produto;
                if(sizeof($produto->variacoes) == 0){
                    $linha = [
                        'codigo' => $m->produto->numero_sequencial,
                        'produto' => $m->produto->nome,
                        'quantidade' => $m->quantidade,
                        'estoque_minimo' => $m->produto->estoque_minimo,
                        'valor_compra' => $m->produto->valor_compra,
                        'valor_venda' => $m->produto->valor_unitario,
                        'categoria' => $m->produto->categoria ? $m->produto->categoria->nome : '--',
                        'data_cadastro' => __data_pt($m->produto->created_at)
                    ];
                    array_push($data, $linha);
                }else{
                    foreach($produto->variacoes as $v){
                        $linha = [
                            'codigo' => $m->produto->numero_sequencial,
                            'produto' => $m->produto->nome . " " . $v->descricao,
                            'quantidade' => $v->estoque ? $v->estoque->quantidade : '',
                            'estoque_minimo' => $m->produto->estoque_minimo,
                            'valor_compra' => $m->produto->valor_compra,
                            'valor_venda' => $v->valor,
                            'categoria' => $m->produto->categoria ? $m->produto->categoria->nome : '--',
                            'data_cadastro' => __data_pt($m->produto->created_at)
                        ];
                        array_push($data, $linha);
                    }
                }
            }
        }

        if($esportar_excel == -1){
            $localizacao = null;
            if($local_id){
                $localizacao = Localizacao::findOrFail($local_id);
            }
            $p = view('relatorios/estoque', compact('data', 'start_date', 'end_date', 'estoque_minimo', 'localizacao'))
            ->with('title', 'Relatório de Estoque');
            $domPdf = new Dompdf(["enable_remote" => true]);
            $domPdf->loadHtml($p);

            // return $p;

            $domPdf->setPaper("A4", "landscape");
            $domPdf->render();
            $domPdf->stream("Relatório de estoque.pdf", array("Attachment" => false));
        }else{

            $relatorioEx = new RelatorioEstoqueExport($data);
            return Excel::download($relatorioEx, 'estoque.xlsx');
        }
    }

    public function totalizaProdutos(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $data = Produto::select('produtos.*')
        ->where('produtos.empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('produtos.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('produtos.created_at', '<=', $end_date);
        })
        ->when(!empty($local_id), function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })->get();

        $local = null;
        if($local_id){
            $local = Localizacao::findOrFail($local_id);
        }

        $p = view('relatorios/totaliza_produtos', compact('data', 'local_id', 'local'))
        ->with('title', 'Relatório Totalizador Produtos');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        // return $p;

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório totalizador de produtos.pdf", array("Attachment" => false));
    }

    public function vendasPorVendedor(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $funcionario_id = $request->funcionario_id;
        $local_id = $request->local_id;

        $funcionario = Funcionario::findOrFail($funcionario_id);
        $nves = Nfe::
        where('empresa_id', $request->empresa_id)
        ->where('funcionario_id', $funcionario_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })->get();

        $nfces = Nfce::
        where('empresa_id', $request->empresa_id)
        ->where('funcionario_id', $funcionario_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })->get();

        $data = [];
        foreach($nves as $n){
            $data[] = [
                'id' => $n->numero_sequencial,
                'cliente' => $n->cliente ? $n->cliente->info : 'Consumidor final',
                'data' => $n->created_at,
                'total' => $n->total,
                'localizacao' => $n->localizacao
            ];
        }

        foreach($nfces as $n){
            $data[] = [
                'id' => $n->numero_sequencial,
                'cliente' => $n->cliente ? $n->cliente->info : 'Consumidor final',
                'data' => $n->created_at,
                'total' => $n->total,
                'localizacao' => $n->localizacao
            ];
        }
        $p = view('relatorios/vendas_por_vendedor', compact('data', 'funcionario'))
        ->with('title', 'Relatório Vendas por Vendedor');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        // return $p;

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório vendas por vendedor.pdf", array("Attachment" => false));
    }

    public function custoMedio(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;
        $categoria_id = $request->categoria_id;
        $ordem = $request->ordem;

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $data = Produto::select('produtos.*')
        ->where('produtos.empresa_id', $request->empresa_id)
        ->where('gerenciar_estoque', 1)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('produtos.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('produtos.created_at', '<=', $end_date);
        })
        ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
            return $query->where(function($t) use ($categoria_id) 
            {
                $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
            });
        })
        ->when(!empty($local_id), function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        // ->limit(10)
        ->get();


        $local = null;
        if($local_id){
            $local = Localizacao::findOrFail($local_id);
        }

        foreach($data as $item){
            $valor = ItemNfe::where('produto_id', $item->id)
            ->sum('sub_total');

            $item->custo_medio = $valor/($item->estoque && $item->estoque->quantidade > 0 ? $item->estoque->quantidade : 1);
            $item->quantidade = $item->estoque ? $item->estoque->quantidade : 0;
            $item->categoria_nome = $item->categoria ? $item->categoria->nome : '--';
            $item->nome = $item->nome;
        }

        $data = $data->toArray();

        usort($data, function($a, $b) use ($ordem){
            if($ordem == 'asc') return $a['quantidade'] > $b['quantidade'] ? 1 : -1;
            else if($ordem == 'desc') return $a['quantidade'] < $b['quantidade'] ? 1 : -1;
            else return $a['nome'] > $b['nome'] ? 1 : -1;
        });

        $p = view('relatorios/inventario_custo_medio', compact('data', 'local_id', 'local'))
        ->with('title', 'Relatório inventário custo médio');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório inventário custo médio.pdf", array("Attachment" => false));

    }

    public function registroInventario(Request $request){
        $date = $request->date;
        $livro = $request->livro;
        $tipo_custo = $request->tipo_custo;

        $sub = MovimentacaoProduto::select(
            'movimentacao_produtos.produto_id',
            DB::raw('MAX(movimentacao_produtos.created_at) as ultima_data')
        )
        ->join('produtos', 'produtos.id', '=', 'movimentacao_produtos.produto_id')
        ->where('produtos.empresa_id', $request->empresa_id)
        ->whereDate('movimentacao_produtos.created_at', '<=', $date)
        ->groupBy('movimentacao_produtos.produto_id');

        $data = MovimentacaoProduto::with('produto')
        ->select('movimentacao_produtos.*')
        ->join('produtos', 'produtos.id', '=', 'movimentacao_produtos.produto_id')
        ->joinSub($sub, 'ultimas', function ($join) {
            $join->on('ultimas.produto_id', '=', 'movimentacao_produtos.produto_id')
            ->on('ultimas.ultima_data', '=', 'movimentacao_produtos.created_at');
        })
        ->where('produtos.empresa_id', $request->empresa_id)
        ->where('movimentacao_produtos.quantidade', '>', 0)
        ->orderBy('produtos.nome')
        ->get();

        $itensNfe = ItemNfe::select(
            'item_nves.produto_id',
            DB::raw('SUM(item_nves.sub_total) as total'),
            DB::raw('SUM(item_nves.quantidade) as quantidade')
        )
        ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
        ->where('nves.tpNF', 0)
        ->whereDate('nves.created_at', '<=', $date)
        ->groupBy('item_nves.produto_id')
        ->get()
        ->keyBy('produto_id');

        foreach ($data as $item) {

            $item->quantidade = $item->estoque_atual;

            if ($tipo_custo === 'media') {

                $info = $itensNfe[$item->produto_id] ?? null;

                if ($info && $info->quantidade > 0) {
                    $item->valor_unitario = $info->total / $info->quantidade;
                } else {
                    $item->valor_unitario = $item->produto->valor_compra ?? 0;
                }

            } 
            else {
                $item->valor_unitario = $item->produto->valor_compra ?? 0;
            }

            $item->sub_total = $item->valor_unitario * $item->quantidade;
        }

        $empresa = Empresa::findOrFail($request->empresa_id);

        $html = view('relatorios.registro_inventario', compact(
            'data',
            'livro',
            'empresa'
        ))->with('title', 'Relatório registro inventário');

        $domPdf = new Dompdf(['enable_remote' => true]);
        $domPdf->loadHtml($html);
        $domPdf->setPaper('A4', 'landscape');
        $domPdf->render();

        $domPdf->stream('Relatorio_registro_inventario.pdf', [
            'Attachment' => false
        ]);
    }

    // public function registroInventario(Request $request){
    //     $date = $request->date;
    //     $livro = $request->livro;
    //     $tipo_custo = $request->tipo_custo;

    //     $sub = MovimentacaoProduto::select(
    //         'produto_id',
    //         DB::raw('MAX(movimentacao_produtos.created_at) as ultima_data')
    //     )
    //     ->whereDate('movimentacao_produtos.created_at', '<=', $date)
    //     ->join('produtos', 'produtos.id', '=', 'movimentacao_produtos.produto_id')
    //     ->where('produtos.empresa_id', $request->empresa_id)
    //     ->groupBy('produto_id');

    //     $data = MovimentacaoProduto::select('movimentacao_produtos.*', 'produtos.nome')
    //     ->join('produtos', 'produtos.id', '=', 'movimentacao_produtos.produto_id')
    //     ->joinSub($sub, 'ultimas', function ($join) {
    //         $join->on('ultimas.produto_id', '=', 'movimentacao_produtos.produto_id')
    //         ->on('ultimas.ultima_data', '=', 'movimentacao_produtos.created_at');
    //     })
    //     ->where('produtos.empresa_id', $request->empresa_id)
    //     ->where('movimentacao_produtos.quantidade', '>', 0)
    //     ->orderBy('produtos.nome')
    //     // ->limit(10)
    //     ->get();

    //     if($tipo_custo == 'media'){
    //         // ver como faz
    //         foreach($data as $item){

    //             $valor = ItemNfe::where('produto_id', $item->produto_id)
    //             ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
    //             ->where('nves.tpNF', 0)
    //             ->sum('sub_total');

    //             $item->quantidade = $item->estoque_atual;
    //             $item->valor_unitario = $item->produto->valor_compra;

    //             if($valor > 0){

    //                 $qtd = ItemNfe::where('produto_id', $item->produto_id)
    //                 ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
    //                 ->where('nves.tpNF', 0)
    //                 ->sum('quantidade');
    //                 $custo_medio = $valor/$qtd;
    //                 $item->valor_unitario = $custo_medio;
    //             }
    //             $item->sub_total = $item->valor_unitario * $item->quantidade;

    //         }
    //     }else{
    //         foreach($data as $item){
    //             $item->valor_unitario = $item->produto->valor_compra;

    //             $item->quantidade = $item->estoque_atual;
    //             $item->sub_total = $item->produto->valor_compra * $item->quantidade;                
    //         }
    //     }

    //     $empresa = Empresa::findOrFail($request->empresa_id);

    //     $p = view('relatorios.registro_inventario', compact('data', 'livro', 'empresa'))
    //     ->with('title', 'Relatório registro inventário');
    //     $domPdf = new Dompdf(["enable_remote" => true]);
    //     $domPdf->loadHtml($p);

    //     $domPdf->setPaper("A4", "landscape");
    //     $domPdf->render();
    //     $domPdf->stream("Relatório registro inventário", array("Attachment" => false));
    // }

    public function inventario(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;
        $ordem = $request->ordem;
        $livro = $request->livro;

        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $data = Produto::select('produtos.*')
        ->where('produtos.empresa_id', $request->empresa_id)
        ->where('gerenciar_estoque', 1)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('produtos.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('produtos.created_at', '<=', $end_date);
        })

        ->when(!empty($local_id), function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        // ->limit(10)
        ->get();


        $local = null;
        $empresa = Empresa::findOrFail($request->empresa_id);
        if($local_id){
            $local = Localizacao::findOrFail($local_id);
        }

        foreach($data as $item){

            $item->custo_unuitario = $item->valor_compra;
            $item->quantidade = $item->estoque ? $item->estoque->quantidade : 0;
            $item->sub_total = $item->quantidade * $item->valor_compra;
            $item->nome = $item->nome;
        }

        $data = $data->toArray();

        usort($data, function($a, $b) use ($ordem){
            if($ordem == 'asc') return $a['quantidade'] > $b['quantidade'] ? 1 : -1;
            else if($ordem == 'desc') return $a['quantidade'] < $b['quantidade'] ? 1 : -1;
            else return $a['nome'] > $b['nome'] ? 1 : -1;
        });

        $p = view('relatorios/inventario', compact('data', 'local_id', 'local', 'livro', 'empresa'))
        ->with('title', 'Relatório inventário');
        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório inventário.pdf", array("Attachment" => false));

    }

    public function curvaAbcClientes(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        $nfe = Nfe::where('nves.empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('nves.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('nves.created_at', '<=', $end_date);
        })
        ->join('clientes', 'clientes.id', '=', 'nves.cliente_id')
        ->groupBy('cliente_id')
        ->select('clientes.id as cliente_id', 'clientes.razao_social as nome', \DB::raw('sum(nves.total) as total'), \DB::raw('count(nves.id) as count'))
        ->get();

        $nfce = Nfce::where('nfces.empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('nfces.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('nfces.created_at', '<=', $end_date);
        })
        ->join('clientes', 'clientes.id', '=', 'nfces.cliente_id')
        ->groupBy('cliente_id')
        ->select('clientes.id as cliente_id', 'clientes.razao_social as nome', \DB::raw('sum(nfces.total) as total'), \DB::raw('count(nfces.id) as count'))
        ->get();

        $data = $this->agrupaArrayCurva($nfe, $nfce);

        $soma = 0;
        foreach($data as $a){
            $soma += $a['total'];
        }

        foreach($data as $key => $a){
            $totalLinha = $data[$key]['total'];
            $v = 100 - (((($totalLinha-$soma)/$soma)*100)*-1);

            $data[$key]['percentual'] = number_format($v, 2);
        }

        $p = view('relatorios/curva_abc_clientes')
        ->with('data', $data)
        ->with('soma', $soma)
        ->with('title', 'Curva ABC Clientes');

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Curva ABC Clientes.pdf", array("Attachment" => false));

    }

    public function entregaDeProdutos(Request $request){
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $vendas = $request->vendas;

        $vNfe = [];
        $vNfce = [];
        $filtroVenda = 0;

        if($vendas){
            $filtroVenda = 1;
            foreach($vendas as $v){
                $ex = explode("_", $v);
                if($ex[0] == 'pedido'){
                    $vNfe[] = $ex[1];
                }else{
                    $vNfce[] = $ex[1];
                }
            }
        }

        $itensNfe = ItemNfe::where('nves.empresa_id', $request->empresa_id)->where('nves.tpNF', 1)
        ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('nves.created_at', '>=', $start_date);
        })
        ->when(sizeof($vNfe) > 0, function ($query) use ($vNfe) {
            return $query->whereIn('nves.id', $vNfe);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('nves.created_at', '<=', $end_date);
        })
        ->where('nves.empresa_id', $request->empresa_id)
        ->get();

        if($filtroVenda == 1 && sizeof($vNfe) == 0){
            $itensNfe = [];
        }

        $itensNfce = ItemNfce::where('nfces.empresa_id', $request->empresa_id)
        ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->where('nfces.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->where('nfces.created_at', '<=', $end_date);
        })
        ->when(sizeof($vNfce) > 0, function ($query) use ($vNfce) {
            return $query->whereIn('nfces.id', $vNfce);
        })
        ->where('nfces.empresa_id', $request->empresa_id)
        ->get();

        if($filtroVenda == 1 && sizeof($vNfce) == 0){
            $itensNfce = [];
        }

        $data = [];
        $dataPushId = [];

        foreach($itensNfe as $i){
            if(!in_array($i->produto_id, $dataPushId)){
                $obj = [
                    'produto_id' => $i->produto_id,
                    'numero_sequencial' => $i->produto->numero_sequencial,
                    'quantidade' => (int)$i->quantidade,
                    'produto_nome' => $i->produto->nome
                ];

                $data[] = $obj;
                $dataPushId[] = $i->produto_id;
            }else{

                for($j=0; $j<sizeof($data); $j++){
                    if($data[$j]['produto_id'] == $i->produto_id){
                        $data[$j]['quantidade'] += (int)$i->quantidade;
                    }
                }
            }
        }

        foreach($itensNfce as $i){
            if(!in_array($i->produto_id, $dataPushId)){
                $obj = [
                    'produto_id' => $i->produto_id,
                    'numero_sequencial' => $i->produto->numero_sequencial,
                    'quantidade' => (int)$i->quantidade,
                    'produto_nome' => $i->produto->nome
                ];

                $data[] = $obj;
                $dataPushId[] = $i->produto_id;
            }else{

                for($j=0; $j<sizeof($data); $j++){
                    if($data[$j]['produto_id'] == $i->produto_id){
                        $data[$j]['quantidade'] += (int)$i->quantidade;
                    }
                }
            }
        }

        $p = view('relatorios/entrega_produtos')
        ->with('data', $data)
        ->with('title', 'Entrega de Produtos');

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4");
        $domPdf->render();
        $domPdf->stream("Entrega de Produtos.pdf", array("Attachment" => false));
    }    

    // private function agrupaArrayCurva($nfe, $nfce){
    //     $clientes = [];
    //     $clientesId = [];
    //     foreach($nfe as $v){
    //         $temp = [
    //             'nome' => $v->nome,
    //             'total' => $v->total,
    //             'cliente_id' => $v->cliente_id,
    //             'count' => $v->count,
    //             'percentual' => 0
    //         ];
    //         $clientesId[] = $v->cliente_id;
    //         array_push($clientes, $temp);
    //     }

    //     foreach($nfce as $v){

    //         if(!in_array($v->cliente_id, $clientesId)){
    //             $temp = [
    //                 'nome' => $v->nome,
    //                 'total' => $v->total,
    //                 'cliente_id' => $v->cliente_id,
    //                 'count' => $v->count,
    //                 'percentual' => 0
    //             ];
    //             array_push($clientes, $temp);
    //         }else{
    //             $v['total'] += $v->total;
    //             $v['count'] += $v->count;
    //         }

    //     }

    //     usort($clientes, function ($a, $b) {
    //         return $b['total'] <=> $a['total'];
    //     });
    //     return $clientes;
    // }

    private function agrupaArrayCurva($nfe, $nfce){
        $clientes = [];
        $clientesId = [];

        foreach ($nfe as $v) {
            $temp = [
                'nome'       => $v->nome,
                'total'      => $v->total,
                'cliente_id' => $v->cliente_id,
                'count'      => $v->count,
                'percentual' => 0
            ];

            $clientesId[] = $v->cliente_id;
            $clientes[] = $temp;
        }

        foreach ($nfce as $v) {

            if (!in_array($v->cliente_id, $clientesId)) {

                $clientes[] = [
                    'nome'       => $v->nome,
                    'total'      => $v->total,
                    'cliente_id' => $v->cliente_id,
                    'count'      => $v->count,
                    'percentual' => 0
                ];

                $clientesId[] = $v->cliente_id;

            } else {
                foreach ($clientes as &$c) {
                    if ($c['cliente_id'] == $v->cliente_id) {
                        $c['total'] += $v->total;
                        $c['count'] += $v->count;
                    }
                }
            }
        }

        usort($clientes, function ($a, $b) {
            return $b['total'] <=> $a['total'];
        });

        return $clientes;

    }

    public function movimentacao(Request $request){
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $local_id = $request->local_id;
        $marca_id = $request->marca_id;
        $categoria_id = $request->categoria_id;
        $produto_id = $request->produto_id;
        $ordem = $request->ordem;
        $fiscal = $request->fiscal;

        $produtos = Produto::where('status', 1)->where('empresa_id', $request->empresa_id)
        ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
            return $query->where(function($t) use ($categoria_id) 
            {
                $t->where('categoria_id', $categoria_id)->orWhere('sub_categoria_id', $categoria_id);
            });
        })
        ->select('produtos.*')
        ->orderBy('nome')
        ->when(!empty($produto_id), function ($query) use ($produto_id) {
            return $query->where('produtos.id', $produto_id);
        })
        ->when(!empty($marca_id), function ($query) use ($marca_id) {
            return $query->where('marca_id', $marca_id);
        })
        ->when(!empty($local_id), function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        // ->limit(200)
        ->get();

        $data = [];
        foreach($produtos as $p){
            $countNfeSaida = ItemNfe::select('item_nfves.*')
            ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
            ->where('nves.tpNF', 1)->where('item_nves.produto_id', $p->id)
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('nves.created_at', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('nves.created_at', '<=', $end_date);
            })
            ->when(!empty($fiscal), function ($query) use ($fiscal) {
                if($fiscal == 1){
                    return $query->where('nves.estado', 'aprovado');
                }else{
                    return $query->where('nves.estado', '!=', 'aprovado');
                }
            })
            ->sum('item_nves.quantidade');

            $countNfce = ItemNfce::select('item_nfces.*')
            ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
            ->where('item_nfces.produto_id', $p->id)
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('nfces.created_at', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('nfces.created_at', '<=', $end_date);
            })
            ->when(!empty($fiscal), function ($query) use ($fiscal) {
                if($fiscal == 1){
                    return $query->where('nfces.estado', 'aprovado');
                }else{
                    return $query->where('nfces.estado', '!=', 'aprovado');
                }
            })
            ->sum('item_nfces.quantidade');

            $countNfeEntrada = ItemNfe::select('item_nfves.*')
            ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
            ->where('nves.tpNF', 0)->where('item_nves.produto_id', $p->id)
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('nves.created_at', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('nves.created_at', '<=', $end_date);
            })
            ->when(!empty($fiscal), function ($query) use ($fiscal) {
                if($fiscal == 1){
                    return $query->where('nves.estado', 'aprovado');
                }else{
                    return $query->where('nves.estado', '!=', 'aprovado');
                }
            })
            ->sum('item_nves.quantidade');

            $descricao = $p->nome;

            $itemParaNome = ItemNfe::where('produto_id', $p->id)
            ->first();

            if($itemParaNome){
                $descricao = $itemParaNome->descricao();
            }

            if($countNfeEntrada > 0 || ($countNfce + $countNfeSaida) > 0){
                $data[] = [
                    'nome_produto' => $descricao,
                    'qtd_compra' => $countNfeEntrada,
                    'qtd_saida' => $countNfce + $countNfeSaida,
                    'vl_venda' => $p->valor_unitario,
                    'vl_compra' => $p->valor_compra,
                    'subtotal_venda' => $p->valor_unitario * ($countNfce + $countNfeSaida),
                    'subtotal_compra' => $p->valor_compra * $countNfeEntrada,
                ];
            }
        }

        if($ordem){
            usort($data, function($a, $b) use($ordem){
                if($ordem == 'mais_vendidos'){
                    return $a['qtd_saida'] < $b['qtd_saida'] ? 1 : -1;
                }
                if($ordem == 'mais_comprados'){
                    return $a['qtd_compra'] < $b['qtd_compra'] ? 1 : -1;
                }

                if($ordem == 'menos_vendidos'){
                    return $a['qtd_saida'] > $b['qtd_saida'] ? 1 : -1;
                }
                if($ordem == 'menos_comprados'){
                    return $a['qtd_compra'] > $b['qtd_compra'] ? 1 : -1;
                }
            });
        }

        // dd($data);
        $p = view('relatorios/movimentacao')
        ->with('data', $data)
        ->with('start_date', $start_date)
        ->with('end_date', $end_date)
        ->with('title', 'Movimentação');

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Movimentação.pdf", array("Attachment" => false));
    }

    public function ordemServico(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $cliente_id = $request->cliente;
        $local_id = $request->local_id;

        $data = OrdemServico::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when(!empty($cliente_id), function ($query) use ($cliente_id) {
            return $query->where('cliente_id', $cliente_id);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();


        $p = view('relatorios/ordem_servico', compact('data'))
        ->with('title', 'Relatório de Ordem de Serviço');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Ordem de Serviço.pdf", array("Attachment" => false));
    }

    public function tiposDePagamento(Request $request)
    {
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $tipo_pagamento = $request->tipo_pagamento;
        $local_id = $request->local_id;

        $nves = Nfe::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $nfces = Nfce::where('empresa_id', $request->empresa_id)
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('created_at', '<=', $end_date);
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->where('local_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->whereIn('local_id', $locais);
        })
        ->get();

        $data = $this->getTiposPagamento($tipo_pagamento);
        foreach($nves as $n){
            foreach($n->fatura as $f){
                if(isset($data[$f->tipo_pagamento])){
                    $data[$f->tipo_pagamento] += $f->valor;
                }
            }
        }

        foreach($nfces as $n){
            foreach($n->fatura as $f){
                if(isset($data[$f->tipo_pagamento])){
                    $data[$f->tipo_pagamento] += $f->valor;
                }
            }
        }

        $p = view('relatorios/tipos_pagamento', compact('data'))
        ->with('title', 'Relatório de Tipos de Pagamento');

        // return $p;

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Tipos de Pagamento.pdf", array("Attachment" => false));
    }

    private function getTiposPagamento($tipo_pagamento = null){
        $data = [];
        foreach(Nfe::tiposPagamento() as $key => $n){
            if($tipo_pagamento != null){
                if($tipo_pagamento == $key){
                    $data[$key] = 0;
                }
            }else{
                $data[$key] = 0;
            }
        }
        return $data;
    }

    public function reservas(Request $request)
    {

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $estado = $request->estado;
        $vagos = $request->vagos;

        if($vagos == 1){

            $reservas = Reserva::where('empresa_id', $request->empresa_id)
            ->where(function ($query) use ($start_date, $end_date) {
                $query->whereDate('data_checkin', '<=', $start_date)
                ->whereDate('data_checkout', '>=', $end_date);
            })
            ->where('estado', '!=', 'cancelado')
            ->pluck('acomodacao_id')
            ->all();

            $data = Acomodacao::where('empresa_id', request()->empresa_id)
            ->whereNotIn('id', $reservas)
            ->where('status', 1)
            ->get();

            $p = view('relatorios/reserva_vagos', compact('data', 'start_date', 'end_date'))
            ->with('title', 'Relatório de acomodações vagas por período');
        }else{
            $data = Reserva::where('empresa_id', $request->empresa_id)
            ->when(!empty($start_date), function ($query) use ($start_date) {
                return $query->whereDate('data_checkin', '>=', $start_date);
            })
            ->when(!empty($end_date), function ($query) use ($end_date,) {
                return $query->whereDate('data_checkout', '<=', $end_date);
            })
            ->when($estado != "", function ($query) use ($estado) {
                return $query->where('estado', $estado);
            })
            ->get();

            $p = view('relatorios/reservas', compact('data', 'start_date', 'end_date'))
            ->with('title', 'Relatório de Reservas');
        }

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Reservas.pdf", array("Attachment" => false));
    }

    public function lucroProduto(Request $request){

        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $marca_id = $request->marca_id;
        $categoria_id = $request->categoria_id;
        $produto_id = $request->produto_id;

        $dataNfe = ItemNfe::where('produtos.empresa_id', $request->empresa_id)
        ->select('produtos.id as produto_id')
        ->join('produtos', 'produtos.id', '=', 'item_nves.produto_id')
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('item_nves.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('item_nves.created_at', '<=', $end_date);
        })
        ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
            return $query->where(function($t) use ($categoria_id) 
            {
                $t->where('produtos.categoria_id', $categoria_id)->orWhere('produtos.sub_categoria_id', $categoria_id);
            });
        })
        ->when(!empty($marca_id), function ($query) use ($marca_id) {
            return $query->where('produtos.marca_id', $marca_id);
        })
        ->when(!empty($produto_id), function ($query) use ($produto_id) {
            return $query->where('produtos.id', $produto_id);
        })
        ->groupBy('produto_id')
        ->pluck('produto_id')->toArray();

        $dataNfce = ItemNfce::where('produtos.empresa_id', $request->empresa_id)
        ->select('produtos.id as produto_id')
        ->join('produtos', 'produtos.id', '=', 'item_nfces.produto_id')
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('item_nfces.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date,) {
            return $query->whereDate('item_nfces.created_at', '<=', $end_date);
        })
        ->when(!empty($categoria_id), function ($query) use ($categoria_id) {
            return $query->where(function($t) use ($categoria_id) 
            {
                $t->where('produtos.categoria_id', $categoria_id)->orWhere('produtos.sub_categoria_id', $categoria_id);
            });
        })
        ->when(!empty($marca_id), function ($query) use ($marca_id) {
            return $query->where('produtos.marca_id', $marca_id);
        })
        ->when(!empty($produto_id), function ($query) use ($produto_id) {
            return $query->where('produtos.id', $produto_id);
        })
        ->groupBy('produto_id')
        ->pluck('produto_id')->toArray();

        $resultado = array_unique(array_merge($dataNfe, $dataNfce));
        $data = [];
        foreach($resultado as $produto_id){
            $produto = Produto::findOrFail($produto_id);

            $subVenda = ItemNfe::where('produto_id', $produto_id)
            ->where('nves.tpNF', 1)
            ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
            ->sum('sub_total');

            $subVendaNfce = ItemNfce::where('produto_id', $produto_id)
            ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
            ->sum('sub_total');

            $subCompra = ItemNfe::where('produto_id', $produto_id)
            ->where('nves.tpNF', 0)
            ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
            ->sum('sub_total');

            $data[] = [
                'produto_id' => $produto_id,
                'numero_sequencial' => $produto->numero_sequencial,
                'produto_nome' => $produto->nome,
                'total_vendas' => $subVenda + $subVendaNfce,
                'total_compras' => $subCompra,
            ];
        }

        $p = view('relatorios.lucro_produto', compact('data', 'start_date', 'end_date'))
        ->with('title', 'Relatório de Lucro por Produto');

        $domPdf = new Dompdf(["enable_remote" => true]);
        $domPdf->loadHtml($p);

        $pdf = ob_get_clean();

        $domPdf->setPaper("A4", "landscape");
        $domPdf->render();
        $domPdf->stream("Relatório de Lucro por Produto.pdf", array("Attachment" => false));
    }

    // public function vendaProdutosFiscal(Request $request){
    //     $locais = __getLocaisAtivoUsuario();
    //     $locais = $locais->pluck(['id']);

    //     $start_date = $request->start_date;
    //     $end_date = $request->end_date;
    //     $cfop = $request->cfop;
    //     $ncm = $request->ncm;
    //     $cst_csosn = $request->cst_csosn;
    //     $cst_pis = $request->cst_pis;
    //     $cst_cofins = $request->cst_cofins;

    //     $diferenca = strtotime($end_date) - strtotime($start_date);
    //     $dias = floor($diferenca / (60 * 60 * 24));

    //     $dataAtual = $start_date;
    //     if($dias <= 0){
    //         $dias = 1;
    //     }

    //     $data = [];
    //     for($aux = 0; $aux < $dias; $aux++){
    //         $itensNfe = ItemNfe::
    //         select(\DB::raw('sum(sub_total) as subtotal, sum(quantidade) as soma_quantidade, item_nves.produto_id as produto_id, avg(item_nves.valor_unitario) as media, item_nves.valor_unitario as valor_unitario'))
    //         ->whereBetween('item_nves.created_at', 
    //             [
    //                 $dataAtual . " 00:00:00",
    //                 $dataAtual . " 23:59:59"
    //             ]
    //         )
    //         ->join('produtos', 'produtos.id', '=', 'item_nves.produto_id')
    //         ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
    //         ->groupBy('item_nves.produto_id')
    //         ->where('produtos.empresa_id', $request->empresa_id)

    //         ->when(!empty($cfop), function ($query) use ($cfop) {
    //             return $query->where('item_nves.cfop', $cfop);
    //         })
    //         ->when(!empty($ncm), function ($query) use ($ncm) {
    //             return $query->where('item_nves.ncm', $ncm);
    //         })
    //         ->when(!empty($cst_csosn), function ($query) use ($cst_csosn) {
    //             return $query->where('item_nves.cst_csosn', $cst_csosn);
    //         })
    //         ->when(!empty($cst_pis), function ($query) use ($cst_pis) {
    //             return $query->where('item_nves.cst_pis', $cst_pis);
    //         })
    //         ->when(!empty($cst_cofins), function ($query) use ($cst_cofins) {
    //             return $query->where('item_nves.cst_cofins', $cst_cofins);
    //         })
    //         ->get();

    //         $itensNfce = ItemNfce::
    //         select(\DB::raw('sum(sub_total) as subtotal, sum(quantidade) as soma_quantidade, item_nfces.produto_id as produto_id, avg(item_nfces.valor_unitario) as media, item_nfces.valor_unitario as valor_unitario'))
    //         ->whereBetween('item_nfces.created_at', 
    //             [
    //                 $dataAtual . " 00:00:00",
    //                 $dataAtual . " 23:59:59"
    //             ]
    //         )
    //         ->join('produtos', 'produtos.id', '=', 'item_nfces.produto_id')
    //         ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
    //         ->groupBy('item_nfces.produto_id')
    //         ->where('produtos.empresa_id', $request->empresa_id)

    //         ->when(!empty($cfop), function ($query) use ($cfop) {
    //             return $query->where('item_nfces.cfop', $cfop);
    //         })
    //         ->when(!empty($ncm), function ($query) use ($ncm) {
    //             return $query->where('item_nfces.ncm', $ncm);
    //         })
    //         ->when(!empty($cst_csosn), function ($query) use ($cst_csosn) {
    //             return $query->where('item_nfces.cst_csosn', $cst_csosn);
    //         })
    //         ->when(!empty($cst_pis), function ($query) use ($cst_pis) {
    //             return $query->where('item_nfces.cst_pis', $cst_pis);
    //         })
    //         ->when(!empty($cst_cofins), function ($query) use ($cst_cofins) {
    //             return $query->where('item_nfces.cst_cofins', $cst_cofins);
    //         })
    //         ->get();

    //         $itens = $this->uneArrayItens($itensNfe, $itensNfce, $request->ordem);
    //         $temp = [
    //             'data' => $dataAtual,
    //             'itens' => $itens,
    //         ];
    //         array_push($data, $temp);
    //         $dataAtual = date('Y-m-d', strtotime($dataAtual. '+1day'));
    //     }

    //     $p = view('relatorios/venda_por_produtos_fiscal', 
    //         compact('data', 'start_date', 'end_date', 'cfop', 'ncm', 'cst_csosn', 'cst_pis', 'cst_cofins'))
    //     ->with('title', 'Relatório de Venda por Produtos Fiscal');
    //     $domPdf = new Dompdf(["enable_remote" => true]);
    //     $domPdf->loadHtml($p);

    //     $domPdf->setPaper("A4", "landscape");
    //     $domPdf->render();
    //     $domPdf->stream("Relatório de venda por produtos fiscal.pdf", array("Attachment" => false));
    // }

    public function vendaProdutosFiscal(Request $request)
    {
        $start = Carbon::parse($request->start_date)->startOfDay();
        $end   = Carbon::parse($request->end_date)->endOfDay();

        $empresaId = $request->empresa_id;

        $filtros = function ($query, $alias) use ($request) {
            $query->when($request->cfop, fn ($q) => $q->where("$alias.cfop", $request->cfop))
            ->when($request->ncm, fn ($q) => $q->where("$alias.ncm", $request->ncm))
            ->when($request->cst_csosn, fn ($q) => $q->where("$alias.cst_csosn", $request->cst_csosn))
            ->when($request->cst_pis, fn ($q) => $q->where("$alias.cst_pis", $request->cst_pis))
            ->when($request->cst_cofins, fn ($q) => $q->where("$alias.cst_cofins", $request->cst_cofins));
        };

        $itensNfe = ItemNfe::selectRaw('
            DATE(item_nves.created_at) as data,
            item_nves.produto_id,
            SUM(sub_total) as subtotal,
            SUM(quantidade) as soma_quantidade,
            AVG(item_nves.valor_unitario) as media,
            item_nves.valor_unitario
            ')
        ->join('produtos', 'produtos.id', '=', 'item_nves.produto_id')
        ->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
        ->where('nves.tpNF', 1)
        ->whereBetween('item_nves.created_at', [$start, $end])
        ->where('produtos.empresa_id', $empresaId)
        ->tap(fn ($q) => $filtros($q, 'item_nves'))
        ->groupBy('data', 'item_nves.produto_id')
        ->get();

        $itensNfce = ItemNfce::selectRaw('
            DATE(item_nfces.created_at) as data,
            item_nfces.produto_id,
            SUM(sub_total) as subtotal,
            SUM(quantidade) as soma_quantidade,
            AVG(item_nfces.valor_unitario) as media,
            item_nfces.valor_unitario
            ')
        ->join('produtos', 'produtos.id', '=', 'item_nfces.produto_id')
        ->join('nfces', 'nfces.id', '=', 'item_nfces.nfce_id')
        ->whereBetween('item_nfces.created_at', [$start, $end])
        ->where('produtos.empresa_id', $empresaId)
        ->tap(fn ($q) => $filtros($q, 'item_nfces'))
        ->groupBy('data', 'item_nfces.produto_id')
        ->get();

        $data = [];

        $periodo = new \DatePeriod(
            $start,
            new \DateInterval('P1D'),
            $end->copy()->addDay()
        );

        foreach ($periodo as $dia) {
            $dataStr = $dia->format('Y-m-d');

            $nfe  = $itensNfe->where('data', $dataStr);
            $nfce = $itensNfce->where('data', $dataStr);

            $itens = $this->uneArrayItens($nfe, $nfce, $request->ordem);

            $data[] = [
                'data' => $dataStr,
                'itens' => $itens,
            ];
        }

        $view = view('relatorios.venda_por_produtos_fiscal', [
            'data' => $data,
            'start_date' => $request->start_date,
            'end_date' => $request->end_date,
            'cfop' => $request->cfop,
            'ncm' => $request->ncm,
            'cst_csosn' => $request->cst_csosn,
            'cst_pis' => $request->cst_pis,
            'cst_cofins' => $request->cst_cofins,
            'title' => 'Relatório de Venda por Produtos Fiscal',
        ]);

        $domPdf = new Dompdf(['enable_remote' => true]);
        $domPdf->loadHtml($view);
        $domPdf->setPaper('A4', 'landscape');
        $domPdf->render();
        $domPdf->stream('Relatorio_venda_produtos_fiscal.pdf', ['Attachment' => false]);
    }
}
