Afip SDK
Hacer una pregunta…
K
Links
💵

Factura electrónica

La especificación de este Web Service se encuentra disponible en https://www.afip.gob.ar/fe/ayuda/documentos/wsfev1-COMPG.pdf
Aquí hablaremos de comprobante indistintamente si es una factura, nota de crédito, etc.
Métodos disponibles
Métodos para obtener los tipos de datos
Otros métodos disponibles

Crear PDF

Obtener número del último comprobante creado

Node
PHP
Ruby
Python
// Numero de punto de venta
const puntoDeVenta = 1;
// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B
const lastVoucher = await afip.ElectronicBilling.getLastVoucher(puntoDeVenta, tipoDeComprobante);
// Numero de punto de venta
$punto_de_venta = 1;
// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_comprobante);
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)

Crear y asignar CAE a un comprobante

Node
PHP
Ruby
Python
Debemos utilizar el método createVoucher pasándole como parámetro un Objeto con los detalles del comprobante y si queremos tener la respuesta completa enviada por el WS debemos pasarle como segundo parámetro true, en caso de no enviarle el segundo parámetro nos devolverá como respuesta { CAE : CAE asignado el comprobante, CAEFchVto : Fecha de vencimiento del CAE (yyyy-mm-dd) }.
// Devolver respuesta completa del web service
const returnFullResponse = false;
const date = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];
// Info del comprobante
let data = {
'CantReg' : 1, // Cantidad de comprobantes a registrar
'PtoVta' : 1, // Punto de venta
'CbteTipo' : 6, // Tipo de comprobante (ver tipos disponibles)
'Concepto' : 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
'DocTipo' : 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
'DocNro' : 0, // Número de documento del comprador (0 consumidor final)
'CbteDesde' : 1, // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
'CbteHasta' : 1, // Número de comprobante o numero del último comprobante en caso de ser mas de uno
'CbteFch' : parseInt(date.replace(/-/g, '')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
'ImpTotal' : 121, // Importe total del comprobante
'ImpTotConc' : 0, // Importe neto no gravado
'ImpNeto' : 100, // Importe neto gravado
'ImpOpEx' : 0, // Importe exento de IVA
'ImpIVA' : 21, //Importe total de IVA
'ImpTrib' : 0, //Importe total de tributos
'MonId' : 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
'MonCotiz' : 1, // Cotización de la moneda usada (1 para pesos argentinos)
'Iva' : [ // (Opcional) Alícuotas asociadas al comprobante
{
'Id' : 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
'BaseImp' : 100, // Base imponible
'Importe' : 21 // Importe
}
],
};
const res = await afip.ElectronicBilling.createVoucher(data, returnFullResponse);
res['CAE']; //CAE asignado el comprobante
res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles En este ejemplo
Debemos utilizar el método CreateVoucher pasándole como parámetro un Array con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro TRUE, en caso de no enviarle el segundo parámetro nos devolverá como respuesta array(CAE => CAE asignado el comprobante, CAEFchVto => Fecha de vencimiento del CAE (yyyy-mm-dd)).
// Devolver respuesta completa del web service
$return_full_response = FALSE;
// Info del comprobante
$data = array(
'CantReg' => 1, // Cantidad de comprobantes a registrar
'PtoVta' => 1, // Punto de venta
'CbteTipo' => 6, // Tipo de comprobante (ver tipos disponibles)
'Concepto' => 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
'DocTipo' => 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
'DocNro' => 0, // Número de documento del comprador (0 consumidor final)
'CbteDesde' => 1, // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
'CbteHasta' => 1, // Número de comprobante o numero del último comprobante en caso de ser mas de uno
'CbteFch' => intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
'ImpTotal' => 121, // Importe total del comprobante
'ImpTotConc' => 0, // Importe neto no gravado
'ImpNeto' => 100, // Importe neto gravado
'ImpOpEx' => 0, // Importe exento de IVA
'ImpIVA' => 21, //Importe total de IVA
'ImpTrib' => 0, //Importe total de tributos
'MonId' => 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
'MonCotiz' => 1, // Cotización de la moneda usada (1 para pesos argentinos)
'Iva' => array( // (Opcional) Alícuotas asociadas al comprobante
array(
'Id' => 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
'BaseImp' => 100, // Base imponible
'Importe' => 21 // Importe
)
),
);
$res = $afip->ElectronicBilling->CreateVoucher($data, $return_full_response);
$res['CAE']; //CAE asignado el comprobante
$res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles En este ejemplo
Debemos utilizar el método createVoucher pasándole como parámetro un Hash con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro true, en caso de no enviarle el segundo parámetro nos devolverá como respuesta { "CAE": CAE asignado el comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd) }.
# Devolver respuesta completa del web service
return_full_response = FALSE
# Info del comprobante
data = {
"CantReg": 1, # Cantidad de comprobantes a registrar
"PtoVta": 1, # Punto de venta
"CbteTipo": 6, # Tipo de comprobante (ver tipos disponibles)
"Concepto": 1, # Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
"DocTipo": 99, # Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
"DocNro": 0, # Número de documento del comprador (0 consumidor final)
"CbteDesde": 1, # Número de comprobante o numero del primer comprobante en caso de ser mas de uno
"CbteHasta": 1, # Número de comprobante o numero del último comprobante en caso de ser mas de uno
"CbteFch": 20231220, # (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
"ImpTotal": 121, # Importe total del comprobante
"ImpTotConc": 0, # Importe neto no gravado
"ImpNeto": 100, # Importe neto gravado
"ImpOpEx": 0, # Importe exento de IVA
"ImpIVA": 21, # Importe total de IVA
"ImpTrib": 0, # Importe total de tributos
"MonId": "PES", # Tipo de moneda usada en el comprobante (ver tipos disponibles)("PES" para pesos argentinos)
"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)
"Iva": [ # (Opcional) Alícuotas asociadas al comprobante
{
"Id": 5, # Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
"BaseImp": 100, # Base imponible
"Importe": 21 # Importe
}
]
}
res = afip.ElectronicBilling.createVoucher(data, return_full_response)
res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
Debemos utilizar el método createVoucher pasándole como parámetro un Hash con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro true, en caso de no enviarle el segundo parámetro nos devolverá como respuesta { "CAE": CAE asignado el comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd) }.
# Devolver respuesta completa del web service
return_full_response = False
# Info del comprobante
data = {
"CantReg": 1, # Cantidad de comprobantes a registrar
"PtoVta": 1, # Punto de venta
"CbteTipo": 6, # Tipo de comprobante (ver tipos disponibles)
"Concepto": 1, # Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
"DocTipo": 99, # Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
"DocNro": 0, # Número de documento del comprador (0 consumidor final)
"CbteDesde": 1, # Número de comprobante o numero del primer comprobante en caso de ser mas de uno
"CbteHasta": 1, # Número de comprobante o numero del último comprobante en caso de ser mas de uno
"CbteFch": 20231220, # (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
"ImpTotal": 121, # Importe total del comprobante
"ImpTotConc": 0, # Importe neto no gravado
"ImpNeto": 100, # Importe neto gravado
"ImpOpEx": 0, # Importe exento de IVA
"ImpIVA": 21, # Importe total de IVA
"ImpTrib": 0, # Importe total de tributos
"MonId": "PES", # Tipo de moneda usada en el comprobante (ver tipos disponibles)("PES" para pesos argentinos)
"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)
"Iva": [ # (Opcional) Alícuotas asociadas al comprobante
{
"Id": 5, # Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
"BaseImp": 100, # Base imponible
"Importe": 21 # Importe
}
]
}
res = afip.ElectronicBilling.createVoucher(data, return_full_response)
res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)

Crear y asignar CAE a siguiente comprobante

Node
PHP
Ruby
Python
Debemos utilizar el método createNextVoucher pasándole como parámetro un Objeto con los detalles del comprobante al igual que el método createVoucher, nos devolverá como respuesta { CAE : CAE asignado al comprobante, CAEFchVto : Fecha de vencimiento del CAE (yyyy-mm-dd), voucher_number : Número asignado al comprobante }.
const res = await afip.ElectronicBilling.createNextVoucher(data);
res['CAE']; //CAE asignado el comprobante
res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
res['voucher_number']; //Número asignado al comprobante
Debemos utilizar el método CreateNextVoucher pasándole como parámetro un Array con los detalles del comprobante al igual que el método CreateVoucher, nos devolverá como respuesta array(CAE => CAE asignado al comprobante, CAEFchVto => Fecha de vencimiento del CAE (yyyy-mm-dd), voucher_number => Número asignado al comprobante).
$res = $afip->ElectronicBilling->CreateNextVoucher($data);
$res['CAE']; //CAE asignado el comprobante
$res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
$res['voucher_number']; //Número asignado al comprobante
Debemos utilizar el método createNextVoucher pasándole como parámetro un Hash con los detalles del comprobante al igual que el método createVoucher, nos devolverá como respuesta { "CAE" : CAE asignado al comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd), "voucher_number" : Número asignado al comprobante }.
res = afip.ElectronicBilling.createNextVoucher(data)
res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
res["voucher_number"] # Número asignado al comprobante
Debemos utilizar el método createNextVoucher pasándole como parámetro un Hash con los detalles del comprobante al igual que el método createVoucher, nos devolverá como respuesta { "CAE" : CAE asignado al comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd), "voucher_number" : Número asignado al comprobante }.
res = afip.ElectronicBilling.createNextVoucher(data)
res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
res["voucher_number"] # Número asignado al comprobante

Obtener información de un comprobante ya emitido

Con este método podemos obtener toda la información relacionada a un comprobante o simplemente saber si el comprobante existe.
Node
PHP
Ruby
Python
// Numero de comprobante
const numeroDeComprobante = 1;
// Numero de punto de venta
const puntoDeVenta = 1;
// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B
const voucherInfo = await afip.ElectronicBilling.getVoucherInfo(numeroDeComprobante, puntoDeVenta, tipoDeComprobante);
if(voucherInfo === null){
console.log('El comprobante no existe');
}
else{
console.log('Esta es la información del comprobante:');
console.log(voucherInfo);
}
// Numero de comprobante
$numero_de_comprobante = 1;
// Numero de punto de venta
$punto_de_venta = 1;
// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B
$voucher_info = $afip->ElectronicBilling->GetVoucherInfo($numero_de_comprobante, $punto_de_venta, $tipo_de_comprobante);
if($voucher_info === NULL){
echo 'El comprobante no existe';
}
else{
echo 'Esta es la información del comprobante:';
echo '<pre>';
print_r($voucher_info);
echo '</pre>';
}
# Numero de comprobante
numero_de_comprobante = 1
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)
puts "Esta es la información del comprobante:"
puts voucher_info
# Numero de comprobante
numero_de_comprobante = 1
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)
print("Esta es la información del comprobante:")
print(voucher_info)

Crear CAEA

Node
PHP
Ruby
Python
// Periodo del CAEA. (yyyymm)
const periodo = 202307;
// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
const orden = 1;
const caeaInfo = await afip.ElectronicBilling.createCAEA(periodo, orden);
// Periodo del CAEA. (yyyymm)
$periodo = 202307;
// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
$orden = 1;
$caea_info = $afip->ElectronicBilling->CreateCAEA($periodo, $orden);
# Periodo del CAEA. (yyyymm)
periodo = 202307
# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
orden = 1
caea_info = afip.ElectronicBilling.createCAEA(periodo, orden)
# Periodo del CAEA. (yyyymm)
periodo = 202307
# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
orden = 1
caea_info = afip.ElectronicBilling.createCAEA(periodo, orden)

Obtener información de CAEA ya emitido

Node
PHP
Ruby
Python
// Periodo del CAEA. (yyyymm)
const periodo = 202307;
// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
const orden = 1;
const caeaInfo = await afip.ElectronicBilling.getCAEA(periodo, orden);
// Periodo del CAEA. (yyyymm)
$periodo = 202307;
// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
$orden = 1;
$caea_info = $afip->ElectronicBilling->GetCAEA($periodo, $orden);
# Periodo del CAEA. (yyyymm)
periodo = 202307
# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
orden = 1
caea_info = afip.ElectronicBilling.getCAEA(periodo, orden)
# Periodo del CAEA. (yyyymm)
periodo = 202307
# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2
orden = 1
caea_info = afip.ElectronicBilling.getCAEA(periodo, orden)

Obtener puntos de venta disponibles

Es normal recibir un error en testing ya que no existen puntos de venta para testing (siempre se usa 1)
Node
PHP
Ruby
Python
const salesPoints = await afip.ElectronicBilling.getSalesPoints()
$sales_points = $afip->ElectronicBilling->GetSalesPoints();
sales_points = afip.ElectronicBilling.getSalesPoints
sales_points = afip.ElectronicBilling.getSalesPoints()

Obtener tipos de comprobantes disponibles

Node
PHP
Ruby
Python
const voucherTypes = await afip.ElectronicBilling.getVoucherTypes();
$voucher_types = $afip->ElectronicBilling->GetVoucherTypes();
voucher_types = afip.ElectronicBilling.getVoucherTypes
voucher_types = afip.ElectronicBilling.getVoucherTypes()

Obtener tipos de conceptos disponibles

Node
PHP
Ruby
Python
const conceptTypes = await afip.ElectronicBilling.getConceptTypes();
$concept_types = $afip->ElectronicBilling->GetConceptTypes();
concept_types = afip.ElectronicBilling.getConceptTypes
concept_types = afip.ElectronicBilling.getConceptTypes()

Obtener tipos de documentos disponibles

Node
PHP
Ruby
Python
const documentTypes = await afip.ElectronicBilling.getDocumentTypes();
$document_types = $afip->ElectronicBilling->GetDocumentTypes();
document_types = afip.ElectronicBilling.getDocumentTypes
document_types = afip.ElectronicBilling.getDocumentTypes()

Obtener tipos de alícuotas disponibles

Node
PHP
Ruby
Python
const aloquotTypes = await afip.ElectronicBilling.getAliquotTypes();
$aloquot_types = $afip->ElectronicBilling->GetAliquotTypes();
aloquot_types = afip.ElectronicBilling.getAliquotTypes
aloquot_types = afip.ElectronicBilling.getAliquotTypes()

Obtener tipos de monedas disponibles

Node
PHP
Ruby
Python
const currenciesTypes = await afip.ElectronicBilling.getCurrenciesTypes();
$currencies_types = $afip->ElectronicBilling->GetCurrenciesTypes();
currencies_types = afip.ElectronicBilling.getCurrenciesTypes
currencies_types = afip.ElectronicBilling.getCurrenciesTypes()

Obtener tipos de opciones disponibles para el comprobante

Node
PHP
Ruby
Python
const optionTypes = await afip.ElectronicBilling.getOptionsTypes();
$option_types = $afip->ElectronicBilling->GetOptionsTypes();
option_types = afip.ElectronicBilling.getOptionsTypes
option_types = afip.ElectronicBilling.getOptionsTypes()

Obtener tipos de tributos disponibles

Node
PHP
Ruby
Python
const taxTypes = await afip.ElectronicBilling.getTaxTypes();
$tax_types = $afip->ElectronicBilling->GetTaxTypes();
tax_types = afip.ElectronicBilling.getTaxTypes
tax_types = afip.ElectronicBilling.getTaxTypes()

Transformar formato de fecha que utiliza AFIP

De yyyymmdd a yyyy-mm-dd
Node
PHP
Ruby
Python
const date = afip.ElectronicBilling.formatDate('19970508'); //Nos devuelve 1997-05-08
$date = $afip->ElectronicBilling->FormatDate('19970508'); //Nos devuelve 1997-05-08
date = afip.ElectronicBilling.formatDate('19970508') # Nos devuelve 1997-05-08
date = afip.ElectronicBilling.formatDate('19970508') # Nos devuelve 1997-05-08

Obtener estado del servidor

No te confíes mucho de este método, AFIP siempre devuelve que esta todo bien incluso cuando hay algo fallando.
Node
PHP
Ruby
Python
const serverStatus = await afip.ElectronicBilling.getServerStatus();
console.log('Este es el estado del servidor:');
console.log(serverStatus);
$server_status = $afip->ElectronicBilling->GetServerStatus();
echo 'Este es el estado del servidor:';
echo '<pre>';
print_r($server_status);
echo '</pre>';
server_status = afip.ElectronicBilling.getServerStatus
puts "Este es el estado del servidor:"
puts server_status
server_status = afip.ElectronicBilling.getServerStatus()
print("Este es el estado del servidor:")
print(server_status)