Considerando a seguinte regra do registro C181 (Página 96 do Guia Prático do EFD 2023)
Campo 02 (COD_MOT_REST_COMPL) - Validação: o valor informado deve estar de acordo com a tabela 5.7 publicada pela UF do informante do arquivo com o terceiro caractere for igual a 5, 6, 7 ou 8. Para os campos de valores unitários não obrigatórios, se o terceiro caractere do código preenchido no campo “COD_MOT_REST_COMPL” for:
a) igual a 5, os campos 13, 14 e 15 devem ser preenchidos e os campos 16 a 21 não devem ser preenchidos.
b) igual a 6, os campos 13, 14, 15, 16, 20 e 21 devem ser preenchidos e os campos 17, 18 e 19 não devem ser preenchidos.
c) igual a 7, os campos 13, 14, 15, 17, 20 e 21 devem ser preenchidos e os campos 18 e 19 não devem ser preenchidos.
d) igual a 8, os campos 13, 14, 15, 16, 18 e 19 devem ser preenchidos e os campos 17, 20 e 21 não devem ser preenchidos.
OBS: Tive que zipar, o ACBRUtil.base estava dando erro no Upload mesmo renomeando e tirando o ".".
Realizei algumas alterações porém que tiveram alguns detalhes que talvez estejam duplicados ou fora do padrão, seguem descrição das alterações e justificativas:
ACBrUtil.Base
Criei duas funções:
EstaVazio(AValue : Variant) sobrecarga
- Fiz essa sobrecarga pois não encontrei função análoga que pegasse um dado Variant e retorna-se dessa forma sobre essas condições porém acredito que já deva existir, ele engloba os valores de string vazia, Null, Unassigned e Undefined, se fez necessário por conta que as validações no bloco C (só alterei as do C181) estavam fazendo o seguinte:
Considerando o DFill(double, boolean)
Estava assim:
DFill (campo_variant, VarIsNull(campo_variant))
Na hora de criar o objeto com atributo Variant o atributo vem com Unassigned, ai o VarIsNull não pega ele, e caso force como null a função DFill dá problema por conta da conversão Variant -> Double resulta em erro.
forceDouble(AValue : Variant)
- O forceDouble pega uma Variant e caso seja string vazia, Null, Unassigned e Undefined ele retorna 0 para não quebrar a função DFill.
Assim ficando:
DFill(forceDouble(campo_variant), EstaVazio(campo_variant))
Garantindo que o campo não será preenchido nesses casos, uma vez que os campos que alterei no C181 estavam com essa validação e os acima deles já estavam com 0 -> deixar vazio, porém nesse caso acredito ser melhor validar dessa forma.
Obs2: Não alterei outros registros pois primeiro gostaria de ver se as alterações são válidas para que no futuro possa repassar nos outros campos e atualiza-los para essa lógica.
ACBR_Sped_Fiscal_c181.rar