public virtual void GenerateProc(Schedule schedule, short times, DateTime runDate) { string lastBatchNbr = "0000000000"; long lastInfoID = -1; IEnumerable <ScheduleDet> occurrences = new Scheduler(this).MakeSchedule(schedule, times, runDate); using (PXTransactionScope ts = new PXTransactionScope()) { foreach (ScheduleDet occurrence in occurrences) { foreach (BatchNew scheduledBatch in PXSelect < BatchNew, Where < BatchNew.scheduleID, Equal <Optional <Schedule.scheduleID> >, And <BatchNew.scheduled, Equal <boolTrue> > > > .Select(this, schedule.ScheduleID)) { BatchNew copy = PXCache <BatchNew> .CreateCopy(scheduledBatch); copy.OrigBatchNbr = copy.BatchNbr; copy.OrigModule = copy.Module; copy.CuryInfoID = null; copy.NumberCode = "GLREC"; copy.NoteID = null; CurrencyInfo info = (CurrencyInfo)PXSelect < CurrencyInfo, Where <CurrencyInfo.curyInfoID, Equal <Required <CurrencyInfo.curyInfoID> > > > .Select(this, scheduledBatch.CuryInfoID); if (info != null) { CurrencyInfo infocopy = PXCache <CurrencyInfo> .CreateCopy(info); infocopy.CuryInfoID = lastInfoID; copy.CuryInfoID = lastInfoID; CuryInfo_Created.Cache.Insert(infocopy); } copy.Posted = false; copy.Released = false; copy.Status = BatchStatus.Balanced; copy.Scheduled = false; copy.AutoReverseCopy = false; copy.DateEntered = occurrence.ScheduledDate; FinPeriod finPeriod = FinPeriodRepository.GetFinPeriodByMasterPeriodID(PXAccess.GetParentOrganizationID(copy.BranchID), occurrence.ScheduledPeriod) .GetValueOrRaiseError(); copy.FinPeriodID = finPeriod.FinPeriodID; copy.TranPeriodID = null; copy.BatchNbr = lastBatchNbr; copy.RefBatchNbr = lastBatchNbr; lastBatchNbr = AutoNumberAttribute.NextNumber(lastBatchNbr); lastInfoID--; copy = (BatchNew)Batch_Created.Cache.Insert(copy); CurrencyInfoAttribute.SetEffectiveDate <Batch.dateEntered>(Batch_Created.Cache, new PXFieldUpdatedEventArgs(copy, null, false)); PXNoteAttribute.CopyNoteAndFiles(Caches[typeof(BatchNew)], scheduledBatch, Batch_Created.Cache, copy); foreach (GLTranNew scheduledBatchTransaction in PXSelect < GLTranNew, Where < GLTranNew.module, Equal <Required <GLTranNew.module> >, And <GLTranNew.batchNbr, Equal <Required <GLTranNew.batchNbr> > > > > .Select(this, scheduledBatch.Module, scheduledBatch.BatchNbr)) { GLTranNew transactionCopy = PXCache <GLTranNew> .CreateCopy(scheduledBatchTransaction); transactionCopy.OrigBatchNbr = transactionCopy.BatchNbr; transactionCopy.OrigModule = transactionCopy.Module; transactionCopy.BatchNbr = copy.BatchNbr; transactionCopy.RefBatchNbr = copy.RefBatchNbr; transactionCopy.CuryInfoID = copy.CuryInfoID; transactionCopy.CATranID = null; transactionCopy.NoteID = null; transactionCopy.TranDate = occurrence.ScheduledDate; FinPeriodIDAttribute.SetPeriodsByMaster <GLTranNew.finPeriodID>(Tran_Created.Cache, transactionCopy, occurrence.ScheduledPeriod); transactionCopy = Tran_Created.Cache.Insert(transactionCopy) as GLTranNew; PXNoteAttribute.CopyNoteAndFiles(Tran_Created.Cache, scheduledBatchTransaction, Tran_Created.Cache, transactionCopy); } } schedule.LastRunDate = occurrence.ScheduledDate; Running_Schedule.Cache.Update(schedule); } Running_Schedule.Cache.Persist(PXDBOperation.Update); Batch_Created.Cache.Persist(PXDBOperation.Insert); Batch_Created.Cache.Persist(PXDBOperation.Update); foreach (GLTranNew createdTransaction in Tran_Created.Cache.Inserted) { foreach (BatchNew createdBatch in Batch_Created.Cache.Cached) { if (object.Equals(createdBatch.RefBatchNbr, createdTransaction.RefBatchNbr)) { createdTransaction.BatchNbr = createdBatch.BatchNbr; createdTransaction.CuryInfoID = createdBatch.CuryInfoID; if (!string.IsNullOrEmpty(createdBatch.RefNbr)) { createdTransaction.RefNbr = createdBatch.RefNbr; } break; } } } Tran_Created.Cache.Normalize(); Tran_Created.Cache.Persist(PXDBOperation.Insert); Tran_Created.Cache.Persist(PXDBOperation.Update); Caches[typeof(CA.CADailySummary)].Persist(PXDBOperation.Insert); ts.Complete(this); } Running_Schedule.Cache.Persisted(false); Batch_Created.Cache.Persisted(false); Tran_Created.Cache.Persisted(false); Caches[typeof(CA.CADailySummary)].Persisted(false); }
public static List <ScheduleDet> MakeSchedule(PXGraph graph, Schedule s, short Times, DateTime runDate) { List <ScheduleDet> ret = new List <ScheduleDet>(); if (s.NextRunDate == null && s.LastRunDate == null) { s.NextRunDate = s.StartDate; } else if (s.NextRunDate == null) { s.NextRunDate = s.LastRunDate; } int i = 0; short oldRunCntr = s.RunCntr ?? 0; do { ScheduleDet d = new ScheduleDet(); do { switch (s.ScheduleType) { case "D": d.ScheduledDate = s.NextRunDate; s.NextRunDate = ((DateTime)s.NextRunDate).AddDays((short)s.DailyFrequency); break; case "W": CalcRunDatesWeekly(s, d); break; case "P": try { switch (s.PeriodDateSel) { case "S": d.ScheduledDate = FinPeriodIDAttribute.PeriodStartDate(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate)); s.NextRunDate = FinPeriodIDAttribute.PeriodStartDate(graph, FinPeriodIDAttribute.PeriodPlusPeriod(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate), (short)s.PeriodFrequency)); break; case "E": d.ScheduledDate = FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate)); s.NextRunDate = FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodPlusPeriod(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate), (short)s.PeriodFrequency)); break; case "D": d.ScheduledDate = FinPeriodIDAttribute.PeriodStartDate(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate)).AddDays((short)s.PeriodFixedDay - 1); if (((DateTime)d.ScheduledDate).CompareTo(FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate))) > 0) { d.ScheduledDate = FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate)); } DateTime?OldNextRunDate = s.NextRunDate; s.NextRunDate = FinPeriodIDAttribute.PeriodStartDate(graph, FinPeriodIDAttribute.PeriodPlusPeriod(graph, FinPeriodIDAttribute.PeriodFromDate(graph, s.NextRunDate), (short)s.PeriodFrequency)).AddDays((short)s.PeriodFixedDay - 1); if (((DateTime)s.NextRunDate).CompareTo(FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodPlusPeriod(graph, FinPeriodIDAttribute.PeriodFromDate(graph, OldNextRunDate), (short)s.PeriodFrequency))) > 0) { s.NextRunDate = FinPeriodIDAttribute.PeriodEndDate(graph, FinPeriodIDAttribute.PeriodPlusPeriod(graph, FinPeriodIDAttribute.PeriodFromDate(graph, OldNextRunDate), (short)s.PeriodFrequency)); } break; } } catch (PXFinPeriodException) { if (d.ScheduledDate != null && (bool)s.NoRunLimit == false && s.RunCntr + 1 == s.RunLimit) { s.NextRunDate = null; } else { s.RunCntr = oldRunCntr; throw; } } break; case "M": switch (s.MonthlyDaySel) { case "D": d.ScheduledDate = new PXDateTime((short)((DateTime)s.NextRunDate).Year, (short)((DateTime)s.NextRunDate).Month, (short)s.MonthlyOnDay); s.NextRunDate = PXDateTime.DatePlusMonthSetDay((DateTime)d.ScheduledDate, (short)s.MonthlyFrequency, (short)s.MonthlyOnDay); break; case "W": d.ScheduledDate = PXDateTime.MakeDayOfWeek((short)((DateTime)s.NextRunDate).Year, (short)((DateTime)s.NextRunDate).Month, (short)s.MonthlyOnWeek, (short)s.MonthlyOnDayOfWeek); //s.NextRunDate = ((DateTime)d.ScheduledDate).AddMonths((short)s.MonthlyFrequency); s.NextRunDate = new PXDateTime(((DateTime)d.ScheduledDate).Year, ((DateTime)d.ScheduledDate).Month, 1).AddMonths((short)s.MonthlyFrequency); s.NextRunDate = PXDateTime.MakeDayOfWeek((short)((DateTime)s.NextRunDate).Year, (short)((DateTime)s.NextRunDate).Month, (short)s.MonthlyOnWeek, (short)s.MonthlyOnDayOfWeek); break; } break; default: throw new PXException(); } } while (d.ScheduledDate == s.LastRunDate); if (d.ScheduledDate != null && ((DateTime)d.ScheduledDate).CompareTo(s.StartDate) >= 0 && ((bool)s.NoEndDate || ((DateTime)d.ScheduledDate).CompareTo(s.EndDate) <= 0) && (((DateTime)d.ScheduledDate).CompareTo(runDate) <= 0) && ((bool)s.NoRunLimit || s.RunCntr < s.RunLimit)) { try { d.ScheduledPeriod = FinPeriodIDAttribute.PeriodFromDate(graph, d.ScheduledDate); } catch { s.RunCntr = oldRunCntr; throw; } ret.Add(d); s.RunCntr++; if ((bool)s.NoRunLimit == false && s.RunCntr >= s.RunLimit || (s.NextRunDate != null) && (bool)s.NoEndDate == false && ((DateTime)s.NextRunDate).CompareTo(s.EndDate) > 0) { s.Active = false; s.NextRunDate = null; } if (s.NextRunDate == null) { break; } if (++i >= Times) { return(ret); } } else { if (d.ScheduledDate != null) { s.NextRunDate = d.ScheduledDate; } break; } } while (true); return(ret); }