381 lines
16 KiB
PHP
381 lines
16 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\API\App;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Nfe;
|
|
use App\Models\Nfce;
|
|
use App\Models\Empresa;
|
|
use App\Models\MovimentacaoProduto;
|
|
use App\Models\Estoque;
|
|
use App\Models\Produto;
|
|
use Dompdf\Dompdf;
|
|
|
|
class RelatorioController extends Controller
|
|
{
|
|
public function vendas(Request $request){
|
|
|
|
$tipo = $request->tipo;
|
|
$start_date = $request->data_inicial;
|
|
if($start_date){
|
|
$start_date = \Carbon\Carbon::createFromFormat('d/m/Y', $start_date)->format('Y-m-d');
|
|
}
|
|
$end_date = $request->data_final;
|
|
if($end_date){
|
|
$end_date = \Carbon\Carbon::createFromFormat('d/m/Y', $end_date)->format('Y-m-d');
|
|
}
|
|
$local_id = $request->local_id;
|
|
$cliente_id = $request->cliente_id;
|
|
$start_time = $request->horario_inicial;
|
|
$end_time = $request->horario_final;
|
|
$estado = $request->estado;
|
|
|
|
if($start_date){
|
|
if($start_time){
|
|
$start_date .= " $start_time:59";
|
|
}else{
|
|
$start_date .= " 00:00:00";
|
|
}
|
|
}
|
|
|
|
if($end_date){
|
|
if($end_time){
|
|
$end_date .= " $end_time:59";
|
|
}else{
|
|
$end_date .= " 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();
|
|
|
|
$data = $this->uneArrayVendas($vendas, $vendasCaixa);
|
|
|
|
usort($data, function($a, $b){
|
|
return $a['data'] > $b['data'] ? 1 : -1;
|
|
});
|
|
|
|
$p = view('relatorios.vendas', compact('data', 'tipo'))
|
|
->with('title', 'Relatório de Vendas');
|
|
|
|
$domPdf = new Dompdf(["enable_remote" => true]);
|
|
$domPdf->loadHtml($p);
|
|
|
|
$pdf = ob_get_clean();
|
|
|
|
$domPdf->setPaper("A4", "landscape");
|
|
$domPdf->render();
|
|
if (!is_dir(public_path('relatorios_app'))) {
|
|
mkdir(public_path('relatorios_app'), 0777, true);
|
|
}
|
|
|
|
// limpar pasta
|
|
|
|
$files = glob(public_path('relatorios_app/')."/*");
|
|
foreach($files as $file){
|
|
if(is_file($file)) unlink($file);
|
|
}
|
|
|
|
$empresa = Empresa::findOrFail($request->empresa_id);
|
|
$doc = preg_replace('/[^0-9]/', '', $empresa->cpf_cnpj);
|
|
|
|
$fileName = "Relatorio_vendas_$doc.pdf";
|
|
file_put_contents(public_path('relatorios_app/') . $fileName , $domPdf->output());
|
|
|
|
$url = env("APP_URL"). "/relatorios_app/".$fileName;
|
|
return response()->json($url, 200);
|
|
}
|
|
|
|
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 estoque(Request $request){
|
|
|
|
$estoque_minimo = $request->estoque_minimo;
|
|
$start_date = $request->data_inicial;
|
|
if($start_date){
|
|
$start_date = \Carbon\Carbon::createFromFormat('d/m/Y', $start_date)->format('Y-m-d');
|
|
}
|
|
$end_date = $request->data_final;
|
|
if($end_date){
|
|
$end_date = \Carbon\Carbon::createFromFormat('d/m/Y', $end_date)->format('Y-m-d');
|
|
}
|
|
$categoria_id = $request->categoria_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('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 = [
|
|
'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 = [
|
|
'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('produtos.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 = [
|
|
'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 = [
|
|
'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('produtos.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 = [
|
|
'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 = [
|
|
'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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$localizacao = null;
|
|
$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);
|
|
|
|
$pdf = ob_get_clean();
|
|
|
|
$domPdf->setPaper("A4", "landscape");
|
|
$domPdf->render();
|
|
if (!is_dir(public_path('relatorios_app'))) {
|
|
mkdir(public_path('relatorios_app'), 0777, true);
|
|
}
|
|
|
|
// limpar pasta
|
|
|
|
$files = glob(public_path('relatorios_app/')."/*");
|
|
foreach($files as $file){
|
|
if(is_file($file)) unlink($file);
|
|
}
|
|
|
|
$empresa = Empresa::findOrFail($request->empresa_id);
|
|
$doc = preg_replace('/[^0-9]/', '', $empresa->cpf_cnpj);
|
|
|
|
$fileName = "Relatorio_vendas_$doc.pdf";
|
|
file_put_contents(public_path('relatorios_app/') . $fileName , $domPdf->output());
|
|
|
|
$url = env("APP_URL"). "/relatorios_app/".$fileName;
|
|
return response()->json($url, 200);
|
|
}
|
|
}
|