/// <summary> /// Create a New PlanCycle and attach it to the given plan year. /// </summary> /// <param name="cycle">with Name and Description</param> /// <param name="rtpYearId">ID of plan year</param> /// <returns>ID of created Plan Cycle</returns> public int CreateRtpPlanCycle(DRCOG.Domain.ViewModels.RTP.PlanCycle cycle, int rtpYearId) { using (var db = new Models.TRIPSEntities()) { // there can be only one cycle in this plan year with a status of New var stId = db.StatusTypes.First(st => st.StatusType1 == "Cycle Status").StatusTypeID; var newId = db.Status.First(s => s.StatusTypeID == stId && s.Status1 == "New").StatusID; // see if there is already a new plan cycle for this RTP Year var previousNew = db.TimePeriodCycles.FirstOrDefault(tpc => tpc.TimePeriodId == rtpYearId && tpc.Cycle.statusId == newId); if (previousNew != null) { throw new Exception("There is already a New Plan Cycle"); } byte listOrder = 0; int? priorCycleId = null; // if this is not the first cycle in the time period, attach it to the end // of the two lists - ListOrder and priorCycleId var planCycles = db.TimePeriodCycles.Where(tpc => tpc.TimePeriodId == rtpYearId); if (planCycles.Count() > 0) { // find last cycle in this time period. "last" means highest ListOrder. var lo = planCycles.Max(tpc => tpc.ListOrder); var prior = planCycles.First(tpc => tpc.ListOrder == lo); priorCycleId = prior.CycleId; listOrder = lo ?? 0; } // find largest ListOrder in these cycles and add 1 ++listOrder; var mcycle = new Models.Cycle() { cycle1 = cycle.Name, Description = cycle.Description, statusId = newId, priorCycleId = priorCycleId }; db.Cycles.AddObject(mcycle); var mtpc = new Models.TimePeriodCycle() { Cycle = mcycle, TimePeriodId = (short)rtpYearId, ListOrder = listOrder }; db.TimePeriodCycles.AddObject(mtpc); db.SaveChanges(); return mcycle.id; } }
public int RtpCreatePlan(RtpCreatePlanRequest request) { using (var db = new Models.TRIPSEntities()) { // create a time period for the plan var tp = new Models.TimePeriod() { TimePeriodTypeID = (int)Enums.TimePeriodType.PlanYear, TimePeriod1 = request.PlanName }; db.TimePeriods.AddObject(tp); // create pieces of the plan, with a status of Pending var pi = new Models.ProgramInstance() { StatusId = (int)Enums.RtpTimePeriodStatus.Pending, ProgramID = 2, TimePeriod = tp }; db.ProgramInstances.AddObject(pi); var rtpi = new Models.RTPProgramInstance() { ProgramInstance = pi, TimePeriod = tp }; db.RTPProgramInstances.AddObject(rtpi); db.SaveChanges(); Logger.Debug("created RTP Program Instance " + rtpi.RTPProgramID.ToString() + ", " + rtpi.TimePeriodID.ToString()); // we had to save the changes to get IDs for the created objects, // since the TimePeriodID is part of a compound key. // TODO: get active plan int activePlan = 78; // copy the sponsors from the current plan foreach (var sponsor in db.RTPProgramInstanceSponsors.Where(r => r.TimePeriodID == activePlan)) { // first create a base ProgramInstanceSponsor var pis = new Models.ProgramInstanceSponsor() { ProgramID = sponsor.RTPProgramID, SponsorID = sponsor.SponsorID, TimePeriodID = tp.TimePeriodID }; db.ProgramInstanceSponsors.AddObject(pis); var copy = new Models.RTPProgramInstanceSponsor() { EmailDate = sponsor.EmailDate, FormPrintedDate = sponsor.FormPrintedDate, ReadyDate = sponsor.ReadyDate, RTPProgramID = sponsor.RTPProgramID, SponsorID = sponsor.SponsorID, TimePeriodID = tp.TimePeriodID }; db.RTPProgramInstanceSponsors.AddObject(copy); } // create a pending cycle var mcycle = new Models.Cycle() { cycle1 = request.CycleName, Description = request.CycleDescription, statusId = (int)Enums.RTPCycleStatus.Pending, priorCycleId = null }; db.Cycles.AddObject(mcycle); var mtpc = new Models.TimePeriodCycle() { Cycle = mcycle, TimePeriodId = tp.TimePeriodID, ListOrder = 1 }; db.TimePeriodCycles.AddObject(mtpc); db.SaveChanges(); Logger.Debug("copied sponsors from RTP Plan " + activePlan.ToString()); Logger.Debug("created RTP Plan Cycle " + mcycle.id.ToString()); return tp.TimePeriodID; } }