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

A quantidade do produto


Frank K Hosaka

Pergunta

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=(new Conn)->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=(new Conn)->select("marg from tbprod where codprod=$codprod")[0];
        $venda=pvenda($custoAtual,$previa->marg);
        $class="class=text-end";
        (new Conn)->update("tbnf set custoanterior=$custoAtual,
            class='$class' where codprod=$codprod");
        return (new Conn)->update("tbprod set custo=$custoAtual, 
            venda=$venda where codprod = $codprod");
    }
    

    function incluir(){
        $lcto=$_POST['lcto'];
        $verifica=count((new Conn)->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=(new Conn)->select("dia from tbdiario where lcto=$lcto")[0]->dia;
        $matriz=(new Conn)->select("* from tbnf");
        foreach($matriz as $vetor){
            (new Conn)->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=(new Conn)->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\"";
        }
        (new Conn)->update("tbnf set class='$novoClass', custoatual=$custoAtual,
            qt=$qt where id=$id");
        return $this->atualiza();
    }

    function selecionada(){
        (new Conn)->delete("tbnf");
        (new Conn)->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 = (new Conn)->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 = (new Conn)->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 = (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\"";
                }
            } 
            (new Conn)->insert("tbnf (codforn,codprod,prod,qt,custoatual,custoanterior,class,custototal,codp) 
                values ($codforn,$codprod,'$produto',$quantidade,$custoAtual,$custoAnterior,'$class',$valorTotal,$codp)");
        }
        $previa=(new Conn)->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>
<div class=mb-3>
<form method=post enctype="multipart/form-data" action="?NF.selecionada">
    <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>

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=new XMLHttpRequest()
            url = "?NF.custo"
            formData = new FormData()
            formData.append('custoAtual',custoAtual)
            formData.append('codprod',codprod)
            xmlhttp.open("POST",url,true)
            xmlhttp.send(formData)
            location.replace('?NF.atualiza')
        }
    }
</script>
<table class='table table-striped table-sm'>
<tr class=fw-semibold><td colspan=3>NF <?=$nNF." ".substr($xNome,0,4)." codp ".$codp?><td><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; ?>
</table>
<table class="table table-striped table-sm">
    <th style="max-width:50px">Cforn
    <th style="width:50px">
    <th style="width:360px">Produto
    <th class=text-end>Qt
    <th class=text-end>Custo
    <th class=text-end>Total
<?php foreach($previa as $p): ?>
    <tr><td style="max-width:50px" class=text-end><?=$p->codforn?>
        <td style="max-width:50px" class=text-end><?=$p->codprod?>
        <td style="max-width:360px" class="overflow-hidden" ><?=$p->prod?>
        <td>
            <form method=post action=?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)?>
        <td class=text-end><?=dec($p->custototal)?>
<?php endforeach; ?>
<tr class=fw-semibold><td><td><td>Total dos itens<td><td></td><td class=text-end><?=dec($soma)?>
</table>
<div>
Enviar tudo para o banco de dados
<form action=?NF.incluir method=post>
    <input name=lcto placeholder="Número do Lançamento" required>
    <input type=submit>
</form>
</div>

 

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

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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,5k
×
×
  • Criar Novo...