New home
This blog has a new home. Please update bookmarks and feeds to https://asfernandes.github.io
This blog has a new home. Please update bookmarks and feeds to https://asfernandes.github.io
Na Nota Técnica 2014/002 da Nota Fiscal Eletrônica, o governo brasileiro do PT, por falta do que fazer com o intuito de evoluir o sistema, substituiu o web service de consulta de NF-e emitidas por terceiros pelo web service de distribuição de documentos fiscais.
Definiram que a partir de 06/10/2014 o novo web service já estaria funcionando no ambiente de produção, enquanto o antigo seria desativado em 02/02/2015. Estava tentando há duas semanas usar o novo web service e ele ainda não funcionava. Hoje consegui.
O web service retornou resposta, mas é claro, resposta errada que não é validada pelo próprio schema distribuído por eles. Como uso Java com JAXB, após desativar a validação da resposta, o conteúdo do arquivo não estava sendo "desserializado" corretamente.
Eles criaram uma tag DocZip que armazena um XML compactado com GZIP no formato BASE-64 e declararam o conteúdo da tag como se tivesse um documento XML. É óbvio que algo em BASE-64 não é um XML válido.
Como o governo incompetente não testa o que faz, tive que corrigir o schema e estou disponibilizando para que outros também não percam tempo. Mesmo sem saber escrever schemas XML, cheguei nessa dúvida que me ajudou a fazer a correção.
Link para o arquivo retDistDFeInt_v1.00.xsd corrigido
Link para o diff/patch contra o arquivo XSD original
Edit:
Se tem uma coisa pior que incompetência que acontece com muita frequência na Receita Federal do PT ultimamente é a sacanagem. Após escrever esse artigo, mandei a mesma informação através do Fale Conosco, e antes mesmo de obter resposta (geralmente é um robô que responde algo sem sentido), desconfiei de uma coisa e fui verificar.
A Receita Federal, na tentativa de esconder seus erros, costuma lançar correções de arquivos e disponibilizá-los com o mesmo número de versão. E não é que aconteceu exatamente isso agora?
Tenho o arquivo PL_NFeDistDFe_100.zip com data de 07/01/2015 que tinha o problema. O arquivo presente nesta página nesse momento tem o mesmo nome e diz que foi atualizado em 19/09/2014, porém ele já está corrigido!
Sometimes C++ still surprises me. Consider this code:
namespace ns1
{
    class C1
    {
    };
    void f1(const C1&)
    {
    }
}
int main()
{
    ns1::C1 c1;
    f1(c1);
    return 0;
}
If you think it's wrong and causes a compiler error, you're wrong.
The function "f1" is not in the scope of "main", but its argument has a type of the same namespace, causing the function to be located.
This rule is called Argument-dependent name lookup (or Koenig lookup) and it is also very necessary in relation to operators.
Na parte de expressões SQL, o Firebird 2.5 acrescenta melhorias e novidades. A função agregada LIST (presente desde a versão 2.1) agora aceita qualquer expressão em seu segundo parâmetro, onde o desenvolvedor pode especificar a string de separação dos elementos retornados. Até a versão 2.1.3 era possível apenas o uso de strings constantes nesse parâmetro. Nota: a versão 2.1.4 também deve ser liberada com esta novidade. A listagem 10 mostra a utilidade deste parâmetro, principalmente no desenvolvimento de relatórios, agrupando várias mensagens referentes a um documento em um mesmo registro e mostrando cada mensagem em uma linha.
Listagem 10. Usando a função LIST com expressões no segundo parâmetro.
| 
Operador | 
Descrição | 
| 
X{2} | 
Duas ocorrências de X. | 
| 
X{2,} | 
Duas ou mais ocorrências de X. | 
| 
X{4,6} | 
De quatro a seis ocorrências de X. | 
| 
X? | 
Zero ou uma ocorrência de X. | 
| 
X* | 
Zero ou mais ocorrências de X. | 
| 
X+ | 
Uma ou mais ocorrências de X. | 
| 
X|Y | 
X ou Y. | 
| 
_ | 
Qualquer caractere - como no LIKE. | 
| 
% | 
Qualquer sequência de caracteres - como no LIKE. | 
| 
(X) | 
Agrupa X para ser tratado pelo operador subsequente. | 
| 
[XYZ] | 
Qualquer caractere igual a X, Y ou Z. | 
| 
[^XYZ] | 
Qualquer caractere diferente de X, Y ou Z. | 
| 
[X-Z] | 
Qualquer caractere entre X e Z. | 
| 
[[:CLASSE:]] | 
Qualquer caractere de uma certa classe, conforme tabela 2. | 
| 
Classe | 
Descrição | 
| 
ALPHA | 
Qualquer caractere entre A e Z. | 
| 
UPPER | 
Qualquer caractere maiúsculo. | 
| 
LOWER | 
Qualquer caractere minúsculo. | 
| 
DIGIT | 
Dígitos de 0 a 9. | 
| 
SPACE | 
Espaço: caractere (ASCII_CHAR) 32. | 
| 
WHITESPACE | 
Todo tipo de espaço: caracteres 9, 10, 11, 12, 13 e 32. | 
Além do comando CREATE COLLATION, mostrado na seção anterior, o Firebird 2.5 acrescenta comandos DDL que aliviam limitações anteriores e outros comandos totalmente novos. Duas limitações existentes nas versões anteriores eram relacionadas à impossibilidade de alteração de colunas COMPUTED BY e views. Era preciso eliminar estes objetos e recriá-los com as alterações. O problema é que o Firebird não permite que um objeto seja eliminado quando este está sendo usado por outro objeto. Algumas ferramentas (como o Flamerobin, por exemplo) geram scripts para eliminar e recriar objetos durante a alteração de um objeto que não era permitida, porém esta não é a solução ideal.