Example #1
0
        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)));
            }
        }
Example #2
0
        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));
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }