/// <summary>
        /// Genera un nuevo documento a partir de un documento base o plantilla, inserta los valores especificados en los campos de texto editables y luego guarda el documento en formato .docx.
        /// </summary>
        /// <param name="pathFileTemplate">Indica la ruta completa donde se encuentra el documento base o plantilla.</param>
        /// <param name="fileNameOutput">Indica el nombre con el cual se guarda el documento final.</param>
        /// <param name="pathDirectoryOutput">Indica la ubicación del directorio donde se guardará el documento final.</param>
        /// <param name="values">Indica la lista de claves y valores necesarios para generar el documento.</param>
        /// <param name="stopProcess">Indica si el proceso se detiene o no al encontrar errores en el proceso.</param>
        /// <returns>Devuelve un entero positivo o negatico que indica si el proceso se completo o no.</returns>
        public int GenerateDocument(string urlTemplatePath, string fileNameOutput, string urlDirectoryOutput, string[,] values, bool stopProccess = false)
        {
            int output = 0;

            try
            {
                var list = values.ConvertArrayToFieldDocument();

                if (list.Count <= 0)
                {
                    output = (int)TypesEvent.ListDataEmpty;
                    return(output);
                }

                if (!urlTemplatePath.FileExist())
                {
                    output = (int)TypesEvent.FileNotFound;
                    return(output);
                }

                if (!urlDirectoryOutput.DirectoryExist())
                {
                    var result = urlDirectoryOutput.CreateDirectory();

                    if (result != (int)TypesEvent.SuccessProccess)
                    {
                        return(result);
                    }
                }

                Document document = new Document(urlTemplatePath);

                var formFields = document.GetFormFieldsOfDocument();

                if (formFields == null || formFields.Count <= 0)
                {
                    output = (int)TypesEvent.FieldNotFound;
                    return(output);
                }

                document.SetValueFieldsInDocument(list, formFields);

                if (DocumentProcessor.NumberFieldsWithoutValue > 0)
                {
                    if (stopProccess)
                    {
                        output = (int)TypesEvent.FieldWithoutValue;
                        return(output);
                    }
                }

                output = document.SaveDocument(urlDirectoryOutput, fileNameOutput);
            }
            catch (FileCorruptedException)
            {
                output = (int)TypesEvent.FileCorrupted;
            }
            catch (UnsupportedFileFormatException)
            {
                output = (int)TypesEvent.UnsupportedFileFormat;
            }
            catch (IOException ioex)
            {
                var message = ioex.Message.ToLower();

                if (message.Contains("porque está siendo utilizado en otro proceso"))
                {
                    output = (int)TypesEvent.DocumentInOtherProccess;
                }
                else
                {
                    output = (int)TypesEvent.ErrorGeneric;
                }
            }
            catch (Exception)
            {
                output = (int)TypesEvent.ErrorGeneric;
            }

            return(output);
        }