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