jueves, 6 de junio de 2019

Ejecutar script SQL con Postgres & Docker

Muchas veces, al ejecutar un contenedor Docker para Postgres, deseamos inicializar el servidor o la base de datos creada con ciertos scripts previamente creados. En este artículo les mostraré cómo ejecutar un contenedor para Postgres agregando las dos siguientes actividades:

1. Ejecutar un script para inicializar las tablas maestras
Esto normalmente se realiza con la instrucción:
psql -U postgres veronica < veronica.sql
Pero en el caso de Docker, podemos agregar el script al directorio /docker-entrypoint-initdb.d/ y Docker ejecutará automáticamente dicho script luego de iniciar el servicio de base de datos.

2. Agregar una llave para encriptación que será utilizada por la extensión pgcrypto.
Si no utilizamos docker, bastaría con realizar lo siguiente
postgres -c encrypt.key=a_secret_key
Ahora, ambas configuraciones se pueden hacer también directamente con Docker tal como se muestra en el siguiente Dockerfile:
FROM postgres:11.3

# About the author
MAINTAINER Rolando Rodríguez <rolando.roc@gmail.com>

# Environment variables

# Set Postgres environment variables
ENV POSTGRES_PASSWORD=123456 
    POSTGRES_USER=postgres 
    POSTGRES_DB=sample

# Get a sql script and move it to initialization scripts folder
ADD https://raw.githubusercontent.com/rolandopalermo/veronica/master/veronica-app/src/main/postgres/veronica.sql /docker-entrypoint-initdb.d/

# Make sql script executable
RUN chmod 744 /docker-entrypoint-initdb.d/veronica.sql

# Expose the PostgreSQL port
EXPOSE 5432

# Run a command, for example: $ postgres -c encrypt.key=8qxBjzCdQkwdpu
CMD ["postgres", "-c", "encrypt.key=8qxBjzCdQkwdpu"]
Para más información, puedes revisar el siguiente repositorio: https://github.com/rolandopalermo/dockerfiles/tree/master/postgres-run-sql-command

miércoles, 22 de mayo de 2019

Clean out your Docker images, containers and volumes

Cleaning up containers
Kill all running containers
> docker kill $(docker ps -q)
Delete all stopped containers
> docker rm $(docker ps -a -q)
Cleaning up images
Delete an image
> docker rmi <image name>
Delete all 'untagged/dangling' images
> docker rmi $(docker images -q -f dangling=true)
Delete all images
> docker rmi $(docker images -q)
Cleaning up volumnes
Once a volume is not longer associated with a container, it is considered 'dangling'
> docker volume rm $(docker volume ls -f dangling=true -q)

jueves, 16 de mayo de 2019

How to remove namespaces from XML using XSLT

Sometimes, XML documents you receive could contain unneeded or incorrect namespace information. You can use XSLT stylesheets to remove the namespace information in these documents.

XML Input
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:reportRequest xmlns:ns1="http://v1.dto.reports.rolandopalermo.com">
    <ns1:metadata>
        <ns1:account>12345678</ns1:account>
        <ns1:reportName>Current_Payment</ns1:reportName>
    </ns1:metadata>
    <ns1:report>
        <ns1:reportId>1</ns1:reportId>
        <ns1:header>
            <ns1:id>999999999</ns1:id>
            <ns1:name>John Smith</ns1:name>
        </ns1:header>
        <ns1:invoices>
            <ns1:invoice>
                <ns1:invoiceNumber>0000000000</ns1:invoiceNumber>
                <ns1:dueDate>07/01/18</ns1:dueDate>
                <ns1:invoiceAmount>14.00</ns1:invoiceAmount>
                <ns1:amountPaid>14.00</ns1:amountPaid>
            </ns1:invoice>
        </ns1:invoices>
        <ns1:paymentMethodInformation>
            <ns1:cardType>VISA</ns1:cardType>
            <ns1:cardName>************1111</ns1:cardName>
            <ns1:cardHolder>Juan Pérez</ns1:cardHolder>
            <ns1:authorizationCode>dd92c0f864ea9ff1016501e880d03451</ns1:authorizationCode>
        </ns1:paymentMethodInformation>
    </ns1:report>
</ns1:reportRequest>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:ns1="http://v1.dto.reports.rolandopalermo.com">
    <xsl:template match="/">
        <xsl:apply-templates
            select="ns1:reportRequest/ns1:report" />
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:copy />
    </xsl:template>
</xsl:stylesheet>
XML Output
<?xml version="1.0" encoding="UTF-8"?>
<report>
    <reportId>1</reportId>
    <header>
        <id>999999999</id>
        <name>John Smith</name>
    </header>
    <invoices>
        <invoice>
            <invoiceNumber>0000000000</invoiceNumber>
            <dueDate>07/01/18</dueDate>
            <invoiceAmount>14.00</invoiceAmount>
            <amountPaid>14.00</amountPaid>
        </invoice>
    </invoices>
    <paymentMethodInformation>
        <cardType>VISA</cardType>
        <cardName>************1111</cardName>
        <cardHolder>Juan Pérez</cardHolder>
        <authorizationCode>dd92c0f864ea9ff1016501e880d03451</authorizationCode>
    </paymentMethodInformation>
</report>

miércoles, 15 de mayo de 2019

Cliente para consumo de servicios Web de la DIAN con Java

Hace ya algunos meses se viene implementando el tema de facturación electrónica en Colombia, lo cual ha conllevado a muchos desarrolladores de software a una intensa búsqueda de recursos en internet que le permitan completar el objetivo de llevar a sus respectivas empresas a la emisión exitosa de comprobantes electrónicos. 

Sin embargo, el camino definitivamente no será fácil debido a la pobre documentación que la DIAN pone a disposición. Este escenario es muy común en países de Latinoamérica; ya hace algunos años tuve la oportunidad de conocer el modelo de facturación electrónica de Ecuador, el cual adolecía de los mismos problemas de documentación. 

Ahora bien, para alegría de nuestros lectores, el día de hoy pongo a su alcance las URL's de los WSDL's de los servicios web de la DIAN, tanto para ambientes de Habilitación como de Operación. En la siguiente tabla muestro un listado de las tres operaciones que la DIAN pone a nuestra disposición: 

Consulta de documentos
Habilitación: https://facturaelectronica.dian.gov.co/habilitacion/B2BIntegrationEngine/FacturaElectronica/consultaDocumentos.wsdl
Operación: https://facturaelectronica.dian.gov.co/operacion/B2BIntegrationEngine/FacturaElectronica/consultaDocumentos.wsdl

Consulta de resoluciones
Habilitación: https://facturaelectronica.dian.gov.co/servicios/B2BIntegrationEngine-servicios/FacturaElectronica/consultaResolucionesFacturacion.wsdl
Operación: https://facturaelectronica.dian.gov.co/servicios/B2BIntegrationEngine-servicios/FacturaElectronica/consultaResolucionesFacturacion.wsdl

Emisión de comprobantes electrónicos
Habilitación: https://facturaelectronica.dian.gov.co/habilitacion/B2BIntegrationEngine/FacturaElectronica/facturaElectronica.wsdl
Operación: https://facturaelectronica.dian.gov.co/operacion/B2BIntegrationEngine/FacturaElectronica/facturaElectronica.wsdl

Y si ya logramos generar los clientes para el consumo de estos servicios Web, ahora es necesario configurar las cabeceras de seguridad que permitirán un apropiado consumo de estos servicios ¡Bastante trabajo el que nos esperar!

Pero no todas son malas noticias - ¿Se imaginan que al ejecutar el siguiente código Java podamos, por ejemplo, consultar un documento electrónico enviado a la DIAN?
public static void main(String[] args) throws MalformedURLException, DatatypeConfigurationException, ParseException {
    String identificadorSoftware = "";
    String password = "";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    EnvioConsultaDocumento request = new EnvioConsultaDocumento();
    //Métodos set omitidos
    DianSoapWSClient client = new DianSoapWSClient(identificadorSoftware, password, TipoAmbiente.HABILITACION);
    DocumentosRecibidos response = client.consultaResultadoValidacionDocumentos(request);
}
Luego de muchas vueltas a la documentación de la DIAN y apoyado en experiencias pasadas, se ha logrado la implementación de un cliente Jar que nos brinda una capa de abstración a toda la complejidad que exige la DIAN como parte del consumo de sus servicios.

Detalles del producto
Versión Java JDK 8
Modo de integración Artefacto Maven
Costo USD 75
Servicios soportados Emisión de facturas, consulta de documentos, consulta de resoluciones
Licenciamiento No posee restricciones de licencia

Datos de contacto
Skype rolandopalermo
Email rolando.roc@gmail.com
Facebook fb.com/rolandopalermo