kinedu / cfdi-xml
用于生成税务凭证(CFDI)XML结构的库
v0.2.0
2021-11-09 00:37 UTC
Requires
- php: ^7.3|^8.0
Requires (Dev)
- phpunit/phpunit: ^9.3.3
README
安装
通过Composer安装包。
composer require kinedu/cfdi-xml
使用
发票
CFDI
use Kinedu\CfdiXML\CFDI; $key = 'AAA010101AAA.key.pem'; $cer = 'AAA010101AAA.cer.pem'; $cfdi = new CFDI([ 'Serie' => 'A', 'Folio' => 'A0103', 'Fecha' => '2018-02-01T10:00:00', 'FormaPago' => '01', 'NoCertificado' => '3000100000300023708', 'SubTotal' => '4741.38', 'Moneda' => 'MXN', 'TipoCambio' => '1', 'Total' => '5500.00', 'TipoDeComprobante' => 'I', 'MetodoPago' => 'PUE', 'LugarExpedicion' => '64000', ], $key, $cer);
查看结果
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd" Version="3.3" Serie="A" Folio="A0103" Fecha="2018-02-01T10:00:00" FormaPago="01" NoCertificado="3000100000300023708" SubTotal="4741.38" Moneda="MXN" TipoCambio="1" Total="5500.00" TipoDeComprobante="I" MetodoPago="PUE" LugarExpedicion="64000"/>
获取XML
use Kinedu\CfdiXML\CFDI; $key = file_get_contents('AAA010101AAA.key.pem'); $cer = file_get_contents('AAA010101AAA.cer.pem'); $cfdi = new CFDI([ 'Serie' => 'A', 'Folio' => 'A0103', 'Fecha' => '2018-02-01T10:00:00', 'FormaPago' => '01', 'NoCertificado' => '3000100000300023708', 'SubTotal' => '4741.38', 'Moneda' => 'MXN', 'TipoCambio' => '1', 'Total' => '5500.00', 'TipoDeComprobante' => 'I', 'MetodoPago' => 'PUE', 'LugarExpedicion' => '64000', ], $key, $cer); $cfdi->getXML();
保存CFDI
use Kinedu\CfdiXML\CFDI; $key = 'AAA010101AAA.key.pem'; $cer = 'AAA010101AAA.cer.pem'; $cfdi = new CFDI([ 'Serie' => 'A', 'Folio' => 'A0103', 'Fecha' => '2018-02-01T10:00:00', 'FormaPago' => '01', 'NoCertificado' => '3000100000300023708', 'SubTotal' => '4741.38', 'Moneda' => 'MXN', 'TipoCambio' => '1', 'Total' => '5500.00', 'TipoDeComprobante' => 'I', 'MetodoPago' => 'PUE', 'LugarExpedicion' => '64000', ], $key, $cer); $cfdi->save('./A0103.xml');
节点
相关
在此节点中,应表达与正在生成的税务凭证相关的信息,应表达所需的CfdiRelacionado节点数量,即需要关联多少张凭证。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Relacionado; $cfdi = new CFDI(...); $cfdi->add(new Relacionado([ 'UUID' => '5FB2822E-396D-4725-8521-CDC4BDD20CCF', ], [ 'TipoRelacion' => '01', ]));
查看结果
<cfdi:CfdiRelacionados TipoRelacion="01"> <cfdi:CfdiRelacionado UUID="5FB2822E-396D-4725-8521-CDC4BDD20CCF"/> </cfdi:CfdiRelacionados>
发射者
在此节点中,应表达发出税务凭证的纳税人的信息。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Emisor; $cfdi = new CFDI(...); $cfdi->add(new Emisor([ 'Rfc' => 'XAXX010101000', 'Nombre' => 'John Doe', 'RegimenFiscal' => '601', ]));
查看结果
<cfdi:Emisor Rfc="XAXX010101000" Nombre="John Doe" RegimenFiscal="601"/>
接收者
在此节点中,应表达接收税务凭证的纳税人的信息。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Receptor; $cfdi = new CFDI(...); $cfdi->add(new Receptor([ 'Rfc' => 'XEXX010101000', 'Nombre' => 'John Doe', 'ResidenciaFiscal' => 'USA', 'NumRegIdTrib' => '121585958', 'UsoCFDI' => 'G03', ]));
查看结果
<cfdi:Receptor Rfc="XEXX010101000" Nombre="John Doe" ResidenciaFiscal="USA" NumRegIdTrib="121585958" UsoCFDI="G03"/>
税收
转让
凭证中的转让
use Kinedu\CfdiXML\CFDI; use Kinedu\CFDI\Node\Impuesto\Traslado; $cfdi = new CFDI([...]); $cfdi->add(new Traslado([ 'Impuesto' => '002', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.160000', 'Importe' => '4500', ], [], [ 'TotalImpuestosTrasladados' => '4500', ]));
查看结果
<cfdi:Impuestos TotalImpuestosTrasladados="4500"> <cfdi:Traslados> <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="4500"/> </cfdi:Traslados> </cfdi:Impuestos>
概念中的转让
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Concepto; use Kinedu\CFDI\Node\Impuesto\Traslado; $cfdi = new CFDI([...]); $concepto = new Concepto([...]); $concepto->add(new Traslado([ 'Base' => '4500', 'Impuesto' => '002', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.160000', 'Importe' => '720', ]));
查看结果
<cfdi:Conceptos> <cfdi:Concepto> <cfdi:Impuestos> <cfdi:Traslados> <cfdi:Traslado Base="4500" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="720"/> </cfdi:Traslados> </cfdi:Impuestos> </cfdi:Concepto> </cfdi:Conceptos>
保留
凭证中的保留
use Kinedu\CfdiXML\CFDI; use Kinedu\CFDI\Node\Impuesto\Retencion; $cfdi = new CFDI([...]); $cfdi->add(new Retencion([ 'Impuesto' => '002', 'Importe' => '4500', ], [], [ 'TotalImpuestosRetenidos' => '4500', ]));
查看结果
<cfdi:Impuestos TotalImpuestosRetenidos="4500"> <cfdi:Retenciones> <cfdi:Retencion Impuesto="002" Importe="4500"/> </cfdi:Retenciones> </cfdi:Impuestos>
概念中的保留
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Concepto; use Kinedu\CFDI\Node\Impuesto\Retencion; $cfdi = new CFDI([...]); $concepto = new Concepto([...]); $concepto->add(new Retencion([ 'Base' => '4500', 'Impuesto' => '003', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.530000', 'Importe' => '2385', ]));
查看结果
<cfdi:Conceptos> <cfdi:Concepto> <cfdi:Impuestos> <cfdi:Retenciones> <cfdi:Retencion Base="4500" Impuesto="003" TipoFactor="Tasa" TasaOCuota="0.530000" Importe="2385"/> </cfdi:Retenciones> </cfdi:Impuestos> </cfdi:Concepto> </cfdi:Conceptos>
概念
在此节点中,应表达在凭证中描述的货物或服务的详细信息。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Concepto; $cfdi = new CFDI(...); $cfdi->add(new Concepto([ 'ClaveProdServ' => '10317331', 'NoIdentificacion' => 'UT421511', 'Cantidad' => '24', 'ClaveUnidad' => 'H87', 'Unidad' => 'Pieza', 'Descripcion' => 'Arreglo de 24 tulipanes rosadas recién cortados', 'ValorUnitario' => '56.00', 'Importe' => '1344.00', 'Descuento' => '10.00', ]));
查看结果
<cfdi:Conceptos> <cfdi:Concepto ClaveProdServ="60121001" NoIdentificacion="UT421510" Cantidad="5.555555" ClaveUnidad="KGM" Unidad="Kilo" ValorUnitario="I"/> </cfdi:Conceptos>
部分
在此节点中,可以表达构成在互联网税务数字凭证中表达的概念整体的部分或组件。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Parte; use Kinedu\CfdiXML\Node\Concepto; $cfdi = new CFDI(...); $concepto = new Concepto([ 'ClaveProdServ' => '27113201', 'NoIdentificacion' => 'UT421456', 'Cantidad' => '1', 'ClaveUnidad' => 'KT', 'Unidad' => 'Kit', 'Descripcion' => 'Kit de destornillador', 'ValorUnitario' => '217.30', 'Importe' => '217.30', 'Descuento' => '0.00', ]); $tornillo = new Parte([ 'ClaveProdServ' => '31161500', 'NoIdentificacion' => 'UT367898', 'Cantidad' => '34', 'ClaveUnidad' => 'H87', 'Unidad' => 'Pieza', 'Descripcion' => 'Tornillo', 'ValorUnitario' => '00.20', 'Importe' => '6.80', ]); $tornilloPerno = new Parte([ 'ClaveProdServ' => '31161501', 'NoIdentificacion' => 'UT367899', 'Cantidad' => '14', 'ClaveUnidad' => 'H87', 'Unidad' => 'Pieza', 'Descripcion' => 'Tornillo de Perno', 'ValorUnitario' => '00.75', 'Importe' => '10.50', ]); $destornillador = new Parte([ 'ClaveProdServ' => '27111701', 'NoIdentificacion' => 'UT367900', 'Cantidad' => '2', 'ClaveUnidad' => 'H87', 'Unidad' => 'Pieza', 'Descripcion' => 'Destornillador', 'ValorUnitario' => '100.00', 'Importe' => '200.00', ]); $concepto->add($tornillo); $concepto->add($tornilloPerno); $concepto->add($destornillador); $cfdi->add($concepto);
查看结果
<cfdi:Conceptos> <cfdi:Concepto ClaveProdServ="27113201" NoIdentificacion="UT421456" Cantidad="1" ClaveUnidad="KT" Unidad="Kit" Descripcion="Kit de destornillador" ValorUnitario="217.30" Importe="217.30" Descuento="0.00"> <cfdi:Parte ClaveProdServ="31161500" NoIdentificacion="UT367898" Cantidad="34" ClaveUnidad="H87" Unidad="Pieza" Descripcion="Tornillo" ValorUnitario="00.20" Importe="6.80"/> <cfdi:Parte ClaveProdServ="31161501" NoIdentificacion="UT367899" Cantidad="14" ClaveUnidad="H87" Unidad="Pieza" Descripcion="Tornillo de Perno" ValorUnitario="00.75" Importe="10.50"/> <cfdi:Parte ClaveProdServ="27111701" NoIdentificacion="UT367900" Cantidad="2" ClaveUnidad="H87" Unidad="Pieza" Descripcion="Destornillador" ValorUnitario="100.00" Importe="200.00"/> </cfdi:Concepto> </cfdi:Conceptos>
海关信息
在此节点中,应表达与每个概念相关的海关信息,当涉及进口商品的一手销售时。
use Kinedu\CfdiXML\CFDI; use Kinedu\CfdiXML\Node\Concepto; use Kinedu\CfdiXML\Node\InformacionAduanera; $cfdi = new CFDI(...); $concepto = new Concepto(...); $concepto->add(new InformacionAduanera([ 'NumeroPedimento' => '00 00 0000 0000000', ])); $cfdi->add($concepto);
查看结果
<cfdi:Conceptos> <cfdi:Concepto ClaveProdServ="60121001" NoIdentificacion="UT421510" Cantidad="5.555555" ClaveUnidad="KGM" Unidad="Kilo" ValorUnitario="I"> <cfdi:InformacionAduanera NumeroPedimento="00 00 0000 0000000"/> </cfdi:Concepto> </cfdi:Conceptos>
许可证
CFDI XML采用MIT许可证,如需了解更多信息,请查看本存储库中的许可证文件。