oixan / php-e-invoice-it
一个用于管理意大利电子发票和通知XML格式的PHP包
Requires
- php: ^7
- slam/php-validatore-fattura-elettronica: >=v1.2.1-patch20201009.1
Requires (Dev)
- phpunit/phpunit: ^7
README
一个用于管理意大利电子发票和通知XML格式的PHP包
- 通过
DOMDocument
和DOMXPath
进行XML管理 - 完整的
FatturaElettronica
(FatturaPA) XML骨架 - 智能简化的xpath字符串,用于获取/设置值(并在需要时添加/获取/删除元素)
- 多个主体(发票批次)
- 多个项目(
DettaglioLinee
) - 多个通用元素,使用
setElementCount()
设置 - XML规范化:删除空元素,并在超过200个字符时自动拆分
Causale
- 可选的
FatturaElettronica
验证,得益于 Slamdunk/php-validatore-fattura-elettronica
(Pacchetto PHP per gestire il formato XML di fatture e notifiche come richiesto dal SdI).
(Qui la documentazione aggiornata in italiano).
请参阅
- PHP SdICoop - Server 以实现意大利交换系统(又称“SdI”)所需的网络服务
- PHP SdICoop - Client 用于连接到SdI网络服务
有关服务器配置、互操作性测试等,请参阅 Forum Italia - Fatturazione Elettronica。特别是
- Apache配置
- Accreditamento SDICoop:在Apache上配置SSL - Fatturazione Elettroni…
- 互操作性测试
- Test Interoperabilità Soluzioni - Fatturazione Elettronica - Forum Italia
快速入门
依赖项
php-xml
- 针对PHP 8+进行了测试
应在PHP 5.5上工作同样
安装
Composer
composer require taocomp/php-e-invoice-it
手动
- 克隆/下载仓库
require_once('/path/to/php-e-invoice-it/vendor/autoload.php');
发票
创建新的发票
创建新的FPA12发票
$invoice = new FatturaElettronica('FPA12');
创建新的FPR12发票
$invoice = new FatturaElettronica('FPR12');
从文件创建新的发票
$invoice = new FatturaElettronica('/path/to/invoice.xml');
创建一个自定义模板发票供以后使用
$prefixPath = __DIR__ . '/tmpfiles'; $filename = 'my-custom-template.xml'; $invoice = new FatturaElettronica('FPR12'); $invoice->setValue('IdTrasmittente/IdCodice', '00011122233'); $invoice->setValue('IdTrasmittente/IdPaese', 'IT'); $invoice->setFilename($filename); $invoice->setPrefixPath($prefixPath)->save();
发票批次和项目
设置3个主体
$invoice->addBody(2); // or $invoice->setBodyCount(3);
为第二个主体设置4个项目
$invoice->addLineItem(3, 2); // or $invoice->setLineItemCount(4, 2);
获取/设置值
通常,您可以通过使用标签/路径和可选的 上下文 来获取/设置值(并添加/获取/删除元素)。
请注意
- 绝对路径相对于根元素:
/FatturaElettronicaHeader
表示/p:FatturaElettronica/FatturaElettronicaHeader
- 标签和相对路径以
(.)//
为前缀 - 允许使用xpath谓词:
$invoice->getValue('DettaglioLinee[2]/NumeroLinea');
获取值
$invoice->getValue('ModalitaPagamento');
带有 上下文 获取值
$invoice->getValue('NumItem', 'DatiContratto');
无效查询(它们返回多个元素)
$invoice->getValue('IdPaese'); $invoice->getValue('Sede/Indirizzo', 'FatturaElettronicaHeader');
为特定元素设置值
$invoice->setValue('ProgressivoInvio', 10001);
一次性设置多个单个值
$invoice->setValues('IdTrasmittente', array( 'IdCodice' => '09876543210', 'IdPaese' => 'IT' ));
$invoice->setValues('CedentePrestatore/Sede', array( 'Indirizzo' => 'VIA UNIVERSO 1' ));
$invoice->setValues('CessionarioCommittente', array( // CessionarioCommittente/DatiAnagrafici/CodiceFiscale 'DatiAnagrafici/CodiceFiscale' => '01234567890', // Denominazione, somewhere inside CessionarioCommittente 'Denominazione' => 'BETA SRL' ));
// Set values for second body $body2 = $invoice->getBody(2); $invoice->setValue('Numero', 44, $body2); $invoice->setValue('Data', '2018-12-12', $body2);
一次性将值设置到多个元素中
$invoice->setValuesToAll('DatiGenerali', array( // All "RiferimentoNumeroLinea" somewhere inside DatiGenerali 'RiferimentoNumeroLinea' => 1, // All "IdDocumento" somewhere inside DatiGenerali 'IdDocumento' => 4455, // All "NumItem" somewhere inside DatiGenerali 'NumItem' => 1 ));
从关联数组设置值
$array = array( 'DatiAnagraficiVettore' => array( 'IdFiscaleIVA' => array( 'IdPaese' => 'IT', 'IdCodice' => '09876543210' ), 'Anagrafica' => array( 'Denominazione' => 'TRASPORTO SRLS' ), 'NumeroLicenzaGuida' => 'AA090909' ), 'MezzoTrasporto' => 'Mezzo', 'CausaleTrasporto' => 'La causale del traporto', 'NumeroColli' => '1', 'Descrizione' => 'La descrizione' ); $invoice->setValuesFromArray('DatiTrasporto', $array);
除了 setValueToAll
和 setValuesToAll
方法外,所有方法在 $expr/$context
不返回单个元素时都将抛出异常。
设置/取消设置样式表
设置
$invoice->setStylesheet('/path/to/xsl');
取消设置
$invoice->unsetStylesheet();
验证发票
您需要Slamdunk/php-validatore-fattura-elettronica。如果您通过composer安装php-e-invoice-it
,它将作为依赖项自动安装;否则,您必须手动下载并安装它。
$invoice->validate();
如果XML无效,将抛出异常(并显示消息),例如
DOMDocument::schemaValidateSource(): Element 'DatiTrasmissione': Missing child element(s). Expected is ( CodiceDestinatario ).
保存发票
为所有发票设置一个可选的默认目标目录
FatturaElettronica::setDefaultPrefixPath('path/to/dir');
为当前发票设置一个可选的目标目录
$invoice->setPrefixPath('path/to/another/dir');
保存发票
$invoice->save();
指定一个自定义文件名
$invoice->setFilename('my-invoice.xml')->save();
将发票发送到SdI
设置一个\Taocomp\Einvoicing\SdicoopClient\Client
对象(用于连接到SdIRiceviFile webservice)
use \Taocomp\Einvoicing\SdicoopClient\Client; use \Taocomp\Einvoicing\SdicoopClient\FileSdIBase; use \Taocomp\Einvoicing\SdicoopClient\RispostaSdIRiceviFile; Client::setPrivateKey('/path/to/client.key'); Client::setClientCert('/path/to/client.pem'); Client::setCaCert('/path/to/ca.pem'); $client = new Client(array( 'endpoint' => 'https://testservizi.fatturapa.it/ricevi_file', 'wsdl' => '/path/to/wsdl/SdIRiceviFile_v1.0.wsdl' ));
发送发票
$fileSdI = new FileSdIBase(); $fileSdI->load($invoice); $response = new RispostaSdIRiceviFile($client->RiceviFile($fileSdI));
通知
创建一个新通知
NotificaEsitoCommittente
$notice = new EsitoCommittente();
从文件中加载通知
设置值
// Set some values from invoice, second body: $notice->setValuesFromInvoice($invoice, 2); // Set values $notice->setValue('IdentificativoSdI', 1234567); $notice->setValue('Esito', EsitoCommittente::EC01);
设置/取消设置样式表
设置
$notice->setStylesheet('/path/to/xsl');
取消设置
$notice->unsetStylesheet();
保存通知
// Set filename from invoice $notice->setFilenameFromInvoice($invoice, '_EC_001'); // Save notice $notice->save();
将通知发送到SdI
设置一个\Taocomp\Einvoicing\SdicoopClient\Client
对象(用于连接到SdIRiceviNotifica webservice)
use \Taocomp\Einvoicing\SdicoopClient\Client; use \Taocomp\Einvoicing\SdicoopClient\FileSdI; use \Taocomp\Einvoicing\SdicoopClient\RispostaSdINotificaEsito; Client::setPrivateKey('/path/to/client.key'); Client::setClientCert('/path/to/client.pem'); Client::setCaCert('/path/to/ca.pem'); $client = new Client(array( 'endpoint' => 'https://testservizi.fatturapa.it/ricevi_notifica', 'wsdl' => __DIR__ . '/../wsdl/SdIRiceviNotifica_v1.0.wsdl' ));
发送通知
$fileSdI = new FileSdI(); $fileSdI->load($notice); $response = new RispostaSdINotificaEsito($client->NotificaEsito($fileSdI));
测试
在项目根目录内部: ./vendor/bin/phpunit --testdox tests
致谢
我们感谢Forum Italia - Fatturazione Elettronica的所有贡献者,他们分享了他们的代码片段和任何可用信息。
感谢@Slamdunk的Slamdunk/php-validatore-fattura-elettronica
!
许可证
GPLv3。