Página 3 de 4

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 15:08
por JoséQuintas
Esse convênio 60/2017 é exatamente o texto que eu postei numa mensagem anterior.
Será que a Fazenda está lendo o fórum PCToledo e viu minha mensagem? kkkkk
cest2.png

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 15:13
por Jairo Maia
José, mas estou achando que neste século essa coisa ainda passa a ser obrigatória.

Tente se puder adaptar seu utilitário ao site do convênio 52 de 7 de Abril. O utilitário que postei acima é funcional para identificar o CEST, tudo bem. Eu também extraí a tabela pelo html do site da SEFAZ, mas acabei de pegar um erro: o CEST 3926.90.90 tem 4 CEST´s, e não 3 CEST´s como na minha tabela. Queria ver se conseguiria usando seu aplicativo atualizar minha tabela.

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 15:22
por JoséQuintas
Aproveitando, a título de curiosidade e fugindo um pouco do CEST.... aquilo de tabela NCM com alíquotas... acho que não dá muito certo.
Como muita gente deve saber, NBM (Nomenclatura Brasileira de Mercadorias) foi substituída depois de 1996 pelo NCM (Nomenclatura Comum do Mercosul).
Mas as leis não.

Aqui só uma parte:
nbm.png
Isso está neste endereço, em São Paulo.

https://www.confaz.fazenda.gov.br/legis ... -estaduais

Coisas do Brasil.....
Agora pergunto: alguém ainda tem o NBM de 1996 nos aplicativos?

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 15:36
por JoséQuintas
Tente se puder adaptar seu utilitário ao site do convênio 52 de 7 de Abril. O utilitário que postei acima é funcional para identificar o CEST, tudo bem. Eu também extraí a tabela pelo html do site da SEFAZ, mas acabei de pegar um erro: o CEST 3926.90.90 tem 4 CEST´s, e não 3 CEST´s como na minha tabela. Queria ver se conseguiria usando seu aplicativo atualizar minha tabela.
Atualizei, e ocorreu o mesmo problema.

O html está diferente nessa parte.
Enquanto os outros tem (BR) separando os códigos, esse usa espaço em branco e também parágrafo.
Então são 3 formatações diferentes para a mesma informação/coluna.
erro.png
Bom... elementar... quando chegar no nível da coluna, vou ter que testar as 3 formatações.
Exatamente esta parte vai precisar tratar as 3 situações:

Código: Selecionar todos

aNcm  := hb_RegExSplit( "(br)", XmlNode( cXmlColList[ 3 ], "p" ) )

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 16:18
por JoséQuintas
Esse deu mais trabalho.
cest3.png
cest4.png
Bom... o problema era a coluna de NCM, então.... criar um tratamento especial pra ela.

Código: Selecionar todos

               aNcm  := PegaNcm( cXmlColList[ 3 ] )
Já posto os fontes em seguida

Ah sim... o problema dos caracteres é porque fiz em modo console, e o modo console é em inglês e não em português.

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 16:38
por Jairo Maia
JoséQuintas escreveu:Atualizei, e ocorreu o mesmo problema.
O html está diferente nessa parte.
Enquanto os outros tem (BR) separando os códigos, esse usa espaço em branco e também parágrafo.
Putz... Que "M". Isso mesmo. Valeu a dica.
JoséQuintas escreveu:Já posto os fontes em seguida
Legal...

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 17:21
por JoséQuintas
A codepage era UTF8 mesmo, fiz a conversão do jeito antigo, ajustando um por um, testando e alterando, por isso a demora.
O próprio test.prg vai mostrando os caracteres que não reconhece ou não consegue converter.
É ir alterando o fonte, acrescentando as "novidades", até ele não mostrar nada.
test.zip
(37.65 KiB) Baixado 213 vezes
test.prg -> o que gera o fonte teste.prg
test.hbp -> gera o test.exe

teste.prg -> o fonte gerado com a tabela
ze_cest.prg -> rotina de validação e de teste
testvalida.hbp -> gera o testvalida.exe

precisa ze_miscfunc.prg e ze_xmlfunc.prg, da sefazclass

https://github.com/JoseQuintas/sefazclass

No xHarbour o FOR/EACH é mais fraco, acho que precisaria mudanças nele, pelo menos nessa rotina adicional de conversão.
E se não me engano, o CreateObject() obriga a especificar a versão em MSXML2.ServerXMLHTTP.6.0
Mas não mexo com xHarbour, nem adianta me perguntar.... rs

Nota: aqui Harbour 3.4, mingw 7.1, nenhum componente adicional, nem libcurl, nem hbssl, nem hbmysql, nada, só fontes do Harbour 3.4

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 22:52
por JoséQuintas
Por causa dos testes acabei esquecendo de uma coisa:

Pra não ter que carregar a lista toda hora, uma opção é criar uma variável estática.
Algo mais ou menos assim:

Código: Selecionar todos

FUNCTION ValidaCest()

   STATIC oCestList := {}

   IF Len( oCestList ) == 0
      oCestList := CestList()
   ENDIF
Desta forma, só vai precisar rodar a rotina de carregar o array uma única vez.
Isso se é que vai ser demorado, porque me pareceu que é rápido e nem precisaria disso.

Tabela de NCM com o CEST correspondente.

Enviado: 24 Jun 2017 07:07
por Jairo Maia
Olá José,

Cara... muito legal seu trabalho. Parabéns e obrigado. Ficou muito bom.
JoséQuintas escreveu:Pra não ter que carregar a lista toda hora, uma opção é criar uma variável estática.
Relamente é rápido mesmo, mas com a variável estática fica melhor. Embora no meu caso vou ajustar em DBF para manter a estrutura do meu sistema.

Mantive a acentuação. Alterei a codificação para PT850 e troquei a função Ajusta() por Hb_UTF8ToStr( cTxt ). Mas se quiser manter PTISO e quiser a acentuação na descrição, pode fazer (nessa ordem):

Código: Selecionar todos

cTxt := Hb_UTF8ToStr( cTxt )
cTxt := Win_AnsiToOEM( cTxt )
Agora um outro pedido: Não sei trabalhar com o FOR EACH, então queria saber como fazer para não entrar os códigos do anexo XXVI. O anexo 26 é somente para produtos vendidos porta a porta, e nele tem vários grupos inteiros que pode atrapalhar quando se trata de comércio. No html ele está assim: <p class="Subtitulo">ANEXO XXVI</p>. A partir desse ponto, pode interromper, já que abaixo são somente os demais anexos irrelevantes para nosso caso.

O CEST é definido nos anexos II a XXVI, sendo o XXVI somente para venda porta a porta e pode atrapalhar.

Editado:
Entendi esse FOR EACH. Vou fazer as alterações.

Valeu...

Tabela de NCM com o CEST correspondente.

Enviado: 24 Jun 2017 08:44
por JoséQuintas
Em todo caso:

Tem horas que é só porque consideramos difícil, que acabamos não aprendendo.

O FOR/NEXT trabalha com uma variável
Neste caso nCont

Código: Selecionar todos

FOR nCont = 1 TO 10
NEXT
o FOR/EACH também.
Neste caso oElemento, que vai representar cada elemento do array

Código: Selecionar todos

FOR EACH cElemento IN { 1, 2, 3 }
NEXT
O que confunde talvez seja usar a segunda variável, mas o FOR/NEXT também pode usar outra variável.

Código: Selecionar todos

FOR nCont = 1 TO nTotal
NEXT

Código: Selecionar todos

FOR EACH oElemento IN aValueList
NEXT
Vamos lembrar do velho arquivo BAT
Isso é um FOR/EACH

Código: Selecionar todos

FOR %%A IN ( 1 2 3 ) DO ECHO %%A
E finalmente, igual na rotina de XML

Código: Selecionar todos

FOR nCont = 1 TO AlgumCalculo()
NEXT

Código: Selecionar todos

FOR EACH cXmlCol IN AlgumCalculo()
NEXT

Tabela de NCM com o CEST correspondente.

Enviado: 24 Jun 2017 13:20
por Jairo Maia
JoséQuintas escreveu:Tem horas que é só porque consideramos difícil, que acabamos não aprendendo.
Pois é... Mas aqui foi uma coisa muito engraçada. No início eu tentei usar na migração o TRY/CATCH com o Harbour e nunca conseguia. Fiquei muito tempo tentando, e só depois que desisti descobri que para usar o TRY/CATCH com Harbour tinha que incluir o arquivo hbcompat.ch.

Por alguma razão minha mente entrou em bloqueio, e toda vez que eu via o FOR/EACH associava ao TRY/CATCH. Pode parecer engraçado, mas eu tinha esse bloqueio até agora pela manhã.

Fiz as alterações necessárias e atualizei minha tabela de CEST da forma que já vinha usando com os zeros a esquerda.

Quem quiser remover o ANEXO XXVI basta na função MAIN() do arquivo test.prg logo abaixo de cXml := DownloadFazenda() colocar:

Código: Selecionar todos

 nIniXml := Hb_At( ["Subtitulo">ANEXO I</p>], cXml )
 nFimXml := Hb_At( ["Subtitulo">ANEXO XXVI</p>], cXml )
 cXml := SubStr( cXml, nIniXml, ( nFimXml - nIniXml ) )
Não esquecer de declarar as variáveis:

Código: Selecionar todos

Local nFimXml, nIniXml
Valeu. Obrigado.

Tabela de NCM com o CEST correspondente.

Enviado: 24 Jun 2017 14:33
por JoséQuintas
Esse porta a porta confundiu.

Se é vendedor ambulante, ele não é indústria, porque teria ST?
Mesmo que indique direto da indústria para o consumidor, de uma porta até outra, também confunde aplicar ST.

Alguma conclusão sobre essa parte?

Tabela de NCM com o CEST correspondente.

Enviado: 24 Jun 2017 14:44
por JoséQuintas
Sobre a quebra pra retirar os anexos...
Como minhas funções não são rígidas quanto à formatação do xml, basta tirar a parte final, e nem precisa de variável.

Código: Selecionar todos

cXml := Substr( cXml, 1, At( [Subtitulo">ANEXO XXVI</p>], cXml ) )

Tabela de NCM com o CEST correspondente.

Enviado: 25 Jun 2017 06:33
por Jairo Maia
JoséQuintas escreveu:Esse porta a porta confundiu.

Se é vendedor ambulante, ele não é indústria, porque teria ST?
Mesmo que indique direto da indústria para o consumidor, de uma porta até outra, também confunde aplicar ST.

Alguma conclusão sobre essa parte?
Imagina as empresas, Avon, Tupperware, Jequiti por exemplo. São empresas cuja atividade principal se destina a venda por marketing direto (porta a porta), e com o agravante de boa parte dos produtos serem importados.

Nesse caso, vendas internas a essas empresas são efetuadas com ST, o anexo XXVI tem praticamente tudo que é possível vender porta a porta. No caso de importação, o ICMS é recolhido por Antecipação. Isso é para garantir a tributação diretamente as empresas, já que na maioria são vendedoras autônomas, difícil de fiscalizar.

No caso de produto nacional vendido a empresas com essa atividade: Substituição Tributária = Imposto recolhido no momento da venda pelo fabricante, com cessação de cobrança nas operações posteriores.
No caso de importação: Antecipação = Imposto recolhido pelo destinatário. Se importar, o ICMS deve ser recolhido quando o produto entra no estado destino.

Tabela de NCM com o CEST correspondente.

Enviado: 25 Jun 2017 15:43
por JoséQuintas
Correção com teste prático

Código: Selecionar todos

   // Retira anexo
   //cXml := Substr( cXml, 1, At( [VENDA DE MERCADORIAS PELO SISTEMA PORTA A PORTA], cXml ) )
   //
No commit dá pra ver exatamente a diferença

https://github.com/JoseQuintas/AllInOne ... a9877037d9