{"id":40,"date":"2024-08-31T09:02:25","date_gmt":"2024-08-31T09:02:25","guid":{"rendered":"https:\/\/elbrinner.com\/?p=40"},"modified":"2025-03-31T09:19:41","modified_gmt":"2025-03-31T09:19:41","slug":"extendiendo-outsystems-con-net-ciclo-outsystems","status":"publish","type":"post","link":"https:\/\/elbrinner.com\/index.php\/2024\/08\/31\/extendiendo-outsystems-con-net-ciclo-outsystems\/","title":{"rendered":"Extendiendo OutSystems con .Net"},"content":{"rendered":"<p>En este art\u00edculo hablaremos de OutSystems, una plataforma low-code que permite crear desarrollos complejos de forma \u00e1gil en menor tiempo comparado con los desarrollos tradicionales.<\/p>\n<p>Una de las ventajas de\u00a0<strong>OutSystems<\/strong>\u00a0en comparaci\u00f3n a otras plataformas low-code, es la flexibilidad al desarrollar, permite crear extensiones de .Net por ejemplo. Esto abre un abanico de posibilidades a la hora de desarrollar como la reutilizaci\u00f3n de c\u00f3digo, uso de paquetes nuget y etc.<\/p>\n<p>Para demostrar el potencial, vamos a implementar desde 0 una extensi\u00f3n .Net de OutSystems para validar s\u00ed un DNI, CIF o NIE es correcto seg\u00fan un algoritmo.<\/p>\n<p>Lo primero que tenemos que hacer, es crear una extensi\u00f3n dentro de Service Studio, la voy a llamar de Validaci\u00f3n.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-51\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/1-outsystem.png\" alt=\"\" width=\"571\" height=\"75\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/1-outsystem.png 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/1-outsystem-300x39.png 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>El siguiente paso ser\u00e1 crear una acci\u00f3n que reciba un par\u00e1metro de entrada y que devuelva si el documento es correcto o no. Est\u00e1 acci\u00f3n se crea dentro de la extensi\u00f3n que acabamos de crear, mediante la herramienta Integration Studio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-50\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/2-outsystem.jpg\" alt=\"\" width=\"354\" height=\"292\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/2-outsystem.jpg 354w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/2-outsystem-300x247.jpg 300w\" sizes=\"auto, (max-width: 354px) 100vw, 354px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>El pr\u00f3ximo paso ser\u00e1 abrir Visual Studio desde Integration Service, lo podemos hacer clicando sobre el icono de editar C#, destaco en la captura abajo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-49\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/3-outsystem.jpg\" alt=\"\" width=\"394\" height=\"325\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/3-outsystem.jpg 394w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/3-outsystem-300x247.jpg 300w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Una vez abierto, podemos apreciar que tenemos una clase con el mismo nombre de nuestro proyecto, que se llama Validaci\u00f3n.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-48\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/4-outsystem.jpg\" alt=\"\" width=\"571\" height=\"218\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/4-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/4-outsystem-300x115.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>Podemos apreciar tambien, que el m\u00e9todo en Visual Studio tiene el mismo nombre que hemos definido, as\u00ed como los par\u00e1metros de entrada y salida, con la peque\u00f1a diferencia que contiene un prefijo ss.<\/p>\n<p>Ahora que tenemos nuestra Extensi\u00f3n creada, lo \u00fanico que tenemos que hacer, es escribir nuestro c\u00f3digo en .Net. Como las validaciones de NIF, CIF y DNI son muy comunes, buscar\u00e9 en Internet, estoy seguro que alguien ya implemento este algoritmo antes en .Net.<\/p>\n<p>El c\u00f3digo que he encontrado como el primero resultado es el de abajo, lo implementaremos dentro de nuestra extensi\u00f3n.<\/p>\n<p>Lo primero que hacemos, es crear una clase con el mismo nombre y pegar el c\u00f3digo del algoritmo dentro, tal cual.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">using System;\r\n\r\nusing System.Text.RegularExpressions;\r\n\r\n\r\n\r\n\/*\r\n\r\n* NumeroNif.cs\r\n\r\n* Servicios de validaci\u00f3n de los n\u00fameros NIF\r\n\r\n* Elbrinner Da Silva Fernandes\r\n\r\n*\/\r\n\r\n\r\n\r\nnamespace JnSoftware.Validaciones\r\n\r\n{\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Representa un n\u00famero. En la clase se desglosan las distintas opciones que se puedan\r\n\r\n\/\/\/ encontrar\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic class NumeroNif\r\n\r\n{\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Tipos de C\u00f3digos.\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;remarks&gt;Aunque actualmente no se utilice el t\u00e9rmino CIF, se usa en la enumeraci\u00f3n\r\n\r\n\/\/\/ por comodidad&lt;\/remarks&gt;\r\n\r\nprivate enum TiposCodigosEnum { NIF, NIE, CIF }\r\n\r\n\r\n\r\n\/\/ N\u00famero tal cual lo introduce el usuario\r\n\r\nprivate string numero;\r\n\r\nprivate TiposCodigosEnum tipo;\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Parte de Nif: En caso de ser un Nif intracomunitario, permite obtener el c\u00f3gido del pa\u00eds\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic string CodigoIntracomunitario { get; internal set; }\r\n\r\ninternal bool EsIntraComunitario { get; set; }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Parte de Nif: Letra inicial del Nif, en caso de tenerla\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic string LetraInicial { get; internal set; }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Parte de Nif: Bloque num\u00e9rico del NIF. En el caso de un NIF de persona f\u00edsica,\r\n\r\n\/\/\/ corresponder\u00e1 al DNI\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic int Numero { get; internal set; }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Parte de Nif: D\u00edgito de control. Puede ser n\u00famero o letra\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic string DigitoControl { get; internal set; }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Valor que representa si el Nif introducido es correcto\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic bool EsCorrecto { get; internal set; }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Cadena que representa el tipo de Nif comprobado:\r\n\r\n\/\/\/ - NIF : N\u00famero de identificaci\u00f3n fiscal de persona f\u00edsica\r\n\r\n\/\/\/ - NIE : N\u00famero de identificaci\u00f3n fiscal extranjer\u00eda\r\n\r\n\/\/\/ - CIF : C\u00f3digo de identificaci\u00f3n fiscal (Entidad jur\u00eddica)\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic string TipoNif { get { return tipo.ToString(); } }\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Constructor. Al instanciar la clase se realizan todos los c\u00e1lculos\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;param name=\"numero\"&gt;Cadena de 9 u 11 caracteres que contiene el DNI\/NIF\r\n\r\n\/\/\/ tal cual lo ha introducido el usuario para su verificaci\u00f3n&lt;\/param&gt;\r\n\r\nprivate NumeroNif(string numero)\r\n\r\n{\r\n\r\n\/\/ Se eliminan los car\u00e1cteres sobrantes\r\n\r\nnumero = EliminaCaracteres(numero);\r\n\r\n\r\n\r\n\/\/ Todo en ma\u00fdusculas\r\n\r\nnumero = numero.ToUpper();\r\n\r\n\r\n\r\n\/\/ Comprobaci\u00f3n b\u00e1sica de la cadena introducida por el usuario\r\n\r\nif (numero.Length != 9 &amp;&amp; numero.Length != 11)\r\n\r\nthrow new ArgumentException(\"El NIF no tiene un n\u00famero de caracteres v\u00e1lidos\");\r\n\r\n\r\n\r\nthis.numero = numero;\r\n\r\nDesglosa();\r\n\r\n\r\n\r\nswitch (tipo)\r\n\r\n{\r\n\r\ncase TiposCodigosEnum.NIF:\r\n\r\ncase TiposCodigosEnum.NIE:\r\n\r\nthis.EsCorrecto = CompruebaNif();\r\n\r\nbreak;\r\n\r\ncase TiposCodigosEnum.CIF:\r\n\r\nthis.EsCorrecto = CompruebaCif();\r\n\r\nbreak;\r\n\r\n}\r\n\r\n}\r\n\r\n\r\n\r\n#region Preparaci\u00f3n del n\u00famero (desglose)\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Realiza un desglose del n\u00famero introducido por el usuario en las propiedades\r\n\r\n\/\/\/ de la clase\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\nprivate void Desglosa()\r\n\r\n{\r\n\r\nInt32 n;\r\n\r\nif (numero.Length == 11)\r\n\r\n{\r\n\r\n\/\/ Nif Intracomunitario\r\n\r\nEsIntraComunitario = true;\r\n\r\nCodigoIntracomunitario = numero.Substring(0, 2);\r\n\r\nLetraInicial = numero.Substring(2, 1);\r\n\r\nInt32.TryParse(numero.Substring(3, 7), out n);\r\n\r\nDigitoControl = numero.Substring(10, 1);\r\n\r\ntipo = GetTipoDocumento(LetraInicial[0]);\r\n\r\n}\r\n\r\nelse\r\n\r\n{\r\n\r\n\/\/ Nif espa\u00f1ol\r\n\r\ntipo = GetTipoDocumento(numero[0]);\r\n\r\nEsIntraComunitario = false;\r\n\r\nif (tipo == TiposCodigosEnum.NIF)\r\n\r\n{\r\n\r\nLetraInicial = string.Empty;\r\n\r\nInt32.TryParse(numero.Substring(0, 8), out n);\r\n\r\n}\r\n\r\nelse\r\n\r\n{\r\n\r\nLetraInicial = numero.Substring(0, 1);\r\n\r\nInt32.TryParse(numero.Substring(1, 7), out n);\r\n\r\n}\r\n\r\nDigitoControl = numero.Substring(8, 1);\r\n\r\n}\r\n\r\nNumero = n;\r\n\r\n}\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ En base al primer car\u00e1cter del c\u00f3digo, se obtiene el tipo de documento que se intenta\r\n\r\n\/\/\/ comprobar\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;param name=\"letra\"&gt;Primer car\u00e1cter del n\u00famero pasado&lt;\/param&gt;\r\n\r\n\/\/\/ &lt;returns&gt;Tipo de documento&lt;\/returns&gt;\r\n\r\nprivate TiposCodigosEnum GetTipoDocumento(char letra)\r\n\r\n{\r\n\r\nRegex regexNumeros = new Regex(\"[0-9]\");\r\n\r\nif (regexNumeros.IsMatch(letra.ToString()))\r\n\r\nreturn TiposCodigosEnum.NIF;\r\n\r\n\r\n\r\nRegex regexLetrasNIE = new Regex(\"[XYZ]\");\r\n\r\nif (regexLetrasNIE.IsMatch(letra.ToString()))\r\n\r\nreturn TiposCodigosEnum.NIE;\r\n\r\n\r\n\r\nRegex regexLetrasCIF = new Regex(\"[ABCDEFGHJPQRSUVNW]\");\r\n\r\nif (regexLetrasCIF.IsMatch(letra.ToString()))\r\n\r\nreturn TiposCodigosEnum.CIF;\r\n\r\n\r\n\r\nthrow new ApplicationException(\"El c\u00f3digo no es reconocible\");\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Eliminaci\u00f3n de todos los car\u00e1cteres no num\u00e9ricos o de texto de la cadena\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;param name=\"numero\"&gt;N\u00famero tal cual lo escribe el usuario&lt;\/param&gt;\r\n\r\n\/\/\/ &lt;returns&gt;Cadena de 9 u 11 car\u00e1cteres sin signos&lt;\/returns&gt;\r\n\r\nprivate string EliminaCaracteres(string numero)\r\n\r\n{\r\n\r\n\/\/ Todos los car\u00e1cteres que no sean n\u00fameros o letras\r\n\r\nstring caracteres = @\"[\/\/^w]\";\r\n\r\nRegex regex = new Regex(caracteres);\r\n\r\nreturn regex.Replace(numero, \"\");\r\n\r\n}\r\n\r\n\r\n\r\n#endregion\r\n\r\n\r\n\r\n#region C\u00e1lculos\r\n\r\n\r\n\r\nprivate bool CompruebaNif()\r\n\r\n{\r\n\r\nreturn DigitoControl == GetLetraNif();\r\n\r\n}\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ C\u00e1lculos para la comprobaci\u00f3n del Cif (Entidad jur\u00eddica)\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\nprivate bool CompruebaCif()\r\n\r\n{\r\n\r\nstring[] letrasCodigo = { \"J\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\" };\r\n\r\n\r\n\r\nstring n = Numero.ToString(\"0000000\");\r\n\r\nInt32 sumaPares = 0;\r\n\r\nInt32 sumaImpares = 0;\r\n\r\nInt32 sumaTotal = 0;\r\n\r\nInt32 i = 0;\r\n\r\nbool retVal = false;\r\n\r\n\r\n\r\n\/\/ Recorrido por todos los d\u00edgitos del n\u00famero\r\n\r\nfor (i = 0; i &lt; n.Length; i++)\r\n\r\n{\r\n\r\nInt32 aux;\r\n\r\nInt32.TryParse(n[i].ToString(), out aux);\r\n\r\n\r\n\r\nif ((i + 1) % 2 == 0)\r\n\r\n{\r\n\r\n\/\/ Si es una posici\u00f3n par, se suman los d\u00edgitos\r\n\r\nsumaPares += aux;\r\n\r\n}\r\n\r\nelse\r\n\r\n{\r\n\r\n\/\/ Si es una posici\u00f3n impar, se multiplican los d\u00edgitos por 2\r\n\r\naux = aux * 2;\r\n\r\n\r\n\r\n\/\/ se suman los d\u00edgitos de la suma\r\n\r\nsumaImpares += SumaDigitos(aux);\r\n\r\n}\r\n\r\n}\r\n\r\n\/\/ Se suman los resultados de los n\u00fameros pares e impares\r\n\r\nsumaTotal += sumaPares + sumaImpares;\r\n\r\n\r\n\r\n\/\/ Se obtiene el d\u00edgito de las unidades\r\n\r\nInt32 unidades = sumaTotal % 10;\r\n\r\n\r\n\r\n\/\/ Si las unidades son distintas de 0, se restan de 10\r\n\r\nif (unidades != 0)\r\n\r\nunidades = 10 - unidades;\r\n\r\n\r\n\r\nswitch (LetraInicial)\r\n\r\n{\r\n\r\n\/\/ S\u00f3lo n\u00fameros\r\n\r\ncase \"A\":\r\n\r\ncase \"B\":\r\n\r\ncase \"E\":\r\n\r\ncase \"H\":\r\n\r\nretVal = DigitoControl == unidades.ToString();\r\n\r\nbreak;\r\n\r\n\r\n\r\n\/\/ S\u00f3lo letras\r\n\r\ncase \"K\":\r\n\r\ncase \"P\":\r\n\r\ncase \"Q\":\r\n\r\ncase \"S\":\r\n\r\nretVal = DigitoControl == letrasCodigo[unidades];\r\n\r\nbreak;\r\n\r\n\r\n\r\ndefault:\r\n\r\nretVal = (DigitoControl == unidades.ToString())\r\n\r\n|| (DigitoControl == letrasCodigo[unidades]);\r\n\r\nbreak;\r\n\r\n}\r\n\r\n\r\n\r\nreturn retVal;\r\n\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Obtiene la suma de todos los d\u00edgitos\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;returns&gt;de 23, devuelve la suma de 2 + 3&lt;\/returns&gt;\r\n\r\nprivate Int32 SumaDigitos(Int32 digitos)\r\n\r\n{\r\n\r\nstring sNumero = digitos.ToString();\r\n\r\nInt32 suma = 0;\r\n\r\n\r\n\r\nfor (Int32 i = 0; i &lt; sNumero.Length; i++)\r\n\r\n{\r\n\r\nInt32 aux;\r\n\r\nInt32.TryParse(sNumero[i].ToString(), out aux);\r\n\r\nsuma += aux;\r\n\r\n}\r\n\r\nreturn suma;\r\n\r\n}\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Obtiene la letra correspondiente al Dni\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\nprivate string GetLetraNif()\r\n\r\n{\r\n\r\nint indice = Numero % 23;\r\n\r\nreturn \"TRWAGMYFPDXBNJZSQVHLCKET\"[indice].ToString();\r\n\r\n}\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Obtiene una cadena con el n\u00famero de identificaci\u00f3n completo\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\npublic override string ToString()\r\n\r\n{\r\n\r\nstring nif;\r\n\r\nstring formato = \"{0:0000000}\";\r\n\r\n\r\n\r\nif (tipo == TiposCodigosEnum.CIF &amp;&amp; LetraInicial == \"\")\r\n\r\nformato = \"{0:00000000}\";\r\n\r\nif (tipo == TiposCodigosEnum.NIF)\r\n\r\nformato = \"{0:00000000}\";\r\n\r\n\r\n\r\nnif = EsIntraComunitario ? CodigoIntracomunitario :\r\n\r\nstring.Empty + LetraInicial + string.Format(formato,Numero ) + DigitoControl;\r\n\r\nreturn nif;\r\n\r\n}\r\n\r\n\r\n\r\n#endregion\r\n\r\n\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\r\n\/\/\/ Comprobaci\u00f3n de un n\u00famero de identificaci\u00f3n fiscal espa\u00f1ol\r\n\r\n\/\/\/ &lt;\/summary&gt;\r\n\r\n\/\/\/ &lt;param name=\"numero\"&gt;Numero a analizar&lt;\/param&gt;\r\n\r\n\/\/\/ &lt;returns&gt;Instancia de &lt;see cref=\"NumeroNif\"\/&gt; con los datos del n\u00famero.\r\n\r\n\/\/\/ Destacable la propiedad &lt;seealso cref=\"NumeroNif.EsCorrecto\"\/&gt;, que contiene la verificaci\u00f3n\r\n\r\n\/\/\/ &lt;\/returns&gt;\r\n\r\npublic static NumeroNif CompruebaNif(string numero)\r\n\r\n{\r\n\r\nreturn new NumeroNif(numero);\r\n\r\n}\r\n\r\n\r\n\r\n}\r\n\r\n\r\n\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>El siguiente paso, es invocar el m\u00e9todo que necesitamos, dentro de nuestra clase Validaci\u00f3n, en este caso es\u00a0<strong>CompruebaNif<\/strong>\u00a0que est\u00e1 dentro de clase\u00a0<strong>NumeroNif<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-47\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/6-outsystem.jpg\" alt=\"\" width=\"571\" height=\"201\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/6-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/6-outsystem-300x106.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>Listo, lo publicamos y ya podemos utilizar. Hacemos clic en guardar en Visual Studio y luego debemos hacer clic en el icono de publicar en Integration Service, que est\u00e1 representado con un bot\u00f3n que contiene el n\u00famero 1.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-46\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/7-outsystem.jpg\" alt=\"\" width=\"571\" height=\"438\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/7-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/7-outsystem-300x230.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>Lo que tenemos que hacer ahora es utilizar nuestra funci\u00f3n, para esto agregamos la referencia de nuestra extensi\u00f3n en el modulo que queremos utilizar, arrastramos nuestra funci\u00f3n y pasamos el valor de entrada que ser\u00e1 una variable que contiene el n\u00famero del documento que queremos validar.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-45\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/8-outsystem.jpg\" alt=\"\" width=\"571\" height=\"181\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/8-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/8-outsystem-300x95.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Como respuesta retorna si es valido o no el documento.<\/p>\n<p>El algoritmo que hemos encontrado, nos puede retorna mucho m\u00e1s que esto, si queremos que retorne todo, podemos crear una estructura que retorne todo est\u00e1 informaci\u00f3n en lugar de un booleano.<\/p>\n<p>Otro punto positivo es que podemos mostrar las excepciones directamente desde .Net, ejemplo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-44\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/9-outsystem.jpg\" alt=\"\" width=\"571\" height=\"57\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/9-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/9-outsystem-300x30.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-43\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/10-outsystem.jpg\" alt=\"\" width=\"571\" height=\"97\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/10-outsystem.jpg 571w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/10-outsystem-300x51.jpg 300w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>De forma que no es necesario retornar el error en el m\u00e9todo, lo podemos mostrar directamente.<\/p>\n<p>En resumen, por m\u00e1s que este algoritmo se puede hacer perfectamente desde OutSystems, tenemos la posibilidad de reutilizar c\u00f3digo .Net de una forma simples.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-42\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/outssytems-2-image001.png\" alt=\"\" width=\"488\" height=\"627\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/outssytems-2-image001.png 488w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/03\/outssytems-2-image001-233x300.png 233w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo hablaremos de OutSystems, una plataforma low-code que permite crear desarrollos complejos de forma \u00e1gil en menor tiempo comparado con los desarrollos tradicionales. Una de las ventajas de\u00a0OutSystems\u00a0en comparaci\u00f3n a otras plataformas low-code, es la flexibilidad al desarrollar, permite crear extensiones de .Net por ejemplo. Esto abre un abanico de posibilidades a la &#8230; <a title=\"Extendiendo OutSystems con .Net\" class=\"read-more\" href=\"https:\/\/elbrinner.com\/index.php\/2024\/08\/31\/extendiendo-outsystems-con-net-ciclo-outsystems\/\" aria-label=\"Leer m\u00e1s sobre Extendiendo OutSystems con .Net\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[10,45],"tags":[15,46],"class_list":["post-40","post","type-post","status-publish","format-standard","hentry","category-net","category-outsystems","tag-net","tag-outsystems"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/40","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":2,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"predecessor-version":[{"id":53,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/40\/revisions\/53"}],"wp:attachment":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}