Ejemplos de Código

Ejemplos completos de uso

Casos de uso reales con código completo para integrar Atto en tu aplicación. Copia y adapta estos ejemplos a tus necesidades.

Factura Electrónica Completa

Ejemplo completo de una factura electrónica con múltiples items, formas de pago y toda la información del receptor.

POST
/factura/emitir
Emite una factura electrónica para consumidor final con IVA incluido
https://api.atto.sv/factura/emitir
factura-completa.js
1const axios = require('axios');
2
3class DTEClient {
4  constructor(apiKey, baseURL = 'https://api.atto.sv') {
5    this.api = axios.create({
6      baseURL,
7      headers: {
8        'Content-Type': 'application/json',
9        'X-API-Key': apiKey
10      }
11    });
12  }
13
14  async emitirFactura(datos) {
15    try {
16      const response = await this.api.post('/factura/emitir', datos);
17      return {
18        success: true,
19        data: response.data
20      };
21    } catch (error) {
22      return {
23        success: false,
24        error: error.response?.data || error.message
25      };
26    }
27  }
28
29  async consultarEstado(codigoGeneracion) {
30    try {
31      const response = await this.api.get(`/factura/estado/${codigoGeneracion}`);
32      return response.data;
33    } catch (error) {
34      throw new Error(error.response?.data?.message || 'Error al consultar estado');
35    }
36  }
37}
38
39// Uso del cliente
40const dte = new DTEClient('sk_live_tu_api_key');
41
42const facturaCompleta = {
43  folio: 12345,
44  tipoMoneda: "USD",
45  
46  // Items de la factura
47  items: [
48    {
49      numItem: 1,
50      tipoItem: 1, // 1 = Bien, 2 = Servicio
51      codigo: "PROD001",
52      descripcion: "Laptop Dell Inspiron 15",
53      cantidad: 2,
54      uniMedida: 99, // 99 = Otros
55      precioUnitario: 800.00,
56      montoDescu: 50.00 // Descuento
57    },
58    {
59      numItem: 2,
60      tipoItem: 2,
61      codigo: "SERV001", 
62      descripcion: "Soporte técnico anual",
63      cantidad: 1,
64      uniMedida: 99,
65      precioUnitario: 200.00,
66      montoDescu: 0
67    }
68  ],
69
70  // Formas de pago
71  pagos: [
72    {
73      codigo: "02", // 02 = Cheque
74      montoPago: 900.00,
75      referencia: "Cheque #12345",
76      plazo: "01" // 01 = Al contado
77    },
78    {
79      codigo: "01", // 01 = Efectivo
80      montoPago: 850.00,
81      referencia: "Pago en efectivo"
82    }
83  ],
84
85  // Información del receptor
86  receptor: {
87    tipoDocumento: "36", // 36 = NIT
88    numDocumento: "0614-010190-103-1",
89    nrc: "123456-7",
90    nombre: "Empresa Receptora S.A. de C.V.",
91    codActividad: "10001",
92    descActividad: "Venta de productos tecnológicos",
93    direccion: {
94      departamento: "06", // San Salvador
95      municipio: "14", // San Salvador
96      complemento: "Col. Escalón, Av. Norte #123"
97    },
98    telefono: "2234-5678",
99    correo: "[email protected]"
100  }
101};
102
103// Emitir la factura
104async function ejemplo() {
105  const resultado = await dte.emitirFactura(facturaCompleta);
106  
107  if (resultado.success) {
108    console.log('✅ Factura emitida exitosamente');
109    console.log('Código:', resultado.data.codigoGeneracion);
110    
111    // Consultar estado después de 5 segundos
112    setTimeout(async () => {
113      const estado = await dte.consultarEstado(resultado.data.codigoGeneracion);
114      console.log('Estado actual:', estado);
115    }, 5000);
116  } else {
117    console.error('❌ Error:', resultado.error);
118  }
119}
120
121ejemplo();
Campos importantes

tipoItem

  • 1 = Bien (productos físicos)
  • 2 = Servicio (servicios prestados)

Códigos de pago

  • 01 = Efectivo
  • 02 = Cheque
  • 03 = Tarjeta de crédito
  • 04 = Tarjeta de débito
  • 05 = Transferencia bancaria

Mejores Prácticas

Manejo de Errores

Siempre valida las respuestas y maneja los errores apropiadamente.

  • • Verifica el status HTTP
  • • Lee los mensajes de error
  • • Implementa reintentos para errores temporales
  • • Registra los errores para debugging
Seguridad

Protege tu API key y datos sensibles.

  • • Nunca hardcodees tu API key
  • • Usa variables de entorno
  • • Implementa HTTPS siempre
  • • Rota las API keys periódicamente