public Resultado ImportarPresupuesto(int presupuestoId, string rutaArchivoImportado, string nombreArchivo, int tamanioArchivo, string usuarioActual)
        {
            try
            {
                // Se guardan datos de Cabecera del Lote
                var lote = new RecursosExcelLote
                {
                    NombreArchivo       = nombreArchivo,
                    TamanioArchivo      = tamanioArchivo,
                    Activo              = true,
                    UsuarioCreacion     = usuarioActual,
                    FechaCreacion       = DateTime.Now,
                    UsuarioModificacion = usuarioActual,
                    FechaModificacion   = DateTime.Now
                };

                dbContext.RecursosExcelLotes.Add(lote);
                dbContext.SaveChanges();

                // Se guarda el detalle
                var startColumn = 1;
                var startRow    = 2;

                using (ExcelPackage package = new ExcelPackage(new FileInfo(rutaArchivoImportado)))
                {
                    ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                    var            cell      = worksheet.Cells[startRow, startColumn] != null && worksheet.Cells[startRow, startColumn].Value != null ? worksheet.Cells[startRow, startColumn].Value.ToString() : string.Empty;
                    var            item      = new RecursosExcel();
                    var            recurso   = new DataAccess.Models.Recurso();
                    while (!string.IsNullOrEmpty(cell))
                    {
                        item = new RecursosExcel
                        {
                            RecursoExcelLoteId = lote.Id,
                            PresupuestoId      = presupuestoId,
                            Ciudad             = worksheet.Cells[startRow, startColumn].Value.ToString(),
                            Facility           = worksheet.Cells[startRow, startColumn + 1].Value.ToString(),
                            CuentaContable     = worksheet.Cells[startRow, startColumn + 2].Value.ToString(),
                            PlanProgramatico   = worksheet.Cells[startRow, startColumn + 3].Value.ToString(),

                            Descripcion      = worksheet.Cells[startRow, startColumn + 4].Value.ToString(),
                            NotasAdicionales = worksheet.Cells[startRow, startColumn + 5].Value != null ? worksheet.Cells[startRow, startColumn + 5].Value.ToString() : string.Empty,

                            Cobertura = worksheet.Cells[startRow, startColumn + 6].Value != null?Convert.ToInt32(worksheet.Cells[startRow, startColumn + 6].Value.ToString()) : 0,
                                            IndiceTransferencia = worksheet.Cells[startRow, startColumn + 7].Value != null?Convert.ToDecimal(worksheet.Cells[startRow, startColumn + 7].Value.ToString()) : 0,
                                                                      MontoAnual = worksheet.Cells[startRow, startColumn + 8].Value != null?Convert.ToDecimal(worksheet.Cells[startRow, startColumn + 8].Value.ToString()) : 0,

                                                                                       Territorio      = worksheet.Cells[startRow, startColumn + 9].Value.ToString(),
                                                                                       Contraparte     = worksheet.Cells[startRow, startColumn + 10].Value.ToString(),
                                                                                       CodigoAuditoria = worksheet.Cells[startRow, startColumn + 11] != null && worksheet.Cells[startRow, startColumn + 11].Value != null ? worksheet.Cells[startRow, startColumn + 11].Value.ToString() : "0",
                                                                                       AccionNacional  = worksheet.Cells[startRow, startColumn + 12] != null && worksheet.Cells[startRow, startColumn + 12].Value != null ? worksheet.Cells[startRow, startColumn + 12].Value.ToString() : "0",
                                                                                       MarcoLogico     = worksheet.Cells[startRow, startColumn + 13] != null && worksheet.Cells[startRow, startColumn + 13].Value != null ? worksheet.Cells[startRow, startColumn + 13].Value.ToString() : "0",

                                                                                       Activo              = true,
                                                                                       UsuarioCreacion     = usuarioActual,
                                                                                       FechaCreacion       = DateTime.Now,
                                                                                       UsuarioModificacion = usuarioActual,
                                                                                       FechaModificacion   = DateTime.Now
                        };
                        dbContext.RecursosExcels.Add(item);
                        startRow++;
                        cell = worksheet.Cells[startRow, startColumn] != null && worksheet.Cells[startRow, startColumn].Value != null ? worksheet.Cells[startRow, startColumn].Value.ToString() : string.Empty;
                    }

                    dbContext.SaveChanges();
                }

                return(new Resultado("El Recurso se guardó correctamente."));
            }
            catch (Exception excepcion)
            {
                LogHelper.RegisterError(excepcion.Message);
                return(new Resultado("Ocurrio un error. Favor contactarse con el administrador."));
            }
        }
        public MemoryStream GetReporteBet(string templateDocument, int facilityId, int ciudadId)
        {
            try
            {
                // Results Output
                MemoryStream output = new MemoryStream();

                // Read Template
                using (FileStream templateDocumentStream = File.OpenRead(templateDocument))
                {
                    // Create Excel EPPlus Package based on template stream
                    using (ExcelPackage package = new ExcelPackage(templateDocumentStream))
                    {
                        // Grab the sheet with the template, sheet name is "BOL".
                        ExcelWorksheet sheet = package.Workbook.Worksheets["ReporteBET"];

                        var facility = dbContext.Facilities.Find(facilityId);
                        var ciudad   = dbContext.Ciudades.Find(ciudadId);

                        sheet.Cells[1, 1].Value = $"Ciudad: {ciudad.Codigo} - {ciudad.Nombre}";
                        sheet.Cells[2, 1].Value = $"Unidad de Programa: {facility.Codigo} - {facility.Nombre}";

                        //sheet.Cells[6, 2].Formula = "SUMA(B7:B11)";
                        var recursosMeses = dbContext.RecursosMeses.Where(r => r.Activo && r.Recurso.Activo && r.Recurso.FacilityId == facilityId && r.Recurso.CiudadId == ciudadId).ToList();
                        var recurso       = new DataAccess.Models.Recurso();
                        if (recursosMeses.Count > 0)
                        {
                            foreach (var recursoMes in recursosMeses)
                            {
                                recurso = recursoMes.Recurso;
                                sheet.InsertRow(5, 1, 4);
                                sheet.Cells[5, 1].Value = recursoMes.Recurso.CuentaContable.Numero;
                                var descripcionFiltrada = recurso.Descripcion.Normalize(NormalizationForm.FormD).Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();
                                sheet.Cells[5, 2].Value = new String(descripcionFiltrada);
                                sheet.Cells[5, 3].Value = recurso.CodigosAuditoria != null ? recurso.CodigosAuditoria.Codigo : string.Empty;
                                var codigoProgramatico         = $"{recurso.Ciudad.Codigo}{recurso.PlanProgramatico.Codigo}{recurso.Territorio.Codigo}{recurso.Contraparte.Codigo}-/{(recurso.AccionesNacionale != null ? recurso.AccionesNacionale.Codigo : "")}*{(recurso.CodigoMarcoLogico != null ? recurso.CodigoMarcoLogico.Codigo : "")}:{recurso.NotasAdicionales}";
                                var codigoProgramaticoFiltrado = codigoProgramatico.Normalize(NormalizationForm.FormD).Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();
                                sheet.Cells[5, 4].Value = new String(codigoProgramaticoFiltrado);
                                sheet.Cells[5, 5].Value = recursoMes.Recurso.Monto;

                                sheet.Cells[5, 6].Value  = recursoMes.Enero;
                                sheet.Cells[5, 7].Value  = recursoMes.Febrero;
                                sheet.Cells[5, 8].Value  = recursoMes.Marzo;
                                sheet.Cells[5, 9].Value  = recursoMes.Abril;
                                sheet.Cells[5, 10].Value = recursoMes.Mayo;
                                sheet.Cells[5, 11].Value = recursoMes.Junio;
                                sheet.Cells[5, 12].Value = recursoMes.Julio;
                                sheet.Cells[5, 13].Value = recursoMes.Agosto;
                                sheet.Cells[5, 14].Value = recursoMes.Septiembre;
                                sheet.Cells[5, 15].Value = recursoMes.Octubre;
                                sheet.Cells[5, 16].Value = recursoMes.Noviembre;
                                sheet.Cells[5, 17].Value = recursoMes.Diciembre;
                            }
                            sheet.DeleteRow(4);
                        }

                        package.SaveAs(output);
                    }
                    return(output);
                }
            }
            catch (Exception exception)
            {
                // Log Exception
                return(null);
            }
        }