taocomp / php-e-invoice-it
用于管理意大利电子发票和通知XML格式的PHP包
Requires
- php: ^7|^8.0
- slam/php-validatore-fattura-elettronica: >=v1.2.1-patch20201009.1
Requires (Dev)
- phpunit/phpunit: ^7|^8.0
README
用于管理意大利电子发票和通知XML格式的PHP包
- 通过
DOMDocument
和DOMXPath
管理XML - 完整的
FatturaElettronica
(FatturaPA) XML框架 - 智能简化的xpath字符串,用于获取/设置值(如果需要,还可以用于添加/获取/删除元素)
- 多个主体(发票批次)
- 多个项目(
DettaglioLinee
) - 通过
setElementCount()
设置多个通用元素 - XML规范化:删除空元素,并在超过200个字符时自动拆分
Causale
- 可选的
FatturaElettronica
验证,得益于Slamdunk/php-validatore-fattura-elettronica
(用于根据SdI要求管理发票和通知XML格式的PHP包)。
(此处提供最新的意大利语文档)。
请参考
- PHP SdICoop - 服务器,以实现意大利交换系统(即“SdI”)所需的网络服务
- PHP SdICoop - 客户端,用于连接到SdI网络服务
请参阅论坛意大利 - 电子发票以获取服务器配置、互操作性测试等信息。特别是
- Apache配置
- Accreditamento SDICoop:在Apache上配置SSL - 电子发票...
- 互操作性测试
- Test Interoperabilità Soluzioni - 电子发票 - 论坛意大利
快速入门
依赖项
php-xml
- 已测试PHP 7+
应在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 Web服务)
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 Web服务)
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。