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。