Página 2 de 4

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 16:59
por Jairo Maia
Legal...

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 18:44
por JoséQuintas
Voltei, vamos lá:

Não sei se é melhor deixar como está, ou completar com X.
Em branco pode parecer arquivo ruim... rs

Na hora de pesquisar NCM, vamos pesquisar:

12345678
1234567X
123456XX
12345XXX
1234XXXX
12XXXXXX

Pode confirmar na tabela CEST, que há quase todos esses casos acima, entre 2 e 7 dígitos, e vários terminam com zero.
O X representaria qualquer número naquela posição.
Desta forma, vamos conseguir pesquisar até aonde é o capítulo inteiro.

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 21:44
por JoséQuintas
O fonte gerando um fonte.... rs

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL cXml, cXmlTabela, cXmlRow, cXmlCol, cXmlColList, cCest, aNcm, cDesc, oElement, cTxt := ""

   Set( _SET_CODEPAGE, "PTISO" )
   CLS
   cXml := MemoRead( "pagina.html" )

   cTxt := [FUNCTION CestList()] + hb_Eol() + hb_Eol()
   cTxt += [   LOCAL aList := {}] + hb_Eol() + hb_Eol()
   FOR EACH cXmlTabela IN MultipleNodeToArray( cXml, "table" )
      FOR EACH cXmlRow IN MultipleNodeToArray( cXmlTabela, "tr" )
         cXmlColList := MultipleNodeToArray( cXmlRow, "td" )
         IF Len( cXmlColList ) != 1 // Titulos
            cCest := XmlNode( cXmlColList[ 2 ], "p" )
            aNcm  := hb_RegExSplit( "<br>", XmlNode( cXmlColList[ 3 ], "p" ) )
            cDesc := XmlNode( cXmlColList[ 4 ], "p" )
            FOR EACH oElement IN aNcm
               cTxt += [   Aadd( aList, { ]
               cTxt += ["] + SoNumeros( cCest ) + [", ]
               cTxt += ["] + Pad( SoNumeros( oElement ), 8, "X" ) + [", ]
               cTxt += ["] + AllTrim( StrTran( cDesc, ["], "" ) ) + [" } )]
               cTxt += hb_Eol()
            NEXT
         ENDIF
      NEXT
   NEXT
   cTxt += hb_Eol() + [   RETURN aList] + hb_Eol()
   hb_MemoWrit( "teste.prg", cTxt )

   RETURN
Funções que faltam....
Nem precisa perguntar.... só olhar o hbp

Código: Selecionar todos

test.prg
\cvsfiles\josequintas\sefazclass\ze_xmlfunc.prg
\cvsfiles\josequintas\sefazclass\ze_miscfunc.prg
O resultado:
Uma função que retorna tudo em array.

Código: Selecionar todos

FUNCTION CestList()

   LOCAL aList := {}

   Aadd( aList, { "", "XXXXXXXX", "DESCRIÇÃO" } )
   Aadd( aList, { "0100100", "38151210", "Catalisadores em colmeia cerâmica ou metálica para conversão catalítica de gases de escape de veículos e outros catalisadores" } )
   Aadd( aList, { "0100100", "38151290", "Catalisadores em colmeia cerâmica ou metálica para conversão catalítica de gases de escape de veículos e outros catalisadores" } )
 ...
   RETURN aList

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:10
por JoséQuintas
Pra completar:

Rotina pra retornar a lista para determinado NCM:

Código: Selecionar todos

FUNCTION CestFromNcm( cNcm )

   LOCAL oCest, nCont, aList := {}

   cNcm := SoNumeros( cNcm )
   IF Len( cNcm ) == 8
      FOR nCont = 8 TO 2 STEP -1
         FOR EACH oCest IN CestList()
            IF Pad( Left( cNcm, nCont ), 8, "X" ) == oCest[ 2 ]
               AAdd( aList, oCest )
            ENDIF
         NEXT
         IF Len( aList ) > 0
            EXIT
         ENDIF
      NEXT
   ENDIF

   RETURN aList
E rotina de teste:

Código: Selecionar todos

#include "inkey.ch"

FUNCTION Main()

   LOCAL cNcm := Space(8), GetList := {}, oElement, aList

   CLS
   SetMode( 30, 100 )
   DO WHILE .T.
      @ 2, 1 SAY "Código NCM a pesquisar:" GET cNcm PICTURE "@R 99.99.99.99"
      READ

      IF LastKey() == K_ESC
         EXIT
      ENDIF
      aList := CestFromNcm( cNcm )

      Scroll( 3, 0, MaxRow(), MaxCol(), 0 )
      @ 3, 0 SAY ""
      FOR EACH oElement IN aList
         @ Row() + 1, 1 SAY oElement[ 1 ] PICTURE "@R 99.99.99.99"
         @ Row(), Col() + 2 SAY oElement[ 2 ] PICTURE "@R 99.99.99.99"
         @ Row(), Col() + 2 SAY Pad( oElement[ 3 ], 60 )
      NEXT
   ENDDO

   RETURN NIL
Não serve AScan(), porque retornaria apenas um código, apesar que não sei se vai acontecer de ter mais de um.

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:16
por JoséQuintas
Ficaram pendentes 2 CEST que tem NCM em branco.

Código: Selecionar todos

   Aadd( aList, { "0199900", "        ", "Outras peças, partes e acessórios para veículos automotores não relacionados nos demais itens deste anexo" } )
   Aadd( aList, { "2899900", "        ", "Outros produtos comercializados pelo sistema de marketing direto porta-a-porta a consumidor final não relacionados em outros itens deste anexo" } )

E o programa em execução, que esqueci da codepage..... rs
ncm7.png

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:27
por fladimir
direto do site? é isso q entendi mesmo?

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:40
por JoséQuintas
No caso, como eu precisava olhar a formatação, baixei o html, mas apaguei toda parte antes e depois das tabelas.
Foi direto do html baixado, equivalente ao site, mas com esses dois blocos apagados, o inicial e o final.

Agora que salvei tudo, dá pra testar direto do site, inclusive com alguns ajustes adicionais, por exemplo dos NCM em branco, e retirando os títulos.

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:49
por JoséQuintas
Mas pera aí.... e isto?
C O N V Ê N I O
Cláusula primeira O inciso I da cláusula sexta do Convênio ICMS 92/15, de 25 de agosto de 2015, passa a vigorar com a seguinte redação:
“I - ao § 1º da cláusula terceira, a partir de:
a) 1º de julho de 2017, para a indústria e o importador;
b) 1º de outubro de 2017, para o atacadista;
c) 1ª de abril de 2018, para os demais segmentos econômicos;”.
Cláusula segunda O inciso II da cláusula trigésima sexta do Convênio ICMS 52/17, de 7 de abril de 2017, passa a vigorar com a seguinte redação:
“II - relativamente ao disposto no inciso I do caput da cláusula vigésima primeira, a partir de:
a) 1º de julho de 2017, para a indústria e o importador;
b) 1º de outubro de 2017, para o atacadista;
c) 1º de abril de 2018, para os demais segmentos econômicos;”.
Cláusula terceira Este convênio entra em vigor na data de sua publicação no Diário Oficial da União.

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 22:58
por JoséQuintas
Pronto.
Atendendo a pedidos... rs.... direto do site que contém a lei.
Direto do site para um fonte em Harbour....
ncm.png
É executar esse módulo, e depois adicionar o fonte gerado ao aplicativo, pronto para ser compilado.

Tabela de NCM com o CEST correspondente.

Enviado: 22 Jun 2017 23:16
por JoséQuintas
Só comentário:
Contando do post antes de mexer no fonte, aleração, teste, editar o print-screen, postar, alterar o post, etc.... foram 9 minutos.
Até que foi rápido.... rs

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 00:11
por fladimir
Parabéns, muito útil.

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 09:07
por gilbertosilverio
Ola Jose Quintas,

Parabéns pela sua contribuição, ficou muito fácil verificar os CEST com esta tua tabela.

So para completar, creio que o link que você usou esta desatualizado, acho que o correto e esse aqui:

https://www.confaz.fazenda.gov.br/legis ... 7/CV052_17

Estava testando aqui, e justamente uma CHUPETA (39.26.90.90) , não consta na sua matriz. Pelo que verifiquei foram includos outros itens.

Peço a gentiliza, se possível, recriar esta matriz, e postar aqui, pois tentei aqui o xhb que uso, mais não consegui gera-la, baseada na tua rotina.

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 12:35
por Jairo Maia
Olá Pessoal,

Apenas para mostrar o raciocínio que uso em meus sistemas quando está cadastrando um produto que tenha mais de um CEST para o mesmo NCM.

Para dar certo o exemplo precisa usar a tabela que postei nesse tópico (com zeros a esquerda): TabCEST

Após compilar, digite o NCM 23.0990.10, que não existe na tabela, mas existe o grupo e tem CEST: Ração tipo "pet" para animais domésticos. Então retornará o CEST do grupo 23.09 da tabela.

Depois, digite o NCM postado acima: 39.2690.90. Veja que esse NCM tem 3 CEST´s, e veja como o exemplo se comporta ao classificar o produto.

Claro que é um exemplo simples, e dependendo do NCM talvez a descrição seja truncada, pois no exemplo estou usando o Hb_Alert(), mas a ideia está bem clara, espero que ajude também.

Código: Selecionar todos

/*
  Compilar Hbmk2 exemplo.prg -lxhb
*/

#include "inkey.ch"

REQUEST DBFCDX
REQUEST HB_CODEPAGE_PT850

Function Main()
 Local cCodNcm, cCest
 
 Clear Screen
 hb_SetCodepage('PT850')
 rddSetDefault( "DBFCDX" )
 
 Do While .t.
  cCodNcm := Space( 10 )
  @ 2,2 say "Digite o código NCM com 8 dígitos:" Get cCodNcm Picture "@R 99.9999.99" Valid Len( StrTran( cCodNcm, " ", "" ) ) = 8
  Read
  
  If LastKey() = K_ESC
   Exit
  Else
   cCodNcm := Trim( cCodNcm )
  EndIf
 
  cCest := PegaCest( cCodNcm )
  If !Empty( cCest )
   Hb_Alert( "Cest retornado => " + cCest, Nil, "B+/W" )
  Else
   Hb_Alert( "Sem Cest" )
  EndIf
 
 EndDo
 
Return Nil

Function PegaCest( cCodNcm )  // pesquisa, classifica e retorna o CEST pelo NCM
 Local GetList:={}, aCests:={}, cCest, x, cCodNcmFix, nOpc, cMsg, nLen
 
 If Select( "TabCEST" ) = 0
  Use TabCEST Shared New
 EndIf
 
 If !File( "TabCEST.Cdx" )
  Index On ( ncm ) To "TabCEST.Cdx"
 Else
  Set Index To "TabCEST.Cdx"
 EndIf
 
 cCodNcmFix := cCodNcm
 
 Seek cCodNcm
 If !Found()
  For x=1 To 6
   cCodNcm := Left( cCodNcm, 7 )  // se não achou, procura pelos subgrupos e até o grupo
   cCodNcm := StrZero( Val( cCodNcm ), 8 )
   Seek cCodNcm
   If Found()
    Exit
   EndIf
  Next
 EndIf
  
 If !Found()   
  cCest := ""
  Hb_Alert( "O Ncm " + cCodNcm + " não é passível de ST.;Para esse NCM não existe CEST!", Nil, "B+/W" )
 Else

  aCests:={}
  While ( ncm = cCodNcm )
   AaDd( aCests, { cest, Trim( descricao ) } )
   Skip
  EndDo
   
  nLen := Len( aCests )
  If Len( aCests ) > 1

   For x=1 To nLen
    cMsg := "Opção => " + Hb_NToS( x ) + " de " + Hb_NToS( nLen ) + " - Código CEST => " + aCests[ x, 1 ]
    cMsg += ";O Produto sendo cadastrado se enquadra nessa Descrição?:"
    cMsg += ";;" + aCests[x,2] + ";"
    nOpc := Hb_Alert( cMsg, { "Proximo", "Classificar", "Sair" }, "B+/W" )
    If nOpc = 0 .Or. nOpc = 3
     Exit
    ElseIf nOpc = 2
     cCest := aCests[x,1]
     Hb_Alert( "Produto com NCM: " + cCodNcmFix + " Classificado com o CEST => " + aCests[x,1] + ";;" + aCests[x,2], Nil, "B+/W" )
     Exit
    EndIf
    If ( x = nLen )
     x := 0
    EndIf
   Next
    
 Else
  cCest := aCests[1,1]
  Hb_Alert( "Produto com NCM: " + cCodNcmFix + ";Produto com Somente um CEST => " + aCests[1,1] + ";;" + aCests[1,2], Nil, "B+/W" )
 EndIf
EndIf
  
 Return ( cCest )

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 14:31
por JoséQuintas
Não entendi.
No caso desse código, o resultado está ok.
Mas falta atualizar para o link que foi comentado que é mais atualizado, ainda não verifiquei.
ncm2.png

Tabela de NCM com o CEST correspondente.

Enviado: 23 Jun 2017 14:59
por JoséQuintas
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

mais um pouco.

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Acabou de chegar o aviso.
cest.png
cest.png (8.45 KiB) Exibido 4640 vezes
NT 2015.003 versão 1.94

https://www.nfe.fazenda.gov.br/portal/e ... iCiO978HY=