public EdOrg GetEdOrgById(int edOrgId, int schoolYearId)
        {
            LoggingService.LogDebugMessage($"GetEdOrgById: '{edOrgId}', year {schoolYearId}");

            using (var validationPortalDataContext = ValidationPortalDataContextFactory.Create())
            {
                var schoolYear = SchoolYearService.GetSchoolYearById(schoolYearId);

                LoggingService.LogDebugMessage($"EdOrg cache: {validationPortalDataContext.EdOrgs.Count()} currently in ValidationPortal database");

                if (!validationPortalDataContext.EdOrgs.Any())
                {
                    LoggingService.LogDebugMessage("Refreshing EdOrg cache");
                    RefreshEdOrgCache(schoolYear);
                }

                var result = validationPortalDataContext.EdOrgs.FirstOrDefault(eo => eo.Id == edOrgId);
                if (result != null)
                {
                    return(result);
                }

                using (var odsDbContext = SchoolYearDbContextFactory.CreateWithParameter(schoolYear.EndYear))
                {
                    var conn = odsDbContext.Database.Connection;
                    try
                    {
                        conn.Open();
                        var edOrgQueryCmd = conn.CreateCommand();
                        edOrgQueryCmd.CommandType = System.Data.CommandType.Text;
                        edOrgQueryCmd.CommandText = EdOrgQuery.SingleEdOrgsQuery;
                        edOrgQueryCmd.Parameters.Add(new SqlParameter("@lea_id", System.Data.SqlDbType.Int));
                        edOrgQueryCmd.Parameters["@lea_id"].Value = edOrgId;
                        result = ReadEdOrgs(edOrgQueryCmd, schoolYearId).FirstOrDefault();
                    }
                    catch (Exception ex)
                    {
                        LoggingService.LogErrorMessage(
                            $"While reading Ed Org description (ID# {edOrgId}, school year {schoolYear}): {ex.ChainInnerExceptionMessages()}");
                    }
                    finally
                    {
                        if (conn != null && conn.State != System.Data.ConnectionState.Closed)
                        {
                            conn.Close();
                        }
                    }
                }

                if (result != null)
                {
                    validationPortalDataContext.EdOrgs.AddOrUpdate(result);
                    validationPortalDataContext.SaveChanges();
                    return(result);
                }

                throw new ApplicationException(
                          $"The Ed Org with ID# {edOrgId}, school year {schoolYear}, was not found.");
            }
        }
        protected IEnumerable <string> GetFieldsForView(SchoolYear schoolYear, string schema, string name)
        {
            var fieldsForView = new List <string>();

            using (var schoolYearContext = SchoolYearDbContextFactory.CreateWithParameter(schoolYear.EndYear))
            {
                var connection = schoolYearContext.Database.Connection;
                connection.Open();

                var queryCommand = connection.CreateCommand();
                queryCommand.CommandType = System.Data.CommandType.Text;
                queryCommand.CommandText =
                    @"SELECT COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA=@schemaName and table_name = @viewName";

                queryCommand.Parameters.Add(new SqlParameter("@schemaName", schema));
                queryCommand.Parameters.Add(new SqlParameter("@viewName", name));

                using (var reader = queryCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        fieldsForView.Add(reader["COLUMN_NAME"].ToString());
                    }
                }
            }

            return(fieldsForView);
        }
        public IList <dynamic> GetReportData(DynamicReportRequest request, int?districtId)
        {
            var reportDefinition = GetReportDefinition(request.ReportDefinitionId);

            // todo: implement user ordering, this at least mimics the admin definition screen
            var selectedFields = reportDefinition.Fields
                                 .Where(x => request.SelectedFields.Contains(x.Id.ToString()))
                                 .OrderBy(x => x.Field.Id)
                                 .ToList();

            var viewName   = $"[{reportDefinition.RulesView.Schema}].[{reportDefinition.RulesView.Name}]";
            var fieldNames = string.Join(", ", selectedFields.Select(x => $"[{x.Field.Name}]"));

            var report = new List <dynamic>();

            using (var schoolYearContext = SchoolYearDbContextFactory.CreateWithParameter(reportDefinition.SchoolYear.EndYear))
            {
                var connection = schoolYearContext.Database.Connection;
                connection.Open();

                var queryCommand = connection.CreateCommand();
                queryCommand.CommandTimeout = 500;
                queryCommand.CommandType    = System.Data.CommandType.Text;
                queryCommand.CommandText    = $"SELECT {fieldNames} FROM {viewName}";

                if (!reportDefinition.IsOrgLevelReport || districtId.HasValue)
                // && selectedFields.Any(x => x.Field.Name.Equals("DistrictId", StringComparison.InvariantCultureIgnoreCase)))
                {
                    queryCommand.CommandText += $" where [DistrictId] = {districtId}";
                }

                LoggingService.LogInfoMessage($"Executing dynamic report SQL: {queryCommand.CommandText}");
                using (var reader = queryCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var dynamicObject = new ExpandoObject() as IDictionary <string, object>;

                        foreach (var field in selectedFields)
                        {
                            var fieldDescription = !string.IsNullOrWhiteSpace(field.Description) ? field.Description : field.Field.Name;
                            dynamicObject.Add(fieldDescription, reader[field.Field.Name].ToString());
                        }

                        report.Add(dynamicObject);
                    }
                }
            }

            return(report);
        }
        public SingleEdOrgByIdQuery GetSingleEdOrg(int edOrgId, int schoolYearId)
        {
            SingleEdOrgByIdQuery result = null;

            var schoolYear = SchoolYearService.GetSchoolYearById(schoolYearId);

            using (var odsDbContext = SchoolYearDbContextFactory.CreateWithParameter(schoolYear.EndYear))
            {
                var conn = odsDbContext.Database.Connection;
                try
                {
                    conn.Open();
                    var edOrgQueryCmd = conn.CreateCommand();
                    edOrgQueryCmd.CommandType = System.Data.CommandType.Text;
                    edOrgQueryCmd.CommandText = SingleEdOrgByIdQuery.EdOrgQuery;
                    edOrgQueryCmd.Parameters.Add(new SqlParameter("@edOrgId", System.Data.SqlDbType.Int));
                    edOrgQueryCmd.Parameters["@edOrgId"].Value = edOrgId;

                    using (var reader = edOrgQueryCmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            result = new SingleEdOrgByIdQuery
                            {
                                Id = int.Parse(reader[SingleEdOrgByIdQuery.IdColumnName].ToString()),
                                ShortOrganizationName = reader[SingleEdOrgByIdQuery.OrganizationShortNameColumnName].ToString(),
                                OrganizationName      = reader[SingleEdOrgByIdQuery.OrganizationNameColumnName].ToString(),
                                StateOrganizationId   = reader[SingleEdOrgByIdQuery.StateOrganizationIdColumnName].ToString()
                            };
                        }
                    }
                }
                catch (Exception ex)
                {
                    LoggingService.LogErrorMessage(
                        $"While reading Ed Org description (ID# {edOrgId}, school year {schoolYear}): {ex.ChainInnerExceptionMessages()}");
                }
                finally
                {
                    if (conn != null && conn.State != System.Data.ConnectionState.Closed)
                    {
                        conn.Close();
                    }
                }
            }

            return(result);
        }
        public void RefreshEdOrgCache(SchoolYear schoolYear)
        {
            string fourDigitOdsDbYear     = schoolYear.EndYear;
            var    edOrgsExtractedFromODS = new List <EdOrg>();

            using (var odsDbContext = SchoolYearDbContextFactory.CreateWithParameter(fourDigitOdsDbYear))
            {
                var conn = odsDbContext.Database.Connection;
                try
                {
                    conn.Open();
                    var edOrgQueryCmd = conn.CreateCommand();
                    edOrgQueryCmd.CommandType = System.Data.CommandType.Text;
                    edOrgQueryCmd.CommandText = EdOrgQuery.AllEdOrgQuery;
                    edOrgsExtractedFromODS.AddRange(ReadEdOrgs(edOrgQueryCmd, schoolYear.Id).ToList());
                }
                catch (Exception ex)
                {
                    LoggingService.LogErrorMessage(
                        $"While trying to add all ODS Ed Org descriptions to the Validation Portal Database Cache: " +
                        $"school year {fourDigitOdsDbYear}, error: {ex.ChainInnerExceptionMessages()}");
                }
                finally
                {
                    if (conn != null && conn.State != System.Data.ConnectionState.Closed)
                    {
                        conn.Close();
                    }
                }
            }

            using (var validationPortalDataContext = ValidationPortalDataContextFactory.Create())
            {
                foreach (var singleEdOrg in edOrgsExtractedFromODS)
                {
                    validationPortalDataContext.EdOrgs.AddOrUpdate(singleEdOrg);
                }

                LoggingService.LogDebugMessage("EdOrgCache: saving changes");
                validationPortalDataContext.SaveChanges();
            }
        }
        public void UpdateViewsAndRulesForSchoolYear(int schoolYearId)
        {
            DeleteViewsAndRulesForSchoolYear(schoolYearId);

            var viewsForYear = new List <ValidationRulesView>();

            var schoolYear = SchoolYearService.GetSchoolYearById(schoolYearId);

            using (var schoolYearContext = SchoolYearDbContextFactory.CreateWithParameter(schoolYear.EndYear))
            {
                var connection = schoolYearContext.Database.Connection;
                connection.Open();

                var queryCommand = connection.CreateCommand();
                queryCommand.CommandType = System.Data.CommandType.Text;
                queryCommand.CommandText = @"select OBJECT_SCHEMA_NAME(t.object_id) [Schema], t.name [Name] FROM sys.tables as t where OBJECT_SCHEMA_NAME(t.object_id)=@schemaName";
                queryCommand.Parameters.Add(new SqlParameter("@schemaName", "rules"));

                using (var reader = queryCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // check for exclusions here and just continue
                        var tableName = reader["Name"].ToString();
                        if (!RulesEngineConfigurationValues.RulesTableExclusions.Contains(
                                tableName,
                                StringComparer.OrdinalIgnoreCase))
                        {
                            var rulesView = new ValidationRulesView
                            {
                                Enabled      = true,
                                Schema       = reader["Schema"].ToString(),
                                Name         = tableName,
                                SchoolYearId = schoolYearId
                            };

                            viewsForYear.Add(rulesView);
                        }
                    }
                }
            }

            using (var validationPortalContext = ValidationPortalDataContextFactory.Create())
            {
                foreach (var view in viewsForYear)
                {
                    var fieldNames = GetFieldsForView(schoolYear, view.Schema, view.Name);
                    foreach (var fieldName in fieldNames)
                    {
                        var rulesField = new ValidationRulesField {
                            Enabled = true, Name = fieldName
                        };
                        validationPortalContext.ValidationRulesFields.Add(rulesField);
                        view.RulesFields.Add(rulesField);
                    }
                }

                validationPortalContext.ValidationRulesViews.AddRange(viewsForYear);
                validationPortalContext.SaveChanges();
            }
        }