public static IEnumerable <string> GetPeriodAgingBucketDescriptions( IFinPeriodRepository finPeriodRepository, DateTime currentDate, AgingDirection agingDirection, int numberOfBuckets, int calendarOrganizationID, bool usePeriodDescription) { if (finPeriodRepository == null) { throw new ArgumentNullException(nameof(finPeriodRepository)); } if (numberOfBuckets <= 0) { throw new ArgumentOutOfRangeException(nameof(numberOfBuckets)); } short periodStep = (short)(agingDirection == AgingDirection.Backwards ? -1 : 1); FinPeriod currentPeriod = finPeriodRepository.GetByID( finPeriodRepository.GetPeriodIDFromDate(currentDate, calendarOrganizationID), calendarOrganizationID); yield return(usePeriodDescription ? currentPeriod.Descr : FinPeriodUtils.FormatForError(currentPeriod.FinPeriodID)); --numberOfBuckets; while (numberOfBuckets > 1) { currentPeriod = finPeriodRepository.GetByID( finPeriodRepository.GetOffsetPeriodId(currentPeriod.FinPeriodID, periodStep, calendarOrganizationID), calendarOrganizationID); yield return(usePeriodDescription ? currentPeriod.Descr : FinPeriodUtils.FormatForError(currentPeriod.FinPeriodID)); --numberOfBuckets; } if (numberOfBuckets > 0) { yield return(PXMessages.LocalizeFormatNoPrefix( agingDirection == AgingDirection.Backwards ? Messages.BeforeMonth : Messages.AfterMonth, usePeriodDescription ? currentPeriod.Descr : FinPeriodUtils.FormatForError(currentPeriod.FinPeriodID))); } }
public static IEnumerable <string> GetPeriodAgingBucketDescriptions( IFinPeriodRepository finPeriodRepository, DateTime currentDate, AgingDirection agingDirection, int numberOfBuckets) { if (finPeriodRepository == null) { throw new ArgumentNullException(nameof(finPeriodRepository)); } if (numberOfBuckets <= 0) { throw new ArgumentOutOfRangeException(nameof(numberOfBuckets)); } short periodStep = (short)(agingDirection == AgingDirection.Backwards ? -1 : 1); // Must not re-use any existing graphs due to possible query // caching of financial periods, which can impact localization // of their descriptions, see AC-84505. // - PXGraph graph = new PXGraph(); FinPeriod currentPeriod = finPeriodRepository.GetByID( finPeriodRepository.GetPeriodIDFromDate(currentDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); yield return(currentPeriod.Descr); --numberOfBuckets; while (numberOfBuckets > 1) { currentPeriod = finPeriodRepository.GetByID( finPeriodRepository.GetOffsetPeriodId(currentPeriod.FinPeriodID, periodStep, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); yield return(currentPeriod.Descr); --numberOfBuckets; } if (numberOfBuckets > 0) { yield return(PXMessages.LocalizeFormatNoPrefix( agingDirection == AgingDirection.Backwards ? Messages.BeforeMonth : Messages.AfterMonth, currentPeriod.Descr)); } }
public virtual IList <DRScheduleTran> GenerateTransactions( DRSchedule deferralSchedule, DRScheduleDetail scheduleDetail) { if (deferralSchedule == null) { throw new ArgumentNullException(nameof(deferralSchedule)); } if (scheduleDetail == null) { throw new ArgumentNullException(nameof(scheduleDetail)); } ValidateTerms(deferralSchedule); int?organizationID = PXAccess.GetParentOrganizationID(scheduleDetail.BranchID); decimal defAmount = scheduleDetail.TotalAmt.Value; List <DRScheduleTran> list = new List <DRScheduleTran>(); short lineCounter = 0; if (_code.ReconNowPct.Value > 0) { decimal recNowRaw = defAmount * _code.ReconNowPct.Value * 0.01m; decimal recNow = _roundingFunction(recNowRaw); defAmount -= recNow; lineCounter++; DRScheduleTran nowTran = new DRScheduleTran { BranchID = scheduleDetail.BranchID, AccountID = scheduleDetail.AccountID, SubID = scheduleDetail.SubID, Amount = recNow, RecDate = deferralSchedule.DocDate, FinPeriodID = scheduleDetail.FinPeriodID, LineNbr = lineCounter, ScheduleID = scheduleDetail.ScheduleID, ComponentID = scheduleDetail.ComponentID, Status = _code.Method == DeferredMethodType.CashReceipt ? DRScheduleTranStatus.Projected : DRScheduleTranStatus.Open, }; list.Add(nowTran); } bool isFlexibleDeferralCode = DeferredMethodType.RequiresTerms(_code.Method); DateTime documentDate = deferralSchedule.DocDate.Value; string documentFinPeriod = _finPeriodRepository.FindFinPeriodByDate(documentDate, organizationID)?.FinPeriodID; int occurrences = isFlexibleDeferralCode ? CalcOccurrences(deferralSchedule.TermStartDate.Value, deferralSchedule.TermEndDate.Value, organizationID) : _code.Occurrences.Value; List <DRScheduleTran> deferredList = new List <DRScheduleTran>(_code.Occurrences.Value); string deferredPeriod = null; for (int i = 0; i < occurrences; i++) { try { if (deferredPeriod == null) { deferredPeriod = isFlexibleDeferralCode ? _finPeriodRepository.FindFinPeriodByDate(deferralSchedule.TermStartDate.Value, organizationID)?.FinPeriodID : _finPeriodRepository.GetOffsetPeriodId(scheduleDetail.FinPeriodID, _code.StartOffset.Value, organizationID); } else { deferredPeriod = _finPeriodRepository.GetOffsetPeriodId(deferredPeriod, _code.Frequency.Value, organizationID); } } catch (PXFinPeriodException ex) { throw new PXException(ex, Messages.NoFinPeriod, _code.DeferredCodeID); } lineCounter++; DateTime recognitionDate = GetRecognitionDate( deferredPeriod, minimumDate: isFlexibleDeferralCode ? deferralSchedule.TermStartDate.Value : documentDate, maximumDate: isFlexibleDeferralCode ? deferralSchedule.TermEndDate : null, organizationID: organizationID); DRScheduleTran deferralTransaction = new DRScheduleTran { BranchID = scheduleDetail.BranchID, AccountID = scheduleDetail.AccountID, SubID = scheduleDetail.SubID, RecDate = recognitionDate, FinPeriodID = _finPeriodRepository.FindFinPeriodByDate(recognitionDate, organizationID)?.FinPeriodID, LineNbr = lineCounter, ScheduleID = scheduleDetail.ScheduleID, ComponentID = scheduleDetail.ComponentID, Status = _code.Method == DeferredMethodType.CashReceipt ? DRScheduleTranStatus.Projected : DRScheduleTranStatus.Open }; deferredList.Add(deferralTransaction); } SetAmounts(deferredList, defAmount, deferralSchedule, organizationID); if (DeferredMethodType.RequiresTerms(_code) && _code.RecognizeInPastPeriods != true) { // Adjust recognition dates and financial periods // that are in the past relative to the document date. // - foreach (DRScheduleTran transaction in deferredList .Where(transaction => transaction.RecDate < documentDate)) { transaction.RecDate = documentDate; transaction.FinPeriodID = documentFinPeriod; } } list.AddRange(deferredList); return(list); }
public virtual IEnumerable <ScheduleDet> MakeSchedule( Schedule scheduleParameters, short numberOccurrences, DateTime?runDate = null) { runDate = runDate ?? _graph.Accessinfo.BusinessDate; List <ScheduleDet> scheduleOccurrences = new List <ScheduleDet>(); if (scheduleParameters.NextRunDate == null && scheduleParameters.LastRunDate == null) { scheduleParameters.NextRunDate = scheduleParameters.StartDate; } else if (scheduleParameters.NextRunDate == null) { scheduleParameters.NextRunDate = scheduleParameters.LastRunDate; } int occurrencesCreated = 0; short oldRunCounter = scheduleParameters.RunCntr ?? 0; do { ScheduleDet occurrence = new ScheduleDet(); do { switch (scheduleParameters.ScheduleType) { case GLScheduleType.Daily: occurrence.ScheduledDate = scheduleParameters.NextRunDate; scheduleParameters.NextRunDate = ((DateTime)scheduleParameters.NextRunDate).AddDays((short)scheduleParameters.DailyFrequency); break; case GLScheduleType.Weekly: CalcRunDatesWeekly(scheduleParameters, occurrence); break; case GLScheduleType.Periodically: try { switch (scheduleParameters.PeriodDateSel) { case PeriodDateSelOption.PeriodStart: occurrence.ScheduledDate = _finPeriodRepository.PeriodStartDate( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); scheduleParameters.NextRunDate = _finPeriodRepository.PeriodStartDate( _finPeriodRepository.GetOffsetPeriodId( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), (short)scheduleParameters.PeriodFrequency, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); break; case PeriodDateSelOption.PeriodEnd: occurrence.ScheduledDate = _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); scheduleParameters.NextRunDate = _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetOffsetPeriodId( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), (short)scheduleParameters.PeriodFrequency, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); break; case PeriodDateSelOption.PeriodFixedDate: occurrence.ScheduledDate = _finPeriodRepository.PeriodStartDate( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue) .AddDays((short)scheduleParameters.PeriodFixedDay - 1); if (((DateTime)occurrence.ScheduledDate).CompareTo( _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue)) > 0) { occurrence.ScheduledDate = _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); } DateTime?OldNextRunDate = scheduleParameters.NextRunDate; scheduleParameters.NextRunDate = _finPeriodRepository.PeriodStartDate( _finPeriodRepository.GetOffsetPeriodId( _finPeriodRepository.GetPeriodIDFromDate(scheduleParameters.NextRunDate, FinPeriod.organizationID.MasterValue), (short)scheduleParameters.PeriodFrequency, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue) .AddDays((short)scheduleParameters.PeriodFixedDay - 1); if (((DateTime)scheduleParameters.NextRunDate).CompareTo( _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetOffsetPeriodId( _finPeriodRepository.GetPeriodIDFromDate(OldNextRunDate, FinPeriod.organizationID.MasterValue), (short)scheduleParameters.PeriodFrequency, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue)) > 0) { scheduleParameters.NextRunDate = _finPeriodRepository.PeriodEndDate( _finPeriodRepository.GetOffsetPeriodId( _finPeriodRepository.GetPeriodIDFromDate(OldNextRunDate, FinPeriod.organizationID.MasterValue), (short)scheduleParameters.PeriodFrequency, FinPeriod.organizationID.MasterValue), FinPeriod.organizationID.MasterValue); } break; } } catch (PXFinPeriodException) { if (occurrence.ScheduledDate != null && (bool)scheduleParameters.NoRunLimit == false && scheduleParameters.RunCntr + 1 == scheduleParameters.RunLimit && scheduleParameters.NextRunDate != null) { scheduleParameters.NextRunDate = null; } else { scheduleParameters.RunCntr = oldRunCounter; throw new PXFinPeriodException(Messages.NoFinancialPeriodForNextExecutionDate); } } break; case GLScheduleType.Monthly: switch (scheduleParameters.MonthlyDaySel) { case "D": occurrence.ScheduledDate = new PXDateTime((short)((DateTime)scheduleParameters.NextRunDate).Year, (short)((DateTime)scheduleParameters.NextRunDate).Month, (short)scheduleParameters.MonthlyOnDay); scheduleParameters.NextRunDate = PXDateTime.DatePlusMonthSetDay((DateTime)occurrence.ScheduledDate, (short)scheduleParameters.MonthlyFrequency, (short)scheduleParameters.MonthlyOnDay); break; case "W": occurrence.ScheduledDate = PXDateTime.MakeDayOfWeek((short)((DateTime)scheduleParameters.NextRunDate).Year, (short)((DateTime)scheduleParameters.NextRunDate).Month, (short)scheduleParameters.MonthlyOnWeek, (short)scheduleParameters.MonthlyOnDayOfWeek); scheduleParameters.NextRunDate = new PXDateTime(((DateTime)occurrence.ScheduledDate).Year, ((DateTime)occurrence.ScheduledDate).Month, 1).AddMonths((short)scheduleParameters.MonthlyFrequency); scheduleParameters.NextRunDate = PXDateTime.MakeDayOfWeek((short)((DateTime)scheduleParameters.NextRunDate).Year, (short)((DateTime)scheduleParameters.NextRunDate).Month, (short)scheduleParameters.MonthlyOnWeek, (short)scheduleParameters.MonthlyOnDayOfWeek); break; } break; default: throw new PXException(); } }while (occurrence.ScheduledDate == scheduleParameters.LastRunDate); if (occurrence.ScheduledDate != null && ((DateTime)occurrence.ScheduledDate).CompareTo(scheduleParameters.StartDate) >= 0 && ((bool)scheduleParameters.NoEndDate || ((DateTime)occurrence.ScheduledDate).CompareTo(scheduleParameters.EndDate) <= 0) && (((DateTime)occurrence.ScheduledDate).CompareTo(runDate) <= 0) && ((bool)scheduleParameters.NoRunLimit || scheduleParameters.RunCntr < scheduleParameters.RunLimit)) { try { occurrence.ScheduledPeriod = _finPeriodRepository.GetPeriodIDFromDate(occurrence.ScheduledDate, FinPeriod.organizationID.MasterValue); } catch (PXFinPeriodException) { scheduleParameters.RunCntr = oldRunCounter; throw new PXFinPeriodException(Messages.NoFinancialPeriodForNextExecutionDate); } scheduleOccurrences.Add(occurrence); scheduleParameters.RunCntr++; if ((bool)scheduleParameters.NoRunLimit == false && scheduleParameters.RunCntr >= scheduleParameters.RunLimit || (scheduleParameters.NextRunDate != null) && (bool)scheduleParameters.NoEndDate == false && ((DateTime)scheduleParameters.NextRunDate).CompareTo(scheduleParameters.EndDate) > 0) { scheduleParameters.Active = false; scheduleParameters.NextRunDate = null; } if (scheduleParameters.NextRunDate == null) { break; } if (++occurrencesCreated >= numberOccurrences) { return(scheduleOccurrences); } } else { if (((DateTime)occurrence.ScheduledDate).CompareTo(scheduleParameters.StartDate) < 0) { continue; } if (occurrence.ScheduledDate != null) { scheduleParameters.NextRunDate = occurrence.ScheduledDate; } break; } }while (true); return(scheduleOccurrences); }