Una forma alterna de generar XML

ML;NL(TL;DR): Si has hecho páginas con plantillas de HTML, puedes usar lo mismo para XML.

Si quieres ingresar facturas emitidas al sistema de SRI, tiene 2 formas: o tipeas esos datos manualmente usando el aplicacion Java que se baja en las pajinas de SRI, o generas archivos de algun formato que ellos puede entender e importar al aplicacion antemencionado.

Entre ellos, tuve un request de generar archivos XML compartible para declarar el “Anexo Transaccional Simplificado” (ATS).

La ficha tecnica de ATS se encuentra aqui

Basicamente, se requiere un archivo en XML que se ve asi:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<iva>
  <TipoIDInformante>R</TipoIDInformante>
  <IdInformante></IdInformante> <!-- RUC -->
  <razonSocial></razonSocial> <!-- nombre de la compania -->
  <totalVentas></totalVentas>
  <!-- mas campos emitidos -->
  <compras>
    <!-- una lista de compras -->
  </compras>
  <ventas>
    <!-- Aqui viene uno de estos por cada cliente -->
    <detalleVentas>
      <idCliente>123</idCliente>
      <valorRetIva>0.00</valorRetIva>
      <valorRetRenta>0.00</valorRetRenta>
      <!-- mas campos emitidos -->
    </detalleVentas>
  </ventas>
  <ventasEstablecimiento>
    <ventaEst>
      <codEstab>001</codEstab>
      <ventasEstab></ventasEstab>
    </ventaEst>
  </ventasEstablecimiento>

  <anulados>
    <!-- Aqui viene uno de estos por cada uno de facturas anulados -->
    <detalleAnulados>
      <tipoComprobante>01</tipoComprobante>
      <autorizacion>1111897538</autorizacion>
      <!-- mas campos emitidos -->
    </detalleAnulados>
  </anulados>
</iva>

Como ya he hecho un servicio REST que retorna JSON, asumí que retornar XML en vez de JSON no es muy diferente. Que consistirán pasos como:

  1. generar objetos con datos de bases de dato
  2. convertir objetos en un dictionario (dict).
  3. Convertir dict en XML (previamente en JSON, que es sincillamente llamando a json.dumps).

Googlee “python generate xml”, y llegué a la biblioteca de lxml. Me di cuenta que tener diccionario no sirve para un carajo, y hay que generar XML desde principio.

Planee de escribir un base class que generara XML como lo hice para dict con SerializableMixin aqui, luego crear 4 clases, para ventasEstablecimiento, detalleVentas, detalleAnulados, e iva (que contiene a los demas). Pero me puse vago por unos días…

Cuando volví a ver el problema, y viendo las páginas web que estoy haciendo con HTML. Se me pegó que HTML es XML, HTML es XML!! HTML es XML!!! (repite 3 veces para las cosas importantes). Y teniendo ya años escribiendo platillas que genera HTML, porque no uso lo mismo para XML!!.

Al final, escribí un plantilla de jinja2 aqui. Que es basicamente copia y pega del formato de arriba.

Han Qi

Han Qi
Cero vale todo

Dependency Injection in Bottle/Flask (Python)

Primer on Dependency Injection------------------------------In a system constructed in a object oriented fashion, we usuallyhave two type...… Continue reading