public MergeDestination(RedistrictingOptions o, IWizardStep p) : base() { options = o; prev = p; InitializeComponent(); }
public SplitDistro(RedistrictingOptions o, IWizardStep p) : base() { prev = p; options = o; InitializeComponent(); }
public SplittingDemography(RedistrictingOptions o, int i) : base() { options = o; index = i; InitializeComponent(); }
public MergingSources(RedistrictingOptions o, string t) : base() { options = o; title = t; InitializeComponent(); }
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); } }
public RedistrictRules(RedistrictingOptions o) : base() { InitializeComponent(); options = o; }
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)); }
public MergeYear(RedistrictingOptions o) : base() { options = o; InitializeComponent(); }
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); }