protected virtual int CalcOccurrences(DateTime startDate, DateTime endDate, int?organizationID) { return(_finPeriodRepository .PeriodsBetweenInclusive(startDate, endDate, organizationID) .Where((_, periodIndex) => periodIndex % _code.Frequency == 0) .Count()); }
/// <summary> /// Given the current date and the number of period-based aging buckets, /// returns the zero-based number of bucket that the specified test date /// falls into. /// </summary> /// <param name="numberOfBuckets"> /// The total number of period-based buckets, including the "Current" /// and "Over" bucket. For backwards aging, the "Current" bucket encompasses /// dates in the same (or later) financial period as the current date, and /// the "Over" bucket corresponds to dates that are at least (numberOfBuckets - 1) /// periods back in time from the current date. /// </param> public static int AgeByPeriods( DateTime currentDate, DateTime dateToAge, IFinPeriodRepository finPeriodRepository, AgingDirection agingDirection, int numberOfBuckets, int organizationID) { if (finPeriodRepository == null) { throw new ArgumentNullException(nameof(finPeriodRepository)); } if (numberOfBuckets <= 0) { throw new ArgumentOutOfRangeException(nameof(numberOfBuckets)); } if (agingDirection == AgingDirection.Forward) { agingDirection = AgingDirection.Backwards; Utilities.Swap(ref currentDate, ref dateToAge); } if (dateToAge > currentDate) { return(0); } int bucketNumber = finPeriodRepository .PeriodsBetweenInclusive(dateToAge, currentDate, organizationID) .Count(); --bucketNumber; if (bucketNumber < 0) { // No financial periods found between the dates, // cannot proceed with aging. // - throw new PXException(GL.Messages.NoPeriodsDefined); } if (bucketNumber > numberOfBuckets - 1) { // Force into the last ("over") aging bucket. // - bucketNumber = numberOfBuckets - 1; } return(bucketNumber); }