Imagine que você vende repolho por peça, mas o seu fornecedor vende num saco de 10 peças. Eu tive um trabalho danado para adaptar o banco de dados ao XML do fornecedor.
Imagine que apareceu outro fornecedor que vende por peça e não por saco. E assim foi o meu pesadelo no último ano.
Hoje eu tive a brilhante ideia de adaptar o XML ao banco de dados.
A ideia é pegar o XML, colocar tudo numa tabela provisória (tbnf), alterar a quantidade na unha, e depois mandar para a tabela definitiva (tbhistprod). Ele ficou assim:
arquivo NF.php
<?php
class NF{function atualiza(){
$previa=(newConn)->select("* from tbnf");
extract($_SESSION['vetor']);return view('NFview',['previa'=>$previa,'nNF'=> $nNF,'xNome'=> $xNome,'codp'=> $codp,'vNF'=> $vNF,'difAliqICMS'=> $difAliqICMS,'soma'=>$soma]);}function custo(){
$custoAtual = $_POST['custoAtual'];
$codprod = $_POST['codprod'];
$previa=(newConn)->select("marg from tbprod where codprod=$codprod")[0];
$venda=pvenda($custoAtual,$previa->marg);
$class="class=text-end";(newConn)->update("tbnf set custoanterior=$custoAtual,
class='$class' where codprod=$codprod");return(newConn)->update("tbprod set custo=$custoAtual,
venda=$venda where codprod = $codprod");}function incluir(){
$lcto=$_POST['lcto'];
$verifica=count((newConn)->select("* from tbhistprod where lcto=$lcto"));if($verifica){
$mensagem="<h1>Nota já lançada. <a href=?NF.atualiza>Voltar</a></h1>";return view('mensagemView',['mensagem'=>$mensagem]);}
$dia=(newConn)->select("dia from tbdiario where lcto=$lcto")[0]->dia;
$matriz=(newConn)->select("* from tbnf");foreach($matriz as $vetor){(newConn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto)
values ($vetor->codprod,'$dia',$vetor->qt,$vetor->custototal,$vetor->codp,$lcto)");}return header("location:?Diario.inicio.$dia");}function inicio(){return view('NFarquivo');}function qt(){
$qt=$_POST['qt'];
$id=$_POST['id'];
$previa=(newConn)->select("* from tbnf where id=$id")[0];
$novoClass=$previa->class;
$custoAtual=intval($previa->custototal/$qt*100)/100;if($custoAtual!==$previa->custoanterior){
$novoClass="class=\"text-danger text-end\"";}(newConn)->update("tbnf set class='$novoClass', custoatual=$custoAtual,
qt=$qt where id=$id");return $this->atualiza();}function selecionada(){(newConn)->delete("tbnf");(newConn)->exec("alter table tbnf auto_increment = 1");
$nfe=simplexml_load_file($_FILES['arquivo']['tmp_name']);
$itens=$nfe->NFe->infNFe->det;
$difAliqICMS=0;
$aliquotaInterna=0.18;foreach($itens as $item){if((string)$item->prod->CFOP ==6102){
$vBC =(string)$item->imposto->ICMS->ICMS10->vBC;
$vICMS =(string)$item->imposto->ICMS->ICMS10->vICMS;;
$difAliqICMS += intval(($vBC * $aliquotaInterna - $vICMS)*100)/100;}}
$vNF =(string)$nfe->NFe->infNFe->total->ICMSTot->vNF;
$nNF =(string)$nfe->NFe->infNFe->ide->nNF;
$xNome =(string)$nfe->NFe->infNFe->emit->xFant;
$nome = explode(" ", $xNome)[0];
$codp =(newConn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp;
$soma=0;foreach($itens as $item){// no campo codforn uso a primeira letra para identificar o fornecedor
$codforn =(string)$item->prod->cProd;
$criterio= $nome[0].$codforn;
$consulta =(newConn)->select("codprod from tbprod where codforn like '%$criterio%' ");
$codprod ='Verificar';if(count($consulta)==1){
$codprod = $consulta[0]->codprod;}
$produto =(string)$item->prod->xProd;
$quantidade =(string)$item->prod->qCom;if(is_numeric($codprod)){
$produtoDobrado =[506,507,508,509,510,519,1768,1770,1772];if(in_array($codprod, $produtoDobrado)){
$quantidade =2* $quantidade;}
$produtox5=[1798];if(in_array($codprod,$produtox5 )){
$quantidade =5* $quantidade;}
$produtoX10 =[2192,2190,1782,2456];if(in_array($codprod, $produtoX10)){
$quantidade =10* $quantidade;}}
$vICMSST =((string)$item->imposto->ICMS->ICMS10->vICMSST)?(string)$item->imposto->ICMS->ICMS10->vICMSST :null;
$difAliq =0;if((string)$item->prod->CFOP ==6102){
$vBC =(string)$item->imposto->ICMS->ICMS10->vBC;
$vICMS = $item->imposto->ICMS->ICMS10->vICMS;
$difAliq = intval(($vBC * $aliquotaInterna - $vICMS)*100)/100;}
$vIPI =0;if((string)$item->imposto->IPI->vIPI){
$vIPI =(string)$item->imposto->IPI->vIPI;}
$vProd =(string)$item->prod->vProd;
$valorTotal = $vProd + $vICMSST + $difAliq + $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\"";}}(newConn)->insert("tbnf (codforn,codprod,prod,qt,custoatual,custoanterior,class,custototal,codp)
values ($codforn,$codprod,'$produto',$quantidade,$custoAtual,$custoAnterior,'$class',$valorTotal,$codp)");}
$previa=(newConn)->select("* from tbnf");
$_SESSION['vetor']=['nNF'=> $nNF,'xNome'=> $xNome,'codp'=> $codp,'vNF'=> $vNF,'difAliqICMS'=> $difAliqICMS,'soma'=>$soma];return view('NFview',['previa'=>$previa,'nNF'=> $nNF,'xNome'=> $xNome,'codp'=> $codp,'vNF'=> $vNF,'difAliqICMS'=> $difAliqICMS,'soma'=>$soma]);}}
arquivo NFarquivo.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="?NF.selecionada"><labelfor=arquivoclass=form-label>Escolha o arquivo XML</label><inputtype=filename=arquivoclass=form-controlid=formfilerequiredonchange=submit()></form></div>
arquio NFView.php
<?php include('menuView.php');?><script>
btmenu.innerHTML='NF Fornecedor';document.title="NF Fornecedor"function atualizar(custoAtual,custoAnterior,codprod){
confirma=confirm("Atualizar?\ncusto atual: "+custoAtual+"\ncusto anterior: "+custoAnterior)if(confirma){
xmlhttp=newXMLHttpRequest()
url ="?NF.custo"
formData =newFormData()
formData.append('custoAtual',custoAtual)
formData.append('codprod',codprod)
xmlhttp.open("POST",url,true)
xmlhttp.send(formData)
location.replace('?NF.atualiza')}}</script><tableclass='table table-striped table-sm'><trclass=fw-semibold><tdcolspan=3>NF <?=$nNF." ".substr($xNome,0,4)." codp ".$codp?><td><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;?></table><tableclass="table table-striped table-sm"><thstyle="max-width:50px">Cforn
<thstyle="width:50px"><thstyle="width:360px">Produto
<thclass=text-end>Qt
<thclass=text-end>Custo
<thclass=text-end>Total
<?php foreach($previa as $p):?><tr><tdstyle="max-width:50px"class=text-end><?=$p->codforn?><tdstyle="max-width:50px"class=text-end><?=$p->codprod?><tdstyle="max-width:360px"class="overflow-hidden"><?=$p->prod?><td><formmethod=postaction=?NF.qt>
<input name=qt value='<?=$p->qt?>' class="inv text-end" size='1' onchange=submit()>
<input type=hidden name=id value='<?=$p->id?>'>
</form>
<td <?=$p->class?> onclick="atualizar(<?=$p->custoatual?>,<?=$p->custoanterior?>,<?=$p->codprod?>)"><?=dec($p->custoatual)?><tdclass=text-end><?=dec($p->custototal)?><?php endforeach;?><trclass=fw-semibold><td><td><td>Total dos itens<td><td></td><tdclass=text-end><?=dec($soma)?></table><div>
Enviar tudo para o banco de dados
<formaction=?NF.incluirmethod=post><inputname=lctoplaceholder="Número do Lançamento"required><inputtype=submit></form></div>
Pergunta
Frank K Hosaka
Imagine que você vende repolho por peça, mas o seu fornecedor vende num saco de 10 peças. Eu tive um trabalho danado para adaptar o banco de dados ao XML do fornecedor.
Imagine que apareceu outro fornecedor que vende por peça e não por saco. E assim foi o meu pesadelo no último ano.
Hoje eu tive a brilhante ideia de adaptar o XML ao banco de dados.
A ideia é pegar o XML, colocar tudo numa tabela provisória (tbnf), alterar a quantidade na unha, e depois mandar para a tabela definitiva (tbhistprod). Ele ficou assim:
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.