Tutorial

Contenido

  1. Requisitos
  2. Generación de una factura a partir de un template
  3. Verificación de una Factura
  4. Generar archivo PDF
  5. Generar archivo envío
  6. Verificar un archivo envío
  7. Enviar un archivo envío a SII
  8. Verificar el estado de recepción de una factura en SII
  9. Generar una factura en código
  1. Requisitos

    Asumimos que conoce el modelo de facturación electrónica en Chile, que ya bajo el software y que posee Java 1.6. Si tiene dudas, refiérase a la documentación disponible en Impuestos Internos https://palena.sii.cl/dte/menu.html

    Para poder generar documentos que sean aceptados por Impuestos Internos, debe poseer además un certificado digital de una autoridad reconocida por SII en un archivo con formato PKCS#12, estar inscrito en el ambiente de certificación de SII y haber obtenido una autorización de folios.

    La distribución viene de todas formas con una autorización (CAF) falsa y un certificado digital falso para efectos de aprendizaje y pruebas. Estos están disponibles en el directorio ejemplos. A continuación le mostramos los pasos básicos para operar, la distribución viene con unos scripts para facilitar el uso, utilice los scripts terminados en .sh para ambientes unixes, y los terminados en .bat para windows.

  2. Generación de una factura a partir de un template

    La clase cl.nic.dte.examples.GeneraFactura genera una factura a partir de una planilla. La planilla es un archivo XML con los datos de la factura pre llenados, pero sin el timbre ni la firma digital.

    Para generar una factura ejecute:

    cd ejemplos
    ../scripts/generafactura.sh -a Autorizacion.xml -p plantilla_documento.xml -c contribuyente1.p12 -s cert123 -o ejemploDte.xml

    La clase que invoca este script es cl.nic.dte.eamples.GeneraFactura

  3. Verificación de una Factura

    En este proceso se verifica el timbre, la estructura XML y la firma digital. Tenga presente que no verifica la validez del certificado digital con que fue firmada la factura ni si el contribuyente está autorizado por SII.

    Para verificar una factura ejecute:

    cd ejemplos
    ../scripts/verificafactura.sh ejemploDte.xml

    La clase que invoca este script es cl.nic.dte.eamples.VerificaFactura

  4. Generar archivo PDF

    Para generar el PDF, la biblioteca usa una transformación usando un stylesheet en el estándar XSL formatting objects (XSL-FO, http://www.w3.org/TR/xsl/). La implementación del estándar específica utilizada es Apache FOP (Formatting Objects Processor, http://xmlgraphics.apache.org/fop/).

    En este estándar, la especificación de como transformar el XML a PDF (o eventualmente a otros formatos) se describe en un archivo xml de stylesheet, en la distribución incluímos un ejemplo llamado plantilla_pdf.xsl.

    Tal como mencionamos en la página de inicio, actualmente el código de barras es generado con errores, estamos trabajando en una solución

    Para generar el archivo PDF ejecute:

    cd ejemplos
    ../scripts/generapdf.sh -p plantilla_pdf.xsl -o ejemploDte.pdf ejemploDte.xml

    La clase que invoca este script es cl.nic.dte.eamples.GeneraPDF

  5. Generar archivo envío

    La generación de un envío también requiere una plantilla para el encabezado. Recibe las opciones (Rut receptor, id, plantilla, password, archivo de resultado) y una lista de los documentos a incluir.

    Para generar el archivo de envio, para enviar a SII (RUT 6080300-K) ejecute:

    cd ejemplos
    ../scripts/generaenvio.sh -r 60803000-K --id test-envio -p plantilla_envio.xml -c contribuyente1.p12 -s cert123 -o ejemploEnvio.xml ejemploDte.xml

    La clase que invoca este script es cl.nic.dte.eamples.GeneraEnvio

  6. Verificar un archivo envío

    En este proceso se verifica el la estructura XML y la firma digital del envío, a la vez que la estructura XML, el timbre y la firma de cada documento contenido en el envío. Tenga presente que no verifica la validez del certificado digital con que fue firmado el envío o los documentos, tampoco verifica que usted sea el receptor correcto.

    Para verificar una archivo de envío ejecute:

    cd ejemplos
    ../scripts/verificaenvio.sh ejemploEnvio.xml

    La clase que invoca este script es cl.nic.dte.eamples.VerificaEnvio

  7. Enviar un archivo envío a SII

    En este proceso es necesario que tanto el archivo de envío como los documentos tributarios incluídos han sido firmados usando un certificado digital válidamente emitido por una autoridad reconocida por SII. También es necesario que los documentos tributarios hayan sido generados con autorizaciones de folios entregadas por SII y que la empresa emisora está registrada en el sistema así como el usuario que está enviado el archivo.

    Para efectos de ejemplo, asumimos que los archivos en el directorio ejemplos cumplen las condiciones (usted deberá usar su propio certificado y generar sus propias facturas). El RUT de la empresa emisora es 66666666-6.

    Para enviar un archivo de envío ejecute:

    cd ejemplos
    ../scripts/enviadocumento.sh -f 66666666-6 -c contribuyente1.p12 -s cert123 ejemploEnvio.xml

    La clase que invoca este script es cl.nic.dte.eamples.EnviaDocumento

  8. Verificar el estado de recepción de una factura en SII

    Usted puede verificar manualmente el estado de una factura en SII en https://palena.sii.cl/cgi_dte/UPL/DTEauth?6

    Para verificar automáticamente usando la biblioteca, es necesario que tenga un certificado digital válidamente emitido por una autoridad reconocida por SII.

    Para efectos de ejemplo, asumimos que la factura ejemploDte.xml fue enviada a SII.

    Para enviar el estado de la factura en SII ejecute:

    cd ejemplos
    ../scripts/verificaestadoensii.sh -c contribuyente1.p12 -s cert123 ejemploDte.xml

    La clase que invoca este script es cl.nic.dte.eamples.VerificaEstadoEnSII

  9. Generar una factura en código

    En este ejemplo se parte desde una plantilla rellena con los datos básicos del emisor, siguiendo nuestro ejemplo, supongamos que tenemos el archivo emisor.xml con contenido:


    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte">
    <Documento>
    <Encabezado>
    <Emisor>
    <RUTEmisor>10000000-8</RUTEmisor>
    <RznSoc>Acme Inc</RznSoc>
    <GiroEmis>Divertimento</GiroEmis>
    <Acteco>61911</Acteco>
    <Sucursal>Oficina Mulandia</Sucursal>
    <CdgSIISucur>1412</CdgSIISucur>
    <DirOrigen>Fantasia 2000</DirOrigen>
    <CmnaOrigen>Santiago</CmnaOrigen>
    <CiudadOrigen>Santiago</CiudadOrigen>
    </Emisor>
    </Encabezado>
    </Documento>
    </DTE>

    Primero cargo los datos del emisor del template

    DTEDocument doc = DTEDocument.Factory.parse(new File("emisor.xml"));

    A continuación le agrego un IdDoc y le asigno algunos valores (ID, folio, tipo, fecha emisión, fecha de pago, servicio, medioo y forma de pago).

    IdDoc iddoc = doc.getDTE().getDocumento().getEncabezado().addNewIdDoc();
    iddoc.setFolio(150);
    doc.getDTE().getDocumento().setID("N" + iddoc.getFolio());
    iddoc.setTipoDTE(BigInteger.valueOf(33));
    iddoc.xsetFchEmis(FechaType.Factory.newValue(Utilities.fechaFormat.format(new Date())));
    iddoc.setIndServicio(BigInteger.valueOf(3));
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.DAY_OF_MONTH, 45);
    iddoc.xsetFchCancel(FechaType.Factory.newValue(Utilities.fechaFormat.format(new Date())));
    iddoc.setMedioPago(MedioPagoType.Enum.forString("LT"));
    iddoc.setFmaPago(BigInteger.valueOf(2));

    Agrego los datos del receptor:

    Receptor recp = doc.getDTE().getDocumento().getEncabezado().addNewReceptor();
    recp.setRUTRecep("5555555-5");
    recp.setRznSocRecep("Warner Brothers");
    recp.setGiroRecep("Divertimento");
    recp.setContacto("Pinky y Cerebro");
    recp.setDirRecep("Embajada USA");
    recp.setCmnaRecep("Vitacura");
    recp.setCiudadRecep("Santiago");

    Los totales

    Totales tot = doc.getDTE().getDocumento().getEncabezado().addNewTotales();
    tot.setMntNeto(1000000);
    tot.setTasaIVA(BigDecimal.valueOf(19));
    tot.setIVA(190000);
    tot.setMntTotal(1190000);

    Agrego el detalles, en este ejemplo 2 ítemes

    Detalle[] det = new Detalle[2];
    det[0] = Detalle.Factory.newInstance();
    det[0].setNroLinDet(1);
    det[0].setNmbItem("Trampa correcaminos");
    det[0].setQtyItem(BigDecimal.valueOf(2));
    det[0].setPrcItem(BigDecimal.valueOf(350000));
    det[0].setMontoItem(700000);
    det[1] = Detalle.Factory.newInstance();
    det[1].setNroLinDet(2);
    det[1].setNmbItem("Insumos varios");
    det[1].setMontoItem(300000);
    doc.getDTE().getDocumento().setDetalleArray(det);

    Leo el folio de autorización (del archivo caf.xml) y timbro

    // Debo meter el namespace porque SII no lo genera
    HashMap namespaces = new HashMap();
    namespaces.put("", "http://www.sii.cl/SiiDte");
    XmlOptions opts = new XmlOptions();
    opts.setLoadSubstituteNamespaces(namespaces);
    AutorizacionType auth = AUTORIZACIONDocument.Factory.parse(new File("caf.xml"), opts).getAUTORIZACION();
    doc.getDTE().timbrar(auth.getCAF(), auth.getPrivateKey(null));

    Leo el certificado digital del archivo cert.p12, password cert123


    // leo certificado y llave privada del archivo pkcs12
    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(new FileInputStream("cert.p12"), "cert123".toCharArray());
    String alias = ks.aliases().nextElement();
    X509Certificate x509 = (X509Certificate) ks.getCertificate(alias);
    PrivateKey pKey = (PrivateKey) ks.getKey(alias, "cert123".toCharArray());

    Antes de firmar lo releo dándole formato, esto es porque una vez firmado no lo puedo modificar. Al formatear debo borrar los namespaces porque SII lo hace así (esto porque SII no respeta los estándares XML)


    opts = new XmlOptions();
    opts.setSaveImplicitNamespaces(namespaces);
    opts.setLoadSubstituteNamespaces(namespaces);
    opts.setSavePrettyPrint(); // trim de espacios en blanco
    opts.setSavePrettyPrintIndent(0); // Identación 0
    doc = DTEDocument.Factory.parse(doc.newInputStream(opts), opts);

    Finalmente firmo y guardo el archivo en documento.xml.

    doc.getDTE().sign(pKey, x509);
    opts = new XmlOptions();
    opts.setCharacterEncoding("ISO-8859-1");
    opts.setSaveImplicitNamespaces(namespaces);
    doc.save(new File("documento.xml"), opts);

    Este ejemplo está implementado en la clase cl.nic.dte.eamples.GeneraFacturaCompleta


Modificado por última vez el 23-12-2009 11:21:32