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

De SIU
Saltar a: navegación, buscar
(Consumo de la librería:)
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
  
 
<source lang="php" enclose="div">
 
<source lang="php" enclose="div">
Línea 25: Línea 25:
 
</source>
 
</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
  
 
<source lang="php" enclose="div">
 
<source lang="php" enclose="div">
Línea 43: Línea 43:
 
</source>
 
</source>
  
=== Cambios en la base: ===  
+
=== 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).
 
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).
Línea 60: Línea 60:
 
</source>
 
</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 75: Línea 75:
 
</source>
 
</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">
 
<source lang="php" enclose="div">
Línea 122: Línea 122:
 
</source>
 
</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**):
+
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:
Línea 136: Línea 136:
 
</source>
 
</source>
  
===Código que gestiona el alta:===
+
=== Código que gestiona el alta ===
 
 
  
 
<source lang="php" enclose="div">
 
<source lang="php" enclose="div">
Línea 181: Línea 180:
 
</source>
 
</source>
  
===Modificación:===
+
=== Modificación ===
  
 
<source lang="php" enclose="div">
 
<source lang="php" enclose="div">
Línea 205: Línea 204:
 
</source>
 
</source>
  
===Baja:===
+
=== Baja ===
  
 
<source lang="php" enclose="div">
 
<source lang="php" enclose="div">
Línea 229: Línea 228:
 
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)
Línea 313: Línea 312:
  
  
===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)
 
[sincronizador_arai_cli.php](/uploads/babb6853f028b9a8f1f45a7ef5fe04e8/sincronizador_arai_cli.php)
  
 
[formateo_consola.php](/uploads/d08e2adc085776b0a3c61fd9acb201e1/formateo_consola.php)
 
[formateo_consola.php](/uploads/d08e2adc085776b0a3c61fd9acb201e1/formateo_consola.php)

Revisión del 16:06 29 dic 2016

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.0"
}

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();

//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();
                   };

//Define el encoding a utilizar
$container['arai-catalogos-encoding'] = 'LATIN1';
$container['arai-catalogos-namespace'] = 'SIU\AraiCli\Services\AraiCatalogos';
//Configuración general de los catálogos que utiliza la aplicación
$container['arai-catalogos-lista'] = Array (
'catalogos' => [
    '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):

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

/**
        * Realiza la sincronización inicial (libreria arai catalogos)   
        */

        function opcion__arai_cat_sinc_inicial($parametros)
        {
                ini_set('memory_limit', '512M');

                if (isset($parametros["-i"])) {
                        $instancia = $parametros["-i"];
                } 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) {
            ini_set('memory_limit', '512M');
           
            $formateo_consola = new formateo_consola();
            $container = \SIU\AraiCli\Factory::getContainer();
           
            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);
            return false;
        }
           
            echo $formateo_consola->formateo_titulo("Arai Catálogos - Sincronización " . (($inicial) ? 'inicial. ' : '. ') . "Catálogo: $catalogo", true);
           
            if (!isset($container['arai-catalogos-lista']['catalogos'][$catalogo])) {
                echo $formateo_consola->formateo_titulo("El catálogo $catalogo no se encuentra definido en la aplicación, verifique el nombre ingresado.", true);
                return false;
            }

            $id_datos_tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['id_componente_dt'];
            $datos_tabla = toba::componente_por_id($id_datos_tabla);
            $tabla = $container['arai-catalogos-lista']['catalogos'][$catalogo]['tabla'];
            $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, $clase_catalogo, $encabezado, $tabla, $datos_tabla);
            $arai_cli->sincronizacion($inicial, true);
           
            echo $formateo_consola->formateo_titulo("La sincronización finalizó con éxito!", true);
        }

El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos está en

https://repositorio.siu.edu.ar/svn/pilaga/trunk/


El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos está en

https://repositorio.siu.edu.ar/svn/diaguita/trunk_versiones/catalogos


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

[sincronizador_arai_cli.php](/uploads/babb6853f028b9a8f1f45a7ef5fe04e8/sincronizador_arai_cli.php)

[formateo_consola.php](/uploads/d08e2adc085776b0a3c61fd9acb201e1/formateo_consola.php)