Dígito verificador para notas v2.0

130 views
Skip to first unread message

Paulo Gabriel

unread,
Mar 22, 2011, 2:48:01 PM3/22/11
to nfe...@googlegroups.com
Olá pessoal,


Preciso, por favor, de uma ajuda, e desde já agradeço a paciência de todos.


Como meu sistema gera o XML para as notas v2.0 diretamente, eu havia adaptado o cálculo do dígito verificador, a partir do algoritmo da versão 1.10, com as devidas correções.

O meu algoritmo fornece exatamente os mesmos resultados do algoritmo fornecido atualmente no NFePHP v2.0 (o calculaDV.php).

Em um teste, importei um XML gerado pelo meu sistema para o emissor 2.0 para ver onde está o erro (já que não consigo enviá-los sem falhas). Um dos erros que ele aponta é que o dígito verificador deveria ser Y, e não X. Quando eu troco, ele não aponta mais esse erro.

Apesar disso, pra mim parece que o emissor é que está errando de alguma maneira, já que o validador do RS aceita todos os meus XMLs sem um erro sequer.

Alguém que realiza este cálculo, precisou fazer alguma alteração no algorítmo do cálculo DV, fornecido atualmente pelo NFePHP?


Desde já agradeço a ajuda de todos. :)


Esclarecimentos:
1. Como eu não consigo enviar minhas notas, quero ter certeza que o erro não está aqui no DV, pra que eu possa avançar pra próxima etapa... Elas estão 100% OK no validador do RS e, mesmo assim, sempre obtenho "Rejeição: Falha no schema XML" ao tentar enviar à sefaz de SP.

2. O log de erros do apache não aponta nenhum erro no PHP... nenhum. O NFePHP parece estar PERFEITO em todos os seus métodos. O que indica que o problema deve estar nos meus XMLs.

--
Paulo Gabriel
Acho que a pior coisa foi testar meus XMLs no emissor gratuito :P
35110318781203000128550010000000081000000976-nfe.xml_assinado
35110318781203000128550010000000081000000976-nfe.xml_sem_assinatura

Bruno Bastos

unread,
Mar 22, 2011, 2:55:20 PM3/22/11
to nfe...@googlegroups.com
Salve paulo,

Há algum tempo, quando iniciava na 2.00, adaptei um arquivo que fazia parte do projeto para o cálculo da chave...
Não sei se te ajuda mas seguem as rotinas e o arquivo em anexo.

-----------------------
/**
 * criaChave
 * @param number $cUF codigo da unudade da federação do IBGE
 * @param string $aamm ano e mes douis últimos digitos do ano e o mes com 2 digitos
 * @param string $cnpj
 * @param number $serie numero da série da nfe
 * @param number $numero numero da nfe
 * @return string chave da nfe com 44 digitos
 */
function criaChave($cUF,$aamm,$cnpj,$serie,$numero,$tpEmis){
    $rNum = '';
    for( $x=0;$x<8;$x++ ){
        $rNum .= rand(0,8);
    }
    $modelo = '55';
    $serie = str_pad($serie, 3, "0", STR_PAD_LEFT);
    $numero = str_pad($numero, 9, "0", STR_PAD_LEFT);
    $chave = $cUF . $aamm . $cnpj . $modelo . $serie . $numero. $tpEmis . $rNum;
    $chave = $chave . calcDV($chave);
    return $chave;
}

/**
 * calcDV
 * @param string $chave com 43 digitos
 * @return variant numero do digito verificador ou null
 */
function calcDV($chave){
    $n = strlen($chave);
    $aPeso = array(4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2);
    if ($n != 43){
        echo "Erro na chave comprimento errado!!!";
        return null;
    }
    $aChave = str_split($chave);
    $soma = 0;
    for($x = 0; $x < $n; $x++){
        $prod = $aPeso[$x] * $aChave[$x];
        $soma += $aPeso[$x] * $aChave[$x];
        //echo $aPeso[$x] . ' * ' . $aChave[$x] . ' = ' . $prod .'<BR>';
    }
    $resto = $soma%11;
    if ($resto == 0 || $resto == 1){
        $dv = 0;
    } else {
        $dv = 11-$resto;
    }
    return $dv;
}

-----------------------

Abraços,
--
+55 21 7868-4741  /  55*12*2808
Bruno Bastos
Rio de Janeiro - Brasil
calculo_chave_nfe_2.00.php

Paulo Gabriel

unread,
Mar 22, 2011, 3:18:22 PM3/22/11
to nfe...@googlegroups.com
Obrigado Bruno e Roberto,


Meu erro estava aqui no cálculo do DV!     XD
Ah, e a função fornecida pelo NFePHP está correta também. E os poucos resultados que foram iguais eram exceções.


Paulo Gabriel - com esperanças de que agora vai... :D
Reply all
Reply to author
Forward
0 new messages