Esse código funciona, apesar do VS Code reclamar que não existe o método getElementsByTagName para a variável $item que aparece na lista. Eu concordo com o VS Code, o código está errado mesmo. O problema é que nem eu e nem ele sabemos como consertar isso. A minha tese é de que estou carregando o arquivo XML de forma errada, mas não consegui encontrar na internet nenhum tutorial para carregar o XML da NF Eletrônica. O que está na minha lista é pura improvisação.
E por falar em improvisação, eu usei o código CSS Bootstrap para avermelhar o valor de um item, quando houver divergência no custo. Mas no mundo da classe, só a classe é que sabe onde houve divergência. Como passar essa informação para o formulário do HTML? Eu fiz a seguinte gambiarra: com a classe eu injetei uma matriz no formulário, e dentro da matriz eu coloquei um vetor com o código CSS. Acho que essa é uma das melhores gambiarras que eu já fiz.
arquivo estoque.php (listagem parcial)
<?php
classEstoque{publicfunction notaCusto(){
$custoAtual = $_POST['custoAtual'];
$codprod = $_POST['codprod'];(newConn)->update("tbprod set custo=$custoAtual where codprod = $codprod");}publicfunction notaIncluir(){
$lcto=$_POST['lcto'];
$dia=(newConn)->select("dia from tbdiario where lcto=$lcto")[0]->dia;
$matriz=json_decode($_POST['matriz']);foreach($matriz as $vetor){(newConn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto)
values ($vetor->codprod,'$dia',$vetor->qt,$vetor->valorTotal,$vetor->codp,$lcto)");}return view('menuView');}publicfunction notaSeleciona(){return view('estoqueArquivo');}publicfunction notaSelecionada(){
$dom =newDOMDocument();
$dom->load($_FILES['arquivo']['tmp_name']);
$nfe = $dom->documentElement;
$itens = $nfe->getElementsByTagName('det');// Calcula diferença de alíquota do ICMS
$difAliqICMS =0;
$aliquotaInterna =0.18;foreach($itens as $item){if($item->getElementsByTagName('CFOP')->item(0)->textContent ==6102){
$vBC = $item->getElementsByTagName('vBC')->item(0)->textContent;
$vICMS = $item->getElementsByTagName('vICMS')->item(0)->textContent;
$difAliqICMS += intval(($vBC * $aliquotaInterna - $vICMS)*100)/100;}}
$vNF = $nfe->getElementsByTagName('vNF')->item(0)->textContent;
$nNF = $nfe->getElementsByTagName('nNF')->item(0)->textContent;
$xNome = $nfe->getElementsByTagName('xNome')->item(0)->textContent;
$nome = explode(" ", $xNome)[0];
$codp =(newConn)->select("codp from tbpessoa where pessoa like '$nome%'")[0]->codp;
$soma =0;
$matriz =[];foreach($itens as $item){// no campo codforn uso a primeira letra para identificar o fornecedor
$codforn = $xNome[0]. $item->getElementsByTagName('cProd')->item(0)->textContent;
$consulta =(newConn)->select("codprod from tbprod where codforn like '%$codforn%' ");
$codprod ='<spam class=text-danger>Verificar</spam>';if(count($consulta)==1){
$codprod = $consulta[0]->codprod;}
$produto = $item->getElementsByTagName('xProd')->item(0)->textContent;
$quantidade = $item->getElementsByTagName('qCom')->item(0)->textContent;if(is_numeric($codprod)){
$produtoDobrado =[506,507,508,509,510,519,1768,1770,1772];if(in_array($codprod, $produtoDobrado)){
$quantidade =2* $quantidade;}
$produtoX10 =[2192,2190];if(in_array($codprod, $produtoX10)){
$quantidade =10* $quantidade;}}
$vICMSST =($item->getElementsByTagName('vICMSST')->item(0))?
$item->getElementsByTagName('vICMSST')->item(0)->textContent :null;
$difAliqICMS =0;if($item->getElementsByTagName('CFOP')->item(0)->textContent ==6102){
$vBC = $item->getElementsByTagName('vBC')->item(0)->textContent;
$vICMS = $item->getElementsByTagName('vICMS')->item(0)->textContent;
$difAliqICMS = intval(($vBC * $aliquotaInterna - $vICMS)*100)/100;}
$vIPI =0;if($item->getElementsByTagName('vIPI')->item(0)){
$vIPI = $item->getElementsByTagName('vIPI')->item(0)->textContent;}
$vProd = $item->getElementsByTagName('vProd')->item(0)->textContent;
$valorTotal = $vProd + $vICMSST + $difAliqICMS + $vIPI;
$soma += $valorTotal;
$class ="class=text-end";if(is_numeric($codprod)){
$custoAtual = intval($valorTotal / $quantidade *100)/100;
$consulta =(newConn)->select("custo from tbprod where codprod=$codprod");
$custoAnterior = $consulta[0]->custo;if(abs($custoAnterior - $custoAtual)>0.02){
$class ="class='text-end text-danger' onclick='atualizar($custoAtual,$custoAnterior,$codprod)'";}}
$matriz[]=['codforn'=> $codforn,'codprod'=> $codprod,'prod'=>$produto,'qt'=> $quantidade,'class'=>$class,'valorTotal'=> $valorTotal,'codp'=> $codp];}return view('estoqueNota',['nNF'=> $nNF,'xNome'=> $xNome,'codp'=> $codp,'vNF'=> $vNF,'difAliqICMS'=> $difAliqICMS,'matriz'=> $matriz,'soma'=>$soma]);}}
arquivo estoqueArquivo.php
<?php require'menuView.php'?><script>btmenu.innerHTML="Nota do Fornecedor";document.title="Nota do Fornecedor"</script><divclass=mb-3><formmethod=postenctype="multipart/form-data"action="?Estoque.notaSelecionada"><labelfor=arquivoclass=form-label>Escolha o arquivo XML</label><inputtype=filename=arquivoclass=form-controlid=formfilerequiredonchange=submit()></form></div>
arquivo estoqueNota.php
<?php include 'menuView.php';?><script>
btmenu.innerHTML="Nota do Fornecedor"
document.title="Nota do Fornecedor"function atualizar(custoAtual,custoAnterior,codprod){
confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior)if(confirma){
xmlhttp=newXMLHttpRequest()
url ="?Estoque.notaCusto"
formData =newFormData()
formData.append('custoAtual',custoAtual)
formData.append('codprod',codprod)
xmlhttp.open("POST",url,true)
xmlhttp.send(formData)
location.reload()}}</script><tableclass='table table-striped table-sm'><trclass=fw-semibold><td><td><td>NF <?=$nNF." ".substr($xNome,0,4)." ".$codp?><td><tdclass=text-end><?=dec($vNF)?><?php if($difAliqICMS!==0):?><trclass=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><tdclass=text-end><?=dec($difAliqICMS)?><trclass=fw-semibold><td><td><td>Total a conferir<td><tdclass=text-end><?=dec($difAliqICMS+$vNF)?><?php endif;?><trclass=fw-semibold><td>CodForn<td>CodProd<td>Produto<td>Qt<tdclass=text-end>Total
<?php foreach($matriz as $vetor):?><tr><td><?=$vetor['codforn']?><td><?=$vetor['codprod']?><td><?=substr($vetor['prod'],0,25)?><td><?=intval($vetor['qt'])?>
<td <?=$vetor['class']?>><?=dec($vetor['valorTotal'])?><?php endforeach;?><trclass=fw-semibold><td><td><td>Total dos itens<td><tdclass=text-end><?=dec($soma)?></table><div>
Enviar tudo para o banco de dados
<formaction=?Estoque.notaIncluirmethod=post><inputname=lctoplaceholder="Número do Lançamento"required>
<input type=hidden name=matriz value='<?=json_encode($matriz)?>'>
<inputtype=submit></form></div>
Pergunta
Frank K Hosaka
A Gemini recomendou usar o DOMXPath junto com o DOMDocument do PHP, mas eu não consegui nada.
Por enquanto, vou usando:
$dom = new DOMDocument(); $dom->load($_FILES['arquivo']['tmp_name']); $nfe = $dom->documentElement; $itens = $nfe->getElementsByTagName('det'); // Calcula diferença de alíquota do ICMS $difAliqICMS = 0; $aliquotaInterna = 0.18; foreach ($itens as $item) { if ($item->getElementsByTagName('CFOP')->item(0)->textContent == 6102) { $vBC = $item->getElementsByTagName('vBC')->item(0)->textContent; $vICMS = $item->getElementsByTagName('vICMS')->item(0)->textContent; $difAliqICMS += intval(($vBC * $aliquotaInterna - $vICMS) * 100) / 100; } }
Esse código funciona, apesar do VS Code reclamar que não existe o método getElementsByTagName para a variável $item que aparece na lista. Eu concordo com o VS Code, o código está errado mesmo. O problema é que nem eu e nem ele sabemos como consertar isso. A minha tese é de que estou carregando o arquivo XML de forma errada, mas não consegui encontrar na internet nenhum tutorial para carregar o XML da NF Eletrônica. O que está na minha lista é pura improvisação.
E por falar em improvisação, eu usei o código CSS Bootstrap para avermelhar o valor de um item, quando houver divergência no custo. Mas no mundo da classe, só a classe é que sabe onde houve divergência. Como passar essa informação para o formulário do HTML? Eu fiz a seguinte gambiarra: com a classe eu injetei uma matriz no formulário, e dentro da matriz eu coloquei um vetor com o código CSS. Acho que essa é uma das melhores gambiarras que eu já fiz.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.