Jump to content
Fórum Script Brasil
  • 0

A Nota Fiscal do fornecedor


Frank K Hosaka

Question

O seguinte código importa um arquivo xml, calcula o valor do produto como a soma do seu valor com o ICMS-ST, IPI e diferença de alíquota do ICMS, se houverem. Se ele não encontrar o código do produto correspondente ao do fornecedor, ele dispara um alerta 'Verificar'. Se houver diferença entre o custo anterior com o custo atual, ele avermelha o total do item, por onde o usuário pode atualizar o custo do produto, se assim desejar. Finalmente, o programa pede um número de lançamento para que ele possa encaminhar tudo para o banco de dados. Como esse programa é gratuito, não aceito reclamações. Mas se funcionar, eu aceito qualquer valor pelo pix frankhosaka@gmail.com.

arquivo nota_bd.php
<?php
$mysqli=new mysqli("localhost","root","","diario");
if(isset($_POST['custoAtual'])){
    $custoAtual=$_POST['custoAtual'];
    $codprod=$_POST['codprod'];
    $mysqli->query("update tbprod set custo=$custoAtual where codprod = $codprod");
}
if(isset($_POST['lcto'])){
    $lcto=$_POST['lcto'];
    $matriz=json_decode($_POST['matriz']);
    echo "aqui fica a rotina do lançamento $lcto que vai incluir os dados: ";
    var_dump($matriz);
}

arquivo notaDoFornecedor.php
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
    rel="stylesheet">
<script>
    function atualizar(custoAtual,custoAnterior,codprod){
        confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior)
        if(confirma){
            xmlhttp=new XMLHttpRequest()
            url = "nota_bd.php"
            formData = new FormData()
            formData.append('custoAtual',custoAtual)
            formData.append('codprod',codprod)
            xmlhttp.open("POST",url,true)
            xmlhttp.send(formData)
            location.reload()
        }
    }
</script>
<form method=post class="w-50 m-auto" enctype="multipart/form-data">
    <label for=arquivo>Escolha o arquivo XML</label>
    <input type=file name=arquivo required>
    <input type=submit>
</form>
<?php
if(!isset($_FILES['arquivo'])){exit;}
$notaFornecedor=$_FILES['arquivo']['tmp_name'];

function dec($value) {
    return ($value) ? number_format($value,2,',','.') : null;
}
$mysqli=new mysqli("localhost","root","","diario");

// Carregar o arquivo XML
$dom = new DOMDocument();
$dom->load($notaFornecedor);

// Acessar os itens
$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;
    }
}

echo "<table class='table table-striped table-sm w-50 m-auto'>";
$vNF=$nfe->getElementsByTagName('vNF')->item(0)->textContent;
$nNF=$nfe->getElementsByTagName('nNF')->item(0)->textContent;
$xNome=$nfe->getElementsByTagName('xNome')->item(0)->textContent;
echo "<tr class=fw-semibold><td><td><td>NF $nNF ". substr($xNome,0,4). "<td><td class=text-end>". dec($vNF);
if($difAliqICMS!==0){
    echo "<tr class=fw-semibold><td><td><td>Diferença de Alíquota de ICMS<td><td class=text-end>" .dec($difAliqICMS);
    echo "<tr class=fw-semibold><td><td><td>Total a conferir<td><td class=text-end>" .dec($difAliqICMS+$vNF);
}
echo "<tr class=fw-semibold><td>CodForn<td>CodProd<td>Produto<td>Qt<td class=text-end>Total";

$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=$mysqli->query("select codprod from tbprod where codforn like '%$codforn%' ");
    $codprod='<spam class=text-danger>Verificar</spam>';
    if ($consulta->num_rows==1) {
        $codprod=$consulta->fetch_assoc()['codprod'];
    }
    $produto = $item->getElementsByTagName('xProd')->item(0)->textContent;
    $quantidade=$item->getElementsByTagName('qCom')->item(0)->textContent;
    if(is_numeric($codprod)){
        $produtoDobrado = [510];
        if(in_array($codprod,$produtoDobrado)){
            $quantidade = 2 * $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=$mysqli->query("select custo from tbprod where codprod=$codprod");
        $custoAnterior=$consulta->fetch_assoc()['custo'];
        if(abs($custoAnterior-$custoAtual)>0.02){
            $class="class='text-end text-danger' onclick='atualizar($custoAtual,$custoAnterior,$codprod)'";
        }
    }
    echo "<tr><td>" . $codforn;
    echo "<td>" . $codprod;
    echo "<td>" . substr($produto,0,25);
    echo "<td>" . intval($quantidade);
    echo "<td $class>" . dec($valorTotal);
    $matriz[]=['codpprod'=>$codprod,'qt'=>$quantidade,'subtotal'=>$valorTotal];
}
?>
<tr class=fw-semibold><td><td><td>Total dos itens<td><td class=text-end><?=dec($soma)?>
</table>
<div class="w-50 m-auto">
Enviar tudo para o banco de dados
<form action=nota_bd 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>

 

 

 

 

 

Captura de tela 2024-05-05 103131.png

Captura de tela 2024-05-05 103202.png

Edited by Frank K Hosaka
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.8k
×
×
  • Create New...