deved-it / fattura-elettronica

Fatturazione Elettronica Italiana
https://deved-it.github.io/fattura-elettronica
MIT License
78 stars 36 forks source link

Sezione Trasmissione non corretta #57

Closed shinesoftware closed 5 years ago

shinesoftware commented 5 years ago

Describe the bug Nel caso di un trasmittente diverso dal mittente della fattura, ad esempio con invio via servizio Aruba, il modulo non permette la cancellazione di alcune sezioni superflue all'invio come la sezione DatiTrasmissione > ContattiTrasmittente

To Reproduce Creare una normale fattura indicando l'Id Trasmittente di un servizio esterno come su detto ed associando un IdTrasmittente.

 $trasmittente = new IdTrasmittente('IT', '0123456789');
 $fatturaElettronicaFactory->setIdTrasmittente($trasmittente);

Nella sezione:

 \Deved\FatturaElettronica\FatturaElettronica\FatturaElettronicaHeader\telefono

il modulo genera la costruzione di una sezione relativa ai ContattiTrasmittente che non è utile ai fini di un invio attraverso un servizio esternalizzato.

Expected behavior La possibilità di cancellare la sezione DatiTrasmissione > ContattiTrasmittente e l'impostazione di un IdTrasmittente personalizzato.

Grazie mille

salgua commented 5 years ago

Ciao, se invii le fatture con Aruba o altro intermediario il blocco da usare è TerzoIntermediarioOSoggettoEmittente . L' IdTrasmittente è l’identificativo univoco del soggetto trasmittente e nulla c'entra con l'intermediario (es. Aruba). Il blocco ContattiTrasmittente viene aggiunto solo se si specifica il telefono o l'indirizzo email. Fammi sapere se non ho capito bene qualcosa altrimenti chiudo il ticket. Grazie a te!

shinesoftware commented 5 years ago

Ciao,

dopo aver chiarito con Aruba, il supporto tecnico ci conferma che la sezione indicata dentro DatiTrasmissione viene usata per identificare il trasmittente. Nei fatti Aruba controlla la suddetta sezione sostituendola durante la fase di importazione nei loro sistemi ed indicando all'operatore che tenta di importare la fattura il seguente messaggio:

La fattura contiene ID e/o contatti del trasmittente differenti dai dati dell'intermediario Aruba PEC.

se l'operatore tenta di completare l'operazione di importazione appare il seguente messaggio:

screenshot_164057

Quindi il supporto tecnico ci ha indicato che le suddette sezioni devono essere lasciate in bianco oppure impostare i dati esclusivamente dentro la sezione dell'IdTrasmittente, cancellando i dati presenti dentro il blocco ContattiTrasmittente.

Cordialmente

salgua commented 5 years ago

Ok, allora dovrebbe essere tutto apposto in quanto il blocco ContattiTrasmittente non viene aggiunto se non si specifica telefono o email. Se mi dai conferma chiudo.

Grazie!

shinesoftware commented 5 years ago

il blocco ContattiTrasmittente non viene aggiunto se non si specifica telefono o email.

Confermo che impostando a NULL i due parametri del telefono ed email del decente ottengo la cancellazione della sezione ContattiTrasmittente in questione.

Per quanto riguarda il codice IdTrasmittente come si risolve? il problema non è solamente il blocco ContattiTrasmittente ma anche la sezione IdTrasmittente, come posso impostare il valore richiesto da Aruba?

Rimanendo sempre in tema, se la classe FatturaElettronicaFactory viene istanziata il costruttore imposta i dati del CedentePrestatore senza badare al parametro IdTrasmittente che essendo impostato di default su "true" la sezione IdTrasmittente verrà generata di default.

Credo sia debba aggiungere controllare il parametro al fine di evitare che venga automaticamente considerato impostato a "true".

salgua commented 5 years ago

Partiamo dal presupposto che il blocco IdTrasmittente è obbligatorio, se lo omettiamo otteniamo un errore in fase di validazione del file xml con il file xsd. Se usi FatturaElettronicaFactory per generare le tue fatture, dovresti poter impostare un IdTrasmittente arbitrario usando il metodo pubblico setIdTrasmittente. Esempio:

$feFactory = new FatturaElettronicaFactory(
        $datiAnagrafici,
        $sede,
        '+39123456789',
        'info@deved.it'
 )

$idTrasmittenteDiverso = new IdTrasmittente('IT', '123456789');
$feFactory->setIdTrasmittente(idTrasmittenteDiverso);

fammi sapere se così risolvi.

Grazie! Salvatore

shinesoftware commented 5 years ago

Sono pienamente d'accordo con te. Ho provato a fare quanto mi hai suggerito ed il risultato è che il nome del file viene modificato in IT123456789 _1.xml invece di mantenere il numero della partita iva del cedente. Come risolvere?

salgua commented 5 years ago

Questo non è possibile in quanto le specifiche tecniche dicono che il file deve essere “nominato” in maniera opportuna affinché possa essere accettato dal Sistema di Interscambio. Ovvero:

Codice Paese Identificativo univoco del Trasmittente _ Progressivo univoco del file

dove:

il Codice Paese va espresso secondo lo standard ISO 3166-1 alpha-2 code, l’Identificativo univoco del Trasmittente, sia esso persona fisica o soggetto giuridico, è rappresentato dal suo identificativo fiscale (codice fiscale nel caso di soggetto trasmittente residente in Italia, identificativo proprio del Paese di appartenenza nel caso di soggetto trasmittente residente all’estero). La lunghezza di questo identificativo è di: 11 caratteri (minimo) e 16 caratteri (massimo) nel caso di codice paese IT, 2 caratteri (minimo) e 28 caratteri (massimo) altrimenti, il progressivo univoco del file è rappresentato da una stringa alfanumerica di lunghezza massima di 5 caratteri e con valori ammessi da “A” a “Z” e da “0” a “9”. Il separatore degli elementi che compongono il nome file è il carattere underscore (“_”), codice ASCII 95. L’estensione del file assume il valore “.xml” oppure “.xml.p7m” in base al tipo di firma utilizzata (a tal proposito consultare la sezione Firmare la FatturaPA).

usare la partita iva del cedente nel nome file è formalmente sbagliato. A questo punto ti consiglio di implementare qualcosa di custom nel tuo codice per modificare il nome del file a tuo piacimento.

shinesoftware commented 5 years ago

Quindi i file devono avere la partita iva di Aruba (trasmittente) e non del Cedente. Confermi?

salgua commented 5 years ago

Secondo me no. Io uso Agyo di TeamSystem e non conosco nello specifico il servizio di Aruba, ma dovrebbe valere la stessa cosa per tutti: il blocco IdTrasmittente va compilato con i dati di chi emette la fattura (soggetto passivo IVA) e non di Aruba. I dati dell'intermediario vanno invece inseriti nel blocco TerzoIntermediarioOSoggettoEmittente. Infatti in quest'ultimo blocco io inserisco i dati di Team System. Se guardi in questo test trovi l'esempio di cui parlo.

shinesoftware commented 5 years ago

Ho contattato nuovamente il servizio Aruba e mi riconfermano che nella sezione IdTrasmittente dovrebbe esserci la loro partita iva e quando ho obiettato riguardo a tale impostazione hanno risposto di aprire una segnalazione tecnica! C'è da impazzire! Ad ogni modo non è possibile sovrascrivere il nome del file in uscita?

endelwar commented 5 years ago

@shinesoftware c'è un esempio per creare il file col nome che vuoi nella documentazione

//generazione file XML 
$xml = $fattura->toXml();

//print su schermo
echo $xml;

//scrivi file
file_put_contents('file_col_nome_che_voglio.xml', $xml);
shinesoftware commented 5 years ago

@endelwar speravo ci fosse un metodo interno poichè avevo visto un metodo getFileName() quindi cercavo un setFileName

$file = $fattura->getFileName();

grazie

shinesoftware commented 5 years ago

Ecco la risposta:

Gentile cliente, ai fini della Sua richiesta la presente per informarLa che è definito trasmittente il soggetto, sia esso cedente/prestatore o terzo intermediario, che trasmette al SdI (Sistema di Interscambio) il file fattura ovvero il file archivio, quindi Aruba Pec. RingraziandoLa per la collaborazione, restiamo a Sua completa disposizione.

Cordiali saluti

salgua commented 5 years ago

Sono alquanto perplesso. Con Agyo caricando le fatture massivamente non funziona così. I dati di TeamSystem li inserisco nel blocco TerzoIntermediarioOSoggettoEmittente e in IdTrasmittente lascio i dati del soggetto passivo IVA. L'unico dubbio è che Agyo possa sovrascrivere quel blocco. Potresti provare a scrivere sul Forum Italia

salgua commented 5 years ago

Comunque ho fatto delle ricerche sul forum e pare tu abbia ragione. Ma a questo punto se usi

$fatturaElettronicaFactory->setIdTrasmittente($trasmittente);

inserendo già i dati di Aruba non hai già risolto?

Grazie!

shinesoftware commented 5 years ago

Ma a questo punto se usi

$fatturaElettronicaFactory->setIdTrasmittente($trasmittente);

inserendo già i dati di Aruba non hai già risolto?

Grazie!

Si ma parzialmente. In poche parole il file generato avrà il nome del file contente la partita iva di Aruba (IT1879020517) invece che la partita iva del Cedente Prestatore come: IT01879020517_1.xml

Tale difficoltà genera un altro problema. L'archiviazione dei files XML da parte del Cedente qualora dovesse trasmettere più fatture per più posizioni fiscali.

Ad esempio: Un negoziante ha tre aziende con tre partite iva differenti e desidera impostare l'Id del Trasmittente di Aruba. Cosa otterrebbe alla generazione di una fattura per ogni singolo negozio? Il negoziante si troverà lo stesso file xml IT01879020517_1.xml ripetuto tre volte, uno per ogni fattura di ogni singolo negozio.

Come si può risolvere elegantemente questo problema?

A presto

salgua commented 5 years ago

Quello che posso fare è aggiungere un metodo setFileName($nomefile), può andarti bene?

shinesoftware commented 5 years ago

Tranquillo io ho risolto già il problema evitando di chiedere attraverso il metodo getFilename() il nome del file ma se vuoi aggiungilo pure magari servirà a qualcuno.

Al momento indico direttamente il codice del paese + la partita iva del cedente + numero incrementale non si può far altro.

Grazie @salgua

salgua commented 5 years ago

Ho approfondito la questione. Nella fattispecie ho controllato un file xml dopo l'elaborazione di Agyo, scaricandolo direttamente dal sito dell'AdE, ed effettivamente Agyo sovrascrive il blocco IdTrasmittente con i propri dati, e sovrascrive anche il nome file con il suo codice fiscale ed il suo progressivo invio. In questo caso vengono rispettate le indicazioni presenti a questo indirizzo usando l' IdTrasmittente anche nel nome file.