Ir para conteúdo
Fórum Script Brasil
  • 0

Classe: o xml da nota fiscal eletrônica


Frank K Hosaka

Pergunta

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.

 

arquivo estoque.php (listagem parcial)
<?php
class Estoque 
{
	public function notaCusto()
    {
        $custoAtual = $_POST['custoAtual'];
        $codprod = $_POST['codprod'];
        (new Conn)->update("tbprod set custo=$custoAtual where codprod = $codprod");
    }

    public function notaIncluir()
    {
        $lcto=$_POST['lcto'];
        $dia=(new Conn)->select("dia from tbdiario where lcto=$lcto")[0]->dia;
        $matriz=json_decode($_POST['matriz']);
        foreach($matriz as $vetor)
        {
            (new Conn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto)
                values ($vetor->codprod,'$dia',$vetor->qt,$vetor->valorTotal,$vetor->codp,$lcto)");
        }
        return view('menuView');
    }

    public function notaSeleciona()
    {
        return view('estoqueArquivo');
    }

    public function notaSelecionada()
    {
        $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;
            }
        }
        $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 = (new Conn)->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 = (new Conn)->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 = (new Conn)->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>
<div class=mb-3>
<form method=post enctype="multipart/form-data" action="?Estoque.notaSelecionada">
    <label for=arquivo class=form-label>Escolha o arquivo XML</label>
    <input type=file name=arquivo class=form-control id=formfile required onchange=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=new XMLHttpRequest()
            url = "?Estoque.notaCusto"
            formData = new FormData()
            formData.append('custoAtual',custoAtual)
            formData.append('codprod',codprod)
            xmlhttp.open("POST",url,true)
            xmlhttp.send(formData)
            location.reload()
        }
    }
</script>
<table class='table table-striped table-sm'>
<tr class=fw-semibold><td><td><td>NF <?=$nNF." ".substr($xNome,0,4)." ".$codp?><td><td class=text-end><?=dec($vNF)?>
<?php if($difAliqICMS!==0): ?>
    <tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td class=text-end><?=dec($difAliqICMS)?>
    <tr class=fw-semibold><td><td><td>Total a conferir<td><td class=text-end><?=dec($difAliqICMS+$vNF)?>
<?php endif; ?>
<tr class=fw-semibold><td>CodForn<td>CodProd<td>Produto<td>Qt<td class=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; ?>
<tr class=fw-semibold><td><td><td>Total dos itens<td><td class=text-end><?=dec($soma)?>
</table>
<div>
Enviar tudo para o banco de dados
<form action=?Estoque.notaIncluir method=post>
    <input name=lcto placeholder="Número do Lançamento" required>
    <input type=hidden name=matriz value='<?=json_encode($matriz)?>'>
    <input type=submit>
</form>
</div>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Ops, o código tem um violento erro de lógica. A variável $difAliqICMS é usado tanto para calcular o imposto de toda a nota e também para cada produto. Ao invés de editar o código aqui no fórum, prefiro deixar como um péssimo exemplo de programação. Só consegui ver esse erro porque o código original misturava PHP com HTML, e agora decidi separar os dois recursos.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...