taocomp/php-e-invoice-it

用于管理意大利电子发票和通知XML格式的PHP包

v0.2.1 2022-06-06 20:26 UTC

This package is auto-updated.

Last update: 2024-09-07 01:43:15 UTC


README

用于管理意大利电子发票和通知XML格式的PHP包

  • 通过DOMDocumentDOMXPath管理XML
  • 完整的FatturaElettronica (FatturaPA) XML框架
  • 智能简化的xpath字符串,用于获取/设置值(如果需要,还可以用于添加/获取/删除元素)
  • 多个主体(发票批次)
  • 多个项目(DettaglioLinee
  • 通过setElementCount()设置多个通用元素
  • XML规范化:删除空元素,并在超过200个字符时自动拆分Causale
  • 可选的FatturaElettronica验证,得益于Slamdunk/php-validatore-fattura-elettronica

(用于根据SdI要求管理发票和通知XML格式的PHP包)。

此处提供最新的意大利语文档)。

请参考

请参阅论坛意大利 - 电子发票以获取服务器配置、互操作性测试等信息。特别是

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);

setValueToAllsetValuesToAll方法外,所有方法都会抛出异常,如果$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。