📄 ¿Qué países de América Latina ya implementan la facturación electrónica?

La facturación electrónica no es solo una tendencia: es una transformación digital clave que ha cambiado los procesos administrativos, fiscales y tecnológicos en todo el continente. Esta práctica mejora el control fiscal, reduce el uso de papel y moderniza la forma en que las empresas reportan sus operaciones. En esta entrada te comparto una lista actualizada de países de América Latina que ya han implementado sistemas de facturación electrónica, junto con una breve descripción del estado actual en cada uno. 🌎 Tabla resumen por país País ¿Obligatoria? Autoridad fiscal Año Notas 🇲🇽 México Sí SAT 2011 (obligatoria desde 2014) CFDI, uso extendido 🇨🇱 Chile Sí SII 2003 Uno de los pioneros 🇧🇷 Brasil Sí SEFAZ 2006 Muy avanzado, múltiples tipos 🇨🇴 Colombia Sí DIAN 2019 Implementación por etapas 🇵🇪 Perú Sí SUNAT 2018 Masificación progresiva 🇦🇷 Argentina Sí AFIP 2007 Amplio alcance 🇺🇾 Uruguay Sí DGI 2012 e-Factura 🇵🇾 Paraguay En expansión SET 2022 (voluntaria...

📌 Arreglos Dinámicos en Progress 4gl: Cómo Usarlos Eficientemente

En el post de esta semana vamos a platicar de un ejemplo en lenguaje Progress 4gl para hacer arreglos ( en mi caso solo vector que es un arreglo de solo una dimensión) dinámicas, cuando decimos que es dinámico es decir podemos definir de tamaño variable una matriz (Algebra líneal), quizá con una imagen sea más fácil de entenderlo

Una Matriz
Algebra Lineal y Programación

Un Vector





La ventaja de un arreglo dinámico es que si no sabes cual es el tamaño exacto de un vector para poder realizar un programa o una operación, lo mejor es para no utilizar memoria demás es definir un arreglo dinámico, en Java  por ejemplo son arreglos que van cambiando de tamaño con forme  se agregan elementos , la instrucción es dynamic array. En Python  por ejemplo no definimos el tamaño de los vectores y matrices, este se va modificando, conforme nosotros modifiquemos los datos. Progress tiene algo que realiza esta función que es utilizando la palabra Extent, esta instrucción nos permite definir un vector sin tamaño al inicio de un programa por ejemplo

DEF VAR arr_col         AS CHARACTER NO-UNDO EXTENT .

Más adelante en el programa cuando ya sabemos el tamaño, actualizamos el dato asi:

EXTENT(arr_col) = vc-totcol.


Por ejemplo yo lo utilice para un reporte que dependiendo de las marcas que encontrara en una tabla fueran las columnas del reporte y las filas serías los códigos de artículos, todo esto lo envié a una tabla temporal y después mostré los datos y como esto no era estático, cree el reporte de manera dinámica y utilice 2 vectores uno para las marcas y otro para los números de parte y para mostrar el resultado busco en la tabla temporal con dos bucles o ciclos uno que va leyendo las filas y otro que va leyendo las columnas y hace un for each con los datos que cumplen las 2 condiciones. 

vc-totrow = 0.
vc-totcol = 0.

FOR EACH ttresult NO-LOCK BREAK BY marca :
    
  IF LAST-OF(marca) THEN DO:
     vc-totrow =  vc-totrow + 1.
  END.  
END.

FOR EACH ttresult NO-LOCK BREAK BY part:
   IF LAST-OF(part) THEN DO:
    vc-totcol =  vc-totcol + 1.
   END.
END.

vc-indc = 1.
vc-indr = 1.

EXTENT(arr_col) = vc-totcol.

EXTENT(arr_row) = vc-totrow.


FOR EACH ttresult NO-LOCK BREAK BY marca:
    
  IF LAST-OF(marca) THEN DO:
     arr_row[vc-indr] = marca.
vc-indr = vc-indr + 1.
  END.  
END.

FOR EACH ttresult BREAK BY parte:
   IF LAST-OF(parte) THEN DO:
    arr_col[vc-indc] = parte .
vc-indc= vc-indc + 1.
   END.

END.


OUTPUT STREAM s-excel TO VALUE(vc-exc-file) PAGE-SIZE 0.

/* Headers */
PUT STREAM s-excel UNFORMATTED 
    "Marca"   "~011".

DO iy = 1 TO EXTENT(arr_col):
   IF arr_col[iy] <> "" THEN 
  PUT STREAM s-excel UNFORMATTED arr_col[iy] "~011" .
END.
  
  PUT STREAM s-excel UNFORMATTED SKIP.

/*Detail*/  
  
DO ix = 1 TO EXTENT(arr_row):
      IF SUBSTRING(arr_row[ix],1,8) <> "" THEN DO:   
     PUT STREAM s-excel UNFORMATTED 
         SUBSTRING(arr_row[ix],1,8)   "~011"
         TRIM(SUBSTRING(arr_row[ix],10,8)) "~011".
END.  
  DO iy = 1 TO EXTENT(arr_col):
  
 
  FIND FIRST ttresult WHERE marca = SUBSTRING(arr_row[ix],1,8) 
          AND parte       = arr_col[iy] NO-LOCK NO-ERROR.
   
  IF AVAIL ttresult AND arr_col[iy] <> ""   THEN DO:
   
     PUT STREAM s-excel UNFORMATTED 
     cantidad "~011".
END.
 
IF NOT AVAIL ttresult AND arr_col[iy] <> "" THEN DO:
     PUT STREAM s-excel UNFORMATTED 
     "0.00" "~011".
END.
 
  END. /* DO iy = 1 TO EXTENT(arr_col): */
   PUT STREAM s-excel UNFORMATTED SKIP.
END.  /* DO ix = 1 TO EXTENT(arr_row): */


OUTPUT STREAM s-excel CLOSE.

El resultado de ejecutar este programa es como la siguiente imagen



El tiempo de ejecución no es demorado y muestra la información de manera fácil para los usuarios.

Otros artículos en este blog acerca de Progress 4gl

Espero este programa les sea de utilidad, compartan el post y nos sigan en el #programacionparatodos  y en nuestra página de Facebook

Comentarios

🚀 Mantener este blog funcionando requiere tiempo y café. ¡Puedes contribuir con uno aquí!

Entradas más populares de este blog

Guía Práctica: Ejemplo Completo de ASPX para Desarrolladores Web

📊 Automatiza tu trabajo: Convierte tablas de Word a Excel con una macro

API de banxico para obtener tipo de cambio utilizando Javascript