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

CFOP


Frank K Hosaka

Pergunta

Semana passada a Bling me orientou que existe no menu de configurações a rotina para Nota Fiscal > Natureza da Operação, onde podem ser definidas as regras de tributação, e assim definir uma CFOP para cada produto de acordo com a NCM.

O MySQL me informou que eu tenho atualmente 256 NCM dentro da tbprod, o problema é saber quem tem substituição tributária e quem não tem.

A Secretaria da Fazenda tem o regulamento do ICMS bem como planilhas que definem os produtos que tem substituição tributária, mas aquilo é bem difícil de entender e trabalhar.

A minha saída é olhar cada nota fiscal do fornecedor e corrigir o banco de dados.

Na tbprod eu criei o campo string cfop, e defini para todas elas 5405. A seguir criei uma rotina em PHP para olhar a nota do fornecedor no formato xml, comparar os dados com a tbprod, e assim corrigir o que for  necessário:

arquivo nf.php
<?php

class NF {

    function CFOP() { return view('nfArquivo',['action'=>'?NF.CFOPselecionado']); }

    function CFOPatualizar() {
        $cfop = $_POST['cfop'];
        $codprod = $_POST['codprod'];
        (new Conn)->update("tbprod set cfop='$cfop' where codprod = $codprod");
    }

    function CFOPselecionado() {
        (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;
        $nNF = (float)$nfe->NFe->infNFe->ide->nNF;
        $xNome = (string)$nfe->NFe->infNFe->emit->xNome;
        $nome = explode(" ", $xNome)[0];        
        $codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp;
        foreach ($itens as $item){
            // no campo codforn uso a primeira letra para identificar o fornecedor
            $codforn = (string)$item->prod->cProd;
            $criterio= strtolower($nome[0].$codforn);
            $consulta = (new Conn)->select("* from tbprod where codforn like '%$criterio%' ");
            $codprod = 'null';
            if (count($consulta) == 1) {
                $codprod = $consulta[0]->codprod;
            } 
            if (count($consulta) > 1) {
                $consulta2 = (new Conn)->select("* from tbprod where codforn like '%$criterio' ");
                if(count($consulta2) == 1){
                    $codprod = $consulta2[0]->codprod;
                } else {
                    echo "existem vários produtos com codforn com o critério $criterio";
                    foreach($consulta as $c) {
                        echo "<br>".$c->codprod." ".$c->prod;
                    }
                    exit;
                }
            }
            if (count($consulta)==0) {
                echo "nenhum produto encontrado com o critério $criterio";
                exit;
            }
            $produto = substr((string)$item->prod->xProd,0,79);
            $cfop = (string)$item->prod->CFOP;
            if($cfop==6101 || $cfop==6102 || $cfop==5101) {
                $cfop=5102;
            }
            if($cfop==6401 || $cfop==6402 || $cfop==5401) {
                $cfop=5405;
            } 
            $class=($cfop == $consulta[0]->cfop) ? "w-[50px] text-right" : 
                "w-[50px] text-red-500 text-right";
            $ncm = (string)$item->prod->NCM;
            $class2=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" : 
                "w-[100px] text-red-500 text-right";
            (new Conn)->insert("tbnf (codforn,codprod,prod,cfop,codp,ncm,class,class2) 
                values ($codforn,$codprod,'$produto','$cfop',$codp,'$ncm','$class','$class2')");
        }
        $previa=(new Conn)->select("* from tbnf");
        $_SESSION['vetor']=['nNF' => $nNF,'xNome' => $xNome,
            'codp' => $codp];
        return view('nfCFOPView',['previa'=>$previa,'nNF' => $nNF,'xNome' => $xNome,
            'codp' => $codp]);
    }
}

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="<?=$action?>">
    <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 nfCFOPview.php
<?php include('menuView.php'); ?>
<script>
    btMenu.innerHTML='NF Fornecedor CFOP';document.title="NF Fornecedor CFOP"
    function atualizar(cfop, codprod) {
        var xmlhttp = new XMLHttpRequest();
        var url = "?NF.CFOPatualizar";
        var formData = new FormData();
        formData.append('cfop', cfop);
        formData.append('codprod', codprod);

        xmlhttp.open("POST", url, true);
        
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                console.log("Estado da requisição: " + xmlhttp.readyState);
                if (xmlhttp.status == 200) {
                    location.reload();
                } else {
                    alert("Erro na requisição: " + xmlhttp.status);
                }
            }
        }; 
        xmlhttp.send(formData);
    }
</script>
<div class="flex">
    <div class="w-[50px] text-right">Cforn</div>
    <div class="w-[50px] text-right">Cod</div>
    <div class="w-[448px] ml-2">Produto</div>
    <div class="w-[50px] text-right">CFOP</div>
    <div class="w-[100px] text-right">NCM</div>
</div>
<?php foreach($previa as $p): ?>
    <div class="flex odd:bg-gray-200">
        <div class="w-[50px] text-right"><?=$p->codforn?></div>
        <div class="w-[50px] text-right"><?=$p->codprod?></div>
        <div class="w-[448px] ml-2 truncate"><?=$p->prod?></div>
        <div class="<?=$p->class?>" onclick="atualizar(<?=$p->cfop?>,<?=$p->codprod?>)">
            <?=$p->cfop?>
        </div>
        <div class="<?=$p->class2?>"><?=$p->ncm?></div>
    </div>
<?php endforeach; ?>

 

Captura de tela 2025-01-16 114201.png

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