Crie um controller de recursos chamado Nfe, para que o projeto fique mais organizado salve o controller numa pasta chamada NotaFiscal
Crie uma rota resource setando para o controller NotaFiscalController
Route::resource("/notafiscal", NotaFiscalController::class);
Crie a view para a listagem de produto
Dentro da pasta resources/view crie uma pasta chamada de NotaFiscal e dentro de NotaFiscal crie uma outra chamada de Nfe e dentro da pasta Nfe crie um arquivo chamado Index.blade.php
Copie o conteúdo do arquivo lst_nfe para o arquivo NotaFiscal/Nfe/Index.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
Na view Index, faça os seguintes procedimentos:
- Faça o loop para receber os dados do banco e listar na tabela
- Configure o link para fazer a edição de um registro
- Configure o link para fazer a exclusão de um registro
<?php $total = 0; ?>
@foreach ($lista as $c)
<tr>
<td align="center">{{ $c->id }}<input type="hidden"
id="status_{{ $c->id }}" value="{{ $c->status_id }}"></td>
<td align="center">{{ $c->nNF }}</td>
<td align="center">
{{ isset($c->destinatario->dest_xNome) ? substr($c->destinatario->dest_xNome, 0, 30) : null }}
</td>
<td align="center">{{ databr(dataNfe($c->dhEmi)) }}</td>
<td align="center">{{ formataNumeroBr($c->vNF) }} </td>
<td align="center"><span
class="{{ strtolower($c->status->status) }}">{{ $c->status->status }}</span>
</td>
<td align="center">
@if ($c->status_id == config('constantes.status.CANCELADO'))
<a href="{{ route('nfe.imprimirDanfePelaNfe', $c->id) }}"
target="_blank" class="btn btn-verde d-inline-block">Imprimir
Nfe</a>
<a href="{{ route('nfe.imprimircancelado', $c->id) }}"
target="_blank" class="btn btn-amarelo d-inline-block">Imprimir
Cancel.</a>
<a href="javascript:;"
onclick="baixarXmlNfe('{{ $c->chave }}')"
class="btn btn-azul d-inline-block">Baixa XML</a>
@elseif($c->status_id == config('constantes.status.AUTORIZADO'))
<a href="javascript:;"
onclick="telaCancelamento({{ $c->id }})"
class="btn btn-vermelho d-inline-block">Cancelar NFE</a>
<a href="javascript:;" onclick="telaCorrecao({{ $c->id }})"
class="btn btn-verde d-inline-block">Carta Correção</a>
<a href="javascript:;"
onclick="baixarXmlNfe('{{ $c->chave }}')"
class="btn btn-azul d-inline-block">Baixa XML</a>
<a href="{{ route('nfe.imprimirDanfePelaNfe', $c->id) }}"
target="_blank" class="btn btn-verde d-inline-block">Imprimir
Nfe</a>
@elseif($c->status_id == config('constantes.status.DIGITACAO'))
<a href="javascript:;" onclick="transmitirNfe({{ $c->id }})"
class="btn btn-azul d-inline-block">Transmitir NFe</a>
<a href="#"
onclick="confirm('Tem Certeza?') ? document.getElementById('apagar{{ $c->id }}').submit() : '';"
class="btn btn-vermelho d-inline-block">Excluir Nota</a>
<form action="{{ route('notafiscal.destroy', $c->id) }}"
method="POST" id="apagar{{ $c->id }}">
<input type="hidden" name="_method" value="DELETE">
{{ csrf_field() }}
</form>
@else
<a href="javascript:;" onclick="transmitirNfe({{ $c->id }})"
class="btn btn-azul">Transmitir NFe</a>
@endif
</td>
<td align="center"><a href="{{ route('notafiscal.edit', $c->id) }}"
class="btn btn-verde d-inline-block"><i class="fas fa-edit"></i>
Editar</a>
</td>
<!-- <td align="right"><a href="javascript:;"
onclick="abrir_opcoes_nfe({{ $c->id }})"><i
class="ellipsis-vertical"></i></a></td>-->
</tr>
@endforeach
Faça o teste com os filtros
Implemente o método create do controller NotaFiscalController com as seguintes ações:
- no array $dados liste as Naturezas
- no array $dados liste os emitentes
- no array $dados liste os clientes
- no array $dados liste as transportadoras
- chame a view Nfe/Create passando o array $dados
$dados["naturezas"] = NaturezaOperacao::get();
$dados["emitentes"] = Emitente::all();
$dados["clientes"] = Cliente::all();
$dados["transportadoras"] = Transportadora::all();
return view("NotaFiscal.Nfe.Create", $dados);
Para fazer o cadastro de Nfe será necessário criar duas novas views, Dentro da pasta NotaFiscal/Nfe faça o seguinte:
- Crie uma view chamada Create.blade.php
- Crie uma view chamada Edit.blade.php
Copie o conteúdo do arquivo frm_nfe para o arquivo NotaFiscal/Nfe/Create.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
Configure o elemento form da view Create, com as seguintes ações:
- Setar a rota produto.store na propriedade action do form
- Setar o método post na propriedade method do form
- setar a propriedade enctype para multipart/form-data
- implementar o helper @csrf dentro do form
<form action="{{ route('notafiscal.create') }}" method="post">
@csrf
Configure os combos: Natureza Operacao, Emitente, Cliente e Transportadora
Faça o loop da lista de transportadora e preencha o elemento select .
<select class="form-campo" name="transportadora_id"
id="transportadora_id">
<option value="">Selecione uma Opção </option>
@foreach ($transportadoras as $transportadora)
<option value="{{ $transportadora->id }}">
{{ $transportadora->razao_social }}</option>
@endforeach
</select>
Crie uma classe chamada Service/NotaFiscalService
<?php
namespace App\Service;
class NotaFiscalService{
}
Na classe NotaFiscalService crie um método chamado criarNovaNota, o que deverá:
- Receber os dados do formulário
- status igual a DIGITACAO
- faça a validação e verificação dos dados e salve no banco de dados
public static function criarNovaNota($nota){
$emitente = Emitente::find($nota->emitente_id);
$cliente = Cliente::find($nota->cliente_id);
$transportadora = Transportadora::find($nota->transportadora_id);
$natureza_operacao = NaturezaOperacao::where("id", $nota->natureza_operacao_id)->first();
$nota->status_id = config("constantes.status.DIGITACAO");
$nota->sequencia_cce = 0;
$nota->cUF = ConstanteService::getUf($cliente->uf);
$nota->natOp = $natureza_operacao->natureza_operacao;
$nota->modelo = config("constanteNota.mod.NFE");
$nota->nNF = $emitente->ultimo_numero_nfe + 1;
$nota->serie = $emitente->numero_serie_nfe;
$nota->cNF = rand($nota->nNF,99999999);
$nota->dhEmi = hoje(). 'T'.date("H:i:s").'-03:00';
$nota->dhSaiEnt = hoje(). 'T'.date("H:i:s").'-03:00';
$nota->tpNF = ($natureza_operacao->tipo == "S") ? config("constanteNota.tpNf.SAIDA") : config("constanteNota.tpNf.ENTRADA"); //0 - Entrada / 1 - Saida
//Verifica o destino da operação
if ($emitente->uf != "EX"){
if($emitente->uf == $cliente->uf ){
$nota->idDest = config("constanteNota.idDest.INTERNA");
}else{
$nota->idDest = config("constanteNota.idDest.INTERESTADUAL");
}
}else{
$nota->idDest = config("constanteNota.idDest.INTERESTADUAL");
}
$nota->cMunFG = $emitente->ibge;
$nota->tpImp = config("constanteNota.tpImp.RETRATO"); //formato do danfe
$nota->tpEmis = config("constanteNota.tpEmis.NORMAL") ; //tipo emissão - 1 - normal
$nota->tpAmb = $emitente->ambiente_nfe;
$nota->finNFe = $natureza_operacao->finNFe; //Finalidade emissão 1 - Normal
$nota->indFinal = $cliente->indFinal; // consumidor final
$nota->indPres = $natureza_operacao->indPres; //presença do comprador
$nota->procEmi = config("constanteNota.procEmi.APLICATIVO_CONTRIBUINTE");
$nota->verProc = '3.10.31';
$nota->dhCont = null;
$nota->xJust = null;
$nota->em_xNome = tiraAcento($emitente->razao_social);
$nota->em_xFant = tiraAcento($emitente->nome_fantasia);
$nota->em_IE = ($emitente->ie) ? tira_mascara($emitente->ie) : null ;
$nota->em_IEST = ($emitente->iest) ? tira_mascara($emitente->iest) : null;
$nota->em_IM = $emitente->im;
$nota->em_CNAE = $emitente->cnae;
$nota->em_CRT = $emitente->crt;
$cnpj = ($emitente->cnpj) ? tira_mascara($emitente->cnpj) : null;
if(strlen($cnpj) == 14){
$nota->em_CNPJ = $cnpj;
}else{
$nota->em_CPF = $cnpj;
}
$nota->em_xLgr = tiraAcento($emitente->logradouro);
$nota->em_nro = $emitente->numero;
$nota->em_xCpl = tiraAcento($emitente->complemento);
$nota->em_xBairro = tiraAcento($emitente->bairro);
$nota->em_cMun = $emitente->ibge;
$nota->em_xMun = tiraAcento($emitente->cidade);
$nota->em_UF = $emitente->uf;
$nota->em_CEP = ($emitente->cep) ? tira_mascara($emitente->cep) : null;
$nota->em_cPais = "1058";
$nota->em_xPais = "Brasil";
$nota->em_fone = ($emitente->fone) ? tira_mascara($emitente->fone): null;
if($transportadora){
$nota->transp_xNome = tiraAcento($transportadora->razao_social);
$nota->transp_IE = $transportadora->ie;
$nota->transp_xEnder = tiraAcento($transportadora->logradouro);
$nota->transp_xMun = tiraAcento($transportadora->cidade);
$nota->transp_UF = $transportadora->uf;
$nota->transp_CNPJ = tira_mascara($transportadora->cnpj);
}
$nfe = Nfe::Create(objToArray($nota));
$emitente = Emitente::first();
$emitente->ultimo_numero_nfe = $nota->nNF;
$emitente->save();
return $nfe;
}
implemente o método store para receber e salvar os dados do formulário no Banco de dados
Receba os dados do Formulário e passe para o método criarNovaNota da classe NotaFiscalService
$retorno = new \stdClass();
$req = $request->except(["_token","_method"]);
try {
$nota = (object) $req ;
$nota->modFrete = $request->modFrete;
$nfe = NotaFiscalService::criarNovaNota($nota);
return redirect()->route("notafiscal.edit", $nfe->id)->with("msg_sucesso","A Nota Fiscal foi cadatrada com sucesso, altere os dados se achar necessário, salve e em seguida faça a transmissão!");
} catch (\Exception $e) {
$retorno->tem_erro = true;
$retorno->erro = $e->getMessage();
return redirect()->back()->with("msg_erro",$retorno->erro);
}
Crie uma classe chamada Service/NfeDestinatarioService
<?php
namespace App\Service;
class NfeDestinatarioService{
}
Crie um método chamado criar na classe NfeDestinatarioService, o qual deverá receber o id da note e os dados do cliente salvar estas informações na tabela nfe_destinatario
public static function criar($nfe_id, $cliente){
$dest = new \stdClass();
$dest->nfe_id = $nfe_id;
$dest->dest_xNome = tiraAcento($cliente->nome_razao_social);
$dest->dest_indIEDest = $cliente->tipo_contribuinte;
$dest->dest_ISUF = $cliente->suframa;
$dest->dest_IM = $cliente->im;
$dest->dest_email = $cliente->email;
$cnpj_cpf = tira_mascara($cliente->cpf_cnpj);
if(strlen($cnpj_cpf) == 14){
$dest->dest_CNPJ = $cnpj_cpf;
$dest->dest_IE = tira_mascara($cliente->rg_ie);
}
else{
$dest->dest_CPF = $cnpj_cpf;
}
$dest->dest_idEstrangeiro=null;
$dest->dest_xLgr = tiraAcento($cliente->logradouro);
$dest->dest_nro = $cliente->numero;
$dest->dest_xCpl = tiraAcento($cliente->complemento);
$dest->dest_xBairro = tiraAcento($cliente->bairro);
$dest->dest_cMun = $cliente->ibge;
$dest->dest_xMun = strtoupper(tiraAcento($cliente->cidade));
$dest->dest_UF = $cliente->uf;
$dest->dest_CEP = tira_mascara($cliente->cep);
$dest->dest_cPais = "1058";
$dest->dest_xPais = "Brasil";
$dest->dest_fone = ($cliente->telefone) ? tira_mascara($cliente->telefone) : null ;
$destinatario = NfeDestinatario::where("nfe_id", $nfe_id)->first();
if(!$destinatario){
NfeDestinatario::create(objToArray($dest));
}else{
$destinatario->update(objToArray($dest));
}
}
No método store do controller NotaFiscalController após inserção na tabela nfe, faça a inserção dos dados do destinatário chamando o método criar da classe NfeDestinatarioService e passando o id da nfe e os dados do cliente
if($nfe){
$cliente = Cliente::find($req["cliente_id"]);
NfeDestinatarioService::criar($nfe->id, $cliente);
$nfe->nFat = $nfe->id;
$nfe->save();
}
Caso não tenha conseguido fazer, segue o código completo
public function store(Request $request)
{
$retorno = new \stdClass();
$req = $request->except(["_token","_method"]);
try {
$nota = (object) $req ;
$nota->modFrete = $request->modFrete;
$nfe = NotaFiscalService::criarNovaNota($nota);
if($nfe){
$cliente = Cliente::find($req["cliente_id"]);
NfeDestinatarioService::criar($nfe->id, $cliente);
$nfe->nFat = $nfe->id;
$nfe->save();
}
return redirect()->route("notafiscal.edit", $nfe->id)->with("msg_sucesso","A Nota Fiscal foi cadatrada com sucesso, altere os dados se achar necessário, salve e em seguida faça a transmissão!");
} catch (\Exception $e) {
$retorno->tem_erro = true;
$retorno->erro = $e->getMessage();
return redirect()->back()->with("msg_erro",$retorno->erro);
}
}
Uma boa prática de programação é validar os dados antes de enviá-los para o banco de dados e uma bom recurso que o laravel oferece são os requests.
implemente um request de forma que faça todas as validações necessárias para salvar a informações no banco
Teste o sistema fazendo cadastros
Configure o método edit do Controller, com as seguinte ações:
- Busque a nfe pelo id passado no parâmetro e guarde a informação em um array $dados
- no array dados sete a variável produtoJs para true
- no array dados sete a variável transportadoraJs para true
- chame a view NotaFiscal/Nfe/Edit passando o array $dados
$nfe = Nfe::find($id);
$dados["notafiscal"] = $nfe;
$dados["produtoJs"] = true;
$dados["transportadoraJs"] = true;
return view("NotaFiscal.Nfe.Edit", $dados);
Copie o conteúdo do arquivo edit_nfe para o arquivo NotaFiscal/Nfe/Edit.blade.php, não esqueça envolvê-lo pelos comandos:
@extends('template')
@section('conteudo')
//aqui fica o conteúdo do arquivo
@endsection
- apenas monte o arquivo, pois as alterações serão feitas passo a passo em outro momento