arcadiasuite/plus/app/Http/Controllers/FornecedorController.php

395 lines
14 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Fornecedor;
use App\Models\Cidade;
use App\Models\Nfe;
use App\Models\ItemNfe;
use App\Models\Cliente;
use App\Models\ContaPagar;
use App\Imports\ProdutoImport;
use Maatwebsite\Excel\Facades\Excel;
use App\Rules\ValidaDocumentoFornecedor;
class FornecedorController extends Controller
{
public function __construct()
{
$this->middleware('permission:fornecedores_create', ['only' => ['create', 'store']]);
$this->middleware('permission:fornecedores_edit', ['only' => ['edit', 'update']]);
$this->middleware('permission:fornecedores_view', ['only' => ['show', 'index']]);
$this->middleware('permission:fornecedores_delete', ['only' => ['destroy']]);
}
private function setNumeroSequencial(){
$fornecedores = Fornecedor::where('empresa_id', request()->empresa_id)
->where('numero_sequencial', null)
->get();
$numero = __getUltimoNumeroSequencial(request()->empresa_id, 'fornecedors');
// $numero++;
foreach($fornecedores as $fornecedor){
$numero++;
$fornecedor->numero_sequencial = $numero;
$fornecedor->save();
}
__setUltimoNumeroSequencial(request()->empresa_id, 'fornecedors', $numero);
}
public function index(Request $request)
{
$this->setNumeroSequencial();
$start_date = $request->get('start_date');
$end_date = $request->get('end_date');
$ordem = $request->get('ordem');
$data = Fornecedor::where('empresa_id', request()->empresa_id)
->when(!empty($request->razao_social), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('razao_social', 'LIKE', "%$request->razao_social%");
});
})
->when(!empty($request->cpf_cnpj), function ($q) use ($request) {
return $q->where(function ($quer) use ($request) {
return $quer->where('cpf_cnpj', 'LIKE', "%$request->cpf_cnpj%");
});
})
->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(!$ordem, function ($query) {
return $query->orderBy('razao_social');
})
->when($ordem, function ($query) use ($ordem) {
return $query->orderBy($ordem, $ordem == 'created_at' ? 'desc' : 'asc');
})
->paginate(__itensPagina());
return view('fornecedores.index', compact('data'));
}
public function create()
{
return view('fornecedores.create');
}
public function edit($id)
{
$item = Fornecedor::findOrFail($id);
__validaObjetoEmpresa($item);
return view('fornecedores.edit', compact('item'));
}
public function store(Request $request)
{
$this->__validate($request);
try {
$request->merge(['ie' => $request->ie ?? '']);
Fornecedor::create($request->all());
__setUltimoNumeroSequencial(request()->empresa_id, 'fornecedors', $request->numero_sequencial);
if($request->insere_cliente){
$numero = __getUltimoNumeroSequencial(request()->empresa_id, 'clientes');
$request->merge([
'numero_sequencial' => $numero+1
]);
Cliente::create($request->all());
__setUltimoNumeroSequencial(request()->empresa_id, 'clientes', $numero+1);
}
__createLog($request->empresa_id, 'Fornecedor', 'cadastrar', $request->razao_social);
session()->flash("flash_success", "Fornecedor cadastrado!");
} catch (\Exception $e) {
__createLog($request->empresa_id, 'Fornecedor', 'erro', $e->getMessage());
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('fornecedores.index');
}
public function update(Request $request, $id)
{
$this->__validate($request, $id);
$item = Fornecedor::findOrFail($id);
try {
$request->merge(['ie' => $request->ie ?? '']);
$item->fill($request->all())->save();
__createLog($request->empresa_id, 'Fornecedor', 'editar', $request->razao_social);
session()->flash("flash_success", "Fornecedor atualizado!");
} catch (\Exception $e) {
__createLog($request->empresa_id, 'Fornecedor', 'erro', $e->getMessage());
session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
}
return redirect()->route('fornecedores.index');
}
private function __validate(Request $request, $id = null)
{
$rules = [
'razao_social' => 'required',
// 'cpf_cnpj' => 'required',
'cpf_cnpj' => $id == null ? [ 'required', new ValidaDocumentoFornecedor($request->empresa_id) ] : 'required',
// 'ie' => 'required',
'telefone' => 'required',
'cidade_id' => 'required',
'rua' => 'required',
'cep' => 'required',
'numero' => 'required',
'bairro' => 'required',
];
$messages = [
'razao_social.required' => 'Campo Obrigatório',
'cpf_cnpj.required' => 'Campo Obrigatório',
'ie.required' => 'Campo Obrigatório',
'telefone.required' => 'Campo Obrigatório',
'cidade_id.required' => 'Campo Obrigatório',
'rua.required' => 'Campo Obrigatório',
'cep.required' => 'Campo Obrigatório',
'numero.required' => 'Campo Obrigatório',
'bairro.required' => 'Campo Obrigatório',
];
$this->validate($request, $rules, $messages);
}
public function destroy($id)
{
$item = Fornecedor::findOrFail($id);
if(sizeof($item->compras) > 0){
session()->flash("flash_warning", "Não é possível remover um fornecedor com compras!");
return redirect()->back();
}
__validaObjetoEmpresa($item);
try {
$descricaoLog = $item->razao_social;
$item->produtoFornecedor()->delete();
$item->delete();
__createLog(request()->empresa_id, 'Fornecedor', 'excluir', $descricaoLog);
session()->flash("flash_success", "Fornecedor removido!");
} catch (\Exception $e) {
__createLog(request()->empresa_id, 'Fornecedor', 'erro', $e->getMessage());
session()->flash("flash_error", "Algo deu Errado: " . $e->getMessage());
}
return redirect()->back();
}
public function destroySelecet(Request $request)
{
$removidos = 0;
for($i=0; $i<sizeof($request->item_delete); $i++){
$item = Fornecedor::findOrFail($request->item_delete[$i]);
$item = Fornecedor::findOrFail($id);
if(sizeof($item->compras) > 0){
session()->flash("flash_warning", "Não é possível remover um fornecedor com compras!");
return redirect()->back();
}
try {
$descricaoLog = $item->razao_social;
$item->delete();
$removidos++;
__createLog(request()->empresa_id, 'Fornecedor', 'excluir', $descricaoLog);
} catch (\Exception $e) {
__createLog(request()->empresa_id, 'Fornecedor', 'erro', $e->getMessage());
session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
return redirect()->route('fornecedores.index');
}
}
session()->flash("flash_success", "Total de itens removidos: $removidos!");
return redirect()->route('fornecedores.index');
}
public function import(){
return view('fornecedores.import');
}
public function downloadModelo(){
return response()->download(public_path('files/') . 'import_clients_csv_template.xlsx');
}
public function storeModelo(Request $request){
if ($request->hasFile('file')) {
ini_set('max_execution_time', 0);
ini_set('memory_limit', -1);
$rows = Excel::toArray(new ProdutoImport, $request->file);
$retornoErro = $this->validaArquivo($rows);
$cont = 0;
if($retornoErro == ""){
foreach($rows as $row){
foreach($row as $key => $r){
if($r[0] != 'RAZÃO SOCIAL' && isset($r[0])){
try{
$data = $this->preparaObjeto($r, $request->empresa_id);
$item = Fornecedor::create($data);
$cont++;
}catch(\Exception $e){
session()->flash('flash_error', $e->getMessage());
}
}
}
}
session()->flash('flash_success', 'Total de fornecedores importados: ' . $cont);
return redirect()->back();
}else{
session()->flash('flash_error', $retornoErro);
return redirect()->back();
}
}else{
session()->flash('flash_error', 'Nenhum Arquivo!!');
return redirect()->back();
}
}
private function preparaObjeto($linha, $empresa_id){
$cpf_cnpj = trim((string)$linha[2]);
$mask = '##.###.###/####-##';
if(strlen($cpf_cnpj) == 11){
$mask = '###.###.###.##';
}
if(!str_contains($cpf_cnpj, ".")){
$cpf_cnpj = __mask($cpf_cnpj, $mask);
}
$cidade = Cidade::where('nome', $linha[7])
->where('uf', $linha[8])->first();
$data = [
'empresa_id' => $empresa_id,
'razao_social' => $linha[0],
'nome_fantasia' => $linha[1] != '' ? $linha[1] : '',
'cpf_cnpj' => $cpf_cnpj,
'ie' => $linha[3] != '' ? $linha[3] : '',
'contribuinte' => $linha[13] != '' ? $linha[13] : 0,
'consumidor_final' => $linha[14] != '' ? $linha[14] : 0,
'email' => $linha[10] != '' ? $linha[10] : '',
'telefone' => $linha[9] != '' ? $linha[9] : '',
'cidade_id' => $cidade != null ? $cidade->id : 1,
'rua' => $linha[4],
'cep' => $linha[11],
'numero' => $linha[5],
'bairro' => $linha[6],
'complemento' => $linha[12] != '' ? $linha[12] : ''
];
return $data;
}
private function validaArquivo($rows){
$cont = 1;
$msgErro = "";
foreach($rows as $row){
foreach($row as $key => $r){
if(isset($r[0])){
$razaoSocial = $r[0];
$cpfCnpj = $r[2];
$rua = $r[4];
$numero = $r[5];
$bairro = $r[6];
$cidade = $r[7];
$uf = $r[8];
$cep = $r[11];
if(strlen($razaoSocial) == 0){
$msgErro .= "Coluna razão social em branco na linha: $cont | ";
}
if(strlen($cpfCnpj) == 0){
$msgErro .= "Coluna CPF/CNPJ em branco na linha: $cont | ";
}
if(strlen($rua) == 0){
$msgErro .= "Coluna rua em branco na linha: $cont | ";
}
if(strlen($numero) == 0){
$msgErro .= "Coluna numero em branco na linha: $cont | ";
}
if(strlen($bairro) == 0){
$msgErro .= "Coluna bairro em branco na linha: $cont | ";
}
if(strlen($cidade) == 0){
$msgErro .= "Coluna cidade em branco na linha: $cont | ";
}
if(strlen($cep) == 0){
$msgErro .= "Coluna CEP em branco na linha: $cont | ";
}
if($msgErro != ""){
return $msgErro;
}
$cont++;
}
}
}
return $msgErro;
}
public function historico($id)
{
$item = Fornecedor::findOrFail($id);
__validaObjetoEmpresa($item);
$data = Nfe::where('fornecedor_id', $id)
->orderBy('id', 'desc')
->get();
$produtos = $this->getProdutos($id);
$faturas = $this->getFaturas($id);
return view('fornecedores.historico', compact('item', 'data', 'produtos', 'faturas'));
}
private function getProdutos($id){
$data = [];
$dataIds = [];
$itens = ItemNfe::select('item_nves.*')
->join('nves', 'nves.id', '=', 'item_nves.nfe_id')
->where('nves.fornecedor_id', $id)
->get();
foreach($itens as $i){
if(!in_array($i->produto_id, $dataIds)){
$data[] = $i;
$dataIds[] = $i->produto_id;
}else{
for($j=0; $j<sizeof($data); $j++){
if($data[$j]['produto_id'] == $i->produto_id){
$data[$j]['quantidade'] += $i->quantidade;
}
}
}
}
return $data;
}
private function getFaturas($id){
return ContaPagar::where('fornecedor_id', $id)
->orderBy('id', 'desc')
->get();
}
}