/// <summary>
        /// Actualiza o crea un hecho en base a los criterios enviados como parámetro
        /// </summary>
        /// <param name="instancia">Documento instnacia actual</param>
        /// <param name="idConcepto">Concepto actual</param>
        /// <param name="hojaAImportar">Hoja actualmente procesada</param>
        /// <param name="renglonActual">Renglón actualmente procesado</param>
        /// <param name="numColumna">Columna actualmente procesada</param>
        /// <param name="contextoDestino">Contexto a donde se asignarán los hechos creados</param>
        private void ActualizarValorHecho(DocumentoInstanciaXbrlDto instancia, string idConcepto, ISheet hojaAImportar, int renglonActual, int numColumna,
                                          AbaxXBRLCore.Viewer.Application.Dto.ContextoDto contextoDestino, IDefinicionPlantillaXbrl plantillaDocumento, AbaxXBRLCore.Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion)
        {
            var valorCelda   = ExcelUtil.ObtenerValorCelda(hojaAImportar, renglonActual, numColumna);
            var fechaDefault = plantillaDocumento.ObtenerVariablePorId("fecha_2016_10_12");

            if (!String.IsNullOrEmpty(valorCelda))
            {
                ConceptoDto conceptoImportado = instancia.Taxonomia.ConceptosPorId[idConcepto];
                HechoDto    hechoActualizar   = null;

                var hechos = instancia.BuscarHechos(idConcepto, null, null, contextoDestino.Periodo.FechaInstante, contextoDestino.Periodo.FechaInstante, null, false);

                if (hechos.Count > 0)
                {
                    hechoActualizar = hechos[0];
                }
                else
                {
                    hechoActualizar = instancia.CrearHecho(idConcepto, null, contextoDestino.Id, "A" + Guid.NewGuid().ToString());

                    plantillaDocumento.InyectaHechoADocumentoInstancia(hechoActualizar);
                }

                if (!UtilAbax.ActualizarValorHecho(conceptoImportado, hechoActualizar, valorCelda, fechaDefault))
                {
                    resumenImportacion.AgregarErrorFormato(
                        UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportado.Id),
                        hojaAImportar.SheetName,
                        renglonActual.ToString(),
                        numColumna.ToString(),
                        valorCelda);
                }
                else
                {
                    resumenImportacion.TotalHechosImportados++;
                    var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                    {
                        IdConcepto     = hechoActualizar.IdConcepto,
                        IdHecho        = hechoActualizar.Id,
                        ValorImportado = valorCelda,
                        HojaExcel      = hojaAImportar.SheetName,
                        Renglon        = renglonActual,
                        Columna        = numColumna
                    };

                    resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportado.Id));
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Exporta al documento de word el hecho del concepto para el trimestre actual, agrega el titulo y el contenido
        /// los hechos sin valor no son exportados
        /// </summary>
        /// <param name="estructura">Estructura actual a exportar</param>
        /// <param name="docBuilder">Clase auxiliar para la creación de contenido en Word</param>
        /// <param name="instancia">Documento de instancia a exportar</param>
        /// <param name="rol">Rol exportado</param>
        /// <param name="plantillaDocumento">Plantilla de documento exportado</param>
        private void ExportarEstructuraRol(EstructuraFormatoDto estructura, DocumentBuilder docBuilder, DocumentoInstanciaXbrlDto instancia, string rol,
                                           IDefinicionPlantillaXbrl plantillaDocumento, DateTime fechaInicio, DateTime fechaFin, string claveIdioma)
        {
            var hechos = instancia.BuscarHechos(estructura.IdConcepto, null, null, fechaInicio, fechaFin, null);

            if (hechos.Count > 0 && hechos[0].Valor != null && !String.IsNullOrEmpty(hechos[0].Valor.Trim()))
            {
                if (String.IsNullOrEmpty(claveIdioma))
                {
                    claveIdioma = "es";
                }
                var etqs        = instancia.Taxonomia.ConceptosPorId[estructura.IdConcepto].Etiquetas[claveIdioma];
                var rolEtiqueta = String.IsNullOrEmpty(estructura.RolEtiquetaPreferido)
                    ? Etiqueta.RolEtiqueta
                    : estructura.RolEtiquetaPreferido;
                var etiqueta = instancia.Taxonomia.ConceptosPorId[estructura.IdConcepto].Nombre;
                if (etqs.ContainsKey(rolEtiqueta))
                {
                    etiqueta = etqs[rolEtiqueta].Valor;
                }

                var font = docBuilder.Font;
                font.Size = 8;
                font.Bold = true;
                font.Name = "Arial";

                docBuilder.Writeln(etiqueta);
                docBuilder.InsertParagraph();
                font.Bold = false;

                WordUtil.InsertHtml(docBuilder, estructura.IdConcepto + ":" + hechos[0].Id, hechos[0].Valor, true);

                docBuilder.InsertParagraph();
                docBuilder.Writeln("");
            }
            if (estructura.SubEstructuras != null)
            {
                foreach (var subestructura in estructura.SubEstructuras)
                {
                    ExportarEstructuraRol(subestructura, docBuilder, instancia, rol, plantillaDocumento, fechaInicio, fechaFin, claveIdioma);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Valida las operaciones extras sobre cuentas específicas del documento de instancia:
        /// Validaciones de consolidado = true :
        /// Utilidad (pérdida) neta = Utilidad (pérdida) atribuible a la participación controladora + Utilidad (pérdida) atribuible a la participación no controladora
        /// Resultado integral =resultado integral de la participación controladora + resultado integral de la participación no controladora
        /// Validaciones generales
        /// Incremento (disminución) neto de efectivo y equivalentes de efectivo + Efectivo y equivalentes de efectivo al principio del periodo = Efectivo y equivalentes de efectivo al final del periodo
        /// </summary>
        /// <param name="instancia">Documento de instancia a validar</param>
        /// <param name="parametros">Parametros extras para validación</param>
        /// <param name="fechaTrimestreParam">Fecha de cierre de trimestre del reporte</param>
        /// <param name="resultadoValidacion">Objeto del resultado de la validación</param>
        /// <returns></returns>
        private bool ValidarCuentasExtras(DocumentoInstanciaXbrlDto instancia, IDictionary <string, string> parametros, DateTime fechaTrimestreParam, ResultadoValidacionDocumentoXBRLDto resultadoValidacion)
        {
            var strConsolidado = ObtenerValorNoNumerico(ID_CUENTA_CONSOLIDADO, instancia);

            if (strConsolidado != null && CommonConstants.CADENAS_VERDADERAS.Any(x => x.Equals(strConsolidado, StringComparison.InvariantCultureIgnoreCase)))
            {
                //Validaciones para Consolidado = si

                //Utilidad (pérdida) neta = Utilidad (pérdida) atribuible a la participación controladora + Utilidad (pérdida) atribuible a la participación no controladora
                if (instancia.HechosPorIdConcepto.ContainsKey(ID_UTILIDAD_PERDIDA_NETA))
                {
                    var dimensiones = new List <DimensionInfoDto>();
                    foreach (var idHechoutilidadPerdidaNeta in instancia.HechosPorIdConcepto[ID_UTILIDAD_PERDIDA_NETA])
                    {
                        if (instancia.HechosPorId.ContainsKey(idHechoutilidadPerdidaNeta))
                        {
                            var utilidadPerdidaNeta = instancia.HechosPorId[idHechoutilidadPerdidaNeta];
                            var ctx = instancia.ContextosPorId[utilidadPerdidaNeta.IdContexto];
                            if (!ctx.ContieneInformacionDimensional)
                            {
                                var utilidadPerdidaNetaControladora   = instancia.BuscarHechos(ID_UTILIDAD_PERDIDA_NETA_PARTICIPANCION_CONTROLADORA, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                                var utilidadPerdidaNetaNoControladora = instancia.BuscarHechos(ID_UTILIDAD_PERDIDA_NETA_PARTICIPANCION_NO_CONTROLADORA, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                                if (utilidadPerdidaNetaControladora.Count > 0 && utilidadPerdidaNetaNoControladora.Count > 0)
                                {
                                    if (utilidadPerdidaNeta.ValorNumerico != utilidadPerdidaNetaControladora[0].ValorNumerico + utilidadPerdidaNetaNoControladora[0].ValorNumerico)
                                    {
                                        AgregarError(resultadoValidacion, null, ctx.Id,
                                                     String.Format(M_ERROR_RV013, utilidadPerdidaNeta.ValorNumerico, utilidadPerdidaNetaControladora[0].ValorNumerico, utilidadPerdidaNetaNoControladora[0].ValorNumerico), true);
                                        return(false);
                                    }
                                }
                            }
                        }
                    }
                }

                //Resultado integral =resultado integral de la participación controladora + resultado integral de la participación no controladora
                if (instancia.HechosPorIdConcepto.ContainsKey(ID_RESULTADO_INTEGRAL))
                {
                    var dimensiones = new List <DimensionInfoDto>();
                    foreach (var idHechoResultadoIntegral in instancia.HechosPorIdConcepto[ID_RESULTADO_INTEGRAL])
                    {
                        if (instancia.HechosPorId.ContainsKey(idHechoResultadoIntegral))
                        {
                            var resultadoIntegral = instancia.HechosPorId[idHechoResultadoIntegral];
                            var ctx = instancia.ContextosPorId[resultadoIntegral.IdContexto];
                            if (!ctx.ContieneInformacionDimensional)
                            {
                                var resultadoIntegralControladora   = instancia.BuscarHechos(ID_RESULTADO_INTEGRAL_CONTROLADORA, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                                var resultadoIntegralNoControladora = instancia.BuscarHechos(ID_RESULTADO_INTEGRAL_NO_CONTROLADORA, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                                if (resultadoIntegralControladora.Count > 0 && resultadoIntegralNoControladora.Count > 0)
                                {
                                    if (resultadoIntegral.ValorNumerico != resultadoIntegralControladora[0].ValorNumerico + resultadoIntegralNoControladora[0].ValorNumerico)
                                    {
                                        AgregarError(resultadoValidacion, null, ctx.Id,
                                                     String.Format(M_ERROR_RV014, resultadoIntegral.ValorNumerico, resultadoIntegralControladora[0].ValorNumerico, resultadoIntegralNoControladora[0].ValorNumerico), true);
                                        return(false);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            //Incremento (disminución) neto de efectivo y equivalentes de efectivo + Efectivo y equivalentes de efectivo al principio del periodo = Efectivo y equivalentes de efectivo al final del periodo
            if (instancia.HechosPorIdConcepto.ContainsKey(ID_INCREMENTO_DISMINUCION_EFECTIVO_Y_EQUIVALENTES))
            {
                var dimensiones = new List <DimensionInfoDto>();
                foreach (var idHechoIncrementoDisminucion in instancia.HechosPorIdConcepto[ID_INCREMENTO_DISMINUCION_EFECTIVO_Y_EQUIVALENTES])
                {
                    if (instancia.HechosPorId.ContainsKey(idHechoIncrementoDisminucion))
                    {
                        var incrementoDisminucion = instancia.HechosPorId[idHechoIncrementoDisminucion];
                        var ctx = instancia.ContextosPorId[incrementoDisminucion.IdContexto];
                        if (!ctx.ContieneInformacionDimensional)
                        {
                            var efectivoAlInicio = instancia.BuscarHechos(ID_EFECTIVO_Y_EQUIVALENTES, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaInicio.AddDays(-1), dimensiones, true);
                            var efectivoAlFinal  = instancia.BuscarHechos(ID_EFECTIVO_Y_EQUIVALENTES, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                            if (efectivoAlInicio.Count > 0 && efectivoAlFinal.Count > 0)
                            {
                                if (incrementoDisminucion.ValorNumerico != efectivoAlFinal[0].ValorNumerico - efectivoAlInicio[0].ValorNumerico)
                                {
                                    AgregarError(resultadoValidacion, null, ctx.Id,
                                                 String.Format(M_ERROR_RV015, efectivoAlFinal[0].ValorNumerico, efectivoAlInicio[0].ValorNumerico, incrementoDisminucion.ValorNumerico), true);
                                    return(false);
                                }
                            }
                        }
                    }
                }
            }

            //El valor de Capital contable al final del periodo  debe ser igual a la suma de Capital contable al principio del periodo  + Total Incremento (disminuci\u00F3n) en el capital contable  para el miembro de dominio
            if (instancia.HechosPorIdConcepto.ContainsKey(ID_CAMBIOS_EN_EL_CAPITAL_CONTABLE))
            {
                var dimensiones = new List <DimensionInfoDto>();
                foreach (var idHechosCambiosEnCapital in instancia.HechosPorIdConcepto[ID_CAMBIOS_EN_EL_CAPITAL_CONTABLE])
                {
                    if (instancia.HechosPorId.ContainsKey(idHechosCambiosEnCapital))
                    {
                        var cambiosCapital = instancia.HechosPorId[idHechosCambiosEnCapital];
                        var ctx            = instancia.ContextosPorId[cambiosCapital.IdContexto];
                        dimensiones.Clear();
                        if (ctx.ValoresDimension != null)
                        {
                            dimensiones.AddRange(ctx.ValoresDimension);
                        }
                        var capitalInicial = instancia.BuscarHechos(ID_CAPITAL_CONTABLE, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaInicio.AddDays(-1), dimensiones, true);
                        var capitalFinal   = instancia.BuscarHechos(ID_CAPITAL_CONTABLE, null, null, ctx.Periodo.FechaInicio, ctx.Periodo.FechaFin, dimensiones, true);
                        if (capitalInicial.Count > 0 && capitalFinal.Count > 0)
                        {
                            if (cambiosCapital.ValorNumerico != capitalFinal[0].ValorNumerico - capitalInicial[0].ValorNumerico)
                            {
                                AgregarError(resultadoValidacion, null, ctx.Id,
                                             String.Format(M_ERROR_RV016, capitalFinal[0].ValorNumerico, capitalInicial[0].ValorNumerico, cambiosCapital.ValorNumerico), true);
                                return(false);
                            }
                        }
                    }
                }
            }


            return(true);
        }
        public void ExportarRolADocumentoWord(Document word, Section seccionActual, DocumentoInstanciaXbrlDto instancia, string rol, IDefinicionPlantillaXbrl plantillaDocumento, string claveIdioma)
        {
            //Buscar el la tabla   []
            Table tabla800005 = null;

            NodeCollection allTables = seccionActual.GetChildNodes(NodeType.Table, true);

            foreach (Table table in allTables)
            {
                if (table.Range.Text.Contains("Ingresos nacionales [miembro]") || table.Range.Text.Contains("National income [member]"))
                {
                    tabla800005 = table;
                    break;
                }
            }

            if (tabla800005 != null)
            {
                DateTime fechaInicio = DateTime.MinValue;
                DateTime fechaFin    = DateTime.MinValue;
                //Trimestre actual


                if (XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId("fecha_2015_09_30"), out fechaFin)
                    &&
                    XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId("fecha_2015_01_01"), out fechaInicio))
                {
                    var todasLasMarcas = new DimensionInfoDto()
                    {
                        Explicita   = false,
                        IdDimension = _idDimensionMarcas,
                        ElementoMiembroTipificado = String.Format(_templateTypedMemeberMarcas, _todasLasMarcas)
                    };
                    var todosLosProductos = new DimensionInfoDto()
                    {
                        Explicita   = false,
                        IdDimension = _idDimensionProductos,
                        ElementoMiembroTipificado = String.Format(_templateTypedMemeberProducto, _todosLosProductos)
                    };


                    var combinacionesMarcaProducto = ObtenerCombinacionesDimensionesMarcaProducto(instancia, fechaInicio, fechaFin);

                    var iRenglon            = _renglonWordInicioHechos;
                    var renglonInicioHechos = tabla800005.Rows[_renglonWordInicioHechos];

                    foreach (var combinacion in combinacionesMarcaProducto)
                    {
                        var renglonNuevo = (Row)renglonInicioHechos.Clone(true);

                        tabla800005.InsertBefore(renglonNuevo, renglonInicioHechos);

                        renglonNuevo.Cells[0].FirstParagraph.AppendChild(new Run(word, ObtenerNombreMarcaOProducto(combinacion[0])));
                        renglonNuevo.Cells[0].FirstParagraph.Runs[0].Font.Name = "Arial";
                        renglonNuevo.Cells[0].FirstParagraph.Runs[0].Font.Size = 6;
                        renglonNuevo.Cells[1].FirstParagraph.AppendChild(new Run(word, ObtenerNombreMarcaOProducto(combinacion[1])));
                        renglonNuevo.Cells[1].FirstParagraph.Runs[0].Font.Name = "Arial";
                        renglonNuevo.Cells[1].FirstParagraph.Runs[0].Font.Size = 6;

                        var dimensionTipoIngreso = new DimensionInfoDto()
                        {
                            Explicita = true,
                        };

                        var listaDimensiones = new List <DimensionInfoDto>
                        {
                            combinacion[0],
                            combinacion[1],
                            dimensionTipoIngreso
                        };

                        for (var iCol = _columnaInicioHechos; iCol <= _columnaFinHechos; iCol++)
                        {
                            dimensionTipoIngreso.IdDimension   = _idDimensionTipoIngresos;
                            dimensionTipoIngreso.IdItemMiembro = _elementosMiembroTipoIngreso[iCol - _columnaInicioHechos];

                            var hecho = instancia.BuscarHechos(_idElementoPrimarioIngresos, null, null, fechaInicio,
                                                               fechaFin, listaDimensiones);
                            if (hecho != null && hecho.Count > 0)
                            {
                                string valor = "$ ";

                                double valorDouble = 0;
                                if (Double.TryParse(hecho[0].Valor, NumberStyles.Any, CultureInfo.InvariantCulture,
                                                    out valorDouble))
                                {
                                    valor += valorDouble.ToString("#,##0.00");
                                }
                                else
                                {
                                    valor = hecho[0].Valor;
                                }
                                renglonNuevo.Cells[iCol].FirstParagraph.AppendChild(new Run(word, valor));
                                renglonNuevo.Cells[iCol].FirstParagraph.Runs[0].Font.Name = "Arial";
                                renglonNuevo.Cells[iCol].FirstParagraph.Runs[0].Font.Size = 6;
                            }
                        }
                        iRenglon++;
                    }
                    var renglonTotal = tabla800005.LastRow;
                    for (var iCol = _columnaInicioHechos; iCol <= _columnaFinHechos; iCol++)
                    {
                        var tipoIngreso = new DimensionInfoDto()
                        {
                            Explicita     = true,
                            IdDimension   = _idDimensionTipoIngresos,
                            IdItemMiembro = _elementosMiembroTipoIngreso[iCol - _columnaInicioHechos]
                        };

                        var hecho = instancia.BuscarHechos(_idElementoPrimarioIngresos, null, null, fechaInicio,
                                                           fechaFin, new List <DimensionInfoDto>()
                        {
                            todasLasMarcas, todosLosProductos, tipoIngreso
                        });
                        if (hecho != null && hecho.Count > 0)
                        {
                            string valor       = "$ ";
                            double valorDouble = 0;
                            if (Double.TryParse(hecho[0].Valor, NumberStyles.Any, CultureInfo.InvariantCulture,
                                                out valorDouble))
                            {
                                valor += valorDouble.ToString("#,##0.00");
                            }
                            else
                            {
                                valor = hecho[0].Valor;
                            }
                            renglonTotal.Cells[iCol].FirstParagraph.AppendChild(new Run(word, valor));
                            renglonTotal.Cells[iCol].FirstParagraph.Runs[0].Font.Name = "Arial";
                            renglonTotal.Cells[iCol].FirstParagraph.Runs[0].Font.Size = 6;
                        }
                    }
                }
            }
        }
        public void ExportarDatosDeHojaExcel(ISheet hojaAExportar, ISheet hojaPlantilla, DocumentoInstanciaXbrlDto instancia, string rol, Model.IDefinicionPlantillaXbrl plantillaDocumento, String idioma)
        {
            DateTime fechaInicio = DateTime.MinValue;
            DateTime fechaFin    = DateTime.MinValue;

            //Trimestre actual

            if (XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId("fecha_2015_09_30"), out fechaFin)
                &&
                XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId("fecha_2015_01_01"), out fechaInicio))
            {
                var todasLasMarcas = new DimensionInfoDto()
                {
                    Explicita                 = false,
                    IdDimension               = _idDimensionMarcas,
                    QNameDimension            = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[_idDimensionMarcas]),
                    ElementoMiembroTipificado = String.Format(_templateTypedMemeberMarcas, _todasLasMarcas)
                };
                var todosLosProductos = new DimensionInfoDto()
                {
                    Explicita                 = false,
                    IdDimension               = _idDimensionProductos,
                    QNameDimension            = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[_idDimensionProductos]),
                    ElementoMiembroTipificado = String.Format(_templateTypedMemeberProducto, _todosLosProductos)
                };


                var combinacionesMarcaProducto = ObtenerCombinacionesDimensionesMarcaProducto(instancia, fechaInicio, fechaFin);
                if (combinacionesMarcaProducto.Count > 0)
                {
                    hojaAExportar.ShiftRows(_renglonInicioHechos, hojaAExportar.LastRowNum, combinacionesMarcaProducto.Count);
                }

                var iRenglon = _renglonInicioHechos;
                foreach (var combinacion in combinacionesMarcaProducto)
                {
                    var renglon = hojaAExportar.CreateRow(iRenglon);

                    ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon, _columnaMarca, ObtenerNombreMarcaOProducto(combinacion[0]), CellType.String, null);
                    ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon, _columnaProducto, ObtenerNombreMarcaOProducto(combinacion[1]), CellType.String, null);

                    var dimensionTipoIngreso = new DimensionInfoDto()
                    {
                        Explicita = true,
                    };

                    var listaDimensiones = new List <DimensionInfoDto>
                    {
                        combinacion[0],
                        combinacion[1],
                        dimensionTipoIngreso
                    };

                    for (var iCol = _columnaInicioHechos; iCol <= _columnaFinHechos; iCol++)
                    {
                        dimensionTipoIngreso.IdDimension      = _idDimensionTipoIngresos;
                        dimensionTipoIngreso.QNameDimension   = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[_idDimensionTipoIngresos]);
                        dimensionTipoIngreso.IdItemMiembro    = ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonDimensionItemTipoIngreso, iCol);
                        dimensionTipoIngreso.QNameItemMiembro = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonDimensionItemTipoIngreso, iCol)]);

                        var hecho = instancia.BuscarHechos(_idElementoPrimarioIngresos, null, null, fechaInicio,
                                                           fechaFin, listaDimensiones);
                        if (hecho != null && hecho.Count > 0)
                        {
                            ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon, iCol, hecho[0].Valor, CellType.Numeric, hecho[0]);
                        }
                    }
                    iRenglon++;
                }

                var numRenglones = hojaAExportar.LastRowNum;
                for (; iRenglon <= numRenglones; iRenglon++)
                {
                    if (_tituloRenglonTotal.Equals(ExcelUtil.ObtenerValorCelda(hojaAExportar, iRenglon, _columnaProducto)))
                    {
                        for (var iCol = _columnaInicioHechos; iCol <= _columnaFinHechos; iCol++)
                        {
                            var tipoIngreso = new DimensionInfoDto()
                            {
                                Explicita        = true,
                                IdDimension      = _idDimensionTipoIngresos,
                                QNameDimension   = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[_idDimensionTipoIngresos]),
                                IdItemMiembro    = ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonDimensionItemTipoIngreso, iCol),
                                QNameItemMiembro = ObtenerQNameConcepto(instancia.Taxonomia.ConceptosPorId[ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonDimensionItemTipoIngreso, iCol)])
                            };

                            var hecho = instancia.BuscarHechos(_idElementoPrimarioIngresos, null, null, fechaInicio,
                                                               fechaFin, new List <DimensionInfoDto>()
                            {
                                todasLasMarcas, todosLosProductos, tipoIngreso
                            });
                            if (hecho != null && hecho.Count > 0)
                            {
                                ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon, iCol, hecho[0].Valor, CellType.Numeric, hecho[0]);
                            }
                        }
                        break;
                    }
                }
            }
        }
        private void ActualizarValorHecho(ConceptoDto concepto, string valorCelda, List <DimensionInfoDto> dimensiones,
                                          DateTime fechaInicio, DateTime fechaFin, string qNameEntidad, DocumentoInstanciaXbrlDto instancia, IDefinicionPlantillaXbrl plantillaDocumento,
                                          AbaxXBRLCore.Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion, ISheet hojaImportar, int iRenglon, int columna)
        {
            if (String.IsNullOrEmpty(valorCelda))
            {
                return;
            }

            var             fechaDefault      = plantillaDocumento.ObtenerVariablePorId("fecha_2015_01_01");
            List <HechoDto> hechosAActualizar = new List <HechoDto>();

            var hechos = instancia.BuscarHechos(concepto.Id, null, null, fechaInicio, fechaFin, dimensiones);

            if (hechos.Count > 0)
            {
                hechosAActualizar.AddRange(hechos);
            }
            else
            {
                var         qNameCompleto   = XmlUtil.ParsearQName(qNameEntidad);
                ContextoDto contextoDestino = null;
                var         tipoPeriodo     = concepto.TipoPeriodo.Equals(EtiquetasXBRLConstantes.Instant) ? Period.Instante : Period.Duracion;
                var         contextos       = instancia.BuscarContexto(qNameEntidad,
                                                                       tipoPeriodo, fechaInicio, fechaFin, dimensiones);
                if (contextos == null || contextos.Count == 0)
                {
                    contextoDestino = new ContextoDto()
                    {
                        Entidad = new EntidadDto()
                        {
                            ContieneInformacionDimensional = false,
                            EsquemaId = qNameCompleto.Namespace,
                            Id        = qNameCompleto.Name
                        },
                        ContieneInformacionDimensional = dimensiones.Count > 0,
                        ValoresDimension = dimensiones,
                        Periodo          = new PeriodoDto()
                        {
                            Tipo          = tipoPeriodo,
                            FechaInicio   = fechaInicio,
                            FechaFin      = fechaFin,
                            FechaInstante = fechaFin
                        },
                        Id = "C" + Guid.NewGuid().ToString()
                    };
                    plantillaDocumento.InyectarContextoADocumentoInstancia(contextoDestino);
                }
                else
                {
                    contextoDestino = contextos[0];
                }

                UnidadDto unidadDestino = null;
                if (concepto.EsTipoDatoNumerico)
                {
                    var listaMedidas = new List <MedidaDto>()
                    {
                        new MedidaDto()
                        {
                            EspacioNombres = plantillaDocumento.ObtenerVariablePorId("medida_http___www_xbrl_org_2003_iso4217"),
                            Nombre         = plantillaDocumento.ObtenerVariablePorId("medida_MXN")
                        }
                    };

                    var unidades = instancia.BuscarUnidades(Unit.Medida, listaMedidas, null);
                    if (unidades == null || unidades.Count == 0)
                    {
                        unidadDestino = new UnidadDto()
                        {
                            Id      = "U" + Guid.NewGuid().ToString(),
                            Tipo    = Unit.Medida,
                            Medidas = listaMedidas
                        };
                        instancia.UnidadesPorId.Add(unidadDestino.Id, unidadDestino);
                    }
                    else
                    {
                        unidadDestino = unidades[0];
                    }
                }

                var hechoNuevo = instancia.CrearHecho(concepto.Id, unidadDestino != null ? unidadDestino.Id : null, contextoDestino.Id, "A" + Guid.NewGuid().ToString());
                if (concepto.EsTipoDatoNumerico)
                {
                    hechoNuevo.Valor     = "0";
                    hechoNuevo.Decimales = _valorDecimalesHechos;
                }
                hechosAActualizar.Add(hechoNuevo);

                plantillaDocumento.InyectaHechoADocumentoInstancia(hechoNuevo);
            }

            foreach (var hechoActualizar in hechosAActualizar)
            {
                var conceptoImportar = instancia.Taxonomia.ConceptosPorId[hechoActualizar.IdConcepto];
                if (!UtilAbax.ActualizarValorHecho(conceptoImportar, hechoActualizar, valorCelda, fechaDefault))
                {
                    resumenImportacion.AgregarErrorFormato(
                        UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportar.Id),
                        hojaImportar.SheetName,
                        iRenglon.ToString(),
                        columna.ToString(),
                        valorCelda);
                }
                else
                {
                    resumenImportacion.TotalHechosImportados++;
                    var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                    {
                        IdConcepto     = hechoActualizar.IdConcepto,
                        IdHecho        = hechoActualizar.Id,
                        ValorImportado = valorCelda,
                        HojaExcel      = hojaImportar.SheetName,
                        Renglon        = iRenglon,
                        Columna        = columna
                    };

                    resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportar.Id));
                }
            }
        }
        public void ExportarRolADocumentoWord(Document word, Section section, DocumentoInstanciaXbrlDto instancia, string rol, IDefinicionPlantillaXbrl plantillaDocumento, string claveIdioma)
        {
            DateTime fechaInicio = DateTime.MinValue;
            DateTime fechaFin    = DateTime.MinValue;

            //Navegar por secciones

            for (var iAnio = 0; iAnio < _anios.Length; iAnio++)
            {
                var variableFechaFin    = _anios[iAnio].Equals("A") ? "fecha_2015_09_30" : "fecha_2014_09_30";
                var variableFechaInicio = _anios[iAnio].Equals("A") ? "fecha_2015_01_01" : "fecha_2014_01_01";
                var conAjustes          = false;

                if (XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId(variableFechaFin), out fechaFin)
                    &&
                    XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId(variableFechaInicio), out fechaInicio))
                {
                    for (var iAjustes = 0; iAjustes < _itemsAjustes.Length; iAjustes++)
                    {
                        for (var iPrimario = 0; iPrimario < _elementosPrimarios.Length; iPrimario++)
                        {
                            for (var iComponentesCapital = 0;
                                 iComponentesCapital < _itemComponentesCapital.Length;
                                 iComponentesCapital++)
                            {
                                //Si es capital contable al inicio se envía de fecha de fin = fecha de inicio - 1 día
                                //Si es capital contable al final se envía fecha de fin = fecha de fin
                                DateTime fechaFinFinal = fechaFin;
                                if (iPrimario == 0)
                                {
                                    fechaFinFinal = fechaInicio.AddDays(-1);
                                }
                                var listaDimensiones = new List <DimensionInfoDto>();

                                if (iAjustes != 0)
                                {
                                    listaDimensiones.Add(new DimensionInfoDto()
                                    {
                                        Explicita     = true,
                                        IdDimension   = "ifrs-full_RetrospectiveApplicationAndRetrospectiveRestatementAxis",
                                        IdItemMiembro = _itemsAjustes[iAjustes]
                                    });
                                }
                                if (iComponentesCapital != 24)
                                {
                                    listaDimensiones.Add(new DimensionInfoDto()
                                    {
                                        Explicita     = true,
                                        IdDimension   = "ifrs-full_ComponentsOfEquityAxis",
                                        IdItemMiembro = _itemComponentesCapital[iComponentesCapital]
                                    });
                                }

                                var hechos = instancia.BuscarHechos(_elementosPrimarios[iPrimario], null, null, fechaInicio, fechaFinFinal,
                                                                    listaDimensiones);
                                if (hechos != null && hechos.Count > 0)
                                {
                                    //conHechos = true;
                                    string valorFinal = "$ ";

                                    double valorDouble = 0;
                                    if (Double.TryParse(hechos[0].Valor, NumberStyles.Any, CultureInfo.InvariantCulture,
                                                        out valorDouble))
                                    {
                                        valorFinal = valorFinal + valorDouble.ToString("#,##0.00");
                                    }
                                    else
                                    {
                                        valorFinal = hechos[0].Valor;
                                    }

                                    section.Range.Replace("[" + _anios[iAnio] + "-" + iAjustes + "-" + iPrimario + "-" + iComponentesCapital + "]",
                                                          valorFinal, false, false);
                                    if (iAjustes > 0)
                                    {
                                        conAjustes = true;
                                    }
                                }
                                else
                                {
                                    section.Range.Replace("[" + _anios[iAnio] + "-" + iAjustes + "-" + iPrimario + "-" + iComponentesCapital + "]",
                                                          "", false, false);
                                }
                            }
                        }
                    }
                    //Si no existen datos para ajustes, eliminar renglón  5 a 11
                    if (!conAjustes)
                    {
                        //Buscar la tabla para eliminar renglones
                        NodeCollection allTables = section.GetChildNodes(NodeType.Table, true);
                        var            indiceInicioTablaBorrar = iAnio * TablasPorPeriodo;
                        for (int indiceTablaBorrar = 0; indiceTablaBorrar < TablasPorPeriodo; indiceTablaBorrar++)
                        {
                            for (int iBorrar = 11; iBorrar >= 5; iBorrar--)
                            {
                                ((Table)allTables[indiceTablaBorrar + indiceInicioTablaBorrar]).Rows.RemoveAt(iBorrar);
                            }
                        }
                    }
                }
            }
        }
        public void ExportarDatosDeHojaExcel(ISheet hojaAExportar, ISheet hojaPlantilla, DocumentoInstanciaXbrlDto instancia, string rol, Model.IDefinicionPlantillaXbrl plantillaDocumento, String idioma)
        {
            var numRenglones = hojaPlantilla.LastRowNum;

            for (var iRenglon = _renglonInicioHechos; iRenglon <= numRenglones; iRenglon++)
            {
                var idElementoPrimario = ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, iRenglon, _columnaIdConcepto);
                if (idElementoPrimario != null && instancia.Taxonomia.ConceptosPorId.ContainsKey(idElementoPrimario))
                {
                    var concepto    = instancia.Taxonomia.ConceptosPorId[idElementoPrimario];
                    var EsAbstracto = concepto.EsAbstracto != null ? concepto.EsAbstracto.Value : false;
                    if (!EsAbstracto || (concepto.EsMiembroDimension != null && concepto.EsMiembroDimension.Value))
                    {
                        var idItemAjustes = _idItemMiembroSenialadoActualmenteAjustes;
                        //Si el concepto es un miembro de dimension, entonces se expresa el capital inicial para ese miembro
                        if (concepto.EsMiembroDimension != null && concepto.EsMiembroDimension.Value)
                        {
                            //Cambiar el concepto a capital contable y colocar el concepto a describir como miembro de la dimensión ajustes
                            idItemAjustes = concepto.Id;
                            concepto      = instancia.Taxonomia.ConceptosPorId[_elementosPrimarios[0]];
                        }
                        var numColumnas = hojaPlantilla.GetRow(iRenglon).LastCellNum;
                        for (int iCol = _columnaInicioHechos; iCol <= numColumnas; iCol++)
                        {
                            var valorDimensionAjustes = new DimensionInfoDto()
                            {
                                IdDimension   = _idDimensionAjustes,
                                IdItemMiembro = idItemAjustes,
                                Explicita     = true
                            };
                            var valorDimensionComponentesCapital = new DimensionInfoDto()
                            {
                                IdDimension   = ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonDimensionComponentesCapital, _columnaInicioHechos),
                                IdItemMiembro = ExcelUtil.ObtenerIdConceptoDeCelda(hojaPlantilla, _renglonMiembroComponentesCapital, iCol),
                                Explicita     = true
                            };

                            if (!String.IsNullOrEmpty(valorDimensionAjustes.IdDimension) && !String.IsNullOrEmpty(valorDimensionAjustes.IdItemMiembro) &&
                                !String.IsNullOrEmpty(valorDimensionComponentesCapital.IdDimension) &&
                                !String.IsNullOrEmpty(valorDimensionComponentesCapital.IdItemMiembro))
                            {
                                DateTime fechaInicio         = DateTime.MinValue;
                                DateTime fechaFin            = DateTime.MinValue;
                                var      variableFechaFin    = hojaPlantilla.SheetName.Contains("Actual") ? "fecha_2015_09_30" : "fecha_2014_09_30";
                                var      variableFechaInicio = hojaPlantilla.SheetName.Contains("Actual") ? "fecha_2015_01_01" : "fecha_2014_01_01";

                                if (XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId(variableFechaFin), out fechaFin)
                                    &&
                                    XmlUtil.ParsearUnionDateTime(plantillaDocumento.ObtenerVariablePorId(variableFechaInicio), out fechaInicio))
                                {
                                    //Si es capital contable al inicio se envía de fecha de fin = fecha de inicio - 1 día
                                    //Si es capital contable al final se envía fecha de fin = fecha de fin
                                    if (iRenglon <= _renglonFinalAjustesRetrospectivos)
                                    {
                                        fechaFin = fechaInicio.AddDays(-1);
                                    }
                                    var listaDimensiones = new List <DimensionInfoDto>();

                                    if (instancia.Taxonomia.DimensionDefaults.ContainsKey(valorDimensionAjustes.IdDimension) &&
                                        !valorDimensionAjustes.IdItemMiembro.Equals(instancia.Taxonomia.DimensionDefaults[valorDimensionAjustes.IdDimension]))
                                    {
                                        listaDimensiones.Add(valorDimensionAjustes);
                                    }
                                    if (instancia.Taxonomia.DimensionDefaults.ContainsKey(valorDimensionComponentesCapital.IdDimension) &&
                                        !valorDimensionComponentesCapital.IdItemMiembro.Equals(instancia.Taxonomia.DimensionDefaults[valorDimensionComponentesCapital.IdDimension]))
                                    {
                                        listaDimensiones.Add(valorDimensionComponentesCapital);
                                    }

                                    var hechoDto = instancia.BuscarHechos(concepto.Id, null, null, fechaInicio, fechaFin,
                                                                          listaDimensiones);

                                    if (hechoDto != null && hechoDto.Count > 0)
                                    {
                                        ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon, iCol, hechoDto[0].Valor,
                                                                    concepto.EsTipoDatoNumerico?
                                                                    CellType.Numeric:CellType.String
                                                                    , hechoDto[0]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        private int InsertarRenglon(string idConceptoHechoActual, DocumentoInstanciaXbrlDto instancia, IDefinicionPlantillaXbrl plantillaDocumento, int iRenglon, Document doc, Table tabla800001)
        {
            var _renglonPrimariosTotales = new String[]
            {
                "ifrs_mx-cor_20141205_InstitucionExtranjeraSiNo",
                "ifrs_mx-cor_20141205_FechaDeFirmaContrato",
                "ifrs_mx-cor_20141205_FechaDeVencimiento",
                "ifrs_mx-cor_20141205_TasaDeInteresYOSobretasa"
            };

            int      renglonesInsertados = 0;
            DateTime fechaInicio         = DateTime.MinValue;
            DateTime fechaFin            = DateTime.MinValue;

            //Trimestre actual
            if (AbaxXBRLCore.Common.Util.DateUtil.ParseDate(
                    plantillaDocumento.ObtenerVariablePorId("fecha_2015_09_30"),
                    AbaxXBRLCore.Common.Util.DateUtil.YMDateFormat, out fechaFin)
                &&
                AbaxXBRLCore.Common.Util.DateUtil.ParseDate(
                    plantillaDocumento.ObtenerVariablePorId("fecha_2015_07_01"),
                    AbaxXBRLCore.Common.Util.DateUtil.YMDateFormat, out fechaInicio))
            {
                var hechosElemento = instancia.BuscarHechos(idConceptoHechoActual, null, null, fechaInicio, fechaFin, null, false);

                var institucionesRelacionadas = ObtenerDistintasInstituciones(hechosElemento, instancia);

                var dimensionDenominacion = new DimensionInfoDto()
                {
                    Explicita     = true,
                    IdDimension   = _idDimensionDenominacion,
                    IdItemMiembro = _idItemMiembroTotalMonedas
                };
                var dimensionIntervalo = new DimensionInfoDto()
                {
                    Explicita     = true,
                    IdDimension   = _idDimensionIntervalo,
                    IdItemMiembro = _idItemMiembroTotalIntervalos
                };
                //Escribir renglón de institución
                foreach (var institucionMember in institucionesRelacionadas.Where(x => !x.ElementoMiembroTipificado.Contains(_institucionTotal)))
                {
                    renglonesInsertados++;
                    var renglonNuevo = iRenglon + renglonesInsertados;
                    var dimensiones  = new List <DimensionInfoDto>()
                    {
                        dimensionDenominacion, dimensionIntervalo, institucionMember
                    };
                    //insertar renglon

                    var renglon = (Row)tabla800001.Rows[renglonNuevo].Clone(true);

                    tabla800001.InsertAfter(renglon, tabla800001.Rows[renglonNuevo - 1]);

                    renglon.FirstCell.FirstParagraph.AppendChild(new Run(doc, ObtenerNombreInstitucion(institucionMember)));
                    renglon.FirstCell.FirstParagraph.Runs[0].Font.Name = "Arial";
                    renglon.FirstCell.FirstParagraph.Runs[0].Font.Size = 6;
                    //Escribir los elementos primarios que van en total
                    for (var iCol = _columnaInicioHechosTotales; iCol <= _columnaFinHechosTotales; iCol++)
                    {
                        var idConceptoHechoTotal = _renglonPrimariosTotales[iCol - _columnaInicioHechosTotales];

                        var hechoTotal = instancia.BuscarHechos(idConceptoHechoTotal, null, null, fechaInicio, fechaFin, dimensiones);
                        if (hechoTotal != null && hechoTotal.Count > 0)
                        {
                            renglon.Cells[iCol].FirstParagraph.AppendChild(new Run(doc, hechoTotal[0].Valor));
                            renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Name = "Arial";
                            renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Size = 6;
                        }
                        else
                        {
                            //renglon.Cells[iCol].FirstParagraph.Runs[0].Text = "";
                        }
                    }
                    //Montos
                    for (var iCol = _columnaInicioHechosMontos; iCol <= _columnaFinHechosMontos; iCol++)
                    {
                        //dimensionDenominacion.IdItemMiembro = ExcelUtil.ObtenerValorCelda(hojaPlantilla, _renglonItemMiembroDenominacion, iCol);
                        //dimensionIntervalo.IdItemMiembro = ExcelUtil.ObtenerValorCelda(hojaPlantilla, _renglonItemMiembroIntervalo, iCol);

                        //var hechoMonto = instancia.BuscarHechos(idConceptoHechoActual, null, null, fechaInicio, fechaFin, dimensiones);
                        //if (hechoMonto != null && hechoMonto.Count > 0)
                        //{
                        //    ExcelUtil.AsignarValorCelda(hojaAExportar, renglonNuevo, iCol, hechoMonto[0].Valor, CellType.Numeric);
                        //}
                        renglon.Cells[iCol].FirstParagraph.AppendChild(new Run(doc, "0"));
                        renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Name = "Arial";
                        renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Size = 6;
                    }
                }
                //Escribir en renglón de total
                foreach (var institucionMember in institucionesRelacionadas.Where(x => x.ElementoMiembroTipificado.Contains(_institucionTotal)))
                {
                    var dimensiones = new List <DimensionInfoDto>()
                    {
                        dimensionDenominacion, dimensionIntervalo, institucionMember
                    };
                    var renglon = tabla800001.Rows[iRenglon];
                    //Montos
                    for (var iCol = _columnaInicioHechosMontos; iCol <= _columnaFinHechosMontos; iCol++)
                    {
                        /*dimensionDenominacion.IdItemMiembro = ExcelUtil.ObtenerValorCelda(hojaPlantilla, _renglonItemMiembroDenominacion, iCol);
                         * dimensionIntervalo.IdItemMiembro = ExcelUtil.ObtenerValorCelda(hojaPlantilla, _renglonItemMiembroIntervalo, iCol);
                         *
                         * var hechoMonto = instancia.BuscarHechos(idConceptoHechoActual, null, null, fechaInicio, fechaFin, dimensiones);
                         * if (hechoMonto != null && hechoMonto.Count > 0)
                         * {
                         *  ExcelUtil.AsignarValorCelda(hojaAExportar, iRenglon + renglonesInsertados, iCol, hechoMonto[0].Valor, CellType.Numeric);
                         * }*/
                        renglon.Cells[iCol].FirstParagraph.AppendChild(new Run(doc, "0"));
                        renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Name = "Arial";
                        renglon.Cells[iCol].FirstParagraph.Runs[0].Font.Size = 6;
                    }
                }
            }
            return(renglonesInsertados);
        }