Il progressivo invio, secondo la specifica dell'Agenzia Entrate, è un numero di 5 caratteri alfanumerici che serve a identificare in modo univoco un file da un altro.

Di default il progressivo invio calcolato dal nostro plugin segue una semplice regola sequenziale, tradotta in base 64 per poter gestire in modo ottimale le sole 5 cifre a disposizione.

Nelle impostazioni del plugin, sezione fatturazione elettronica, è possibile aggiungere un prefisso, per poter distinguere, ad esempio, i file prodotti da una piattaforma da un altra.

Laddove ci fosse la necessità di gestire in maniera più specifica il progressivo invio, abbiamo introdotto un filtro utilizzabile per personalizzare il calcolo:

wcpdf_IT_export_filter_progressivoinvio

gli argomenti del filtro sono:

  • $type: assume il valore "invoice" per le fatture o "credit_note" per le note di credito;
  • $invoice_number: riporta il numero della fattura formattata
  • $invoice_date: riporta la data della fattura in formato Y-m-d;

Alcuni esempi di codice


Esempio 1

Un semplice metodo per gestire un proprio numeratore automatico personalizzato, da riportare nel file function.php:

add_filter( 'wcpdf_IT_export_filter_progressivoinvio', 'filter_progressivoinvio', 20, 4);
function filter_progressivoinvio($result, $type, $invoice_number, $invoice_date){
  //recupero un valore memorizzato nelle opzioni
  $mio_progressivoInvio = intval(get_option("mio_progressivoInvio", 0));

  //aumento il contatore di 1
  $mio_progressivoInvio++;

  //salvo il nuovo valore nelle opzioni
  update_option("mio_progressivoInvio", $mio_progressivoInvio);

  //trasformo il numero ottenuto in un codice di 5 cifre
  if($type == "invoice") {
    //se il file corrisponde a una fattura
    $result = sprintf("%05d",$mio_progressivoInvio);

  } elseif($type == "credit_note") {
    //se il file corrisponde a una nota di credito
    $result = sprintf("R%04d",$mio_progressivoInvio);
  }

  return $result;
}

il file corrispondente sarà del tipo IT12345678901_00023.xml.


Esempio 2

Un'alternativa alla compressione del progressivo unico usata nel plugin, su base 36 invece di 62, che permette di avere dei nomi di file univoci anche nei casi (es. client Windows) in cui non c'è distinzione fra caratteri maiuscoli e minuscoli.
Da riportare sempre nel file function.php:

add_filter( 'wcpdf_IT_export_filter_progressivoinvio', 'filter_progressivoinvio', 20, 4);
function filter_progressivoinvio($result, $type, $invoice_number, $invoice_date){
  //recupera il numero progressivo generale memorizzato nelle opzioni
  $num = intval(get_option("wcpdf_IT_numFilename", 0));

  $b=36;
$base='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$r = $num % $b ;
$res = $base[$r];
$q = floor($num/$b);
while ($q) {
$r = $q % $b;
$q = floor($q/$b);
$res = $base[$r].$res;
}
$result = substr(str_pad($res, 5, "0", STR_PAD_LEFT), -5, 5); return $result; }

il file corrispondente sarà del tipo IT12345678901_00D5B.xml.


Esempio 3

Ecco invece un esempio di codice per il calcolo del progressivo invio in funzione del numero e della data della fattura. L'ipotesi è di identificare il file con il numero e la data della fattura. Se l'identificativo della fattura è numerico, e non supera le 999 unità all'anno, allora è possibile, inserendo questo codice al function.php

add_filter( 'wcpdf_IT_export_filter_progressivoinvio', 'filter_progressivoinvio', 20, 4);
function filter_progressivoinvio($result, $type, $invoice_number, $invoice_date){
  $year = date("y", strtotime($invoice_date));
  if($type == "invoice") {
    $result = sprintf("%02d%03d",intval($year),intval($invoice_number));
  } elseif($type == "credit_note") {
    $result = sprintf("R%02d%02d",intval($year),intval($invoice_number));
  }
  return $result;
}

Data la fattura 23 del 2019, il file corrispondente è IT12345678901_19023.xml.
È un codice che funziona fino all'anno 2099.


Esempio 4

Un altro un esempio di codice per il calcolo del progressivo invio in funzione del numero e della data della fattura. Anche in questo caso l'ipotesi è di identificare il file con il numero e la data della fattura. Se l'identificativo della fattura è numerico, e non supera le 9999 unità all'anno, allora è possibile, inserendo questo codice al function.php

add_filter( 'wcpdf_IT_export_filter_progressivoinvio', 'filter_progressivoinvio', 20, 4);
function filter_progressivoinvio($result, $type, $invoice_number, $invoice_date){
  $year = intval(date("Y", strtotime($invoice_date))) - 2019; //ipotizziamo che il 2019 sia l'anno 0
  $b=36;
  $base='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $r = $year % $b ;
  $pre = $base[$r];
  if($type == "invoice") {
    $result = $pre . substr(sprintf("%04d",intval($invoice_number)), -4, 4);
  } elseif($type == "credit_note") {
    $result = $pre . "R" . substr(sprintf("%03d",intval($invoice_number)), -3, 3);
  }
  return $result;
}

Data la fattura 4324 del 2020, il file corrispondente è IT12345678901_14324.xml,
mentre il file corrispondente alla nota di credito 934 del 2019 è IT12345678901_1R934.xml.
È un codice che funziona fino all'anno 2055.