Por ahora idéntica a leanucci/bravo, solo he modificado el ejemplo de este Readme, que fallaba debido a que faltaba el campo document_number / DocNro.
Bravo permite la obtención del C.A.E. (Código de Autorización Electrónico) por medio del Web Service de Facturación Electrónica provisto por AFIP.
Para poder autorizar comprobantes mediante el WSFE, AFIP requiere de ciertos pasos detallados a continuación:
- Generar una clave privada para la aplicación.
- Generar un CSR (Certificate Signing Request) utilizando el número de CUIT que emitirá los comprobantes y la clave privada del paso anterior. Se deberá enviar a AFIP el CSR para obtener el Certificado X.509 que se utilizará en el proceso de autorización de comprobantes.
- Para el entorno de Testing, se debe enviar el X.509 por email a webservices@afip.gov.ar.
- Para el entorno de Producción, el trámite se hace a través del portal AFIP
- El certificado X.509 y la clave privada son utilizados por Bravo para obtener el token y signature a incluir en el header de autenticacion en cada request que hagamaos a los servicios de AFIP.
Para cumplir con los requisitos de encriptación del Web Service de Autenticación y Autorización (WSAA), Bravo requiere OpenSSL en cualquier versión posterior a la 1.0.0a.
Como regla general, basta correr desde la línea de comandos openssl cms
Si el comando cms
no está disponible, se debe actualizar OpenSSL.
AFIP exige para acceder a sus Web Services, la utilización del WSAA. Este servicio se encarga de la autorización y autenticación de cada request hecho al web service.
Una vez instalada la version correcta de OpenSSL, podemos generar la clave privada y el CSR.
Luego de haber obtenido el certificado X.509, podemos comenzar a utilizar Bravo en el entorno para el cual sirve el certificado.
Bravo no asume valores por defecto, por lo cual hay que configurar de forma explícita todos los parámetros:
pkey
ruta a la clave privadacert
ruta al certificado X.509cuit
el número de CUIT para el que queremos emitir los comprobantessale_point
el punto de venta a utilizar (ante la duda consulte a su contador)default_concepto, default_documento y default_moneda
estos valores pueden configurarse para no tener que pasarlos cada vez que emitamos un comprobante, ya que no suelen cambiar entre comprobantes emitidos por el mismo vendedor.own_iva_cond
condicion propia ante el IVAopenssl_bin
path al ejecutable de OpenSSL
Ejemplo de configuración tomado del spec_helper de Bravo:
require 'bravo'
# Set up Bravo defaults/config.
Bravo.pkey = 'spec/fixtures/certs/pkey'
Bravo.cert = 'spec/fixtures/certs/cert'
Bravo.cuit = '20085617517'
Bravo.sale_point = '0004'
Bravo.default_concepto = 'Servicios'
Bravo.default_moneda = :peso
Bravo.own_iva_cond = :responsable_inscripto
Bravo.openssl_bin = '/usr/bin/openssl'
Bravo::AuthData.environment = :test
Bravo.logger.log = true
Para emitir un comprobante, basta con:
- instanciar la clase
Bill
, - instanciar al menos una clase Bill::Invoice
- pasarle los parámetros típicos del comprobante, como si lo llenásemos a mano,
- llamar el método
authorize
, para que el WSFE autorice el comprobante que acabamos de 'llenar':
Luego de configurar Bravo, autorizamos una factura:
- Comprobante: Factura
- Tipo: 'B'
- A: consumidor final
- Total: $ 100 (si fuera una factura tipo A, este valor es el neto, y Bravo calcula el IVA correspondiente)
Código de ejemplo para la configuración anterior:
puts "Let's issue a Factura for 100 ARS to a Consumidor Final"
# Creamos un Bill de tipo Factura B
bill_b = Bravo::Bill.new(bill_type: :bill_b,
invoice_type: :invoice)
# Creamos un Invoice y pasamos total, tipo de documento, condición de IVA
# del receptor y porcentaje de IVA a aplicar. (0% o 21% para consumidor final)
invoice = Bravo::Bill::Invoice.new(total: 100.0,
document_type: 'DNI',
iva_condition: :consumidor_final,
iva_type: :iva_21)
# Agregamos DNI o CUIT
invoice.document_number = '36025649'
# Agregamos este Invoice al Bill
bill_b.set_new_invoice(invoice)
# Enviamos la solicitud a la AFIP
bill_b.authorize
puts "Authorization result = #{ bill_b.authorized? }"
puts "Authorization response."
puts bill_b.response
- Comprobante: Credit Note
- Tipo: 'B'
- A: consumidor final
- Total: $ 100
Código de ejemplo para la configuración anterior:
puts "Let's issue a Credit Note for 100 ARS to a Consumidor Final"
# Creamos un Bill de tipo CreditNote B
bill_b = Bravo::Bill.new(bill_type: :bill_b,
invoice_type: :credit)
invoice = Bravo::Bill::Invoice.new(total: 100.0,
document_type: 'DNI',
iva_condition: :consumidor_final,
iva_type: :iva_21)
# Agregamos DNI o CUIT
invoice.document_number = '36025649'
# Asociamos la Nota de Credito con alguna/s Factura/s (* New AFIP requirement)
invoice.cbte_asocs = [
{
type: '01', # 01 Invoice
sale_point: '0004',
number: '00000052', # Numero de factura asociada
}
]
# Agregamos este Invoice al Bill
bill_b.set_new_invoice(invoice)
# Enviamos la solicitud a la AFIP
bill_b.authorize
puts "Authorization result = #{ bill_b.authorized? }"
puts "Authorization response."
puts bill_b.response
rdoc- mensajes de error más completos
- Emilio Tagua por sus consejos y contribuciones.
Copyright (c) 2010 Leandro Marcucci & Vurbia Technologies International Inc. See LICENSE.txt for further details.