Crie um controller de recursos chamado NfeEntrada, para que o projeto fique mais organizado salve o controller numa pasta chamada Importacao
No controller CategoriaController implemente o método index, o qual deverá:
- pegar a lista de status
- pegar a lista de categorias e colocar um array
- chamar a view Importacao/NfeEntrada/Index com o array criado com a lista de nfeentradas
public function index()
{
$dados["status"] = Status::get();
$dados["lista"] = NfeEntrada::get();
return View("Importacao.NfeEntrada.Index", $dados);
}
Crie uma rota get setando para o método inde controller NfeEntradaController
Route::get('/nfeentrada/index',[NfeEntradaController::class,'index'])->name('nfeentrada.index');
Crie a view para a listagem de nfeentrada
Copie o conteúdo do arquivo lst_nfeentrada para o arquivo Importacao/NfeEntrada/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 listagem de produtos
- Configure o link para fazer a edição de um registro
- Configure o link para fazer a exclusão de um registro
@foreach ($lista as $c)
<tr>
<td align="center">{{ $c->id }}</td>
<td align="center">{{ $c->fornecedor->razao_social ?? '---' }}</td>
<td align="center">{{ $c->chave }}</td>
<td align="center">{{ databr(dataNfe($c->dhEmi)) }}</td>
<td align="center">{{ formataNumeroBr($c->vProd) }} </td>
<td align="center">{{ formataNumeroBr($c->vFrete) }} </td>
<td align="center">{{ formataNumeroBr($c->vDesc) }} </td>
<td align="center">{{ formataNumeroBr($c->vICMS) }} </td>
<td align="center">{{ formataNumeroBr($c->vIPI) }} </td>
<td align="center">{{ formataNumeroBr($c->vPIS) }} </td>
<td align="center">{{ formataNumeroBr($c->vCOFINS) }} </td>
<td align="center">{{ formataNumeroBr($c->vNF) }} </td>
<td align="center">
<a href="" class="btn btn-azul d-inline-block" title="Visulizar Produtos"><i
class="fas fa-eye "></i></a>
<a href="" class="btn btn-vermelho d-inline-block" title="Excluir"><i
class="fas fa-eye"></i></a>
<a href="" class="btn btn-vermelho d-inline-block" title="Excluir"><i
class="fas fa-trash"></i></a>
</td>
</tr>
@endforeach
Vamos configurar a view index para enviar os arquivos XML para importação
Configure o elemento form da view Index, com as seguintes ações:
- Setar a rota nfeentrada.importar 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('nfeentrada.importar') }}" method="POST" enctype="multipart/form-data">
@csrf
configure os input atribuindo a eles na propriedade name ="arquivo[]", propriedade type = "file" e a propriedade accept = ".xml"
<div class="col-6">
<label class="text-label d-block text-branco">Nome </label>
<input type="file" name="arquivo[]" multiple accept=".xml" class="form-campo"
id="arquivo">
</div>
Implemente o método importar do controller NfeEntradaController que a pricípio fará apenas o seguinte:
- contará o total de arquivos xml enviados
- fará um loop para cada arquivo enviado
- dentro o loop armazena o arquivo na variável xml
- chama o método lerXml da classe XmlService passando o xml como parâmetro
- o método lerXml
como o método lerXml é um pouco extenso vamos primeiramente criá-lo e depois finalizaremos o método importar
public function importar(Request $request){
$total = count($request->allFiles()["arquivo"]);
for($i =0; $i< $total; $i++){
$xml = $request->allFiles()["arquivo"][$i];
$nota = XmlService::lerXml($xml);
}
}
Na classe XmlService crie um método chamado lerXml, o qual receber o arquivo xml como parâmetro e deverá:
- ler o arquivo usando o método simplexml_load_file
- verificar se existir o objeto $xm->NFE
- extraia a chave
- receba cada um dos nós da nota em uma variável, exemplo: $identificacao = $xml_nfe->ide;
como esse método é muito grande vamos fazê-lo por parte , e no final criaremos um objeto stdClass chamado $nota que receberá cada um dos nós da nota
function lerXml($xmlOrigem){
$xml = simplexml_load_file($xmlOrigem);
if(isset($xml->NFe)){
$xml_nfe = $xml->NFe->infNFe;
}elseif($xml->infNFe){
$xml_nfe = $xml->infNFe;
}
$chaveNfe = $xml_nfe->attributes()->Id;
$chave = substr($chaveNfe, 3, 44);
$identificacao = $xml_nfe->ide;
$emitenteXml = $xml_nfe->emit;
$produtosXml = $xml_nfe->det ;
$totais = $xml_nfe->total ;
$transportadoraNfe = $xml_nfe->transp;
$intermediarioXml = $xml_nfe->Intermed ?? null;
$infAdicXml = $xml_nfe->infAdic ?? null;
$duplicataXml = $xml_nfe->cobr->dup ?? null;
$pagamentoXml = $xml_nfe->pag ?? null;
$totalXml = ($totais->ICMSTot) ?? null;
$nota = new stdClass;
return $nota;
}
- crie um objeto chamado ide stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Dados de Identificação
$ide = new \stdClass();
$ide->cUF = $identificacao->cUF;
$ide->chave = $chave;
$ide->cNF = $identificacao->cNF;
$ide->natOp = $identificacao->natOp;
$ide->modelo = $identificacao->mod ;
$ide->serie = $identificacao->serie ;
$ide->nNF = $identificacao->nNF ;
$ide->dhEmi = $identificacao->dhEmi ;
$ide->dhSaiEnt = $identificacao->dhSaiEnt ;
$ide->tpNF = $identificacao->tpNF ;
$ide->idDest = $identificacao->idDest ;
$ide->cMunFG = $identificacao->cMunFG ;
$ide->tpImp = $identificacao->tpImp ;
$ide->tpEmis = $identificacao->tpEmis ;
$ide->cDV = $identificacao->cDV ;
$ide->tpAmb = $identificacao->tpAmb ;
$ide->finNFe = $identificacao->finNFe ;
$ide->indFinal = $identificacao->indFinal ;
$ide->indPres = $identificacao->indPres ;
$ide->indIntermed = $identificacao->indIntermed ;
$ide->procEmi = $identificacao->procEmi ;
$ide->verProc = $identificacao->verProc ;
$ide->dhCont = ($identificacao->dhCont) ?? null ;
$ide->xJust = ($identificacao->xJust) ?? null ;
$ide->modFrete = ($transportadoraNfe->modFrete) ?? null ;
$nota = new stdClass();
$nota->identificacao = $ide;
crie um objeto chamado emitente stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Daods do Emitente
$emitente = new \stdClass();
$emitente->CNPJ = ($emitenteXml->CNPJ) ? $emitenteXml->CNPJ : $emitenteXml->CPF;
$emitente->xNome = $emitenteXml->xNome;
$emitente->xFant = $emitenteXml->xFant;
$emitente->xLgr = $emitenteXml->enderEmit->xLgr;
$emitente->nro = $emitenteXml->enderEmit->nro;
$emitente->xBairro = $emitenteXml->enderEmit->xBairro;
$emitente->UF = $emitenteXml->enderEmit->UF;
$emitente->xCpl = ($emitenteXml->xCpl) ?? null;
$emitente->fone = ($emitenteXml->enderEmit->fone) ?? null;
$emitente->CEP = $emitenteXml->enderEmit->CEP;
$emitente->cMun = $emitenteXml->enderEmit->cMun;
$emitente->IE = ($emitenteXml->IE) ?? null;
$emitente->email = ($emitenteXml->email) ?? null;
$emitente->xMun = $emitenteXml->enderEmit->xMun;
- crie um objeto chamado transportadora stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Tranportadora
$transportadora = new stdClass();
$transportadora->CNPJ = $transportadoraNfe->transporta->CNPJ ?? null ;
$transportadora->xNome = $transportadoraNfe->transporta->xNome ?? null;
$transportadora->xEnder = $transportadoraNfe->transporta->xEnder ?? null;
$transportadora->xMun = $transportadoraNfe->transporta->xMun ?? null;
$transportadora->UF = $transportadoraNfe->transporta->UF ?? null;
$transportadora->IE = $transportadoraNfe->transporta->IE ?? null;
- crie um objeto chamado volume stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Volume
$volume = new stdClass();
$volume->qVol = $transportadoraNfe->vol->qVol ?? null;
$volume->esp = $transportadoraNfe->vol->esp ?? null;
$volume->marca = $transportadoraNfe->vol->marca ?? null;
$volume->pesoL = $transportadoraNfe->vol->pesoL ?? null;
$volume->pesoB = $transportadoraNfe->vol->pesoB ?? null;
- crie um objeto chamado volume stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Veículo
$veiculo = new stdClass();
$veiculo->placa = $transportadoraNfe->veicTransp->placa ?? null;
$veiculo->UF = $transportadoraNfe->veicTransp->UF ?? null;
$veiculo->RNTC = $transportadoraNfe->veicTransp->RNTC ?? null;
- crie um objeto chamado reboque stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Reboque
$reboque = new stdClass();
$reboque->placa = $transportadoraNfe->reboque->placa ?? null;
$reboque->UF = $transportadoraNfe->reboque->UF ?? null;
$reboque->RNTC = $transportadoraNfe->reboque->RNTC ?? null;
- crie um objeto chamado vagaoBalsa stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Vagão
$vagaoBalsa = new stdClass();
$vagaoBalsa->vagao = $transportadoraNfe->vagao->vagao ?? null;
$vagaoBalsa->balsa = $transportadoraNfe->vagao->balsa ?? null;
$vagaoBalsa->nLacre = $transportadoraNfe->lacres->nLacre ?? null;
- crie um objeto chamado total stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Totais da Nota
$total = new stdClass();
$total->vFrete = ($totalXml->vFrete) ?? null ;
$total->vSeg = ($totalXml->vSeg) ?? null ;
$total->vNF = ($totalXml->vNF) ?? null ;
$total->vOrig = ($totalXml->vOrig) ?? null ;
$total->vLiq = ($totalXml->vLiq) ?? null ;
$total->vBC = ($totalXml->vBC) ?? null ;
$total->vICMS = ($totalXml->vICMS) ?? null ;
$total->vICMSDeson = ($totalXml->vICMSDeson) ?? null ;
$total->vFCP = ($totalXml->vFCP) ?? null ;
$total->vBCST = ($totalXml->vBCST) ?? null ;
$total->vST = ($totalXml->vST) ?? null ;
$total->vFCPST = ($totalXml->vFCPST) ?? null ;
$total->vFCPSTRet = ($totalXml->vFCPSTRet) ?? null ;
$total->vProd = ($totalXml->vProd) ?? null ;
$total->vFrete = ($totalXml->vFrete) ?? null ;
$total->vSeg = ($totalXml->vSeg) ?? null ;
$total->vDesc = ($totalXml->vDesc) ?? null ;
$total->vII = ($totalXml->vII) ?? null ;
$total->vIPI = ($totalXml->vIPI) ?? null ;
$total->vIPIDevol = ($totalXml->vIPIDevol) ?? null ;
$total->vPIS = ($totalXml->vPIS) ?? null ;
$total->vCOFINS = ($totalXml->vCOFINS) ?? null ;
$total->vOutro = ($totalXml->vOutro) ?? null ;
$total->vNF = ($totalXml->vNF) ?? null ;
$total->vTotTrib = ($totalXml->vTotTrib) ?? null ;
- crie um objeto chamado duplicata stdclass e atribua os valores do xml
- adicione o objeto id ao objeto $nota
//Duplicatas
$duplicatas = array();
if($duplicataXml){
foreach ($duplicataXml as $dup){
$duplicata = new \stdClass();
$duplicata->nDup = ($dup->nDup) ?? null;
$duplicata->dVenc = ($dup->dVenc) ?? null;
$duplicata->vDup = ($dup->vDup) ?? null;
$duplicatas[] = $duplicata;
}
}