codelko/ciberfactura

电子发票发行库


README

简化CFDI v3.3创建和盖章过程的库

安装

要开始安装库,需要在Laravel根目录的composer.json中添加依赖。

{
    "require": {
        "codelko/ciberfactura": "0.1.*"
    }
}

Laravel 5.4

注册以下Service Provider和Alias

// config/app.php

'providers' => [
    Codelko\Ciberfactura\CiberfacturaServiceProvider::class,
];

'aliases' => [
    'Cfdi' => Codelko\Ciberfactura\Facades\Cfdi::class,
];

接下来,发布默认配置。

php artisan vendor:publish --provider="Codelko\Ciberfactura\CiberfacturaServiceProvider"

此命令除了创建配置文件config/packages/codelko/ciberfactura/config.php外,还会创建一组文件,包含创建CFDI所需表的迁移。

为了使配置正确工作,我们需要在.env文件中定义环境变量及其适当的值。

此库可用来通过Smarter Web发出发票,Smarter Web是SAT认证的授权提供商。

迁移

在测试库功能之前,需要执行创建存储CFDI的表的迁移。

php artisan migrate

执行此命令后,将创建集成库所需的所有必要表,以及SAT提供的目录,这些目录对于版本3.3的发票发行是必需的。

  • 凭证类型
  • 税务制度
  • 支付方式
  • 支付方法
  • 税种
  • 货币
  • 国家
  • 因素类型
  • 关系类型
  • CFDI用途
  • 单位
  • 产品和/或服务
    • 类型
    • 分段
    • 家族
    • 类别

代码示例

    DB::beginTransaction();

    $cfdi_factura = CfdiFactura::create([
        'version' => 3.3,
        'serie' => 'AS',
        'folio' => '3972',
        'fecha' => str_replace(" ", "T", date("Y-m-d H:i:s")),
        'forma_pago' => "03",
        'sub_total' => 1000,
        'descuento' => 0,
        'moneda' => 'MXN',
        'total' => 1000,
        'tipo_de_comprobante' => 'I',
        'metodo_pago' => 'PUE',
        'lugar_expedicion' => '46600',
        'condiciones_de_pago' => 'Condiciones No Definidas'
    ]);

    $cfdi_factura->addEmisor([
        'rfc' => 'AAA010101AAA',
        'nombre' => 'ACCEM SERVICIOS EMPRESARIALES SC',
        'regimen_fiscal' => '601'
    ]);

    $cfdi_factura->addReceptor([
        'rfc' => 'VECR8307073J1',
        'nombre' => 'Ramiro Alonso Vera Contreras',
        'residencia_fiscal' => 'MEX',
        'num_reg_id_trib' => '',
        'uso_cfdi' => 'G03'
    ]);

    $cfdi_concepto = $cfdi_factura->addConcepto([
        'cfdi_id' => $cfdi_factura->id,
        'clave_prod_serv' => '10151810',
        'no_identificacion' => '',
        'cantidad' => 5,
        'clave_unidad' => 'E49',
        'unidad' => 'Litro',
        'descripcion' => 'Concepto de Prueba 1',
        'valor_unitario' => 100.00,
        'importe' => 500.00,
        'descuento' => 0.00
    ]);

    $cfdi_concepto->addImpuesto([
        'cfdi_id' => $cfdi_factura->id,
        'type' => 'retencion',
        'base' => 500.00,
        'impuesto' => '001',
        'tipo_factor' => 'Tasa',
        'tasa_o_cuota' => 0.1600,
        'importe' => 80.00
    ]);

    $cfdi_concepto = $cfdi_factura->addConcepto([
        'cfdi_id' => $cfdi_factura->id,
        'clave_prod_serv' => '10151810',
        'no_identificacion' => '',
        'cantidad' => 5,
        'clave_unidad' => 'E49',
        'unidad' => 'Litro',
        'descripcion' => 'Concepto de Prueba 2',
        'valor_unitario' => 100.00,
        'importe' => 500.00,
        'descuento' => 0.00
    ]);

    $cfdi_concepto->addImpuesto([
        'type' => 'traslado',
        'base' => 500.00,
        'impuesto' => '002',
        'tipo_factor' => 'Tasa',
        'tasa_o_cuota' => 0.1600,
        'importe' => 80.00
    ]);

    $cfdi = new Cfdi();
    $cfdi->setTimbrador(new CfdiTimbrador($cfdi->rfc, $cfdi->certificate, $cfdi->production));

    $cfdi->load($cfdi_factura);

    $sello = $cfdi->sellar();

    $uuid = $cfdi->timbrar();

    $xml = $cfdi->xml();

    DB::commit();