public IHttpActionResult ExportarReporteExcelConsultasRepositorio()
        {
            var resultado = new ResultadoOperacionDto()
            {
                Resultado = true,
                Mensaje   = "Ok"
            };

            try
            {
                //var filtrosConsulta = "{\"conceptos\":[{\"Id\":\"ifrs-full_AdministrativeExpense\",\"EspacioNombres\":null,\"EspacioNombresTaxonomia\":\"http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05\",\"orden\":1,\"indentacion\":1,\"esAbstracto\":false,\"dimension\":null,\"Nombre\":null,\"etiqueta\":null},{\"Id\":\"ifrs-full_DistributionCosts\",\"EspacioNombres\":null,\"EspacioNombresTaxonomia\":\"http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05\",\"orden\":2,\"indentacion\":1,\"esAbstracto\":false,\"dimension\":null,\"Nombre\":null,\"etiqueta\":null},{\"Id\":\"ifrs-full_Inventories\",\"EspacioNombres\":null,\"EspacioNombresTaxonomia\":\"http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05\",\"orden\":2,\"indentacion\":1,\"esAbstracto\":false,\"dimension\":null,\"Nombre\":null,\"etiqueta\":null},{\"Id\":\"ifrs-full_Equity\",\"EspacioNombres\":null,\"EspacioNombresTaxonomia\":\"http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05\",\"orden\":2,\"indentacion\":2,\"esAbstracto\":false,\"dimension\":[{\"Filtro\":null,\"Explicita\":true,\"IdDimension\":\"ifrs-full_ComponentsOfEquityAxis\",\"IdItemMiembro\":\"ifrs-full_OtherReservesMember\",\"QNameDimension\":\"http://xbrl.ifrs.org/taxonomy/2014-03-05/ifrs-full:ComponentsOfEquityAxis\",\"QNameItemMiembro\":\"http://xbrl.ifrs.org/taxonomy/2014-03-05/ifrs-full:OtherReservesMember\",\"ElementoMiembroTipificado\":null}],\"Nombre\":null,\"etiqueta\":null},{\"Id\":\"ifrs_mx-cor_20141205_ComercioExteriorBancarios\",\"EspacioNombres\":null,\"EspacioNombresTaxonomia\":\"http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05\",\"orden\":5,\"indentacion\":2,\"esAbstracto\":false,\"dimension\":[{\"Filtro\":\"TOTAL\",\"Explicita\":false,\"IdDimension\":\"ifrs_mx-cor_20141205_InstitucionEje\",\"IdItemMiembro\":null,\"QNameDimension\":\"http://bmv.com.mx/ifrs_mx-cor_20141205/full_ifrs_mx-cor_2014-12-05:InstitucionEje\",\"QNameItemMiembro\":null,\"ElementoMiembroTipificado\":null}],\"Nombre\":null,\"etiqueta\":null}],\"filtros\":{\"entidades\":[\"DAIMLER\",\"AEROMEX\"],\"entidadesDiccionario\":null,\"unidades\":[\"MXN\",\"USD\"],\"gruposEntidades\":null,\"periodos\":[{\"Tipo\":0,\"EsTipoInstante\":false,\"FechaInstante\":null,\"FechaInicio\":\"2015-01-01T00:00:00\",\"FechaFin\":\"2015-06-30T00:00:00\"},{\"Tipo\":0,\"EsTipoInstante\":false,\"FechaInstante\":null,\"FechaInicio\":\"2015-04-01T00:00:00\",\"FechaFin\":\"2015-06-30T00:00:00\"},{\"Tipo\":0,\"EsTipoInstante\":false,\"FechaInstante\":null,\"FechaInicio\":\"2014-04-01T00:00:00\",\"FechaFin\":\"2014-12-31T00:00:00\"}]},\"idioma\":\"es\"}";
                var filtrosConsulta = getFormKeyValue("consulta");
                var isExportWord    = getFormKeyValue("isExportWord");

                var settings = new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Ignore
                };
                var filtrosConsultaHecho = JsonConvert.DeserializeObject <EntFiltroConsultaHecho>(filtrosConsulta, settings);

                resultado = AbaxXBRLCellStoreService.ConsultarRepositorio(filtrosConsultaHecho, -1, -1);

                if (resultado.Resultado && ((EntHecho[])resultado.InformacionExtra).Count() > 0)
                {
                    ReporteGenericoMongoDB reporteGenericoMongoDB = new ReporteGenericoMongoDB();

                    EstructuraReporteGenerico estructuraReporteGenerico = reporteGenericoMongoDB.CrearEstructuraGenerica(filtrosConsultaHecho, resultado, true);
                    estructuraReporteGenerico = reporteGenericoMongoDB.AgruparHechosPorPeriodo(filtrosConsultaHecho, estructuraReporteGenerico);

                    CrearReporteGenerico crearReporteGenerico = new CrearReporteGenerico();

                    if (isExportWord == null)
                    {
                        var contenidoDelReporteExcel = crearReporteGenerico.ExcelStream(estructuraReporteGenerico);
                        return(this.ExportDatosToExcel(contenidoDelReporteExcel, "ReporteConsultaRepositorio.xls"));
                    }
                    else
                    {
                        var contenidoDelReporteWord = crearReporteGenerico.ExportWordConsultaReporte(estructuraReporteGenerico);
                        return(this.ExportDatosToWord(contenidoDelReporteWord, "ReporteConsultaRepositorio.docx"));
                    }
                }
                resultado.Resultado = false;
            }
            catch (Exception e)
            {
                resultado.Resultado = false;
                resultado.Mensaje   = e.Message;
            }


            return(Ok(resultado));
        }
        /// <summary>
        /// GeneraciĆ³n del reporte en excel
        /// </summary>
        /// <param name="rutaArchivoXBRL">Ruta del archivo XBRL que sera procesado</param>
        /// <param name="rutaDestino">Ruta y nombre de archivo donde se creara el archivo *.xlsx</param>
        /// <param name="idioma">Idioma en la que se va a generar el reporte</param>
        /// <param name="agruparPorunidad">Agrupacion de las columnas por unidad</param>
        private MemoryStream ReporteGenericoExcel(EstructuraReporteGenerico estruturaDeReporte, string idioma, bool agruparPorunidad)
        {
            // Generacion ReporteExcel
            XSSFWorkbook workbook        = null;
            ISheet       sheet           = null;
            List <int>   columnasOcultas = new List <int>();

            int NumeroFilasParaEncabezado = NUMERO_FILAS_PARA_ENCABEZADO + NUMERO_COLUMNAS_PARA_TITULO_ROL;

            if (estruturaDeReporte.AgruparPorUnidad)
            {
                NumeroFilasParaEncabezado++;
            }

            workbook = new XSSFWorkbook();

            foreach (var rol in estruturaDeReporte.ReporteGenericoPorRol)
            {
                int nivelIndentacionMaximo = ObtenerUltimaIndentacion(rol.Conceptos) + 2;
                int columnaDimension       = ObtenerUltimaIndentacion(rol.Conceptos) + 1;

                string nombreHoja = ValidarNombreDeHoja(rol.Rol, workbook);
                sheet = workbook.CreateSheet(nombreHoja);


                var contarColumna = nivelIndentacionMaximo;
                foreach (var columna in rol.ColumnasDelReporte)
                {
                    if (columna.OcultarColumna)
                    {
                        columnasOcultas.Add(contarColumna);
                    }
                    contarColumna++;
                }

                #region Estilos
                IFont fuenteParaTitulo = sheet.Workbook.CreateFont();
                fuenteParaTitulo.FontHeightInPoints = TAMANIO_FUENTE_PARA_TITULO_ROL;
                fuenteParaTitulo.Boldweight         = (short)NPOI.SS.UserModel.FontBoldWeight.Bold;

                IFont fuenteParaContenido = sheet.Workbook.CreateFont();
                fuenteParaContenido.FontHeightInPoints = TAMANIO_FUENTE_PARA_CONTENIDO;

                IFont fuenteParaConceptosAbstractos = sheet.Workbook.CreateFont();
                fuenteParaConceptosAbstractos.FontHeightInPoints = TAMANIO_FUENTE_PARA_CONTENIDO;
                fuenteParaConceptosAbstractos.Boldweight         = (short)FontBoldWeight.Bold;

                ICellStyle EstiloEstandarEnCeldasEncabezado = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasEncabezado.VerticalAlignment = VerticalAlignment.Center;
                EstiloEstandarEnCeldasEncabezado.Alignment         = HorizontalAlignment.Left;
                EstiloBordeACeldas(EstiloEstandarEnCeldasEncabezado);
                EstiloEstandarEnCeldasEncabezado.SetFont(fuenteParaContenido);

                EstiloEstandarEnCeldasEncabezado.FillForegroundColor = ObtenerColorEntidad((int)Color.AMARILLO);
                EstiloEstandarEnCeldasEncabezado.FillPattern         = NPOI.SS.UserModel.FillPattern.SolidForeground;

                ICellStyle EstiloEstandarEnCeldasConceptos = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasConceptos.VerticalAlignment = VerticalAlignment.Center;
                EstiloEstandarEnCeldasConceptos.Alignment         = HorizontalAlignment.Left;
                EstiloBordeACeldas(EstiloEstandarEnCeldasConceptos);
                EstiloEstandarEnCeldasConceptos.SetFont(fuenteParaContenido);

                EstiloEstandarEnCeldasConceptos.FillForegroundColor = ObtenerColorEntidad((int)Color.AZUL);
                EstiloEstandarEnCeldasConceptos.FillPattern         = NPOI.SS.UserModel.FillPattern.SolidForeground;

                ICellStyle EstiloEstandarEnCeldasConceptosAbstracto = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasConceptosAbstracto.VerticalAlignment = EstiloEstandarEnCeldasConceptos.VerticalAlignment;
                EstiloEstandarEnCeldasConceptosAbstracto.Alignment         = EstiloEstandarEnCeldasConceptos.Alignment;
                EstiloBordeACeldas(EstiloEstandarEnCeldasConceptosAbstracto);
                EstiloEstandarEnCeldasConceptosAbstracto.SetFont(fuenteParaConceptosAbstractos);

                EstiloEstandarEnCeldasConceptosAbstracto.FillForegroundColor = ObtenerColorEntidad((int)Color.AZUL);
                EstiloEstandarEnCeldasConceptosAbstracto.FillPattern         = NPOI.SS.UserModel.FillPattern.SolidForeground;

                ICellStyle EstiloEstandarEnCeldasDimension = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasDimension.WrapText          = true;
                EstiloEstandarEnCeldasDimension.VerticalAlignment = VerticalAlignment.Center;
                EstiloEstandarEnCeldasDimension.Alignment         = HorizontalAlignment.Left;
                EstiloBordeACeldas(EstiloEstandarEnCeldasDimension);
                EstiloEstandarEnCeldasDimension.SetFont(fuenteParaContenido);

                EstiloEstandarEnCeldasDimension.FillForegroundColor = ObtenerColorEntidad((int)Color.GRIS);
                EstiloEstandarEnCeldasDimension.FillPattern         = NPOI.SS.UserModel.FillPattern.SolidForeground;

                ICellStyle EstiloEstandarEnCeldasValoresHecho = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasValoresHecho.WrapText          = true;
                EstiloEstandarEnCeldasValoresHecho.VerticalAlignment = VerticalAlignment.Center;
                EstiloEstandarEnCeldasValoresHecho.Alignment         = HorizontalAlignment.Right;
                EstiloBordeACeldas(EstiloEstandarEnCeldasValoresHecho);
                EstiloEstandarEnCeldasValoresHecho.SetFont(fuenteParaContenido);

                ICellStyle EstiloEstandarEnCeldasValoresHechoBloqueTexto = sheet.Workbook.CreateCellStyle();
                EstiloEstandarEnCeldasValoresHechoBloqueTexto.WrapText          = true;
                EstiloEstandarEnCeldasValoresHechoBloqueTexto.VerticalAlignment = VerticalAlignment.Top;
                EstiloEstandarEnCeldasValoresHechoBloqueTexto.Alignment         = HorizontalAlignment.Left;
                EstiloBordeACeldas(EstiloEstandarEnCeldasValoresHechoBloqueTexto);
                EstiloEstandarEnCeldasValoresHechoBloqueTexto.SetFont(fuenteParaContenido);

                ICellStyle estiloTituloRol = sheet.Workbook.CreateCellStyle();
                estiloTituloRol.VerticalAlignment = VerticalAlignment.Center;
                estiloTituloRol.Alignment         = HorizontalAlignment.Left;
                estiloTituloRol.SetFont(fuenteParaTitulo);

                #endregion

                #region Renglones Titulo Rol
                var renglonTituloRol = sheet.CreateRow(NUMERO_RENGLON_TITULO_ROL);
                var celdaTituloRol   = renglonTituloRol.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                celdaTituloRol.SetCellValue(rol.Rol);
                celdaTituloRol.CellStyle = estiloTituloRol;

                var renglonUriRol = sheet.CreateRow(NUMERO_RENGLON_TITULO_URI);
                var celdaUriRol   = renglonUriRol.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                celdaUriRol.SetCellValue(rol.RolUri);
                celdaUriRol.CellStyle = estiloTituloRol;
                #endregion

                int iniciaColumna = 0;
                for (int filaEncabezado = NUMERO_COLUMNAS_PARA_TITULO_ROL; filaEncabezado <= NumeroFilasParaEncabezado; filaEncabezado++)
                {
                    var renglon = sheet.CreateRow(filaEncabezado);
                    iniciaColumna = nivelIndentacionMaximo;

                    #region Imprimir columnas al reporte

                    var decremetarColumna = 0;
                    foreach (var columna in rol.ColumnasDelReporte)
                    {
                        if (columnasOcultas.Contains(iniciaColumna))
                        {
                            iniciaColumna++;
                            decremetarColumna = decremetarColumna - 1;
                            continue;
                        }
                        iniciaColumna = iniciaColumna + decremetarColumna;

                        ICell celdaColumna = null;
                        switch (filaEncabezado)
                        {
                        case NUMERO_RENGLON_ENCABEZADO_FECHA:
                            string tituloFecha = GenerarEncabezadoFecha(columna);
                            celdaColumna = renglon.GetCell(iniciaColumna, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            celdaColumna.SetCellValue(tituloFecha);
                            break;

                        case NUMERO_RENGLON_ENCABEZADO_ENTIDAD:
                            celdaColumna = renglon.GetCell(iniciaColumna, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            celdaColumna.SetCellValue(columna.Entidad);
                            break;

                        case NUMERO_RENGLON_ENCABEZADO_UNIDAD:
                            if (estruturaDeReporte.AgruparPorUnidad)
                            {
                                celdaColumna = renglon.GetCell(iniciaColumna, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                                celdaColumna.SetCellValue(columna.Moneda);
                            }
                            break;
                        }
                        sheet.SetColumnWidth(iniciaColumna, TAMANIO_COLUMNA_EN_CONCEPTOS);
                        celdaColumna.CellStyle = EstiloEstandarEnCeldasEncabezado;
                        iniciaColumna++;
                    }
                    #endregion
                }

                //Formato a celdas de columna dimension
                #region Borde a columna de encabezado dimension
                sheet.GetRow(NUMERO_RENGLON_ENCABEZADO_FECHA).CreateCell(nivelIndentacionMaximo - 1).CellStyle   = EstiloEstandarEnCeldasEncabezado;
                sheet.GetRow(NUMERO_RENGLON_ENCABEZADO_ENTIDAD).CreateCell(nivelIndentacionMaximo - 1).CellStyle = EstiloEstandarEnCeldasEncabezado;
                if (agruparPorunidad)
                {
                    sheet.GetRow(NUMERO_RENGLON_ENCABEZADO_UNIDAD).CreateCell(nivelIndentacionMaximo - 1).CellStyle = EstiloEstandarEnCeldasEncabezado;
                }
                else
                {
                    sheet.GetRow(NUMERO_RENGLON_ENCABEZADO_ENTIDAD).CreateCell(nivelIndentacionMaximo - 1).CellStyle = EstiloEstandarEnCeldasEncabezado;
                }
                #endregion

                iniciaColumna = nivelIndentacionMaximo;
                int filaConceptos          = NumeroFilasParaEncabezado + 1;
                int numeroCeldasAgrupar    = 0;
                int filaInicialParaAgrupar = 0;
                foreach (var concepto in rol.Conceptos)
                {
                    var renglon = sheet.CreateRow(filaConceptos);
                    var celda   = renglon.GetCell(concepto.NivelIndentacion, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    celda.SetCellValue(concepto.NombreConcepto);
                    bool EsAbstracto = (concepto.EsAbstracto != null ? concepto.EsAbstracto.Value : false);
                    if (EsAbstracto)
                    {
                        celda.CellStyle = EstiloEstandarEnCeldasConceptosAbstracto;
                    }
                    else
                    {
                        celda.CellStyle = EstiloEstandarEnCeldasConceptos;
                    }

                    sheet.SetColumnWidth(concepto.NivelIndentacion, TAMANIO_COLUMNA_EN_CONCEPTOS);
                    if (ObtenerUltimaIndentacion(rol.Conceptos) == concepto.NivelIndentacion)
                    {
                        sheet.SetColumnWidth(concepto.NivelIndentacion, TAMANIO_COLUMNA_ULTIMONIVEL_CONCEPTOS);
                    }
                    filaInicialParaAgrupar = filaConceptos;

                    bool primerDimensionANivelConcepto = true;
                    bool contieneDimensiones           = false;
                    bool aplicaAgrupacionDeCeldas      = false;

                    #region Imprime las dimensiones del concepto
                    bool TituloColumnaDimension = true;
                    foreach (var dimension in concepto.Dimensiones.Values)
                    {
                        if (TituloColumnaDimension)
                        {
                            var renglonEncabezadoEntidad = sheet.GetRow(NUMERO_RENGLON_ENCABEZADO_ENTIDAD);
                            var celdaTituloDimension     = renglonEncabezadoEntidad.GetCell(nivelIndentacionMaximo - 1, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            celdaTituloDimension.SetCellValue(NOMBRE_COLUMNA_DIMENSIONES);

                            TituloColumnaDimension = !TituloColumnaDimension;
                        }

                        contieneDimensiones = true;
                        IRow renglonParaDimension = null;
                        if (primerDimensionANivelConcepto)
                        {
                            renglonParaDimension          = sheet.GetRow(filaConceptos);
                            primerDimensionANivelConcepto = !primerDimensionANivelConcepto;
                        }
                        else
                        {
                            filaConceptos++;
                            renglonParaDimension = sheet.CreateRow(filaConceptos);
                        }
                        numeroCeldasAgrupar++;
                        var celdaDimension = renglonParaDimension.GetCell(columnaDimension, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                        celdaDimension.SetCellValue(string.Format("{0}:{1}", dimension.NombreDimension, dimension.NombreMiembro));
                        sheet.SetColumnWidth(columnaDimension, TAMANIO_COLUMNA_ULTIMONIVEL_CONCEPTOS);
                        celdaDimension.CellStyle = EstiloEstandarEnCeldasDimension;
                    }

                    if (contieneDimensiones)
                    {
                        aplicaAgrupacionDeCeldas = true;
                        CellRangeAddress rangoDeCeldasAgrupar = new CellRangeAddress(filaInicialParaAgrupar, filaInicialParaAgrupar + numeroCeldasAgrupar - 1, concepto.NivelIndentacion, columnaDimension - 1);
                        sheet.AddMergedRegion(rangoDeCeldasAgrupar);
                        EstiloBordeACeldasAgrupadas(workbook, sheet, rangoDeCeldasAgrupar);
                    }
                    else
                    {
                        var renglonDimensionVacio = sheet.GetRow(filaConceptos);
                        var celdaDimension        = renglonDimensionVacio.GetCell(columnaDimension, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                        celdaDimension.CellStyle = EstiloEstandarEnCeldasDimension;

                        CellRangeAddress rangoDeCeldasConceptosAgrupar = new CellRangeAddress(filaConceptos, filaConceptos, concepto.NivelIndentacion, nivelIndentacionMaximo - 2);
                        sheet.AddMergedRegion(rangoDeCeldasConceptosAgrupar);
                        EstiloBordeACeldasAgrupadas(workbook, sheet, rangoDeCeldasConceptosAgrupar);
                    }

                    #endregion
                    iniciaColumna = nivelIndentacionMaximo;
                    #region Imprimir los hecho en la celda
                    var decremetarColumna = 0;
                    foreach (var hechoPorColumna in concepto.Hechos)
                    {
                        if (columnasOcultas.Contains(iniciaColumna))
                        {
                            iniciaColumna++;
                            decremetarColumna = decremetarColumna - 1;
                            continue;
                        }
                        iniciaColumna = iniciaColumna + decremetarColumna;

                        var celdaHechos = renglon.GetCell(iniciaColumna, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                        if (hechoPorColumna != null)
                        {
                            if (hechoPorColumna.EsNumerico)
                            {
                                celdaHechos.SetCellValue(Double.Parse(hechoPorColumna.Valor));
                                celdaHechos.SetCellType(CellType.Numeric);
                                celdaHechos.CellStyle = EstiloEstandarEnCeldasValoresHecho;
                            }
                            else if (hechoPorColumna.TipoDato.Contains(TiposDatoXBRL.TextBlockItemType) || hechoPorColumna.TipoDato.Contains(TiposDatoXBRL.StringItemType))
                            {
                                celdaHechos.SetCellValue(hechoPorColumna.ValorFormateado);
                                celdaHechos.CellStyle = EstiloEstandarEnCeldasValoresHechoBloqueTexto;
                            }
                            else
                            {
                                celdaHechos.SetCellValue(hechoPorColumna.Valor);
                                celdaHechos.CellStyle = EstiloEstandarEnCeldasValoresHecho;
                            }
                        }
                        if (aplicaAgrupacionDeCeldas)
                        {
                            CellRangeAddress rangoDeCeldasAgrupar = new CellRangeAddress(filaInicialParaAgrupar, filaInicialParaAgrupar + numeroCeldasAgrupar - 1, iniciaColumna, iniciaColumna);
                            sheet.AddMergedRegion(rangoDeCeldasAgrupar);
                            EstiloBordeACeldasAgrupadas(workbook, sheet, rangoDeCeldasAgrupar);
                        }
                        sheet.SetColumnWidth(iniciaColumna, TAMANIO_COLUMNA_EN_VALORES);

                        iniciaColumna++;
                    }
                    #endregion
                    aplicaAgrupacionDeCeldas = false;
                    numeroCeldasAgrupar      = 0;
                    filaConceptos++;
                    iniciaColumna = nivelIndentacionMaximo;
                }
            }
            try
            {
                var stream = new MemoryStream();

                workbook.Write(stream);
                stream.Flush();

                return(stream);
            }
            catch (Exception ex)

            {
                throw new Exception("Error al guardar el archivo excel en stream");
            }
        }
        /// <summary>
        /// Crea y retorna el documento word en byte[].
        /// </summary>
        /// <param name="estruturaDeReporte"></param>
        /// <returns></returns>
        public byte[] ExportWordConsultaReporte(EstructuraReporteGenerico estruturaDeReporte)
        {
            Document word = null;

            word = new Document();

            try
            {
                DocumentBuilder docBuilder = new DocumentBuilder(word);
                docBuilder.CurrentSection.PageSetup.Orientation = Orientation.Portrait;
                docBuilder.CurrentSection.PageSetup.PaperSize   = Aspose.Words.PaperSize.Letter;

                docBuilder.CellFormat.Borders.LineStyle = Aspose.Words.LineStyle.Single;

                var numeroColumnas = estruturaDeReporte.ReporteGenericoPorRol.Count;

                foreach (var rol in estruturaDeReporte.ReporteGenericoPorRol)
                {
                    var columna = 0;

                    foreach (var columnaReporte in rol.ColumnasDelReporte)
                    {
                        var fecha         = columnaReporte.TipoDePeriodo == 1 ? Convert.ToDateTime(columnaReporte.FechaInstante.Date).ToString("dd/MM/yyyy") : Convert.ToDateTime(columnaReporte.FechaInicio.Date).ToString("dd/MM/yyyy") + " - " + Convert.ToDateTime(columnaReporte.FechaFin.Date).ToString("dd/MM/yyyy");
                        var moneda        = columnaReporte.Moneda != null && columnaReporte.Moneda.Length > 0 ? " - " + columnaReporte.Moneda : "";
                        var tituloSeccion = columnaReporte.Entidad + " - " + fecha + moneda;

                        this.EscribirTituloSeccion(docBuilder, tituloSeccion);



                        foreach (var concepto in rol.Conceptos)
                        {
                            if (concepto.Hechos[columna] != null)
                            {
                                List <String> nombreDimensiones = new List <string>();

                                if (concepto.Dimensiones != null && concepto.Dimensiones.Values.Count > 0)
                                {
                                    foreach (var estructuraDimensionReporte in concepto.Dimensiones.Values)
                                    {
                                        nombreDimensiones.Add(estructuraDimensionReporte.NombreDimension);
                                        nombreDimensiones.Add(estructuraDimensionReporte.NombreMiembro);
                                    }
                                }

                                docBuilder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(0);

                                if (concepto != null && concepto.Hechos != null && concepto.Hechos.Length > 0 && concepto.Hechos[columna] != null && concepto.Hechos[columna].TipoDato.Contains("textBlockItemType") || (concepto.Hechos[columna].TipoDato.Contains("stringItemType") && concepto.Hechos[columna].Valor != null && concepto.Hechos[columna].Valor.Length > 20))
                                {
                                    this.EscribirConceptoPorRenglon(docBuilder, concepto.NombreConcepto, concepto.Hechos[columna].Valor != null ? concepto.Hechos[columna].Valor : "", nombreDimensiones);
                                }
                                else
                                {
                                    String valor = "";

                                    var tipoDeDato = concepto.Hechos[columna].TipoDato.Substring(concepto.Hechos[columna].TipoDato.LastIndexOf(':') + 1);

                                    if (concepto.Hechos[columna].Valor != null)
                                    {
                                        switch (tipoDeDato)
                                        {
                                        case "stringItemType":
                                        case "monthNumberItemType":
                                        case "siNoItemType":
                                        case "denominationOfTheIssueItemType":
                                            valor = concepto.Hechos[columna].Valor;
                                            break;

                                        case "monetaryItemType":
                                        case "decimalItemType":
                                        case "nonNegativeIntegerItemType":
                                        case "percentItemType":
                                            valor = ReporteXBRLUtil.formatoDecimal(Convert.ToDecimal(concepto.Hechos[columna].Valor), ReporteXBRLUtil.FORMATO_CANTIDADES_DECIMALES_AUX);
                                            break;

                                        case "booleanItemType":
                                            valor = concepto.Hechos[columna].Valor.Equals("true") ? "SI" : "NO";
                                            break;

                                        case "dateItemType":
                                            valor = Convert.ToDateTime(concepto.Hechos[columna].Valor).ToString("dd/MM/yyyy");
                                            break;

                                        default:
                                            valor = concepto.Hechos[columna].Valor;
                                            break;
                                        }
                                    }

                                    this.EscribirADosColumnas(docBuilder, concepto.NombreConcepto, valor, nombreDimensiones);
                                }
                            }
                        }

                        docBuilder.Writeln();
                        docBuilder.MoveToDocumentEnd();

                        if ((columna + 1) < rol.ColumnasDelReporte.Count)
                        {
                            docBuilder.InsertBreak(BreakType.PageBreak);
                        }

                        columna++;
                    }
                }
            }
            catch (Exception e)
            {
                LogUtil.Error(e);
            }

            return(guardarDocumentoComoWord(word));
        }
 /// <summary>
 /// Llama al metodo que genera el reporte en excel
 /// </summary>
 /// <param name="estruturaDeReporte">Estructura que contiene la informacion necesaria para la creacion del reporte</param>
 /// <param name="rutaDestino">Ruta destino donde se crear el archivo xlsx</param>
 public MemoryStream ExcelStream(EstructuraReporteGenerico estruturaDeReporte)
 {
     return(ReporteGenericoExcel(estruturaDeReporte, estruturaDeReporte.Idioma, estruturaDeReporte.AgruparPorUnidad));
 }
        /// <summary>
        /// Metodo que realiza la agrupacion de periodos de tipo instante en los de duraciĆ³n en el caso que se cumplan
        /// los filtros necesarios para integrar el valor
        /// </summary>
        /// <param name="estructuraReporteGenerico">Valores de columnas y hechos a valorar</param>
        /// <param name="filtros">Filtros de consulta que se realizo para la consulta generica</param>
        /// <returns>Estructura generica para presentar en el reporte</returns>
        public EstructuraReporteGenerico AgruparHechosPorPeriodo(EntFiltroConsultaHecho filtros, EstructuraReporteGenerico estructuraReporteGenerico)
        {
            //Obtenemos los periodos de tipoInstante
            if (estructuraReporteGenerico != null && estructuraReporteGenerico.ReporteGenericoPorRol != null)
            {
                foreach (var reporteGenericoRol in estructuraReporteGenerico.ReporteGenericoPorRol)
                {
                    for (var indiceColumna = 0; indiceColumna < reporteGenericoRol.ColumnasDelReporte.Count; indiceColumna++)
                    {
                        var columnaReporte = reporteGenericoRol.ColumnasDelReporte[indiceColumna];
                        if (columnaReporte.TipoDePeriodo == Period.Instante)
                        {
                            foreach (var periodosFiltro in filtros.filtros.periodos)
                            {
                                if (periodosFiltro.FechaFin.Value.Date.Equals(columnaReporte.FechaInstante.Date))
                                {
                                    columnaReporte.FechaInicio = periodosFiltro.FechaInicio.Value;
                                    columnaReporte.FechaFin    = periodosFiltro.FechaFin.Value;
                                    break;
                                }
                            }

                            for (var indiceColumnaDuracion = 0; indiceColumnaDuracion < reporteGenericoRol.ColumnasDelReporte.Count; indiceColumnaDuracion++)
                            {
                                var columnaReporteDuracion = reporteGenericoRol.ColumnasDelReporte[indiceColumnaDuracion];
                                if (columnaReporteDuracion.TipoDePeriodo == Period.Duracion && validarIgualdad(columnaReporteDuracion, columnaReporte))
                                {
                                    foreach (var concepto in reporteGenericoRol.Conceptos)
                                    {
                                        if (concepto.Hechos[indiceColumnaDuracion] == null && concepto.Hechos[indiceColumna] != null)
                                        {
                                            concepto.Hechos[indiceColumnaDuracion] = concepto.Hechos[indiceColumna];
                                        }
                                    }

                                    reporteGenericoRol.ColumnasDelReporte[indiceColumna].OcultarColumna = true;
                                    break;
                                }
                            }
                        }
                    }
                }
            }


            return(estructuraReporteGenerico);
        }
        public EstructuraReporteGenerico CrearEstructuraGenerica(EntFiltroConsultaHecho filtros, ResultadoOperacionDto listaDeHechos, bool agruparPorUnidad, string nombreRol = "", string rolUri = "")
        {
            if (filtros.conceptos != null && filtros.conceptos.Count() > 0 && listaDeHechos.InformacionExtra != null && ((EntHecho[])listaDeHechos.InformacionExtra).Count() > 0)
            {
                EstructuraReporteGenerico estructuraReporteGenerico = new EstructuraReporteGenerico();
                EstructuraRolReporte      estructuraRolReporte      = new EstructuraRolReporte();
                estructuraRolReporte.ColumnasDelReporte = new List <EstructuraColumnaReporte>();
                estructuraRolReporte.Conceptos          = new List <EstructuraConceptoReporte>();
                estructuraRolReporte.Rol                = nombreRol;
                estructuraRolReporte.RolUri             = rolUri;
                estructuraRolReporte.ColumnasDelReporte = new List <EstructuraColumnaReporte>();

                if (filtros.conceptos != null)
                {
                    foreach (var detalleConcepto in filtros.conceptos.OrderBy(x => x.orden))
                    {
                        foreach (var hecho in ((EntHecho[])listaDeHechos.InformacionExtra).Where(x => x.concepto.Id.Equals(detalleConcepto.Id)))
                        {
                            //Verificar si este hecho cabe en alguna de las columnas
                            var columnaYaExiste = false;
                            foreach (var columna in estructuraRolReporte.ColumnasDelReporte)
                            {
                                if (HechoPerteneceAColumna(hecho, columna, agruparPorUnidad))
                                {
                                    columnaYaExiste = true;
                                    break;
                                }
                            }
                            if (!columnaYaExiste)
                            {
                                estructuraRolReporte.ColumnasDelReporte.Add(CrearColumnaEncabezado(hecho, agruparPorUnidad));
                            }
                        }
                    }
                }

                // Ordenar las columnas
                if (estructuraRolReporte.ColumnasDelReporte.Count > 1)
                {
                    estructuraRolReporte.ColumnasDelReporte = OrdenarFechaDeColumnas(estructuraRolReporte.ColumnasDelReporte);
                }

                Debug.WriteLine(estructuraRolReporte.Rol);
                foreach (var col in estructuraRolReporte.ColumnasDelReporte)
                {
                    Debug.WriteLine(col.Entidad + "," + DateUtil.ToStandarString(col.FechaInicio) + " - " + DateUtil.ToStandarString(col.FechaFin) + " - " + DateUtil.ToStandarString(col.FechaInstante) + "," +
                                    col.Moneda
                                    );
                }

                List <EstructuraConceptoReporte> listaDeConceptos = new List <EstructuraConceptoReporte>();
                CrearEstructuraConceptosConHechos(listaDeConceptos, listaDeHechos, filtros.conceptos, estructuraRolReporte.ColumnasDelReporte, filtros.idioma, agruparPorUnidad);
                estructuraRolReporte.Conceptos = listaDeConceptos;

                estructuraReporteGenerico.ReporteGenericoPorRol = new List <EstructuraRolReporte>();
                estructuraReporteGenerico.ReporteGenericoPorRol.Add(estructuraRolReporte);
                estructuraReporteGenerico.Idioma           = filtros.idioma;
                estructuraReporteGenerico.AgruparPorUnidad = agruparPorUnidad;

                return(estructuraReporteGenerico);
            }

            return((EstructuraReporteGenerico)null);
        }
        public IHttpActionResult ConsultarRepositorio()
        {
            var resultado = new ResultadoOperacionDto()
            {
                Resultado = true,
                Mensaje   = "Ok"
            };

            try
            {
                var filtrosConsulta = getFormKeyValue("consulta");
                var paginaRequerida = getFormKeyValue("pagina");
                var numeroRegistros = getFormKeyValue("numeroRegistros");

                var settings = new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Ignore
                };
                var filtrosConsultaHecho = JsonConvert.DeserializeObject <EntFiltroConsultaHecho>(filtrosConsulta, settings);

                /**
                 * var filtrosConsultaHecho = new EntFiltroConsultaHecho();
                 * filtrosConsultaHecho.conceptos = new EntConcepto[1];
                 * filtrosConsultaHecho.conceptos[0] = new EntConcepto();
                 * filtrosConsultaHecho.conceptos[0].Id = "ifrs-full_ChangesInEquity";
                 * filtrosConsultaHecho.conceptos[0].EspacioNombresTaxonomia = "http://www.bmv.com.mx/taxonomy/ifrs_mx/full_ifrs_mc_mx_ics_entry_point_2014-12-05";
                 * filtrosConsultaHecho.conceptos[0].dimension=new EntInformacionDimensional[1];
                 * filtrosConsultaHecho.conceptos[0].dimension[0] = new EntInformacionDimensional();
                 * filtrosConsultaHecho.conceptos[0].dimension[0].Explicita = true;
                 * filtrosConsultaHecho.conceptos[0].dimension[0].QNameDimension = "http://xbrl.ifrs.org/taxonomy/2014-03-05/ifrs-full:ComponentsOfEquityAxis";
                 * filtrosConsultaHecho.conceptos[0].dimension[0].IdDimension = "ifrs-full_ComponentsOfEquityAxis";
                 * filtrosConsultaHecho.conceptos[0].dimension[0].QNameItemMiembro = "http://xbrl.ifrs.org/taxonomy/2014-03-05/ifrs-full:IssuedCapitalMember";
                 * filtrosConsultaHecho.conceptos[0].dimension[0].IdItemMiembro = "ifrs-full_IssuedCapitalMember";
                 *
                 * filtrosConsultaHecho.filtros = new EntFiltrosAdicionales();
                 * filtrosConsultaHecho.filtros.entidades=new EntEntidad[1];
                 * filtrosConsultaHecho.filtros.entidades[0] = new EntEntidad();
                 * filtrosConsultaHecho.filtros.entidades[0].Id="ICA";
                 * filtrosConsultaHecho.filtros.periodos=new EntPeriodo[1];
                 * filtrosConsultaHecho.filtros.periodos[0] = new EntPeriodo();
                 * filtrosConsultaHecho.filtros.periodos[0].EsTipoInstante=false;
                 * filtrosConsultaHecho.filtros.periodos[0].Tipo=2;
                 * filtrosConsultaHecho.filtros.periodos[0].FechaInicio=new DateTime(2015,1,1);
                 * filtrosConsultaHecho.filtros.periodos[0].FechaFin=new DateTime(2015,6,30);
                 *
                 *
                 * filtrosConsultaHecho.filtros.unidades=new string[1];
                 * filtrosConsultaHecho.filtros.unidades[0] = "MXN";
                 *
                 * paginaRequerida = "1";
                 * numeroRegistros = "10";
                 */

                resultado = AbaxXBRLCellStoreService.ConsultarRepositorio(filtrosConsultaHecho, int.Parse(paginaRequerida), int.Parse(numeroRegistros));

                ReporteGenericoMongoDB reporteGenericoMongoDB = new ReporteGenericoMongoDB();

                EstructuraReporteGenerico estructuraReporteGenerico = reporteGenericoMongoDB.CrearEstructuraGenerica(filtrosConsultaHecho, resultado, true);
                estructuraReporteGenerico  = reporteGenericoMongoDB.AgruparHechosPorPeriodo(filtrosConsultaHecho, estructuraReporteGenerico);
                resultado.InformacionExtra = estructuraReporteGenerico;
            }
            catch (Exception e)
            {
                resultado.Resultado = false;
                resultado.Mensaje   = e.Message;
                LogUtil.Error(e);
            }


            return(Ok(resultado));
        }