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=newXMLHttpRequest()
url ="nota_bd.php"
formData =newFormData()
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 =newDOMDocument();
$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];}?><trclass=fw-semibold><td><td><td>Total dos itens<td><tdclass=text-end><?=dec($soma)?></table><divclass="w-50 m-auto">
Enviar tudo para o banco de dados
<formaction=nota_bdmethod=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
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.
Link para o comentário
Compartilhar em outros sites
0 respostass 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.