Proyecto

General

Perfil

Generador universal de códigos por XML (GenericXMLCodeGenerator)

Información

Autor Noly Quintero
Sitio Web
Repositorio
Código fuente
Versión Actual v1.0
Compatible con Abox 2.7.12

Resumen

AVISO INFORMATIVO: EN LOS XMLS DE EXPEDIENTES NO SE DEBE AGREGAR NUNCA EL RESET, PORQUE LOS EXPEDIENTES SIGUEN SU NUMERACION A PESAR DE QUE CAMBIE EL AÑO.

Genera el código de un entidad (por ahora, sólo documento o expediente) a partir de un XML. Para optimizar rendimiento y permitir concurrencia trabaja en memoria y descarga el XML cuando el servicio se baja.

El archivo de configuración se debe llamar "GenericXMLDocumentv2.xml" para documentos y "GenericXMLCaseFolderv2.xml" para expedientes y debe estar dentro de la carpeta HTDOCS/CONFIG (Esta ruta se configura en el archivo Config/appSettings.config incluyendo la siguiente linea "<add key="generatorPath" value="Config/" />"):

<?xml version="1.0"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <codeGenerator edit="false" separator="">
    <reset format="MM">06</reset>
    <datas>
      <data type="String" name="Default" />
      <data type="Date" format="yy" />
      <data type="Child" name="Empresa" />
      <data type="FolderCode" startIndex="8" length="2" />
      <data type="TypeCode" startIndex="0" length="3" />
      <data type="Date" format="MM" />
      <data type="Code" format="0000" />
      <data type="Mode" in="E" out="S" normal="" />
    </datas>
    <evaluators>
      <evaluator mode="TypeAndFolder" foldercode="*.NAV.*" typecode="Contab.RecFra.*">
        <in>201</in>
        <out>200</out>
        <normal>200</normal>
        <datas>
          <data type="String" name="Empresa">10</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.ULO.*" typecode="Contab.RecFra.*">
        <in>303</in>
        <out>300</out>
        <normal>300</normal>
        <datas>
          <data type="String" name="Empresa">12</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.TRA.*" typecode="Contab.RecFra.*">
        <in>402</in>
        <out>400</out>
        <normal>400</normal>
        <datas>
          <data type="String" name="Empresa">13</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.NVP.*" typecode="Contab.RecFra.*">
        <in>501</in>
        <out>500</out>
        <normal>500</normal>
        <datas>
          <data type="String" name="Empresa">14</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.POS.*" typecode="Contab.RecFra.*">
        <in>602</in>
        <out>600</out>
        <normal>600</normal>
        <datas>
          <data type="String" name="Empresa">15</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.COL.*" typecode="Contab.RecFra.*">
        <in>700</in>
        <out>700</out>
        <normal>700</normal>
        <datas>
          <data type="String" name="Empresa">50</data>
        </datas>
      </evaluator>
      <evaluator mode="TypeAndFolder" foldercode="*.CLC.*" typecode="Contab.RecFra.*">
        <in>118</in>
        <out>100</out>
        <normal>161</normal>
        <datas>
          <data type="String" name="Empresa">11</data>
        </datas>
      </evaluator>
      <evaluator mode="Type" typecode="*" separator=".">
        <in>800</in>
        <out>800</out>
        <normal>802</normal>
        <datas>
          <data type="String" name="Default">DOC</data>
        </datas>
        <reset format="MM">06</reset>
      </evaluator>
    </evaluators>
  </codeGenerator>
</root>

Este generador de códigos busca entre los tipos definidos en el XML cual corresponde para así calcular su consecutivo, sino encuentra ninguno que corresponda calculará el consecutivo a partir de la etiqueta default.

Para definir el formato del código en el XML se debe tener en cuenta:

EDIT: indica si el campo del código será editable o no / SEPARATOR: indica el separador entre elementos del código

Formato de fecha para el reseteo. Si se deja en blanco o se elimina este tag no actúa el reset. P.ej. "MM" resetea cada mes.

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute

Se emplea el tag dayInMonthReset para indicar que actuará el plugin de reset especial

Especifica el formato del código en el orden de los elementos DATA:

  • String: constante fija en todos los códigos.
  • Date: formato de fecha, p.ej. "yyyyMMdd-HH.mm" generará "20140911-18.59"
  • Mode: texto que se añadirá según el modo de alta, eligiendo in, out y normal.
  • Code: especifica la posición y longitud del consecutivo.
  • TypeCode: indica si se desea visualizar el código completo del tipo documental en el código o una fracción del mismo (startindex y length extraen el fragmento)
  • FolderCode: indica si se desea visualizar el código completo de la carpeta en el código o una fracción del mismo
  • Child: alias para reservar un elemento cualquiera dentro de un evaluador.

ATENCIÓN: El tag "name" permite que el evaluador sustituya el elemento por un elemento propio del evaluador. Ej. name="Oficina" reemplazará los elementos que tengan el mismo name.

El tag "startIndex" es de base 0, es decir, 0 significa el primer carácter de la cadena y 4 el quinto carácter.

El tag MODE sólo actúa en documentos, no en el resto de entidades.

Hay 4 tipos de evaluador o condiciones:
  • Type: busca que el "typecode" coincida con el código del tipo del contenido
  • TypeAndFolder: busca que el "foldercode" y el "typecode" coincidan ambos con el código de la carpeta y código del tipo de contenido
  • TypeOrFolder: busca que el "foldercode" o el "typecode" coincidan con el código de la carpeta o el código del tipo de contenido
  • Folder: busca que el "foldercode" coincida con el código de la carpeta

ATENCIÓN: Todos los códigos admiten expresiones regulares y se evalúan en el orden indicado.

CADA EVALUADOR IMPLICA UN CONSECUTIVO DIFERENTE, con su gestión independiente del resto.

  • El orden en que se definan los atributos sera el orden en el que se creará el código.
  • Los atributos in, out, normal solo se pueden definir para el caso de los documentos. Estos definen en su valor una constante que llevara el código dependiendo el modo del documento a crear. Por ejemplo si el documento que se esta creando es de modo entrada, solo tendrá en cuenta el atributo in, los otros los obviará.

Notas de instalación

Extendiendo Abox para desarrollo:

Descargue el código fuente del plugin y compílelo usando Visual Studio 2010. Luego dependiendo si lo va a integrar en una instalación de Abox o en un proyecto de extensión de Abox sigua las siguientes instrucciones.

Copiar la dll que genera el proyecto, en principio se debe llamar Adapting.GenericXMLCodeGenerator.dll, en la carpeta /bin del sitio web donde esta Abox.

Incluya el proyecto en su proyecto para extender Abox, añada una referencia en Adapting.Web al proyecto que acaba de incluir.

En una instalación de Abox

Descargue la dll compilada llamada Adapting.GenericXMLCodeGenerator.dll en el menú Otros: Versiones de plugins

Incluya la dll en la carpeta bin de su instalación.

Debe incluirse el fichero de parametrización para documentos y para expedientes en la ruta: C:\inetpub\wwwroot\APLICACION\htdocs\Config

  • GenericXMLCaseFolder.xml
  • GenericXMLDocument.xml

Más abajo algunos ejemplos adicionales.

Pasos comunes

En el menú de parametrización defina que usará este generador en el parámetro de la pestaña Admin>Parametrizacion>Document:

NOTA: Sólo se puede configurar para documentos y expedientes.

ATENCIÓN: Si modifica el fichero de parametrización, no se notarán los cambios hasta haber reseteado el IIS, dado que el sistema guarda la parametrización en memoria para mejorar el rendimiento y el comportamiento ante concurrencia. Para forzar reseteo del IIS puede modificar una DLL o resetear directamente el IIS del servidor.

Guía de uso

Una vez definido el generador en el menú de paratrización, pestaña document, solo se debe crear el documento o el expediente para comprobar que este creando el código a partir de la configuración del XML.

Historico

11/06/2014 se agrego la posibilidad de alterar la fecha del plugins mediente un xml con el fin de resetear los consecutivos, segun las fechas de cortes de la empresa, para usar dicha mejora se debe crear un xml en la misma ruta del xml del generador con nombre "ConfigDateGenerator.xml" con la siguiente estructura

<?xml version="1.0" encoding="utf-8" ?>
<days>
<!--es importante mantener el formato DIA/MES/AÑO-->
<date day="11/06/2014">01/07/2014</date>
<date day="06/07/2014">08/07/2014</date>
<date day="06/08/2014">08/08/2014</date>
<date day="06/09/2014">08/09/2014</date>
<date day="06/10/2014">08/10/2014</date>
<!--"day" es la fecha a comparar con la del sistema y el valor de la etiqueta es la fecha que se desea-->
</days>

NOTA: OJO! no deben llevar saltos de lineas ni comentarios los XML.

02/09/2014 formato de fecha admite "y" para colocar el ultimo digito del año EJ: ("2014"->"4"), NOTA: formato no admitido para los reset.

MODIFICACION
14/10/2015 se realizo un cambio en la estructura del xml, anteriormente los data y los evaluadores estaban de este modo:

DATAS

    <datas>
      <data type="String" name="Default" />
      <data type="Date" format="yy" />
      <data type="Child" name="Empresa" />
      <data type="FolderCode" startIndex="8" length="2" />
      <data type="Date" format="MM" />
      <data type="Code" format="0000" />
      <data type="Mode" in="E" out="S" normal="" />
    </datas>

EVALUATOR

    <evaluator mode="TypeAndFolder" foldercode="*.NAV.*" typecode="Contab.RecFra.*">
        <in>201</in>
        <out>200</out>
        <normal>200</normal>
        <datas>
          <data type="String" name="Empresa">10</data>
        </datas>
      </evaluator>

en la nueva version esta estructura debera estar del siguiente modo:

DATAS

    <datas>
      <data type="String" name="Default" />
      <data type="Date" format="yy" />
      <data type="Child" name="Empresa" />
      <data type="FolderCode" startIndex="8" length="2" />
      <data type="Date" format="MM" />
      <data type="Code" format="0000" />
      <data type="Mode">
         <consecutives>
          <consecutivename name="in">E</consecutivename>
          <consecutivename name="out">S</consecutivename>
          <consecutivename name="normal"></consecutivename>
        </consecutives>
      </data>
    </datas>

EVALUATOR

    <evaluator mode="TypeAndFolder" foldercode="*.NAV.*" typecode="Contab.RecFra.*">
        <consecutives>
          <consecutive name="in">201</consecutive>
          <consecutive name="out">200</consecutive>
          <consecutive name="normal">200</consecutive>
        </consecutives>
        <datas>
          <data type="String" name="Empresa">10</data>
        </datas>
      </evaluator>

NOTA: Cabe aclarar que si la condición del evaluador se cumple pero en los consecutivos no esta definido el modo del documento, no va a entrar en dicho evaluador.

07/03/2018:

  • se revirtió el cambio realizado el 14/10/2015
  • se incluyó un nuevo consecutivo llamado "hist"
  • se deshabilitó una protección que validaba si el ultimo consecutivo dado fue usado, y en caso de no haberlo hecho, se reutilizaba.
  • se ha hecho compatible para generar códigos de organizaciones.

El data y el evaluador ha quedado de la siguiente manera:

DATAS

    <datas>
      <data type="String" name="Default" />
      <data type="Date" format="yy" />
      <data type="Child" name="Empresa" />
      <data type="FolderCode" startIndex="8" length="2" />
      <data type="Date" format="MM" />
      <data type="Code" format="0000" />
      <data type="Mode" in="E" out="S" normal="" hist="" />
    </datas>

EVALUATOR

    <evaluator mode="TypeAndFolder" foldercode="*.NAV.*" typecode="Contab.RecFra.*">
        <in>201</in>
        <out>200</out>
        <normal>200</normal>
        <hist>200</hist>
        <datas>
          <data type="String" name="Empresa">10</data>
        </datas>
      </evaluator>

Por otro lado, para configurar el Generador de códigos a organizaciones se debe:
  • Parametrizar el generador de códigos para las organizaciones en la pestaña Core desde la aplicación. Dicha pestaña esta ubicada en
    Menú partner > Parametrización > Core (pestaña) > Generador de códigos para organizaciones = GenericXMLCodeGenerator . Como lo muestra la siguiente imagen:

  • Se Debe incluir el fichero xml de parametrización para organizaciones en la ruta: ~\htdocs\Config llamado GenericXMLOrganization.xml, y el archivo es muy parecido al del expediente, por ejemplo
<?xml version="1.0"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <codeGenerator edit="true" separator=".">
    <reset format="yyyy">2018</reset>
    <datas>
      <data type="String">Hola</data>
      <data type="Date" format="yyyyDDMM" />
      <data type="Mode" in="IN" out="OUT" normal="NORMAL" />
      <data type="Code" format="00000" />
      <data type="TypeCode" startIndex="0" length="1" name="Test" />
      <data type="FolderCode" separator="-" startIndex="2" length="5" />
      <data type="Child" name="Data" />
    </datas>
    <evaluators>
      <evaluator mode="Type" foldercode="*" typecode="nog.*" separator="-">
        <in>1</in>
        <out>1</out>
        <normal>4</normal>
        <datas>
          <data type="String" name="Data">TNEW</data>
          <data type="TypeCode" separator="$" name="Test" />
        </datas>
      </evaluator>
      <evaluator mode="Type" foldercode="*" typecode="*" separator="">
        <in>1</in>
        <out>1</out>
        <normal>13</normal>
        <datas>
          <data type="String" name="Data">END</data>
          <data type="TypeCode" separator="_" name="Test" />
        </datas>
      </evaluator>
    </evaluators>
  </codeGenerator>
</root>

Donde para los evaluadores:
  • foldercode es el código (o una expresión regular que coincida) del padre de la organización.
  • typecode es el código (o una expresión regular que coincida) del tipo de la organización.

14/05/2019 Se realiza cambio en el generador de códigos genérico por xml y se traslada a base de datos con el fin de un mejor funcionamiento y que se pueda trabajar con balanceo de carga, la funcionalidad sigue siendo la misma.

  • Se agrego la funcionalidad de almacenar el ultimo valor de los códigos en cada evaluador cuando este ha sido reseteado y la fecha en que se realizo el reset.
  • Se agrego la opción de marcar como activo o inactivo cada generador, esto con el fin de poder tener varios generadores de la misma entidad y poder seleccionar el que va a funcionar en la instalación, en caso de que exista mas de 1 generador activo por entidad, se utilizara en primero según el orden de la base de datos

rutas base del generador:
http://URLBASE/GenericXmlCodeGenerator/CodeGenerators/List
http://URLBASE/GenericXmlCodeGenerator/Resets/List

A partir de esta ruta podrá realizar la parametrización de cada generador

05/12/2022 Se copia este generador de código y se crea uno nuevo para conectarlo a una base de datos diferente a la del aplicativo, ya que la base de datos del aplicativo esta propensa a muchos bloqueos.
Nombre nuevo generador: GenericSqlCodeGenerator
Ruta proyecto: https://svn-community.adapting.com/svn/community/Plugins/GeneradorDeCodigos/trunk/src/GenericSqlCodeGenerator
Ubicación DLL: http://intranet.adapting.com/intranet/Document/Documents/Show/ADP-2022-11-00191-I?Version=6065

Es obligatorio agregar la siguiente key en el appSettings de abox con la configuración de conexión de la base de datos a conectar:

<add key="ConexionSqlCodeGenerator" value="Data Source=DESKTOP-69KK33R;Initial Catalog=CodeGenerator;User=abox;Password=abox;Min Pool Size=2;Connect Timeout=120;Connect Timeout=15" />

Volver al inicio
Agregar imagen desde el portapapeles (Tamaño máximo: 10 MB)