示例#1
0
 public MergeDestination(RedistrictingOptions o, IWizardStep p)
     : base()
 {
     options = o;
     prev = p;
     InitializeComponent();
 }
示例#2
0
 public SplitDistro(RedistrictingOptions o, IWizardStep p)
     : base()
 {
     prev = p;
     options = o;
     InitializeComponent();
 }
 public SplittingDemography(RedistrictingOptions o, int i)
     : base()
 {
     options = o;
     index = i;
     InitializeComponent();
 }
示例#4
0
 public MergingSources(RedistrictingOptions o, string t)
     : base()
 {
     options = o;
     title = t;
     InitializeComponent();
 }
示例#5
0
 public SplittingSaes(RedistrictingOptions o, IWizardStep p)
     : base()
 {
     InitializeComponent();
     options = o;
     prev = p;
 }
 public SplitReviewConfirm(RedistrictingOptions o)
     : base()
 {
     options = o;
     message = Translations.SplitConfirmReview;
     
     InitializeComponent();
 }
 public SplittingDemography(RedistrictingOptions o, bool run)
     : base()
 {
     options = o;
     index = 0;
     doExecuteSplit = run;
     InitializeComponent();
 }
        public RedistrictingResult Run(RedistrictingOptions options)
        {
            RedistrictingResult result = new RedistrictingResult();
            //return result;

            bool transWasStarted = false;
            OleDbConnection connection = new OleDbConnection(DatabaseData.Instance.AccessConnectionString);
            using (connection)
            {
                connection.Open();
                try
                {
                    // START TRANS
                    OleDbCommand command = new OleDbCommand("BEGIN TRANSACTION", connection);
                    command.ExecuteNonQuery();
                    transWasStarted = true;

                    if (options.SplitType == SplittingType.Merge)
                        result = DoMerge(options, command, connection);
                    else if (options.SplitType == SplittingType.Split)
                        result = DoSplit(options, command, connection);
                    else
                        result = DoSplitCombine(options, command, connection);

                    // COMMIT TRANS
                    command = new OleDbCommand("COMMIT TRANSACTION", connection);
                    command.ExecuteNonQuery();
                    transWasStarted = false;
                }
                catch (Exception ex)
                {
                    if (transWasStarted)
                    {
                        try
                        {
                            OleDbCommand cmd = new OleDbCommand("ROLLBACK TRANSACTION", connection);
                            cmd.ExecuteNonQuery();
                        }
                        catch { }
                    }
                    logger.Error("Exception occurred running redistricting (RedistrictingExpert:Run). " + options.ToString(), ex);
                    return new RedistrictingResult { ErrorMessage = TranslationLookup.GetValue("UnexpectedException", "UnexpectedException") + ex.Message, HasError = true };

                }
            }
            return result;
        }
        private RedistrictingResult DoSplitCombine(RedistrictingOptions options, OleDbCommand command, OleDbConnection connection)
        {
            Dictionary<int, List<AdminLevelDemography>> demographyToMerge = new Dictionary<int, List<AdminLevelDemography>>();
            Dictionary<string, List<DiseaseDistroCm>> ddCmToMerge = new Dictionary<string, List<DiseaseDistroCm>>();
            Dictionary<string, List<DiseaseDistroPc>> ddPcToMerge = new Dictionary<string, List<DiseaseDistroPc>>();
            Dictionary<string, List<IntvBase>> intvToMerge = new Dictionary<string, List<IntvBase>>();
            Dictionary<string, List<ProcessBase>> trainingToMerge = new Dictionary<string, List<ProcessBase>>();
            List<SurveyBase> surveys = new List<SurveyBase>();
            var processesToCopyAll = new List<ProcessBase>();
            Dictionary<string, List<ProcessBase>> scmToMerge = new Dictionary<string, List<ProcessBase>>();

            int redistrictId = demoRepo.InsertRedistrictingRecord(command, connection, options, userId);
            foreach (var source in options.SplitDestinations)
            {
                demoRepo.InsertRedistrictUnit(command, connection, userId, source.Unit, redistrictId, RedistrictingRelationship.Mother, source.Percent, false);

                List<AdminLevelDemography> demos = new List<AdminLevelDemography>();
                List<DiseaseDistroCm> ddCms = new List<DiseaseDistroCm>();
                List<DiseaseDistroPc> ddPcs = new List<DiseaseDistroPc>();
                List<IntvBase> intvs = new List<IntvBase>();
                // WHAT TO DO ABOUT SURVEYS?
                // List<SurveyBase> survs = new List<SurveyBase>();
                List<ProcessBase> procs = new List<ProcessBase>();
                // split off portion
                SplitSourceToDestination(options, command, connection, redistrictId, options.MergeDestination, source.Unit, source.Percent,
                    demos, ddCms, ddPcs, intvs,  procs);
                AddToMergingDictionaries(options, demographyToMerge, ddCmToMerge, ddPcToMerge, intvToMerge, trainingToMerge, processesToCopyAll,
                    surveys, scmToMerge, demos, ddCms, ddPcs, intvs, new List<SurveyBase>(), procs);
                // adjust actual unit
                SplitSourceToDestination(options, command, connection, redistrictId, source.Unit, source.Unit, 100 - source.Percent,
                    null, null, null, null, null);
            }
            // do different for surveys

            var processesNoSaes = processesToCopyAll.Where(p => p.ProcessType.Id != (int)StaticProcessType.SAEs).ToList();
            MergeIntoNewUnit(options, command, connection, redistrictId, demographyToMerge, ddCmToMerge, ddPcToMerge, intvToMerge, trainingToMerge,
                processesNoSaes, surveys, scmToMerge);
            // The necessary ones have been moved, now they just need to be saved
            SaveSplitSaes(options.Saes, redistrictId, command, connection);

            return new RedistrictingResult();
        }
        private void MergeSurveys(RedistrictingOptions opts, List<SurveyBase> toMerge, AdminLevel dest, int redistrictId, OleDbCommand command, OleDbConnection connection)
        {   
            foreach (var oldForm in toMerge)
            {
                SurveyBase newForm = Util.DeepClone(oldForm);
                // remove all but merge sources
                oldForm.AdminLevels.RemoveAll(a => !opts.MergeSources.Select(s => s.Id).Contains(a.Id));
                surveyRepo.SaveSurveyBase(command, connection, oldForm, userId);

                newForm.Id = 0;
                newForm.IsRedistricted = true;
                // remove all the old admin levels
                newForm.AdminLevels.RemoveAll(a => opts.MergeSources.Select(s => s.Id).Contains(a.Id));
                newForm.AdminLevels.Add(dest);
                surveyRepo.SaveSurveyBase(command, connection, newForm, userId);
                opts.Surveys.Add(newForm);
                demoRepo.InsertRedistrictForm(command, connection, userId, redistrictId, oldForm.Id, newForm.Id, IndicatorEntityType.Survey);
            }
        }
        private void MergeProcesses(RedistrictingOptions opts, List<ProcessBase> toMerge, int destId, int redistrictId, OleDbCommand command, OleDbConnection connection)
        {
            foreach (var oldForm in toMerge)
            {
                ProcessBase newForm = Util.DeepClone(oldForm);

                newForm.Id = 0;
                newForm.IsRedistricted = true;
                newForm.AdminLevelId = destId;
                processRepo.Save(command, connection, newForm, userId);
                demoRepo.InsertRedistrictForm(command, connection, userId, redistrictId, oldForm.Id, newForm.Id, IndicatorEntityType.Process);
                opts.Processes.Add(newForm);
            }
        }
示例#12
0
 public RedistrictRules(RedistrictingOptions o)
     : base()
 {
     InitializeComponent();
     options = o;
 }
示例#13
0
 public SplittingSource(RedistrictingOptions o)
     : base()
 {
     options = o;
     InitializeComponent();
 }
 public SplittingIntoNumber(RedistrictingOptions o)
     : base()
 {
     options = o;
     InitializeComponent();
 }
        private RedistrictingResult DoSplit(RedistrictingOptions options, OleDbCommand command, OleDbConnection connection)
        {
            int redistrictId = demoRepo.InsertRedistrictingRecord(command, connection, options, userId);
            demoRepo.InsertRedistrictUnit(command, connection, userId, options.Source, redistrictId, RedistrictingRelationship.Mother, 0, true);
            foreach (var dest in options.SplitDestinations)
            {
                demoRepo.InsertRedistrictUnit(command, connection, userId, dest.Unit, redistrictId, RedistrictingRelationship.Daughter, dest.Percent, false);
                SplitSourceToDestination(options, command, connection, redistrictId, dest.Unit, options.Source, dest.Percent, null, null, null, null,
                    null);
            }
            // copy all surveys into new groups 
            List<SurveyDetails> surveys = surveyRepo.GetAllForAdminLevel(options.Source.Id);
            var newSites = SplitSentinelSites(options.Source, options.SplitDestinations, command, connection);
            foreach (var survey in surveys)
                options.Surveys.Add(SplitSurveys(survey, options.Source, options.SplitDestinations, redistrictId, command, connection, newSites));

            SaveSplitSaes(options.Saes, redistrictId, command, connection);
            return new RedistrictingResult();
        }
        private void SplitSourceToDestination(RedistrictingOptions options, OleDbCommand command, OleDbConnection connection, int redistrictId, AdminLevel dest,
            AdminLevel source, double percent, List<AdminLevelDemography> demosToMerge, List<DiseaseDistroCm> ddCmMerge, List<DiseaseDistroPc> ddPcMerge,
            List<IntvBase> intvMerge, List<ProcessBase> procsMerge)
        {
            double percentMultiplier = (percent / 100);
            // split all demography
            List<DemoDetails> demoDetails = demoRepo.GetAdminLevelDemography(source.Id);
            foreach (var deet in demoDetails)
                SplitDemo(demosToMerge, deet, dest.Id, percentMultiplier, redistrictId, command, connection);
            // split all distros 
            List<DiseaseDistroDetails> dds = diseaseRepo.GetAllForAdminLevel(source.Id);
            foreach (var dd in dds)
                if (dd.DiseaseType == "PC")
                    options.DistrosPc.Add(SplitDdPc(ddPcMerge, dd, dest, percentMultiplier, redistrictId, command, connection));
                else
                    options.DistrosCm.Add(SplitDdCm(ddCmMerge, dd, dest, percentMultiplier, redistrictId, command, connection));
            // split all intvs 
            List<IntvDetails> intvs = intvRepo.GetAllForAdminLevel(source.Id);
            foreach (var intv in intvs)
                options.Intvs.Add(SplitIntv(intvMerge, intv, dest, percentMultiplier, redistrictId, command, connection));
            // split all processes 
            IEnumerable<ProcessDetails> processes = processRepo.GetAllForAdminLevel(source.Id).Where(i => i.TypeId != (int)StaticProcessType.SAEs);
            foreach (var process in processes)
                options.Processes.Add(SplitProcesses(procsMerge, process, dest, percentMultiplier, redistrictId, command, connection));

        }
示例#17
0
 public MergeYear(RedistrictingOptions o)
     : base()
 {
     options = o;
     InitializeComponent();
 }
示例#18
0
        public int InsertRedistrictingRecord(OleDbCommand command, OleDbConnection connection, RedistrictingOptions options, int userId)
        {
            command = new OleDbCommand(@"Insert Into RedistrictEvents (RedistrictTypeId, CreatedById, CreatedAt, RedistrictDate) VALUES
                        (@RedistrictTypeId,  @CreatedById, @CreatedAt, @RedistrictDate)", connection);
            command.Parameters.Add(new OleDbParameter("@RedistrictTypeId", (int)options.SplitType));
            command.Parameters.Add(new OleDbParameter("@CreatedById", userId));
            command.Parameters.Add(OleDbUtil.CreateDateTimeOleDbParameter("@CreatedAt", DateTime.Now));
            command.Parameters.Add(OleDbUtil.CreateDateTimeOleDbParameter("@RedistrictDate", options.RedistrictDate));
            command.ExecuteNonQuery();

            command = new OleDbCommand(@"SELECT Max(ID) FROM RedistrictEvents", connection);
            int id = (int)command.ExecuteScalar();

            return id;
        }
        private RedistrictingResult DoMerge(RedistrictingOptions options, OleDbCommand command, OleDbConnection connection)
        {
            int redistrictId = demoRepo.InsertRedistrictingRecord(command, connection, options, userId);

            Dictionary<int, List<AdminLevelDemography>> demographyToMerge = new Dictionary<int, List<AdminLevelDemography>>();
            Dictionary<string, List<DiseaseDistroCm>> ddCmToMerge = new Dictionary<string, List<DiseaseDistroCm>>();
            Dictionary<string, List<DiseaseDistroPc>> ddPcToMerge = new Dictionary<string, List<DiseaseDistroPc>>();
            Dictionary<string, List<IntvBase>> intvToMerge = new Dictionary<string, List<IntvBase>>();
            Dictionary<string, List<ProcessBase>> trainingToMerge = new Dictionary<string, List<ProcessBase>>();
            List<ProcessBase> processesToCopyAll = new List<ProcessBase>();
            List<SurveyBase> surveys = new List<SurveyBase>();
            Dictionary<string, List<ProcessBase>> scmToMerge = new Dictionary<string, List<ProcessBase>>();

            #region Get forms to merge
            foreach (var source in options.MergeSources)
            {
                List<AdminLevelDemography> demos = new List<AdminLevelDemography>();
                List<DiseaseDistroCm> ddCms = new List<DiseaseDistroCm>();
                List<DiseaseDistroPc> ddPcs = new List<DiseaseDistroPc>();
                List<IntvBase> intvs = new List<IntvBase>();
                List<SurveyBase> survs = new List<SurveyBase>();
                List<ProcessBase> procs = new List<ProcessBase>();
                demoRepo.InsertRedistrictUnit(command, connection, userId, source, redistrictId, RedistrictingRelationship.Mother, 100, true);
                // add all children to merge destination
                options.MergeDestination.Children.AddRange(demoRepo.GetAdminLevelChildren(source.Id));
                // Gather all the necessary forms
                List<DemoDetails> demoDetails = demoRepo.GetAdminLevelDemography(source.Id);
                foreach (var demoDetail in demoDetails)
                    demos.Add(demoRepo.GetDemoById(demoDetail.Id));
                List<DiseaseDistroDetails> ddDetails = diseaseRepo.GetAllForAdminLevel(source.Id);
                foreach (var dd in ddDetails.Where(d => d.DiseaseType == "CM"))
                    ddCms.Add(diseaseRepo.GetDiseaseDistributionCm(dd.Id, dd.TypeId));
                foreach (var dd in ddDetails.Where(d => d.DiseaseType == "PC"))
                    ddPcs.Add(diseaseRepo.GetDiseaseDistribution(dd.Id, dd.TypeId));
                List<IntvDetails> intvDeatils = intvRepo.GetAllForAdminLevel(source.Id);
                foreach (var i in intvDeatils)
                    intvs.Add(intvRepo.GetById(i.Id));
                List<SurveyDetails> survDeatils = surveyRepo.GetAllForAdminLevel(source.Id);
                foreach (var s in survDeatils)
                    survs.Add(surveyRepo.GetById(s.Id));
                List<ProcessDetails> procDetails = processRepo.GetAllForAdminLevel(source.Id);
                foreach (var p in procDetails)
                    procs.Add(processRepo.GetById(p.Id));
                // Determine which forms to merge
                AddToMergingDictionaries(options, demographyToMerge, ddCmToMerge, ddPcToMerge, intvToMerge,
                    trainingToMerge, processesToCopyAll, surveys, scmToMerge, demos, ddCms, ddPcs, intvs, survs, procs);
            }
            #endregion

            MergeIntoNewUnit(options, command, connection, redistrictId, demographyToMerge, ddCmToMerge, ddPcToMerge, intvToMerge,
                trainingToMerge, processesToCopyAll, surveys, scmToMerge);

            return new RedistrictingResult();
        }
 public BackupForRedistrict(RedistrictingOptions o)
     : base()
 {
     options = o;
     InitializeComponent();
 }
        /// <summary>
        /// match forms to merge
        /// </summary>
        private void AddToMergingDictionaries(RedistrictingOptions options, Dictionary<int, List<AdminLevelDemography>> demographyToMerge,
            Dictionary<string, List<DiseaseDistroCm>> ddCmToMerge, Dictionary<string, List<DiseaseDistroPc>> ddPcToMerge, Dictionary<string, List<IntvBase>>
            intvToMerge, Dictionary<string, List<ProcessBase>> trainingToMerge, List<ProcessBase> processesToCopy, List<SurveyBase> surveys,
            Dictionary<string, List<ProcessBase>> scmToMerge, List<AdminLevelDemography> demos, List<DiseaseDistroCm> ddCms, List<DiseaseDistroPc>
            ddPcs, List<IntvBase> intvs, List<SurveyBase> survs, List<ProcessBase> procs)
        {
            //Demography forms – merge for the most recent in the year only
            Dictionary<int, AdminLevelDemography> recentDemo = new Dictionary<int, AdminLevelDemography>();
            foreach (var d in demos)
            {
                int year = Util.GetYearReported(options.YearStartMonth, d.DateDemographyData);
                if (!recentDemo.ContainsKey(year))
                    recentDemo.Add(year, d);
                else if (recentDemo.ContainsKey(year) && recentDemo[year].DateDemographyData < d.DateDemographyData)
                    recentDemo[year] = d;
            }
            foreach (int y in recentDemo.Keys)
            {
                if (demographyToMerge.ContainsKey(y))
                    demographyToMerge[y].Add(recentDemo[y]);
                else
                    demographyToMerge.Add(y, new List<AdminLevelDemography> { recentDemo[y] });
            }
            //DD forms – merge for the most recent in the year only (KEY: Year_Typeid)
            Dictionary<string, DiseaseDistroPc> recentPc = new Dictionary<string, DiseaseDistroPc>();
            foreach (var d in ddPcs)
            {
                string key = Util.GetYearReported(options.YearStartMonth, d.DateReported.Value).ToString() + "_" + d.Disease.Id;
                if (!recentPc.ContainsKey(key))
                    recentPc.Add(key, d);
                else if (recentPc.ContainsKey(key) && recentPc[key].DateReported < d.DateReported)
                    recentPc[key] = d;
            }
            foreach (string k in recentPc.Keys)
            {
                if (ddPcToMerge.ContainsKey(k))
                    ddPcToMerge[k].Add(recentPc[k]);
                else
                    ddPcToMerge.Add(k, new List<DiseaseDistroPc> { recentPc[k] });
            }
            Dictionary<string, DiseaseDistroCm> recentCm = new Dictionary<string, DiseaseDistroCm>();
            foreach (var d in ddCms)
            {
                string key = Util.GetYearReported(options.YearStartMonth, d.DateReported.Value).ToString() + "_" + d.Disease.Id;
                if (!recentCm.ContainsKey(key))
                    recentCm.Add(key, d);
                else if (recentCm.ContainsKey(key) && recentCm[key].DateReported < d.DateReported)
                    recentCm[key] = d;
            }
            foreach (string k in recentCm.Keys)
            {
                if (ddCmToMerge.ContainsKey(k))
                    ddCmToMerge[k].Add(recentCm[k]);
                else
                    ddCmToMerge.Add(k, new List<DiseaseDistroCm> { recentCm[k] });
            }

            //Interventions forms – merge for all in the year with the same round (KEY "YEAR_TYpeId_ROUND")
            foreach (var form in intvs)
            {
                string key = Util.GetYearReported(options.YearStartMonth, form.DateReported).ToString() + "_" + form.IntvType.Id;
                var roundInd = form.IndicatorValues.FirstOrDefault(i => i.Indicator.DisplayName == "PcIntvRoundNumber");
                if (roundInd != null)
                    key += ("_" + roundInd.DynamicValue);
                if (intvToMerge.ContainsKey(key))
                    intvToMerge[key].Add(form);
                else
                    intvToMerge.Add(key, new List<IntvBase> { form });
            }
            // Surveys 
            surveys.AddRange(survs);
            //PC training - merge for all in the year with the same category (KEY "YEAR_CAT")
            foreach (var form in procs.Where(p => p.ProcessType.Id == (int)StaticProcessType.PcTraining))
            {
                string key = Util.GetYearReported(options.YearStartMonth, form.DateReported).ToString();
                var cat = form.IndicatorValues.FirstOrDefault(i => i.Indicator.DisplayName == "PCTrainTrainingCategory");
                if (cat != null)
                    key += ("_" + cat.DynamicValue);
                if (!trainingToMerge.ContainsKey(key))
                    trainingToMerge.Add(key, new List<ProcessBase> { form });
                else
                    trainingToMerge[key].Add(form);
            }
            //SCM –merge for all in the year with the same drug and unit (KEY "YEAR_DRUG_UNIT")
            foreach (var form in procs.Where(p => p.ProcessType.Id == (int)StaticProcessType.SCM))
            {
                string key = Util.GetYearReported(options.YearStartMonth, form.DateReported).ToString();
                var drug = form.IndicatorValues.FirstOrDefault(i => i.Indicator.DisplayName == "SCMDrug");
                if (drug != null)
                    key += ("_" + drug.DynamicValue);
                var unit = form.IndicatorValues.FirstOrDefault(i => i.Indicator.DisplayName == "SCMUnit");
                if (unit != null)
                    key += ("_" + unit.DynamicValue);
                if (scmToMerge.ContainsKey(key))
                    scmToMerge[key].Add(form);
                else
                    scmToMerge.Add(key, new List<ProcessBase> { form });
            }
            //SAE – no merge - copy all separately to merged admin unit. 
            processesToCopy.AddRange(procs.Where(p => p.ProcessType.Id != (int)StaticProcessType.PcTraining && p.ProcessType.Id != (int)StaticProcessType.SCM));
        }
 public SplittingAdminLevel(RedistrictingOptions o)
     : base()
 {
     options = o;
     InitializeComponent();
 }
        /// <summary>
        /// After determining which forms to merge, perform the merge by saving the new files and running the merge rules
        /// </summary>
        private void MergeIntoNewUnit(RedistrictingOptions options, OleDbCommand command, OleDbConnection connection, int redistrictId,
            Dictionary<int, List<AdminLevelDemography>> demographyToMerge, Dictionary<string, List<DiseaseDistroCm>> ddCmToMerge,
            Dictionary<string, List<DiseaseDistroPc>> ddPcToMerge, Dictionary<string, List<IntvBase>> intvToMerge, Dictionary<string,
            List<ProcessBase>> trainingToMerge, List<ProcessBase> processesToCopyAll, List<SurveyBase> surveys, Dictionary<string, List<ProcessBase>> scmToMerge)
        {
            demoRepo.InsertRedistrictUnit(command, connection, userId, options.MergeDestination, redistrictId, RedistrictingRelationship.Daughter, 0, false);
            foreach (var val in demographyToMerge.Values)
                MergeDemo(val, options.MergeDestination.Id, redistrictId, command, connection);
            foreach (var val in ddPcToMerge.Values)
                options.DistrosPc.Add(MergeDdPc(val, options.MergeDestination.Id, redistrictId, command, connection));
            foreach (var val in ddCmToMerge.Values)
                options.DistrosCm.Add(MergeDdCm(val, options.MergeDestination.Id, redistrictId, command, connection));
            foreach (var val in intvToMerge.Values)
                options.Intvs.Add(MergeIntv(val, options.MergeDestination.Id, redistrictId, command, connection));
            foreach (var val in trainingToMerge.Values)
                options.Processes.Add(MergeProcess(val, options.MergeDestination.Id, redistrictId, command, connection));
            foreach (var val in scmToMerge.Values)
                options.Processes.Add(MergeProcess(val, options.MergeDestination.Id, redistrictId, command, connection));
            MergeProcesses(options, processesToCopyAll, options.MergeDestination.Id, redistrictId, command, connection);
            MergeSurveys(options, surveys, options.MergeDestination, redistrictId, command, connection);

        }