proximos passos - validação - regra de negócios

54 views
Skip to first unread message

Roberto Spadim

unread,
Jun 13, 2013, 6:19:31 PM6/13/13
to nfe...@googlegroups.com
Fala galera blz?
Bom agente ja ta um tempo com a versão estavel de nfe concordam?
Bom acredito que seria interessante passarmos para um proximo nivel de validação
1)Além da atual validação por schema, será interessante fazermos as validações da regra de negocios do manual da nfe
2)Após esta validação como um ultimo passo em direção a liberdade (do contador), fazermos a validação dos tributos

Bom estou pensando em fazer o seguinte para o (1)
Criar um conjunto de classes (vai ser monstro mas tamanho não é documento kkk) para validação de modelos de documentos fiscais, estas classes estarão validando baseado no EMITENTE e na DATA DE EMISSÃO (provavel SCHEMA) do documento fiscal.
Classes que vão ter por enquanto:
1) NF-e/NFC-e, Modelos 55 e 65
2) CT-e Modelo 57 (se não me engano)

Dentro de cada uma dela vai ter uma função
ValidRegraNegocios($xml,$opcoes=false)
$xml vai poder receber um arquivo, uma string de xml ou o DOM da xml
$opcoes vai ser um array que poderá ativar ou desativar algumas validações específicas

a classe vai ter que considerar que o documento ja está validado quanto ao schema, se não fizer isso vai dar erros e enfim não vamos nos preocupar, validem o schema antes... (quem sabe no futuro podemos fazer essa validação automatico, mas não é minha vontade por enquanto)

Após iniciar a função, vamos iniciar as validações das regras
Nas regras que englobam varios itens do xml, exemplo <det> que pode ter varios dets, é interessante a função ter alguma declaração do tipo:
ValidRegraXYZ_do_item($xml,$no=false,$opcoes=false)
se o nó for for false, ele vai validar todos os nós, se não vai validar somente o nó passado como parametro

retorno da função e mudança dos schemas
Como os schemas mudam, e as notas tecnicas também aparecem, é interesasnte a função restringir pela data de emissão se ela deverá ser ou não validada
O retorno da função 'mestre' estava pensando em fazer algo do tipo:
Array(
  'alertas'=> quantidade de alertas (que não criam problemas mas sujestionam erros, ou fiscalização)
  'erros' => quantidade de erros (que podem dar problema na transmissão do documento para o governo)
  'validacoes' => array(
      'nome_funcao' => array(
         'fonte' => 'Nota tecnica XYZ, de 10/10/2010'
         'numero da regra' => '1234'
         'nome da regra' => 'teste do banana de pijama'
         'inicio_vigencia' => '2012-01-01 12:12:12 GMT'
         'fim_vigencia' => '2020-01-01 12:12:12 GMT / não determinado'
         'tipo_resultado' => 'alerta / erro / ok'
         'resultado' => 'incorreto campo xxxx'
         'correcao' => 'campo xxxx deve ser igual a yyyy, ou campo xxxx não pode ser preenchido, etc'
         'funcao_correcao' => função que se chamada irá corrigir o documento, veja que aki está o pulo do gato, e provavelmente só funcionara em php 5.4 ou 5.3 pois vai ser uma função ... 'funcao_correcao' = function () { uma função ... }, e ela vai corrigir o documento xml para que fique ok, pode retornar true se teve sucesso, ou false se não for possivel corrigir
       )
   )
)
FIM do (1)

-----------------------
Para o (2)
Validar a tributação dos itens quanto a:
Emitente, Destinatário (ou Origem quando compra) - intra estadual, inter estadual, internacional, regime de operação da empresa, CFOP, CST, imposto, valores de imposto de cada item, informações externas (exemplo aliquota do simples nacional resultante dos ultimos 12 meses de faturamento)

com estas informações a função irá retornar algo do tipo:
Array(
  'alertas'=> quantidade de alertas (que não criam problemas mas sujestionam erros, ou fiscalização)
  'erros' => quantidade de erros (que irá causar 'merda' mais pra frente)
  'validacoes' => array(
      'nome_funcao' => array(
         'fonte' => 'RICMS SP - 20/12/2012'
         'numero da regra' => 'Livro XYZ, Art 123, alinea 1234, linha 1 caracter 1234'
         'nome da regra' => 'aliquota do imposto'
         'inicio_vigencia' => '2012-01-01 12:12:12 GMT'
         'fim_vigencia' => '2020-01-01 12:12:12 GMT / não determinado'
         'tipo_resultado' => 'alerta / erro / ok'
         'resultado' => 'aliquota deve ser 18%, informado 12%'
         'correcao' => 'campo xxxx deve ser igual a yyyy, ou campo xxxx não pode ser preenchido, etc'
         'funcao_correcao' => função que se chamada irá corrigir o documento, mesmo eskema da correção da validaçaõ da regra de negócios
       )
   )
)

bom, eu sei q isso é trabalho de formiga, é um graaaande trabalho e é muito bonito
no caso do (2) vai depender de contador, analistas tributários e consulta com o governo, mas no caso do (1) agente pode pegar as notas tecnicas e começar a debulhar


bom, quem está dentro ou fora disso? acredito que o melhor lugar para colocarmos é no nfephp (ou no spedphp) a questão é que se não começar, nunca vai acabar

para o (2), com certeza vamos precisar de banco de dados, sugiro um sqlite, ou algum outro que não dependa de servidor rodando pelomenos no inicio. assim não vamos nos preocupar com PDO, ou alguma classe de abstração de banco de dados por agora.


abraços
--
Roberto Spadim

Alberto Fernandes

unread,
Jun 14, 2013, 9:43:10 AM6/14/13
to nfe...@googlegroups.com
deixa eu ver se entendi, o (1) vai fazer validações do tipo, uma NFe de entrada de importações que esta sem as DI e Adições, ou NFe de entrada e item com CFOP de saída..... 

Roberto Spadim

unread,
Jun 14, 2013, 10:28:40 PM6/14/13
to nfe...@googlegroups.com
o (1) vai fazer as restrições que estão comentadas aki:
http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=33ol5hhSYZk=

no inicio mais especifico neste aki:
http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=qmxgJXfbUhs=
pagina 30 até pagina 42
4.1.9.4 Validação de regras de negócios da NF-e

depois com a nfv3 (nfce) tem algumas mudanças que são feitas para o modelo 65
e tem tbm as regras da CT-e, mas isso agente vai fazendo de poco em poco

um exemplo...
         'fonte' => "Manual de Orientacao Contribuinte v5.00",
         'numero da regra' => 'GA03'
         'nome da regra' => 'Campo ID Invalido'
         'inicio_vigencia' => '2013-05-01 03:00:00 GMT'
         'fim_vigencia' => ''
         'tipo_resultado' => 'erro'
         'resultado' => 'Chave de Acesso do campo Id difere da concatenação dos campos correspondentes'
         'resultado_codigo' => '502 - Rejeição: Erro na Chave de Acesso - Campo Id não corresponde à concatenação dos campos correspondentes',
         'correcao' => 'Recriar chave de acesso'
         'funcao_correcao' => algo que possa recriar, ou false

GA03
A03
Campo Id inválido:
– Chave de Acesso do campo Id difere da concatenação
dos campos correspondentes
Obrig. 502 Rej. Rejeição: Erro na Chave de Acesso - Campo Id não
corresponde à concatenação dos campos correspondentes


a questão é... tem gente disponivel pra ir implementando?
a primeiro momento escrever todas as restrições em forma de array
depois começamos a fazer as restriçoes, acredito que podemos começar pelo ultimo manual, os anteriores são de menos... com o tempo vamo fazendo eles
Reply all
Reply to author
Forward
0 new messages