Crie um controller chamado NFE, para que o projeto fique mais organizado salve o controller numa pasta chamada NotaFiscal
Para criar o controller use o comando: php artisan make:controller \NotaFiscal\NfeController
Crie um objeto stdclass com os dados gerais da nota, tais como status_id, chave, recibo, protocolo e todos que forem necessários
$nota = new stdClass;
$nota->id = $nfe->id;
$nota->venda_id = $nfe->venda_id;
$nota->status_id = $nfe->status_id;
$nota->chave = $nfe->chave;
$nota->recibo = $nfe->recibo;
$nota->protocolo = $nfe->protocolo;
$nota->sequencia_cce= $nfe->sequencia_cce;
Baseados nos dados da nfe, monte um objeto stdclass com os dados do node ide
$ide = new stdClass;
$ide->cUF = $nfe->cUF;
$ide->nNF = $nfe->nNF;
$ide->natOp = $nfe->natOp;
$ide->mod = $nfe->modelo;
$ide->serie = $nfe->serie;
$ide->dhEmi = $nfe->dhEmi;
$ide->dhEntSai = $nfe->dhEntSai;
$ide->idDest = $nfe->idDest;
$ide->cMunFG = $nfe->cMunFG;
$ide->tpNF = $nfe->tpNF;
$ide->tpImp = $nfe->tpImp;
$ide->tpEmis = $nfe->tpEmis;
$ide->tpAmb = $nfe->tpAmb;
$ide->finNFe = $nfe->finNFe;
$ide->indFinal = $nfe->indFinal;
$ide->indPres = $nfe->indPres;
$ide->indIntermed = $nfe->indIntermed;
$ide->procEmi = $nfe->procEmi;
$ide->verProc = $nfe->verProc;
$ide->modFrete = $nfe->modFrete;
$ide->vTroco = $nfe->vTroco;
$ide->dhCont = null;
$ide->xJust = null;
baseado nos dados da nfe, monte um objeto stclass com os dados do responsavel técnico
//Responsável técnico
$responsavel = new stdClass;
$responsavel->CNPJ = $nfe->resp_CNPJ;
$responsavel->xContato = $nfe->resp_xContato;
$responsavel->email = $nfe->resp_email;
$responsavel->fone = $nfe->resp_fone;
$responsavel->CSRT = $nfe->resp_CSRT;
$responsavel->idCSRT = $nfe->resp_idCSRT;
baseado nos dados da nfe, monte um objeto stdclass com os dados do Emitente
//Emitente
$emitente = new \stdClass();
$emitente->xNome = $nfe->em_xNome;
$emitente->xFant = $nfe->em_xFant;
$emitente->IE = $nfe->em_IE;
$emitente->IEST = $nfe->em_IEST;
$emitente->IM = $nfe->em_IM;
$emitente->CNAE = $nfe->em_CNAE;
$emitente->CRT = $nfe->em_CRT;
$emitente->CNPJ = $nfe->em_CNPJ; //indicar apenas um CNPJ ou CPF
$emitente->CPF = $nfe->em_CPF;
$emitente->xLgr = $nfe->em_xLgr;
$emitente->nro = $nfe->em_nro;
$emitente->xCpl = $nfe->em_xCpl;
$emitente->xBairro= $nfe->em_xBairro ;
$emitente->cMun = $nfe->em_cMun;
$emitente->xMun = $nfe->em_xMun;
$emitente->UF = $nfe->em_UF;
$emitente->CEP = $nfe->em_CEP;
$emitente->cPais = $nfe->em_cPais;
$emitente->xPais = $nfe->em_xPais;
$emitente->fone = $nfe->em_fone;
baseado nos dados da nfe, monte um objeto stdclass com os dados do destinatario
$destinatario = new \stdClass();
if($nfe->destinatario){
$objDest = $nfe->destinatario;
$destinatario->xNome = $objDest->dest_xNome;
$destinatario->CNPJ = $objDest->dest_CNPJ;
$destinatario->CPF = $objDest->dest_CPF;
$destinatario->idEstrangeiro= $objDest->dest_idEstrangeiro;
$destinatario->indIEDest = $objDest->dest_indIEDest;
$destinatario->IE = $objDest->dest_IE;
$destinatario->ISUF = $objDest->dest_ISUF;
$destinatario->IM = $objDest->dest_IM;
$destinatario->email = $objDest->dest_email;
$destinatario->xLgr = $objDest->dest_xLgr;
$destinatario->nro = $objDest->dest_nro;
$destinatario->xCpl = $objDest->dest_xCpl;
$destinatario->xBairro = $objDest->dest_xBairro;
$destinatario->cMun = $objDest->dest_cMun;
$destinatario->xMun = $objDest->dest_xMun;
$destinatario->UF = $objDest->dest_UF;
$destinatario->CEP = $objDest->dest_CEP;
$destinatario->cPais = $objDest->dest_cPais;
$destinatario->xPais = $objDest->dest_xPais;
$destinatario->fone = $objDest->dest_fone;
}
baseado nos dados dos itens da nota faça um loop para ler todos os itens
$itens = array();
if(count($nfe->itens) > 0){
foreach($nfe->itens as $item){
}
}
Dentro do loop dos itens, crie um objeto stdclass com os dados do produto
$produto = new \stdClass();
$produto->item = $item->numero_item;
$produto->cProd = $item->cProd;
$produto->cEAN = $item->cEAN;
$produto->xProd = $item->xProd;
$produto->NCM = $item->NCM;
$produto->cBenef = $item->cBenef;
$produto->EXTIPI = $item->EXTIPI;
$produto->CFOP = $item->CFOP;
$produto->CEST = $item->CEST;
$produto->uCom = $item->uCom;
$produto->qCom = $item->qCom;
$produto->vUnCom = $item->vUnCom;
$produto->vProd = $item->vProd;
$produto->cEANTrib = $item->cEANTrib;
$produto->uTrib = $item->uTrib;
$produto->qTrib = $item->qTrib;
$produto->vUnTrib = $item->vUnTrib;
$produto->vFrete = $item->vFrete;
$produto->vSeg = $item->vSeg;
$produto->vDesc = $item->vDesc;
$produto->vOutro = $item->vOutro;
$produto->indTot = $item->indTot;
$produto->xPed = $item->xPed;
$produto->nItemPed = $item->nItemPed;
$produto->nFCI = $item->nFCI;
$produto->vTotTrib = $item->vTotTrib;
Dentro do loop dos itens, crie um objeto stdclass com os dados do ICMS
$icms = new \stdClass();
$icms->item = $item->numero_item; //item da NFe
$icms->orig = $item->orig;
$icms->CST = $item->cstICMS;
$icms->modBC = $item->modBC;
$icms->pRedBC = $item->pRedBC;
$icms->vBC = $item->vBCICMS;
$icms->pICMS = $item->pICMS;
$icms->vICMS = $item->vICMS;
$icms->modBCST = $item->modBCST;
$icms->vBCST = $item->vBCST;
$icms->valor_pauta = $item->valor_pauta ;
$icms->qtde_produto_pauta= $item->qtde_pauta;
$icms->pMVAST = $item->pMVAST;
$icms->pRedBCST = $item->pRedBCST;
$icms->pICMSST = $item->pICMSST;
$icms->vICMSST = $item->vICMSST;
$icms->pBCop = $item->pBCOp;
$icms->UFST = $item->UFST;
$icms->vBCSTRet = $item->vBCSTRet;
$icms->vICMSSTRet = $item->vICMSSTRet;
$icms->vBCSTDest = $item->vBCSTDest;
$icms->vICMSSTDest = $item->vICMSSTDest;
$icms->vBCFCPSTRet = $item->vBCFCPSTRet; //incluso no layout 4.00
$icms->pFCPSTRet = $item->pFCPSTRet; //incluso no layout 4.00
$icms->vFCPSTRet = $item->vFCPSTRet; //incluso no layout 4.00
$icms->pRedBCEfet = $item->pRedBCEfet;
$icms->vBCEfet = $item->vBCEfet;
$icms->pICMSEfet = $item->pICMSEfet;
$icms->vICMSEfet = $item->vICMSEfet;
$icms->vICMSSubstituto = $item->vICMSSubstituto;
$icms->motDesICMS = $item->motDesICMS;
$icms->vICMSDeson = $item->vICMSDeson;
$icms->pCredSN = $item->pCredSN;
$icms->vCredICMSSN = $item->vCredICMSSN;
$icms->pDif = $item->pDifal ;
$icms->vBCFCP = $item->vBCFCP;
$icms->pFCP = $item->pFCP;
$icms->vFCP = $item->vFCP;
$icms->vFCPST = $item->vFCPST; //incluso no layout 4.00
$icms->pST = $item->pST;
$icms->vBCFCPST = $item->vBCFCPST; //incluso no layout 4.00
$icms->pFCPST = $item->pFCPST; //incluso no layout 4.00
Dentro do loop dos itens, crie um objeto stdclass com os dados do ipi
$ipi = new \stdClass();
$ipi->item = $item->numero_item; //item da NFe
$ipi->clEnq = $item->clEnq;
$ipi->CNPJProd = $item->CNPJProd;
$ipi->cSelo = $item->cSelo;
$ipi->qSelo = $item->qSelo;
$ipi->cEnq = $item->cEnq;
$ipi->CST = $item->cstIPI;
$ipi->vIPI = $item->vIPI;
$ipi->vBC = $item->vBCIPI;
$ipi->pIPI = $item->pIPI;
$ipi->qUnid = $item->qUnidIPI;
$ipi->vUnid = $item->vUnidIPI;
$ipi->tipo_calculo = $item->tipo_calc_ipi;
Dentro do loop dos itens, crie um objeto stdclass com os dados do pis
$pis = new \stdClass();
$pis->item = $item->numero_item; //item da NFe
$pis->CST = $item->cstPIS;
$pis->vBC = $item->vBCPIS;
$pis->pPIS = $item->pPIS;
$pis->vPIS = $item->vPIS;
$pis->qBCProd = $item->qBCProdPis;
$pis->vAliqProd = $item->vAliqProd_pis;
Dentro do loop dos itens, crie um objeto stdclass com os dados do cofins
$cofins = new \stdClass();
$cofins->item = $item->numero_item; //item da NFe
$cofins->CST = $item->cstCOFINS;
$cofins->vBC = $item->vBCCOFINS;
$cofins->pCOFINS = $item->pCOFINS;
$cofins->vCOFINS = $item->vCOFINS;
$cofins->qBCProd = $item->qBCProdConfis;
$cofins->vAliqProd = $item->vAliqProd_cofins;
crie um objeto do tipo stdclass chamado transporte, a qual deverá receber os campos: transportadora, retencao, veiculo, reboque e volume de acordo com os dados da nFE
$transporte = new stdClass;
crie um objeto do tipo stdClass chamado transportadora e receba os dados de acordo com a nfe e caso os campos xNome ou CNPJ forem diferentes de nulo atribua o objeto transportadora ao objeto transporte
//Transporte
$transportadora = new stdClass;
$transportadora->xNome = $nfe->transp_xNome ;
$transportadora->IE = $nfe->transp_IE;
$transportadora->xEnder = $nfe->transp_xEnder;
$transportadora->xMun = $nfe->transp_xMun;
$transportadora->UF = $nfe->transp_UF;
$transportadora->CNPJ = $nfe->transp_CNPJ;
if($transportadora->xNome!=null || $transportadora->CNPJ!=null){
$transporte->transportadora = $transportadora;
}
crie um objeto do tipo stdClass chamado retencaoe receba os dados de acordo com a nfe e caso os campos vServ, pICMSRet, CFOP forem diferentes de nulo atribua o objeto retencao ao objeto transporte
//Retenção
$retencao = new stdClass;
$retencao->vServ = $nfe->transp_ret_vServ;
$retencao->vBCRet = $nfe->transp_ret_vBCRet;
$retencao->pICMSRet = $nfe->transp_ret_pICMSRet;
$retencao->vICMSRet = $nfe->transp_ret_vICMSRet;
$retencao->CFOP = $nfe->transp_ret_CFOP;
$retencao->cMunFG = $nfe->transp_ret_cMunFG;
if($retencao->vServ!=null || $retencao->pICMSRet!=null || $retencao->CFOP!=null){
$transporte->retencao = $retencao;
}
crie um objeto do tipo stdClass chamado veiculo e receba os dados de acordo com a nfe e caso os campos placa, UF forem diferentes de nulo atribua o objeto veiculo ao objeto transporte
//Veículo
$veiculo = new stdClass;
$veiculo->placa = $nfe->transp_veic_placa;
$veiculo->UF = $nfe->transp_veic_UF;
$veiculo->RNTC = $nfe->transp_veic_RNTC;
if($veiculo->placa!=null || $veiculo->UF!=null ){
$transporte->veiculo = $veiculo;
}
crie um objeto do tipo stdClass chamado reboque e receba os dados de acordo com a nfe e caso os campos placa, UF, vagao, balsa, reboque forem diferentes de nulo atribua o objeto reboque ao objeto transporte
//Reboque
$reboque = new stdClass;
$reboque->placa = $nfe->transp_reboque_placa;
$reboque->UF = $nfe->transp_reboque_UF;
$reboque->RNTC = $nfe->transp_reboque_RNTC;
$reboque->vagao = $nfe->transp_vagao;
$reboque->balsa = $nfe->transp_balsa;
if($reboque->placa!=null || $reboque->UF!=null || $reboque->vagao!=null || $reboque->balsa!=null){
$transporte->reboque = $reboque;
}
crie um objeto do tipo stdClass chamado volume e receba os dados de acordo com a nfe e caso os campos qVol, esp, pesoL, pesoB , nLacre forem diferentes de nulo atribua o objeto volume ao objeto transporte
$volume = new stdClass;
$volume->qVol = $nfe->qVol;
$volume->esp = $nfe->esp;
$volume->marca = $nfe->marca;
$volume->nVol = $nfe->nVol;
$volume->pesoL = $nfe->pesoL;
$volume->pesoB = $nfe->pesoB;
$volume->nLacre = $nfe->nLacre;
if($volume->qVol!=null || $volume->esp!=null || $volume->pesoL !=null || $volume->pesoB !=null || $volume->nLacre !=null){
$transporte->volume = $volume;
}
baseado nos dados da nfe, monte um objeto stclass com os dados do total
$total = new stdClass;
$total->vBC = $nfe->vBC;
$total->vICMS = $nfe->vICMS;
$total->vICMSDeson= $nfe->vICMSDeson;
$total->vFCP = $nfe->vFCP; //incluso no layout 4.00
$total->vBCST = $nfe->vBCST;
$total->vST = $nfe->vST;
$total->vFCPST = $nfe->vFCPST; //incluso no layout 4.00
$total->vFCPSTRet = $nfe->vFCPSTRet; //incluso no layout 4.00
$total->vProd = $nfe->vProd;
$total->vFrete = $nfe->vFrete;
$total->vSeg = $nfe->vSeg;
$total->vDesc = $nfe->vDesc;
$total->vII = $nfe->vII;
$total->vIPI = $nfe->vIPI;
$total->vIPIDevol = $nfe->vIPIDevol; //incluso no layout 4.00
$total->vPIS = $nfe->vPIS;
$total->vCOFINS = $nfe->vCOFINS;
$total->vOutro = $nfe->vOutro;
$total->vNF = $nfe->vNF;
$total->vTotTrib = $nfe->vTotTrib;
faça uma leitura dos tipos de pagamentos existentes no nfeDuplicata e de acordo com os dados monte o array pagamentos com os indices detalhes e cartao
//Definindo o pagamento
$formas = NfeDuplicata::where("nfe_id", $nfe->id)->select(NfeDuplicata::raw('DISTINCT tPag, SUM(vDup) as soma'))->groupBy('tPag')->get();
$pagamentos = array();
foreach($formas as $f){
$detalhe = new stdClass;
$detalhe->indPag = null;
$detalhe->tPag = $f->tPag;
$detalhe->vPag = $f->soma;
$pagamentos[] = array(
"detalhe" =>$detalhe,
"cartao" =>null
);
}
crie um objeto do tipo stdclass chamado cobrancao, a qual deverá receber os campos: fatura e duplicatas de acordo com os dados da nFE
$cobranca = new stdClass;
crie um objeto do tipo stdClass chamado fatura e receba os dados de acordo com a nfe em seguida atribua o objeto fatura ao objeto cobranca
$fatura = new stdClass;
$fatura->nFat = $nfe->nFat;
$fatura->vOrig = $nfe->vOrig;
$fatura->vDesc = $nfe->vDesc;
$fatura->vLiq = $nfe->vLiq;
$cobranca->fatura = $fatura;
crie um array chamado duplicatas e faça um loop para ler todos todas as nfeduplicatas ao final atribua o array duplicatas ao objeto cobreanca
$dups = NfeDuplicata::where("nfe_id", $nfe->id)->get();
$duplicatas = array();
foreach($dups as $dup){
$duplicata = new stdClass;
$duplicata->nDup = $dup->nDup;
$duplicata->dVenc = $dup->dVenc;
$duplicata->vDup = $dup->vDup;
$duplicatas[] = $duplicata;
}
$cobranca->duplicatas = $duplicatas;
crie um array chamado autorizados e atribua a ele as pessoas autorizadas emitir a nota de acordo com os dados da nfe
$autorizados = array();
if($nfe->autorizados){
foreach($nfe->autorizados as $autorizado){
$aut = new \stdClass();
$aut->CNPJ = null;
$aut->CPF = null;
$cnpj = ($autorizado->aut_cnpj) ? tira_mascara($autorizado->aut_cnpj) : null;
if(strlen($cnpj) == 14){
$aut->CNPJ = $cnpj;
}else{
$aut->CPF = $cnpj;
}
$autorizados[] = $aut;
}
}
Crie um array chamado referenciados, o qual deverá todos as notas referenciadas de acordo com a nfe
$referenciados = array();
if($nfe->referenciados){
foreach($nfe->referenciados as $ref){
$referenciado = new \stdClass();
$referenciado->tipo_nota_referenciada = $ref->tipo_nota_referenciada;
$referenciado->ref_NFe= $ref->ref_NFe;
$referenciado->ref_ano_mes = $ref->ref_ano_mes ;
$referenciado->ref_num_nf = $ref->ref_num_nf ;
$referenciado->ref_serie = $ref->ref_serie ;
$referenciados[] = $referenciado;
}
}
crie um objeto do tipo stdclass chamado notafiscal, o qual deverá receber como campos: nota, nota, destinatario, itens, transporte, pagamentos, autorizados, referenciados, total
$notafiscal = new stdClass;
$notafiscal->nota = $nota;
$notafiscal->ide = $nota
$notafiscal->emitente = $emitente;
$notafiscal->destinatario= $destinatario;
if(count($itens)>0){
$notafiscal->itens = $itens;
}
$notafiscal->transporte = $transporte;
$notafiscal->pagamentos = $pagamentos;
$notafiscal->cobranca = $cobranca;
$notafiscal->autorizados = $autorizados;
$notafiscal->referenciados = $referenciados;
$notafiscal->total = $total;
return $notafiscal;