Estou usando as seguintes funções para a geração do número:
NFePHP 1.b layout 1.10
function criaChave($cUF,$aamm,$cnpj,$serie,$numero) {
$rNum = '';
for ($x = 0; $x < 9; $x++) {
$rNum .= rand(0,9);
}
$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 . $rNum;
$calc = calcDV($chave);
if (is_int($calc)) {
return $chave .= $calc;
} else {
return $calc;
}
}
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){
return 'Erro na chave comprimento errado!!!';
}
$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;