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

De SIU
Saltar a: navegación, buscar
(Instalación)
(Instalación)
Línea 12: Línea 12:
 
Agregar en el archivo **composer.json** de la aplicación cliente
 
Agregar en el archivo **composer.json** de la aplicación cliente
  
<source lang="json" enclose="div">
+
<source lang="php" enclose="div">
 
"repositories":  
 
"repositories":  
 
[
 
[
Línea 64: Línea 64:
 
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 71:
 
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();
  
Línea 119: Línea 118:
 
     )
 
     )
 
]);
 
]);
 
+
</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**):
Línea 126: Línea 124:
 
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 132:
 
     $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 177:
 
         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 201:
 
     }
 
     }
 
}
 
}
```
+
</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 223:
 
}
 
}
 
}
 
}
```
+
</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
Línea 235: Línea 233:
 
Ejemplo  
 
Ejemplo  
  
```
+
<source lang="php" enclose="div">
 
/**
 
/**
 
* Realiza la sincronización inicial (libreria arai catalogos)  
 
* Realiza la sincronización inicial (libreria arai catalogos)  
Línea 300: Línea 298:
 
    echo $formateo_consola->formateo_titulo("La sincronización finalizó con éxito!", true);
 
    echo $formateo_consola->formateo_titulo("La sincronización finalizó con éxito!", true);
 
}
 
}
```
+
</source>
  
 
El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos está en  
 
El proyecto SIU Pilaga que ya se encuentra integrado con arai-catalogos está en  
```
+
 
 
https://repositorio.siu.edu.ar/svn/pilaga/trunk/
 
https://repositorio.siu.edu.ar/svn/pilaga/trunk/
```
+
 
  
 
El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos está en  
 
El proyecto SIU Diaguita que ya se encuentra integrado con arai-catalogos está en  
```
+
 
 
https://repositorio.siu.edu.ar/svn/diaguita/trunk_versiones/catalogos
 
https://repositorio.siu.edu.ar/svn/diaguita/trunk_versiones/catalogos
```
+
 
  
  

Revisión del 15:58 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)