Nota: el proyecto se encuentra en desarrollo.
Para instalar el paquete mediante Composer.
composer require orlandocharles/cfdi
use Charles\CFDI\CFDI;
$cer = file_get_contents('.../csd/AAA010101AAA.cer.pem');
$key = file_get_contents('.../csd/AAA010101AAA.key.pem');
$cfdi = new CFDI([
'Serie' => 'A',
'Folio' => 'A0101',
'Fecha' => '2017-06-17T03:00:00',
'FormaPago' => '01',
'NoCertificado' => '00000000000000000000',
'CondicionesDePago' => '',
'Subtotal' => '',
'Descuento' => '0.00',
'Moneda' => 'MXN',
'TipoCambio' => '1.0',
'Total' => '',
'TipoDeComprobante' => 'I',
'MetodoPago' => 'PUE',
'LugarExpedicion' => '64000',
], $cer, $key);
En este nodo se debe expresar la información de los comprobantes fiscales relacionados con el que se ésta generando, se deben expresar tantos numeros de nodos de CfdiRelacionado, como comprobantes se requieran relacionar.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Relacionado;
$cfdi = new CFDI([...]);
$cfdi->add(new Relacionado([
'UUID' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
], [
'TipoRelacion' => '01',
]));
<cfdi:CfdiRelacionados TipoRelacion="01">
<cfdi:CfdiRelacionado UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"/>
</cfdi:CfdiRelacionados>
En este nodo se debe expresar la información del contribuyente que emite el comprobante fiscal.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Emisor;
$cfdi = new CFDI([...]);
$cfdi->add(new Emisor([
'Rfc' => 'XAXX010101000',
'Nombre' => 'Florería SA de CV',
'RegimenFiscal' => '601',
]));
<cfdi:Emisor Rfc="XAXX010101000" Nombre="Florería SA de CV" RegimenFiscal="601"/>
En este nodo se debe expresar la información del contribuyente receptor del comprobante.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Receptor;
$cfdi = new CFDI([...]);
$cfdi->add(new Receptor([
'Rfc' => 'XEXX010101000',
'Nombre' => 'Orlando Charles',
'ResidenciaFiscal' => 'USA',
'NumRegIdTrib' => '121585958',
'UsoCFDI' => 'G01',
]));
<cfdi:Receptor Rfc="XEXX010101000" Nombre="Orlando Charles" ResidenciaFiscal="USA" NumRegIdTrib="121585958" UsoCFDI="G01"/>
En este nodo se debe expresar la información detallada de un bien o servicio descrito en el comprobante.
use Charles\CFDI\CFDI;
use Charles\CFDI\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->add(new Concepto([
'ClaveProdServ' => '10317352',
'NoIdentificacion' => 'UT421510',
'Cantidad' => '12',
'ClaveUnidad' => 'H87',
'Unidad' => 'Pieza',
'Descripcion' => 'Arreglo de 12 tulipanes rojos recién cortados',
'ValorUnitario' => '66.00',
'Importe' => '792.00',
'Descuento' => '5.00',
]));
<cfdi:Conceptos>
<cfdi: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:Concepto ClaveProdServ="10317352" NoIdentificacion="UT421510" Cantidad="12" ClaveUnidad="H87" Unidad="Pieza" Descripcion="Arreglo de 12 tulipanes rojos recién cortados" ValorUnitario="66.00" Importe="792.00" Descuento="5.00"/>
</cfdi:Conceptos>
En este nodo se debe expresar la información detallada de una retención de un impuesto específico.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Impuesto\Retencion;
$cfdi->add(new Retencion([
'Impuesto' => '002',
'Importe' => '35000',
]));
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Concepto;
use Charles\CFDI\Node\Impuesto\Retencion;
$cfdi = new CFDI([...]);
$concepto = 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',
]);
$concepto->add(new Retencion([
]));
$cfdi->add($concepto);
En este nodo se debe expresar la información detallada de un traslado de impuesto específico.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Impuesto\Traslado;
$cfdi->add(new Traslado([
'Impuesto' => '001',
'TipoFactor' => 'Tasa',
'TasaOCuota' => '0.160000',
'Importe' => '23000',
]));
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Concepto;
use Charles\CFDI\Node\Impuesto\Traslado;
$cfdi = new CFDI([...]);
$concepto = 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',
]);
$concepto->add(new Traslado([
]));
$cfdi->add($concepto);
En este nodo se debe expresar la información aduanera correspondiente a cada concepto cuando se trate de ventas de primera mano de mercancías importadas
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Concepto;
use Charles\CFDI\Node\InformacionAduanera;
$cfdi = new CFDI([...]);
$concepto = 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',
]);
$concepto->add(new InformacionAduanera([
'NumeroPedimento' => '00 00 0000 0000000',
]));
$cfdi->add($concepto);
<cfdi:Conceptos>
<cfdi: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:InformacionAduanera NumeroPedimento="00 00 0000 0000000"/>
</cfdi:Concepto>
</cfdi:Conceptos>
En este nodo se puede expresar el número de cuenta predial con el que fue registrado el inmueble en el sistema catastral de la entidad federativa de que trate, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Concepto;
use Charles\CFDI\Node\CuentaPredial;
$cfdi = new CFDI([...]);
$concepto = new Concepto([...]);
$concepto->add(new CuentaPredial([
'Numero' => '00000',
]));
$cfdi->add($concepto);
En este nodo se pueden expresar las partes o componentes que integran la totalidad del concepto expresado en el comprobante fiscal digital por Internet.
use Charles\CFDI\CFDI;
use Charles\CFDI\Node\Concepto;
use Charles\CFDI\Node\Parte;
$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>
Este paquete no pertenece a ninguna comañia ni entidad gubernamental y esta bajo la Licencia MIT, si quieres saber más al respecto puedes ver el archivo de Licencia que se encuentra en este mismo repositorio.
Este proyecto ayuda a que otros desarrolladores ahorren horas de trabajo.