{"id":36995035,"url":"https://github.com/taocomp/php-e-invoice-it","last_synced_at":"2026-01-13T23:47:20.231Z","repository":{"id":33788027,"uuid":"161983906","full_name":"taocomp/php-e-invoice-it","owner":"taocomp","description":"A PHP package for managing italian e-invoice and notice XML formats. (Pacchetto PHP per gestire il formato XML di fatture e notifiche come richiesto dal SdI).","archived":false,"fork":false,"pushed_at":"2022-06-06T20:28:03.000Z","size":1411,"stargazers_count":75,"open_issues_count":9,"forks_count":22,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-09-23T22:39:45.756Z","etag":null,"topics":["e-invoice","einvoice","fattura","fattura-elettronica","fattura-pa","fatturazione-elettronica","invoice","italy","open-source","opensource","php","xml"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taocomp.png","metadata":{"files":{"readme":"README.it.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-16T08:56:41.000Z","updated_at":"2025-09-11T06:46:27.000Z","dependencies_parsed_at":"2022-08-24T07:50:13.388Z","dependency_job_id":null,"html_url":"https://github.com/taocomp/php-e-invoice-it","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/taocomp/php-e-invoice-it","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taocomp%2Fphp-e-invoice-it","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taocomp%2Fphp-e-invoice-it/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taocomp%2Fphp-e-invoice-it/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taocomp%2Fphp-e-invoice-it/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taocomp","download_url":"https://codeload.github.com/taocomp/php-e-invoice-it/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taocomp%2Fphp-e-invoice-it/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["e-invoice","einvoice","fattura","fattura-elettronica","fattura-pa","fatturazione-elettronica","invoice","italy","open-source","opensource","php","xml"],"created_at":"2026-01-13T23:47:20.167Z","updated_at":"2026-01-13T23:47:20.216Z","avatar_url":"https://github.com/taocomp.png","language":"PHP","readme":"* Installazione\n** Composer\n~composer require taocomp/php-e-invoice-it~\n\n** Manualmente\n- Clonare o scaricare il repository\n- ~require_once('/path/to/php-e-invoice-it/vendor/autoload.php');~\n\n* Setup\nSe utilizzate ~composer~, avrete già incluso il file ~vendor/autoload.php~ nel vostro codice.\n\nSe avete clonato/scaricato il repository:\n#+BEGIN_SRC \nrequire_once('/path/to/php-e-invoice-it/vendor/autoload.php');\n#+END_SRC\n\nIn entrambi i casi, per utilizzare la classe ~FatturaElettronica~:\n#+BEGIN_SRC \nuse Taocomp\\Einvoicing\\FatturaElettronica;\n#+END_SRC\n\nPer utilizzare la classe ~EsitoCommittente~:\n#+BEGIN_SRC \nuse Taocomp\\Einvoicing\\EsitoCommittente;\n#+END_SRC\n\n* Nuova fattura/notifica\nFattura FPA:\n#+BEGIN_SRC \n$invoice = new FatturaElettronica('FPA12');\n#+END_SRC\n\nFattura FPR:\n#+BEGIN_SRC \n$invoice = new FatturaElettronica('FPR12');\n#+END_SRC\n\nNotifica EsitoCommittente:\n#+BEGIN_SRC \n$notice = new EsitoCommittente();\n#+END_SRC\n\n* Caricamento di una fattura/notifica esistente\n#+BEGIN_SRC \n$invoice = new FatturaElettronica('/path/to/invoice.xml');\n#+END_SRC\n\nOppure:\n#+BEGIN_SRC \n$invoice = new FatturaElettronica('FPR12');\n$invoice-\u003eload('/path/to/invoice.xml');\n#+END_SRC\n\n* Individuare gli elementi\nIn generale, per individuare gli elementi che si vogliono leggere o modificare all'interno dell'XML sono necessari:\n- il nome o path dell'elemento che si vuole leggere o modificare\n- (opzionale) un nodo /context/ a cui appartiene l'elemento (stringa o ~\\DOMNode~)\n\nLa sintassi da utilizzare è quella XPath, con le seguenti facilitazioni.\n\n** Path assoluto\nSe il path è assoluto (comincia con ~/~), esso è in realtà relativo al nodo root del documento. Nel caso di una fattura elettronica:\n#+BEGIN_SRC \n$this-\u003egetValue('/FatturaElettronicaHeader/DatiTrasmissione/CodiceDestinatario');\n#+END_SRC\n\nè equivalente a una query effettuata con ~\\DOMXPath~ per\n#+BEGIN_SRC \n/p:FatturaElettronica/FatturaElettronicaHeader/DatiTrasmissione/CodiceDestinatario\n#+END_SRC\n\nUn path assoluto non può avere /context/.\n\n** Path relativo\nA un path relativo viene sempre anteposto ~//~:\n\n#+BEGIN_CENTER\n\"Selects nodes in the document from the current node that match the selection no matter where they are\". ([[https://www.w3schools.com/xml/xpath_syntax.asp][XPath Syntax]])\n#+END_CENTER\n\nSe è presente un /context/, viene anteposto ~.//~. Il punto specifica che si intende partire dal nodo /context/.\n\nÈ possibile anche specificare predicati XPath, ad esempio\n#+BEGIN_SRC \n$invoice-\u003egetValue('DettaglioLinee[2]/NumeroLinea');\n#+END_SRC\n\nleggerà il valore di ~NumeroLinea~ del secondo blocco ~DettaglioLinee~. La numerazione parte da 1 e non da 0, come da sintassi XPath.\n\n** Tag\nSe viene fornito solo il nome dell'elemento (non sono presenti ~/~), vengono seguite le stesse regole dei path relativi. Ad esempio per selezionare ~ModalitaPagamento~:\n\n#+BEGIN_SRC \n$invoice-\u003egetValue('ModalitaPagamento');\n#+END_SRC\n\nCon un /context/:\n#+BEGIN_SRC \n$invoice-\u003egetValue('NumItem', 'DatiContratto');\n#+END_SRC\n\n* Leggere/modificare i valori\n** ~getValue( string $expr, $context = null )~\nRestituisce il valore dell'elemento individuato da ~$expr/$context~, se ~$expr/$context~ restituisce un elemento univoco, altrimenti genera un'eccezione.\n\nEsempi validi:\n#+BEGIN_SRC \n$invoice-\u003egetValue('ProgressivoInvio');\n$invoice-\u003egetValue('Sede/Indirizzo', 'CedentePrestatore');\n#+END_SRC\n\nEsempi non validi:\n#+BEGIN_SRC \n$invoice-\u003egetValue('IdPaese');\n$invoice-\u003egetValue('Sede/Indirizzo', 'FatturaElettronicaHeader');\n#+END_SRC\n\nCome detto, ~$context~ può essere un oggetto ~\\DOMNode~.\n\n** ~setValue( string $expr, $value, $context = null )~\nSetta il valore ~$value~ per l'elemento individuato da ~$expr/$context~, se ~$expr/$context~ restituisce un elemento univoco, altrimenti genera un'eccezione.\n\n** ~setValueToAll( string $expr, $value, $context = null )~\nSetta il valore ~$value~ per tutti gli elementi individuati da ~$expr/$context~.\n\n** ~setValues( $context, array $array )~\nPer ogni coppia chiave/valore ~$k/$v~ dell'array, setta il valore ~$v~ per l'elemento individuato da ~$k/$context~, se ~$k/$context~ restituisce un elemento univoco, altrimenti genera un'eccezione.\n\nEsempio:\n#+BEGIN_SRC \n$invoice-\u003esetValues('CessionarioCommittente', array(\n    'CodiceFiscale' =\u003e '02313821007',\n    'Anagrafica/Denominazione' =\u003e 'AMMINISTRAZIONE',\n));\n#+END_SRC\n\n** ~setValuesToAll( $context, array $array )~\nPer ogni coppia chiave/valore ~$k/$v~ dell'array, setta il valore ~$v~ per tutti gli elementi individuati da ~$k/$context~.\n\n** ~setValuesFromArray( $context, array $array )~\nDato un array che rispecchia fedelmente una porzione di struttura XML di un certo nodo ~$context~, setta ricorsivamente i rispettivi valori.\n\nEsempio:\n#+BEGIN_SRC \n$array =  array(\n    'DatiAnagraficiVettore' =\u003e array(\n        'IdFiscaleIVA' =\u003e array(\n            'IdPaese' =\u003e 'IT',\n            'IdCodice' =\u003e '09876543210'\n        ),\n        'Anagrafica' =\u003e array(\n            'Denominazione' =\u003e 'TRASPORTO SRLS'\n        ),\n        'NumeroLicenzaGuida' =\u003e 'AA090909'\n    ),\n    'MezzoTrasporto' =\u003e 'Mezzo',\n    'CausaleTrasporto' =\u003e 'La causale del traporto',\n    'NumeroColli' =\u003e '1',\n    'Descrizione' =\u003e 'La descrizione'\n);\n\n$invoice-\u003esetValuesFromArray('DatiTrasporto', $array);\n#+END_SRC\n\n* Lotto di fatture\n** ~addBody( int $n = 1 )~\nAggiunge n ~FatturaElettronicaBody~ alla fattura.\n\nPoiché clona il primo body, verranno clonati anche tutti gli eventuali valori al suo interno.\n\n** ~getBody( int $bodyIndex = 1 )~\nRestituisce l'oggetto ~\\DOMNode~ relativo all'i-esimo body.\n\nCome da sintassi XPath, l'indice parte da 1.\n\n** ~setBodyCount( int $n )~\nSetta il numero complessivo di ~FatturaElettronicaBody~.\n\nPuò essere usato alternativamente a ~addBody~.\n\nAd esempio per creare un lotto di 5 fatture:\n#+BEGIN_SRC \n$invoice-\u003esetBodyCount(5);\n// oppure\n$invoice-\u003eaddBody(4);\n#+END_SRC\n\n* Più linee di dettaglio\n** ~addLineItem( int $n, int $bodyIndex = 1 )~\nAggiunge ~$n~ linee di dettaglio al body ~$bodyIndex~.\n\nAd esempio per aggiungere 3 linee di dettaglio al secondo body:\n#+BEGIN_SRC \n$invoice-\u003eaddLineItem(3, 2);\n#+END_SRC\n\n** ~getLineItem( int $i, int $bodyIndex = 1 )~\nRestituisce l'oggetto ~\\DOMNode~ relativo alla i-esima linea di dettaglio del body ~$bodyIndex~.\n\n** ~setLineItemCount( int $n, int $bodyIndex = 1 )~\nSetta il numero complessivo di ~DettaglioLinee~ del body ~$bodyIndex~.\n\nPuò essere usato alternativamente a ~addLineItem~.\n\n* Gestione degli elementi XML\nNormalmente non c'è bisogno di utilizzare i seguenti metodi per prendere/aggiungere/rimuovere elementi XML come nodi ~\\DOMNode~ perché:\n- per leggere/settare i valori degli elementi si possono usare i loro nomi o i path, come stringhe\n- per aggiungere elementi ~FatturaElettronicaBody~ (lotto di fatture) si possono usare i metodi ~addBody~, ~getBody~ e ~setBodyCount~\n- per aggiungere linee di dettaglio si possono usare i metodi ~addLineItem~, ~getLineItem~ e ~setLineItemCount~\n\nIn ogni caso a volte può servire aggiungere, rimuovere o prendere un determinato elemento della struttura XML. È possibile farlo con i seguenti metodi.\n\n** ~addElement( $element, $parent, $beforeRef = null )~\nAggiunge un elemento ~$element~ all'interno del nodo genitore ~$parent~. Viene posizionato prima del nodo fratello ~$beforeRef~, se ~$beforeRef~ non è nullo.\n\n** ~addElementsFromArray( $parent, array $array )~\nDato un array che rispecchia fedelmente una porzione di struttura XML di un certo nodo ~parent~, aggiunge ricorsivamente i vari elementi dell'array. Il metodo viene usato nel ~constructor~ per creare l'intera struttura della fattura (e della notifica).\n\n** ~getElement( $expr, $context = null )~\nPrende un determinato elemento individuato da ~$expr/$context~, se ~$expr/$context~ restituisce un elemento univoco, altrimenti genera un'eccezione.\n\n** ~removeElement( $element )~\nRimuove l'elemento ~$element~, se univoco. Altrimenti genera un'eccezione.\n\n** ~setElementCount( $expr, int $n, $context = null )~\nImposta la cardinalità di un certo elemento. Ad esempio per avere 3 ~DatiRiepilogo~:\n#+BEGIN_SRC \n$invoice-\u003esetElementCount('DatiRiepilogo', 3);\n#+END_SRC\n\nO nel caso di più bodies:\n#+BEGIN_SRC \n$body2 = $invoice-\u003egetBody(2);\n$invoice-\u003esetElementCount('DatiRiepilogo', 2, $body2);\n#+END_SRC\n\nSettaggio valori:\n#+BEGIN_SRC \n$invoice-\u003esetValue('DatiRiepilogo[1]/AliquotaIVA', '22.00', $body2);\n$invoice-\u003esetValue('DatiRiepilogo[2]/AliquotaIVA', '10.00', $body2);\n#+END_SRC\n\n* Altri metodi comuni a fatture e notifiche\n** ~getDOM()~\nRestituisce l'oggetto ~\\DOMDocument~ relativo alla fattura.\n\n** ~normalize()~\nRimuove gli elementi XML vuoti.\n\nUtilizzato in ~asXML()~ e ~save()~, se non esplicitamente disabilitato.\n\nIn ~FatturaElettronica~ divide l'elemento ~DatiGeneraliDocumento/Causale~ in più elementi se il valore supera i 200 caratteri (chunks da 200 caratteri ciascuno).\n\n** ~query( string $expr, $context = null, bool $registerNodeNS = true )~\nRestituisce una lista di elementi ~\\DOMNodeList~ derivante dalla query ~$expr/$context~.\n\n* Visualizzazione dell'XML\nPer recuperare la fattura come stringa XML:\n#+BEGIN_SRC \n$invoice-\u003easXML();\n#+END_SRC\n\nDi default gli elementi vuoti vengono eliminati prima di stampare la stringa XML (normalizzazione). Per visualizzarli:\n#+BEGIN_SRC \n$invoice-\u003easXML(false);\n#+END_SRC\n\n* Validazione della fattura\n~php-e-invoice-it~ utilizza la libreria [[https://github.com/Slamdunk/php-validatore-fattura-elettronica][Slamdunk/php-validatore-fattura-elettronica]] per la validazione. Se avete installato ~php-e-invoice-it~ con composer ve la ritrovate già, altrimenti dovete scaricarla e includerla manualmente se volete validare le fatture.\n\nValidazione:\n#+BEGIN_SRC \n$invoice-\u003evalidate();\n#+END_SRC\n\n* Salvataggio su file\n** Fattura\nQuando si salva una fattura, di default il nome del file è dato da:\n#+BEGIN_SRC \nIdPaese . IdCodice . _ . ProgressivoInvio . .xml\n#+END_SRC\n\nÈ possibile in ogni caso assegnare un nome arbitrario alla fattura:\n#+BEGIN_SRC \n$invoice-\u003esetFilename('filename');\n#+END_SRC\n\nPer settare una directory di destinazione dove salvare la fattura:\n#+BEGIN_SRC \n$invoice-\u003esetPrefixPath('path/to/dir');\n#+END_SRC\n\nPer settare una directory di destinazione per tutti gli oggetti ~FatturaElettronica~ che verranno creati:\n#+BEGIN_SRC \nFatturaElettronica::setDefaultPrefixPath('path/to/dir');\n#+END_SRC\n\nPer salvare la fattura:\n#+BEGIN_SRC \n$invoice-\u003esave();\n#+END_SRC\n\nSe è già presente un file con lo stesso nome viene generata un'eccezione. Per sovrascrivere il file:\n#+BEGIN_SRC \n$overwrite = true;\n$invoice-\u003esave($overwrite);\n#+END_SRC\n\nPrima di salvare il file, l'XML viene normalizzato (vengono rimossi gli elementi vuoti). Per disabilitare la normalizzazione:\n#+BEGIN_SRC \n$overwrite = false;\n$normalize = false;\n$invoice-\u003esave($overwrite, $normalize);\n#+END_SRC\n\nGetters:\n#+BEGIN_SRC \nFatturaElettronica::getDefaultPrefixPath();\n$invoice-\u003egetFilename();\n$invoice-\u003egetPrefixPath();\n#+END_SRC\n\n** Notifica\nI metodi visti per le fatture valgono anche per le notifiche.\n\nInoltre, per costruire il nome del file notifica a partire da quello di una certa ~$invoice~:\n#+BEGIN_SRC \n$notice-\u003esetFilenameFromInvoice($invoice, '_EC_001');\n#+END_SRC\n\nPer pre-popolare i valori della notifica a partire da quelli di una fattura:\n#+BEGIN_SRC \n$notice-\u003esetValuesFromInvoice($invoice, $bodyIndex);\n#+END_SRC\n\n* Invio al Sistema di Interscambio (SdI)\n** Fatture\n#+BEGIN_SRC \nuse Taocomp\\Einvoicing\\SdicoopClient\\Client;\nuse Taocomp\\Einvoicing\\SdicoopClient\\FileSdIBase;\nuse Taocomp\\Einvoicing\\SdicoopClient\\RispostaSdIRiceviFile;\n\n$invoice = new FatturaElettronica('FPR12');\n// ...\n// settaggio valori\n// ...\n\nClient::setPrivateKey('/path/to/client.key');\nClient::setClientCert('/path/to/client.pem');\nClient::setCaCert('/path/to/ca.pem');\n\n$client = new Client(array(\n    'endpoint' =\u003e 'https://testservizi.fatturapa.it/ricevi_file',\n    'wsdl'     =\u003e '/path/to/wsdl/SdIRiceviFile_v1.0.wsdl'\n));\n\n$fileSdI = new FileSdIBase();\n$fileSdI-\u003eload($invoice);\n$response = new RispostaSdIRiceviFile($client-\u003eRiceviFile($fileSdI));    \n#+END_SRC\n\n** Notifiche\n#+BEGIN_SRC \nuse Taocomp\\Einvoicing\\SdicoopClient\\Client;\nuse Taocomp\\Einvoicing\\SdicoopClient\\FileSdI;\nuse Taocomp\\Einvoicing\\SdicoopClient\\RispostaSdINotificaEsito;\n\n$notice = new EsitoCommittente();\n// ...\n// settaggio valori\n// ...\n\nClient::setPrivateKey('/path/to/client.key');\nClient::setClientCert('/path/to/client.pem');\nClient::setCaCert('/path/to/ca.pem');\n\n$client = new Client(array(\n    'endpoint' =\u003e 'https://testservizi.fatturapa.it/ricevi_notifica',\n    'wsdl'     =\u003e __DIR__ . '/../wsdl/SdIRiceviNotifica_v1.0.wsdl'\n));\n\n$fileSdI = new FileSdI();\n$fileSdI-\u003eload($notice);\n$response = new RispostaSdINotificaEsito($client-\u003eNotificaEsito($fileSdI));\n#+END_SRC\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaocomp%2Fphp-e-invoice-it","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaocomp%2Fphp-e-invoice-it","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaocomp%2Fphp-e-invoice-it/lists"}