Diferencia entre revisiones de «SIU-Arai/catalogos-cliente»

De SIU
Saltar a: navegación, buscar
 
(No se muestran 20 ediciones intermedias de otro usuario)
Línea 8: Línea 8:
 
== Instalación ==
 
== Instalación ==
  
**Consumo de la librería:**
+
=== Consumo de la librería ===
  
Agregar en el archivo **composer.json** de la aplicación cliente
+
Agregar en el archivo '''composer.json''' de la aplicación cliente
  
<code>
+
<source lang="php" enclose="div">
<nowiki>"repositories":  
+
"repositories":  
 
[
 
[
 
{
 
{
Línea 21: Línea 21:
 
],
 
],
 
"require": {
 
"require": {
         "siu/arai-cli": "v1.0"
+
         "siu/arai-cli": "v1.1.4"
}</nowiki>
+
}
</code>
+
</source>
  
Dentro de la ruta **/vendor/siu/arai-cli/src/SIU/AraiCli** se encuentra el archivo **Factory.php** donde se debe configurar
+
Dentro de la ruta '''/vendor/siu/arai-cli/src/SIU/AraiCli''' se encuentra el archivo '''Factory.php''' donde se debe configurar
  
<pre>
+
<source lang="php" enclose="div">
 
$container['arai-catalogos-path-logs'] = '/../../../logs/arai-catalogos-cli.log'; //PATH Y ARCHIVO DONDE SE ALMACENAN LOGS
 
$container['arai-catalogos-path-logs'] = '/../../../logs/arai-catalogos-cli.log'; //PATH Y ARCHIVO DONDE SE ALMACENAN LOGS
 
$container['arai-catalogos-logger'] = function ($c) {
 
$container['arai-catalogos-logger'] = function ($c) {
Línea 41: Línea 41:
 
     return $config;
 
     return $config;
 
};
 
};
</pre>
+
</source>
  
**Cambios en la base:** Se agregan tres nuevos campos a las tablas que pasan a convertirse en catálogos comunes, revisión que guarda el número de revisión asociado, id_arai que guarda el id global, y sincronizar es un flag que indica si ese registro debe ser sincronizado (para aquellos catálogos que cuenten con sincronización parcial de datos).
+
=== Cambios en la base ===
 +
 
 +
Se agregan tres nuevos campos a las tablas que pasan a convertirse en catálogos comunes, revisión que guarda el número de revisión asociado, id_arai que guarda el id global, y sincronizar es un flag que indica si ese registro debe ser sincronizado (para aquellos catálogos que cuenten con sincronización parcial de datos).
  
 
Para el catálogo Rubro el sql aplicado sería:
 
Para el catálogo Rubro el sql aplicado sería:
  
```
+
<source lang="sql" enclose="div">
 
ALTER TABLE anx_rubros
 
ALTER TABLE anx_rubros
 
ADD revision integer;
 
ADD revision integer;
Línea 56: Línea 58:
 
ALTER TABLE anx_rubros
 
ALTER TABLE anx_rubros
 
ADD sincronizar char(1) DEFAULT 'N';
 
ADD sincronizar char(1) DEFAULT 'N';
```
+
</source>
  
**Consumo de la librería en aplicación que utiliza SIU Toba**
+
=== Consumo de la librería en aplicación que utiliza SIU Toba ===
  
 
[[https://www.lucidchart.com/documents/embeddedchart/48e3dbb6-41e9-4b22-9487-17b4edb447de]]
 
[[https://www.lucidchart.com/documents/embeddedchart/48e3dbb6-41e9-4b22-9487-17b4edb447de]]
Línea 64: Línea 66:
 
Copiar el archivo cliente.ini  en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos con el contenido
 
Copiar el archivo cliente.ini  en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos con el contenido
  
```
+
<source lang="php" enclose="div">
 
[conexion]
 
[conexion]
 
;Recuerde dejar una barra (/) al finalizar la URL
 
;Recuerde dejar una barra (/) al finalizar la URL
Línea 71: Línea 73:
 
auth_usuario="USUARIO"
 
auth_usuario="USUARIO"
 
auth_password="CLAVE"
 
auth_password="CLAVE"
 
+
</source>
```
 
 
   
 
   
En **contexto_ejecucion_[proyecto].php** agregar, esto complementa el contenedor que utiliza la librería:
+
En '''contexto_ejecucion_[proyecto].php''' agregar, esto complementa el contenedor que utiliza la librería:
  
```
+
<source lang="php" enclose="div">
$container = \SIU\AraiCli\Factory::getContainer();
+
$container = \SIU\AraiCli\Factory::getContainer();
 +
$container['arai-catalogos-def-path'] = '/../../arai_definicion_catalogos.json'; //Archivo JSON donde está la definición de los catalogos
 +
$container['arai-catalogos-lista'] = function ($c) {
 +
$definition = json_decode(file_get_contents(__DIR__ . $c['arai-catalogos-def-path']), true);
 +
return $definition;
 +
};
  
 
//Configura el cliente guzzle, la configuración la toma del archivo cliente.ini  
 
//Configura el cliente guzzle, la configuración la toma del archivo cliente.ini  
 
ubicado en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos
 
ubicado en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos
 
 
$container['arai-catalogos-cliente'] = function ($c) {
 
$container['arai-catalogos-cliente'] = function ($c) {
$cliente = toba::servicio_web_rest('arai-catalogos');
+
    $cliente = toba::servicio_web_rest('arai-catalogos');
return $cliente->guzzle();
+
    return $cliente->guzzle();
  };
+
};
 
 
//Define el encoding a utilizar
 
 
$container['arai-catalogos-encoding'] = 'LATIN1';
 
$container['arai-catalogos-encoding'] = 'LATIN1';
 
$container['arai-catalogos-namespace'] = 'SIU\AraiCli\Services\AraiCatalogos';
 
$container['arai-catalogos-namespace'] = 'SIU\AraiCli\Services\AraiCatalogos';
//Configuración general de los catálogos que utiliza la aplicación
+
</source>
$container['arai-catalogos-lista'] = Array (
+
 
'catalogos' => [
+
En el archivo arai_definicion_catalogos.json se definen los catálogos utilizados, y la configuración de cada uno de ellos, ejemplo:
    'rubro' => Array(
 
'columnas' => ["descripcion"], //Columnas que componen el catalogo
 
'lk' => ["descripcion"], //Clave Lógica
 
'fk' => null,  //Foreigns keys
 
'id_componente_dt' => ID_DATOS_TABLA_DE_ANX_RUBROS,  //Id del datos tabla que maneja el catalogo (por el momento solo permite uno)
 
'tabla' => 'anx_rubros',  //Nombre de la tabla que maneja el catalogo (por el momento solo permite una)
 
'ultima_revision' => call_user_func('sincronizador_arai_cli::getUltimaRevision', 'anx_rubros')
 
    ),
 
    'tipoDocumento' => Array(
 
'columnas' => ["tipo_de_documentacion","descripcion","requiere_liquidacion","formato","imprime","reimprime","tipo_documentacion"],
 
'lk' => ["tipo_de_documentacion"], //Clave Lógica
 
'fk' => null,
 
'id_componente_dt' => ID_DATOS_TABLA_DE_SAU_NO_DOCUMENTACION_TIPOS,
 
'tabla' => 'sau_no_documentacion_tipos',
 
'subset' => [array("campo"=>"tipo_documentacion", "operador"=>"=", "valor"=>"'D'")], //esto sincroniza solo los registros que cumplen con esa condición
 
'ultima_revision' => call_user_func('sincronizador_arai_cli::getUltimaRevision', 'sau_no_documentacion_tipos')
 
    ),
 
    'zona' => Array(
 
'columnas' => ["pais","nombre"],
 
'lk' => null, //Clave Lógica
 
'fk' => array("pais"=>"pais"),
 
'id_componente_dt' =>ID_DATOS_TABLA_DE_ANX_ZONAS,
 
'tabla' => 'anx_zonas',
 
'ultima_revision' => call_user_func('sincronizador_arai_cli::getUltimaRevision', 'anx_zonas')
 
    )
 
]);
 
  
```
 
  
A continuación se muestra el consumo en un ABM (del catalogo Rubro del sistema SIU Pilaga), se edita el CI de la operación, que en este caso se reutiliza para la mayoría de los ABMs (**ci_abm_filtro.php**):
+
<source lang="php" enclose="div">
 +
{
 +
    "catalogos": {
 +
        "bienServicio": {
 +
            "definicion": [{
 +
                    "tabla": "scp_catalogo_bienes_servicios", // Tabla asociada al catalogo
 +
                    "columnas": ["id_catalogo_bien_servicio_padre", "id_bien_servicio_tipo", "codigo", "codigo_completo", "nombre", "nivel", "estado"] // Columnas asociadas al catalogo
 +
                }],
 +
            "lk": ["codigo_completo"], // Clave logica
 +
            "fk":  {
 +
                "bienServicio" : "id_catalogo_bien_servicio_padre" //Clave foranea: primero se indica el catalogo, luego el campo, en este caso se trata de una FK recursiva
 +
            },
 +
            "relacion_recursiva": { // En caso de existir relaciones recursivas crear este elemento
 +
                "id": "id_arai",  // Id global (id arai)
 +
                "fk": "id_catalogo_bien_servicio_padre", // Campo de la FK
 +
                "id_local": "id_catalogo_bien_servicio"  // Id local asociado
 +
            },   
 +
            "id_componente_dt": 101000448,  // ID del datos tabla que apunta a la tabla maestra del catalogo
 +
            "ultima_revision": "call_user_func('sincronizador_arai_cli::getUltimaRevision', 'diaguita.scp_catalogo_bienes_servicios')" // Callback que permite obtener la ultima revision del catalogo
 +
        },
 +
        "bienPatrimonial": {
 +
            "definicion": [{
 +
                    "tabla": "scp_catalogo_bienes_patrimoniales",
 +
                    "columnas": ["id_catalogo_bien_uso_padre","vida_util","id_bien_tipo","debe_amortizarse","codigo","codigo_completo","nombre","nivel","estado"]
 +
                }],
 +
            "lk": ["codigo_completo"],
 +
            "fk":  {
 +
                "bienPatrimonial" : "id_catalogo_bien_uso_padre"
 +
            },
 +
            "relacion_recursiva": {
 +
                "id": "id_arai",
 +
                "fk": "id_catalogo_bien_uso_padre",
 +
                "id_local": "id_catalogo_bien_patrimonial"
 +
            },
 +
            "id_componente_dt": 101000455,
 +
            "ultima_revision": "call_user_func('sincronizador_arai_cli::getUltimaRevision', 'diaguita.scp_catalogo_bienes_patrimoniales')"
 +
        }
 +
    }
 +
}
 +
</source>
 +
 
 +
A continuación se muestra el consumo en un ABM (del catalogo Rubro del sistema SIU Pilaga), se edita el CI de la operación, que en este caso se reutiliza para la mayoría de los ABMs ('''ci_abm_filtro.php'''):
  
 
Se fuerza una sincronización con el servidor cada vez que se carga la operación de la siguiente forma:
 
Se fuerza una sincronización con el servidor cada vez que se carga la operación de la siguiente forma:
  
```
+
<source lang="php" enclose="div">
 
function conf() {
 
function conf() {
 
     $arai_cli = new sincronizador_arai_cli($this->catalogo, $this->get_tabla());
 
     $arai_cli = new sincronizador_arai_cli($this->catalogo, $this->get_tabla());
Línea 134: Línea 151:
 
     $arai_cli->sincronizacion(true);
 
     $arai_cli->sincronizacion(true);
 
}
 
}
```
+
</source>
 
 
**Código que gestiona el alta:**
 
  
 +
=== Código que gestiona el alta ===
  
```
+
<source lang="php" enclose="div">
 
function evt__formulario__alta($datos) {
 
function evt__formulario__alta($datos) {
 
$arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);
 
$arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);
Línea 179: Línea 195:
 
         return $this->dep('datos');
 
         return $this->dep('datos');
 
}
 
}
```
+
</source>
  
**Modificación:**
+
=== Modificación ===
  
```
+
<source lang="php" enclose="div">
 
function evt__formulario__modificacion($datos) {
 
function evt__formulario__modificacion($datos) {
 
     //Le inyecto la revision general del catalogo
 
     //Le inyecto la revision general del catalogo
Línea 203: Línea 219:
 
     }
 
     }
 
}
 
}
```
+
</source>
  
**Baja:**
+
=== Baja ===
  
```
+
<source lang="php" enclose="div">
 
function evt__formulario__baja($seleccion = null) {
 
function evt__formulario__baja($seleccion = null) {
 
if (!is_null($seleccion))
 
if (!is_null($seleccion))
Línea 225: Línea 241:
 
}
 
}
 
}
 
}
```
+
</source>
  
 
La clase sincronizador_arai_cli es el nexo entre la aplicación cliente y la librería arai-catalogos-cli
 
La clase sincronizador_arai_cli es el nexo entre la aplicación cliente y la librería arai-catalogos-cli
  
**Comandos administrativos:**
+
=== Comandos administrativos ===
  
 
Existen dos comandos (actualmente se pueden ver en Pilaga y Diaguita): sincronizacion (ej: ./pilaga.sh arai sincronizacion) y sincronizacion_inicial (ej: ./pilaga.sh arai sincronizacion_inicial)
 
Existen dos comandos (actualmente se pueden ver en Pilaga y Diaguita): sincronizacion (ej: ./pilaga.sh arai sincronizacion) y sincronizacion_inicial (ej: ./pilaga.sh arai sincronizacion_inicial)
  
Ejemplo  
+
Ejemplo (utiliza libreria xlib para el formateo de la salida a consola):
 +
 
 +
<source lang="php" enclose="div">
 +
class comando_arai_catalogos extends comando_toba_pilaga {
 +
    function __construct($manejador_interface, $interprete = null) {
 +
parent::__construct($manejador_interface, $interprete);
 +
ini_set("memory_limit", '1024M');
 +
    }
 +
 
 +
    static function get_info() {
 +
return 'Opciones sincronización ARAI Catalogos.';
 +
    }
 +
 
 +
    /**
 +
    * Determina el catalogo
 +
    *
 +
    * @param unknown_type $obligatorio
 +
    * @return unknown
 +
    */
 +
    protected function get_catalogo($obligatorio = true) {
 +
$catalogo = null;
 +
$param = $this->get_parametros();
 +
 
 +
if (isset($param['-c']) && ( trim($param['-c']) != '')) {
 +
    $catalogo = $param['-c'];
 +
} elseif (isset($this->catalogo)) {
 +
    $catalogo = $this->catalogo;
 +
}
 +
 
 +
if ($obligatorio && is_null($catalogo)) {
 +
    throw new toba_error("Es necesario definir un Catalogo. Utilice el modificador '-c'.");
 +
}
  
```
+
return $catalogo;
/**
+
    }
* Realiza la sincronización inicial (libreria arai catalogos)
+
   
*/
+
    protected function get_revision($obligatorio = true) {
function opcion__arai_cat_sinc_inicial($parametros)
+
$revision = null;
{
+
$param = $this->get_parametros();
ini_set('memory_limit', '512M');
 
  
if (isset($parametros["-i"])) {
+
if (isset($param['-rev']) && ( trim($param['-rev']) != '')) {
$instancia = $parametros["-i"];
+
    $revision = $param['-rev'];
} else {
 
$instancia = apex_pa_instancia;
 
}
 
if (isset($parametros["-p"])) {
 
$proyecto = $parametros["-p"];
 
} else {
 
$proyecto = apex_pa_proyecto;
 
}
 
if (isset($parametros["-c"])) {
 
    $catalogo = $parametros["-c"];
 
} else {
 
    throw new toba_error("Es necesario definir un Catalogo. Utilice el modificador '-c'.");
 
}
 
 
// Iniciar contexto de pilaga
 
toba::nucleo()->iniciar_contexto_desde_consola($instancia, $proyecto);
 
$this->sincronizacion(true, $catalogo);
 
 
}
 
}
 
 
function sincronizacion($inicial, $catalogo) {
+
if ($obligatorio && is_null($revision)) {
    ini_set('memory_limit', '512M');
+
    throw new toba_error("Es necesario definir una revisión. Utilice el modificador '-rev'.");
   
+
}
    $formateo_consola = new formateo_consola();
+
 
    $container = \SIU\AraiCli\Factory::getContainer();
+
return $revision;
   
+
    }
    if (!isset($container['arai-catalogos-lista'])) {
+
 
    $display->mensaje("La aplicación no tiene activo el parámetro 'aplicar_sincronizacion_arai'\nDebe ponerlo en Si para poder utilizar este comando.", true);
+
    function mostrar_observaciones() {
 +
$this->consola->mensaje("INVOCACION: pilaga arai_catalogos [OPCIONES] [PARAMETROS]");
 +
$this->consola->enter();
 +
    }
 +
 
 +
    function sincronizacion($inicial) {
 +
$container = \SIU\AraiCli\Factory::getContainer();
 +
 +
if (!isset($container['arai-catalogos-lista'])) {
 +
xlib::salida_comandos()->mostrar_mensaje("La aplicación no tiene activo el parámetro 'aplicar_sincronizacion_arai'\nDebe ponerlo en Si para poder utilizar este comando.");
 +
    xlib::salida_comandos()->separador();
 +
return false;
 +
}
 +
 
 +
$catalogo = $this->get_catalogo();
 +
$revision = $this->get_revision(false);
 +
 +
xlib::salida_comandos()->mostrar_titulo('Arai Catálogos - Sincronización ' . (($inicial) ? 'inicial. ' : '. ') . "Catálogo: $catalogo");
 +
xlib::salida_comandos()->separador();
 +
 
 +
if (!isset($container['arai-catalogos-lista']['catalogos'][$catalogo])) {
 +
    xlib::salida_comandos()->mostrar_mensaje("El catálogo $catalogo no se encuentra definido en la aplicación, verifique el nombre ingresado.");
 +
    xlib::salida_comandos()->separador();
 
    return false;
 
    return false;
        }
+
}
   
+
 
    echo $formateo_consola->formateo_titulo("Arai Catálogos - Sincronización " . (($inicial) ? 'inicial. ' : '. ') . "Catálogo: $catalogo", true);
+
$datos_tabla_name = $container['arai-catalogos-lista']['catalogos'][$catalogo]['id_componente_dt'];
   
+
$datos_tabla = toba::tabla( $datos_tabla_name );
    if (!isset($container['arai-catalogos-lista']['catalogos'][$catalogo])) {
+
$tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['tabla_maestra'];
echo $formateo_consola->formateo_titulo("El catálogo $catalogo no se encuentra definido en la aplicación, verifique el nombre ingresado.", true);
+
$namespace = $container['arai-catalogos-namespace'];
return false;
+
    }
+
$encabezado = array();
 +
sincronizador_arai_cli::setDatosEncabezadoApp($encabezado, $tabla);
 +
 +
if (class_exists($namespace . '\\' . $catalogo))
 +
    $clase_catalogo = $namespace . '\\' . $catalogo;
 +
else
 +
    $clase_catalogo = $namespace . '\AraiCatalogos';
  
    $id_datos_tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['id_componente_dt'];
+
$arai_cli = new sincronizador_arai_cli($catalogo, $datos_tabla, $revision);
    $datos_tabla = toba::componente_por_id($id_datos_tabla);
+
$arai_cli->sincronizacion($inicial, true);
    $tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['tabla'];
 
    $namespace = $container['arai-catalogos-namespace'];
 
  
    $encabezado = array();
+
xlib::salida_comandos()->mostrar_titulo('La sincronización finalizó con éxito!');
    sincronizador_arai_cli::setDatosEncabezadoApp($encabezado, $tabla);
+
xlib::salida_comandos()->separador();
 +
    }
  
    if (class_exists($namespace . '\\' . $catalogo))
+
    //-------------------------------------------------------------
$clase_catalogo = $namespace . '\\' . $catalogo;
+
    // Opciones
    else
+
     //-------------------------------------------------------------
$clase_catalogo = $namespace . '\AraiCatalogos';      
 
  
    $arai_cli = new sincronizador_arai_cli($catalogo, $clase_catalogo, $encabezado, $tabla, $datos_tabla);
+
    /**
    $arai_cli->sincronizacion($inicial, true);
+
    * Sincronización inicial con ARAI.
   
+
    */
    echo $formateo_consola->formateo_titulo("La sincronización finalizó con éxito!", true);
+
    function opcion__sincronizacion_inicial() {
}
+
// Iniciar contexto de pilaga
```
+
toba::nucleo()->iniciar_contexto_desde_consola(apex_pa_instancia, apex_pa_proyecto);
 +
$this->sincronizacion(true);
 +
    }
  
El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos está en
+
    /**
```
+
    * Sincroniza con ARAI.
https://repositorio.siu.edu.ar/svn/pilaga/trunk/
+
    */
```
+
    function opcion__sincronizacion() {
 +
// Iniciar contexto de pilaga
 +
toba::nucleo()->iniciar_contexto_desde_consola(apex_pa_instancia, apex_pa_proyecto);
 +
$this->sincronizacion(false);
 +
    }
 +
}
 +
</source>
  
El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos está en
+
El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos a partir de la versión 3.0.3
```
 
https://repositorio.siu.edu.ar/svn/diaguita/trunk_versiones/catalogos
 
```
 
  
 +
El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos a partir de la versión 2.5
  
**Consumo de la librería en aplicación que NO utilizan SIU Toba**
+
=== Consumo de la librería en aplicación que NO utilizan SIU Toba ===
  
 
En la carpeta "example" se encuentran los fuentes requeridos para poder utilizar la librería desde proyectos que no utilizan el framework SIU TOBA.
 
En la carpeta "example" se encuentran los fuentes requeridos para poder utilizar la librería desde proyectos que no utilizan el framework SIU TOBA.
La clase a utilizar es **sincronizador_arai_cli**
+
La clase a utilizar es '''sincronizador_arai_cli'''
 +
 
  
[sincronizador_arai_cli.php](/uploads/babb6853f028b9a8f1f45a7ef5fe04e8/sincronizador_arai_cli.php)
 
  
[formateo_consola.php](/uploads/d08e2adc085776b0a3c61fd9acb201e1/formateo_consola.php)
+
[[SIU-Arai|<Volver]]

Revisión actual del 15:32 18 may 2017

Siu-arai iso.png

SIU-Arai Catalogos (cliente)

Esta librería permite que una aplicación pueda interactuar con SIU Arai Catalogos (servidor).

Forma de trabajo

La distribución de la librería se realiza a través de gitlab: https://hub.siu.edu.ar.

Instalación

Consumo de la librería

Agregar en el archivo composer.json de la aplicación cliente

"repositories":
[
{
        "type": "composer",
        "url": "https://satis.siu.edu.ar"
}
],
"require": {
        "siu/arai-cli": "v1.1.4"
}

Dentro de la ruta /vendor/siu/arai-cli/src/SIU/AraiCli se encuentra el archivo Factory.php donde se debe configurar

$container['arai-catalogos-path-logs'] = '/../../../logs/arai-catalogos-cli.log'; //PATH Y ARCHIVO DONDE SE ALMACENAN LOGS
$container['arai-catalogos-logger'] = function ($c) {
    $log = new Logger('arai-catalogos-cli');
    $streamHandler = new StreamHandler(__DIR__ . $c['arai-catalogos-path-logs'], Logger::NOTICE, false);
    $log->pushHandler($streamHandler);
    return $log;
};
$container['arai-catalogos-json-schema-path'] = '/../../../../../res/catalogos/schemas/'; //PATH DONDE SE ENCUENTRAN LOS JSON SCHEMAS VALIDATORS
$container['arai-catalogos-config-file'] = '/../../../res/catalogos/config/config.json'; //PATH Y ARCHIVO JSON DE CONFIGURACION
$container['arai-catalogos-config'] = function ($c) {
    $config = json_decode(file_get_contents(__DIR__ . $c['arai-catalogos-config-file']), true);
    return $config;
};

Cambios en la base

Se agregan tres nuevos campos a las tablas que pasan a convertirse en catálogos comunes, revisión que guarda el número de revisión asociado, id_arai que guarda el id global, y sincronizar es un flag que indica si ese registro debe ser sincronizado (para aquellos catálogos que cuenten con sincronización parcial de datos).

Para el catálogo Rubro el sql aplicado sería:

ALTER TABLE anx_rubros
        ADD revision INTEGER;

ALTER TABLE anx_rubros
        ADD id_arai INTEGER;

ALTER TABLE anx_rubros
        ADD sincronizar CHAR(1) DEFAULT 'N';

Consumo de la librería en aplicación que utiliza SIU Toba

[[1]]

Copiar el archivo cliente.ini en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos con el contenido

[conexion]
;Recuerde dejar una barra (/) al finalizar la URL
to = "URL SERVIDOR"
auth_tipo="basic"
auth_usuario="USUARIO"
auth_password="CLAVE"

En contexto_ejecucion_[proyecto].php agregar, esto complementa el contenedor que utiliza la librería:

$container = \SIU\AraiCli\Factory::getContainer();                     
$container['arai-catalogos-def-path'] = '/../../arai_definicion_catalogos.json'; //Archivo JSON donde está la definición de los catalogos
$container['arai-catalogos-lista'] = function ($c) {                           
        $definition = json_decode(file_get_contents(__DIR__ . $c['arai-catalogos-def-path']), true);
        return $definition;
};                     

//Configura el cliente guzzle, la configuración la toma del archivo cliente.ini
ubicado en /{proyecto}/vendor/siu-toba/framework/instalacion/i__{instancia}/p__{proyecto}/rest/arai-catalogos
$container['arai-catalogos-cliente'] = function ($c) {
    $cliente = toba::servicio_web_rest('arai-catalogos');
    return $cliente->guzzle();
};
$container['arai-catalogos-encoding'] = 'LATIN1';
$container['arai-catalogos-namespace'] = 'SIU\AraiCli\Services\AraiCatalogos';

En el archivo arai_definicion_catalogos.json se definen los catálogos utilizados, y la configuración de cada uno de ellos, ejemplo:


{
    "catalogos": {
        "bienServicio": {
            "definicion": [{
                    "tabla": "scp_catalogo_bienes_servicios", // Tabla asociada al catalogo
                    "columnas": ["id_catalogo_bien_servicio_padre", "id_bien_servicio_tipo", "codigo", "codigo_completo", "nombre", "nivel", "estado"] // Columnas asociadas al catalogo
                }],
            "lk": ["codigo_completo"], // Clave logica
            "fk":  {
                "bienServicio" : "id_catalogo_bien_servicio_padre" //Clave foranea: primero se indica el catalogo, luego el campo, en este caso se trata de una FK recursiva
            },
            "relacion_recursiva": { // En caso de existir relaciones recursivas crear este elemento
                "id": "id_arai",  // Id global (id arai)
                "fk": "id_catalogo_bien_servicio_padre", // Campo de la FK
                "id_local": "id_catalogo_bien_servicio"  // Id local asociado
            },    
            "id_componente_dt": 101000448,  // ID del datos tabla que apunta a la tabla maestra del catalogo
            "ultima_revision": "call_user_func('sincronizador_arai_cli::getUltimaRevision', 'diaguita.scp_catalogo_bienes_servicios')" // Callback que permite obtener la ultima revision del catalogo
        },
        "bienPatrimonial": {
            "definicion": [{
                    "tabla": "scp_catalogo_bienes_patrimoniales",
                    "columnas": ["id_catalogo_bien_uso_padre","vida_util","id_bien_tipo","debe_amortizarse","codigo","codigo_completo","nombre","nivel","estado"]
                }],
            "lk": ["codigo_completo"],
            "fk":  {
                "bienPatrimonial" : "id_catalogo_bien_uso_padre"
            },
            "relacion_recursiva": {
                "id": "id_arai",
                "fk": "id_catalogo_bien_uso_padre",
                "id_local": "id_catalogo_bien_patrimonial"
            },
            "id_componente_dt": 101000455,
            "ultima_revision": "call_user_func('sincronizador_arai_cli::getUltimaRevision', 'diaguita.scp_catalogo_bienes_patrimoniales')"
        }
    }
}

A continuación se muestra el consumo en un ABM (del catalogo Rubro del sistema SIU Pilaga), se edita el CI de la operación, que en este caso se reutiliza para la mayoría de los ABMs (ci_abm_filtro.php):

Se fuerza una sincronización con el servidor cada vez que se carga la operación de la siguiente forma:

function conf() {      
    $arai_cli = new sincronizador_arai_cli($this->catalogo, $this->get_tabla());
    $this->s__clase_catalogo = $arai_cli->getClaseCatalogo();
    $this->s__tabla_catalogo = $arai_cli->getTablaCatalogo();
    $this->s__encabezado = $arai_cli->getEncabezado();
    $arai_cli->sincronizacion(true);
}

Código que gestiona el alta

function evt__formulario__alta($datos) {
        $arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);
        try {
        $this->verifica_duplicados($datos);
        $respuesta = $arai_cli_lib->setDatos($datos, 'A', $datos["id_arai"]);
        //El alta local se realiza para guardar campos que pueden no estar siendo guardados en el catálogo central, al sincronizar se termina de actualizar la revisión
        if (isset($respuesta["idArai"])) {
            $datos["id_arai"] = $respuesta["idArai"];
        }
        } catch (toba_error $e) {
        throw $e;
        } catch (Exception $e) {
        throw new excepcion_pilaga($e);
        }
      -- REALIZAR LLAMADO A FUNCION QUE REALIZA EL ALTA LOCAL PARA EVITAR QUE DATOS QUE NO VAN AL CATALOGO CENTRAL SE PIERDAN
}

function verifica_duplicados($datos) {
        $tabla = $this->get_tabla();
        $arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);
        $claves = $arai_cli_lib->getColumnasLK();

        foreach ($claves as $clave) {
            $r[$clave] = $datos[$clave];
        }

        $dao = "\$datos_tabla = $this->clase::$this->metodo(null);";
        eval($dao);
        $tabla->cargar_con_datos($datos_tabla);
        $id = $tabla->get_id_fila_condicion($r);

        if (count($id)>0) {
            throw new excepcion_pilaga("Se intenta dar de alta un registro con una clave que ya existe. Verifique los datos ingresados.");
        }
}

protected function get_tabla() {
        return $this->dep('datos');
}

Modificación

function evt__formulario__modificacion($datos) {
    //Le inyecto la revision general del catalogo
    $datos["revision"] = sincronizador_arai_cli::getUltimaRevision($this->s__tabla_catalogo);
   
    $arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);
   
    try {
        $respuesta = $arai_cli_lib->setDatos($datos, 'M', $datos["id_arai"]);
        //El modificación local se realiza para guardar campos que pueden no estar siendo guardados en el catálogo central, al sincronizar se termina de actualizar la revisión
        if (isset($respuesta["idArai"])) {
            $datos["id_arai"] = $respuesta["idArai"];
            self::evt__formulario__modificacion_local($datos);
        }
    } catch (toba_error $e) {
        throw $e;
    } catch (Exception $e) {
        throw new excepcion_pilaga($e->getMessage());
    }
}

Baja

function evt__formulario__baja($seleccion = null) {            
        if (!is_null($seleccion))
            $this->s__seleccion = $seleccion;

        //Le inyecto la revision general del catalogo
        $datos["revision"] = sincronizador_arai_cli::getUltimaRevision($this->s__tabla_catalogo);

        $arai_cli_lib = new $this->s__clase_catalogo($this->s__encabezado, $this->catalogo);       

        try {          
                $respuesta = $arai_cli_lib->setDatos(null, 'B', $this->s__seleccion["id_arai"]);
        } catch (toba_error $e) {
                throw $e;
        } catch (Exception $e) {
                throw new excepcion_pilaga($e);
        }
}

La clase sincronizador_arai_cli es el nexo entre la aplicación cliente y la librería arai-catalogos-cli

Comandos administrativos

Existen dos comandos (actualmente se pueden ver en Pilaga y Diaguita): sincronizacion (ej: ./pilaga.sh arai sincronizacion) y sincronizacion_inicial (ej: ./pilaga.sh arai sincronizacion_inicial)

Ejemplo (utiliza libreria xlib para el formateo de la salida a consola):

class comando_arai_catalogos extends comando_toba_pilaga {
    function __construct($manejador_interface, $interprete = null) {
        parent::__construct($manejador_interface, $interprete);
        ini_set("memory_limit", '1024M');
    }

    static function get_info() {
        return 'Opciones sincronización ARAI Catalogos.';
    }

    /**
     * Determina el catalogo
     *
     * @param unknown_type $obligatorio
     * @return unknown
     */

    protected function get_catalogo($obligatorio = true) {
        $catalogo = null;
        $param = $this->get_parametros();

        if (isset($param['-c']) && ( trim($param['-c']) != '')) {
            $catalogo = $param['-c'];
        } elseif (isset($this->catalogo)) {
            $catalogo = $this->catalogo;
        }

        if ($obligatorio && is_null($catalogo)) {
            throw new toba_error("Es necesario definir un Catalogo. Utilice el modificador '-c'.");
        }

        return $catalogo;
    }
   
    protected function get_revision($obligatorio = true) {
        $revision = null;
        $param = $this->get_parametros();

        if (isset($param['-rev']) && ( trim($param['-rev']) != '')) {
            $revision = $param['-rev'];
        }
       
        if ($obligatorio && is_null($revision)) {
            throw new toba_error("Es necesario definir una revisión. Utilice el modificador '-rev'.");
        }

        return $revision;
    }

    function mostrar_observaciones() {
        $this->consola->mensaje("INVOCACION: pilaga arai_catalogos [OPCIONES] [PARAMETROS]");
        $this->consola->enter();
    }

    function sincronizacion($inicial) {
        $container = \SIU\AraiCli\Factory::getContainer();     
       
        if (!isset($container['arai-catalogos-lista'])) {
                xlib::salida_comandos()->mostrar_mensaje("La aplicación no tiene activo el parámetro 'aplicar_sincronizacion_arai'\nDebe ponerlo en Si para poder utilizar este comando.");
            xlib::salida_comandos()->separador();
                return false;
        }

        $catalogo = $this->get_catalogo();
        $revision = $this->get_revision(false);
       
        xlib::salida_comandos()->mostrar_titulo('Arai Catálogos - Sincronización ' . (($inicial) ? 'inicial. ' : '. ') . "Catálogo: $catalogo");
        xlib::salida_comandos()->separador();

        if (!isset($container['arai-catalogos-lista']['catalogos'][$catalogo])) {
            xlib::salida_comandos()->mostrar_mensaje("El catálogo $catalogo no se encuentra definido en la aplicación, verifique el nombre ingresado.");
            xlib::salida_comandos()->separador();
            return false;
        }

        $datos_tabla_name = $container['arai-catalogos-lista']['catalogos'][$catalogo]['id_componente_dt'];
        $datos_tabla = toba::tabla( $datos_tabla_name );
        $tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['tabla_maestra'];
        $namespace = $container['arai-catalogos-namespace'];
       
        $encabezado = array();
        sincronizador_arai_cli::setDatosEncabezadoApp($encabezado, $tabla);
               
        if (class_exists($namespace . '\\' . $catalogo))
            $clase_catalogo = $namespace . '\\' . $catalogo;
        else
            $clase_catalogo = $namespace . '\AraiCatalogos';

        $arai_cli = new sincronizador_arai_cli($catalogo, $datos_tabla, $revision);
        $arai_cli->sincronizacion($inicial, true);

        xlib::salida_comandos()->mostrar_titulo('La sincronización finalizó con éxito!');
        xlib::salida_comandos()->separador();  
    }

    //-------------------------------------------------------------
    // Opciones
    //-------------------------------------------------------------

    /**
     * Sincronización inicial con ARAI.
     */

    function opcion__sincronizacion_inicial() {
        // Iniciar contexto de pilaga
        toba::nucleo()->iniciar_contexto_desde_consola(apex_pa_instancia, apex_pa_proyecto);
        $this->sincronizacion(true);
    }

    /**
     * Sincroniza con ARAI.
     */

    function opcion__sincronizacion() {
        // Iniciar contexto de pilaga
        toba::nucleo()->iniciar_contexto_desde_consola(apex_pa_instancia, apex_pa_proyecto);
        $this->sincronizacion(false);
    }
}

El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos a partir de la versión 3.0.3

El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos a partir de la versión 2.5

Consumo de la librería en aplicación que NO utilizan SIU Toba

En la carpeta "example" se encuentran los fuentes requeridos para poder utilizar la librería desde proyectos que no utilizan el framework SIU TOBA. La clase a utilizar es sincronizador_arai_cli


<Volver