示例#1
0
        public virtual void GetRange(DateTime date, string Range, int?cashAccountID, out DateTime?RangeStart, out DateTime?RangeEnd)
        {
            switch (Range)
            {
            case "W":
                RangeStart = date.AddDays(-1 * (PXDateTime.DayOfWeekOrdinal(date.DayOfWeek) - 1));
                RangeEnd   = date.AddDays(7 - PXDateTime.DayOfWeekOrdinal(date.DayOfWeek));
                return;

            case "M":
                RangeStart = new DateTime(date.Year, date.Month, 1);
                RangeEnd   = new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
                return;

            case "P":
                CashAccount cashAccount = PXSelect <CashAccount, Where <CashAccount.cashAccountID, Equal <Required <CashAccount.cashAccountID> > > > .Select(this, cashAccountID);

                int?organizationID = PXAccess.GetParentOrganizationID(cashAccount?.BranchID);
                var period         = FinPeriodRepository.FindFinPeriodByDate(date, organizationID);
                RangeStart = period?.StartDate;
                RangeEnd   = period?.EndDate;
                return;

            case "D":
            default:
                RangeStart = date;
                RangeEnd   = date;
                return;
            }
        }
 protected static DateTime getPrevDate(DateTime aGuessDate, DateTime aBeforeDate, int Day)
 {
     return((aGuessDate < aBeforeDate) ? aGuessDate : PXDateTime.DatePlusMonthSetDay(aGuessDate, -1, Day));
 }
 protected static DateTime getNextDate(DateTime aGuessDate, DateTime aLastStatementDate, int Day)
 {
     return((aLastStatementDate < aGuessDate) ? aGuessDate : PXDateTime.DatePlusMonthSetDay(aGuessDate, 1, Day));
 }
        public static DateTime CalcStatementDateBefore(DateTime aBeforeDate, string aPrepareOn, int?aDay00, int?aDay01)
        {
            DateTime statementDate = DateTime.MinValue;

            switch (aPrepareOn)
            {
            case PrepareOnType.FixedDayOfMonth:
                statementDate = new PXDateTime(aBeforeDate.Year, aBeforeDate.Month, aDay00 ?? 1);
                statementDate = getPrevDate(statementDate, aBeforeDate, aDay00 ?? 1);
                break;

            case PrepareOnType.EndOfMonth:
                DateTime dateTime = new DateTime(aBeforeDate.Year, aBeforeDate.Month, 1);
                statementDate = dateTime.AddDays(-1);
                break;

            case PrepareOnType.Custom:
                DateTime dateTime1 = DateTime.MinValue;
                DateTime dateTime2 = DateTime.MinValue;
                bool     useBoth   = (aDay00 != null) && (aDay01 != null);
                if (aDay00 != null)
                {
                    dateTime1 = new PXDateTime(aBeforeDate.Year, aBeforeDate.Month, aDay00.Value);
                }
                if (aDay01 != null)
                {
                    dateTime2 = new PXDateTime(aBeforeDate.Year, aBeforeDate.Month, aDay01.Value);
                }
                if (useBoth)
                {
                    Int32 Day00 = (Int32)aDay00;
                    Int32 Day01 = (Int32)aDay01;
                    Utilities.SwapIfGreater(ref dateTime1, ref dateTime2);
                    Utilities.SwapIfGreater(ref Day00, ref Day01);
                    if (aBeforeDate > dateTime2)
                    {
                        statementDate = dateTime2;
                    }
                    else
                    {
                        if (aBeforeDate > dateTime1)
                        {
                            statementDate = dateTime1;
                        }
                        else
                        {
                            statementDate = PXDateTime.DatePlusMonthSetDay(dateTime2, -1, Day01);
                        }
                    }
                }
                else
                {
                    DateTime dt = (dateTime1 != DateTime.MinValue) ? dateTime1 : dateTime2;
                    if (dt != DateTime.MinValue)
                    {
                        statementDate = getPrevDate(dt, statementDate, aDay00 ?? aDay01 ?? 1);
                    }
                }
                break;

            default:
                throw new PXException(Messages.UnknownPrepareOnType);
            }
            return(statementDate);
        }
        public static DateTime?CalcNextStatementDate(DateTime aLastStmtDate, string aPrepareOn, int?aDay00, int?aDay01)
        {
            DateTime?nextDate = null;

            switch (aPrepareOn)
            {
            case PrepareOnType.FixedDayOfMonth:
                DateTime guessDate = new PXDateTime(aLastStmtDate.Year, aLastStmtDate.Month, aDay00 ?? 1);
                nextDate = getNextDate(guessDate, aLastStmtDate, aDay00 ?? 1);
                break;

            case PrepareOnType.EndOfMonth:
                DateTime dateTime = new DateTime(aLastStmtDate.Year, aLastStmtDate.Month, 1);
                dateTime = dateTime.AddMonths(1);
                TimeSpan diff = (dateTime.Subtract(aLastStmtDate));
                int      days = diff.Days;
                if (days < 2)
                {
                    nextDate = dateTime.AddMonths(1).AddDays(-1);
                }
                else
                {
                    nextDate = dateTime.AddDays(-1);
                }
                break;

            case PrepareOnType.Custom:

                DateTime dateTime1 = DateTime.MinValue;
                DateTime dateTime2 = DateTime.MinValue;
                bool     useBoth   = (aDay00 != null) && (aDay01 != null);
                if (aDay00 != null)
                {
                    dateTime1 = new PXDateTime(aLastStmtDate.Year, aLastStmtDate.Month, aDay00.Value);
                }
                if (aDay01 != null)
                {
                    dateTime2 = new PXDateTime(aLastStmtDate.Year, aLastStmtDate.Month, aDay01.Value);
                }
                if (useBoth)
                {
                    Int32 Day00 = (Int32)aDay00;
                    Int32 Day01 = (Int32)aDay01;
                    Utilities.SwapIfGreater(ref dateTime1, ref dateTime2);
                    Utilities.SwapIfGreater(ref Day00, ref Day01);
                    if (aLastStmtDate < dateTime1)
                    {
                        nextDate = dateTime1;
                    }
                    else
                    {
                        if (aLastStmtDate < dateTime2)
                        {
                            nextDate = dateTime2;
                        }
                        else
                        {
                            nextDate = PXDateTime.DatePlusMonthSetDay(dateTime1, 1, Day00);
                        }
                    }
                }
                else
                {
                    DateTime dt = (dateTime1 != DateTime.MinValue) ? dateTime1 : dateTime2;
                    if (dt != DateTime.MinValue)
                    {
                        nextDate = getNextDate(dt, aLastStmtDate, aDay00 ?? aDay01 ?? 1);
                    }
                }
                break;
            }
            return(nextDate);
        }
        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);
        }
        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       = _financialPeriodProvider.PeriodStartDate(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate));
                                scheduleParameters.NextRunDate = _financialPeriodProvider.PeriodStartDate(_graph, _financialPeriodProvider.PeriodPlusPeriod(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate), (short)scheduleParameters.PeriodFrequency));
                                break;

                            case PeriodDateSelOption.PeriodEnd:
                                occurrence.ScheduledDate       = _financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate));
                                scheduleParameters.NextRunDate = _financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodPlusPeriod(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate), (short)scheduleParameters.PeriodFrequency));
                                break;

                            case PeriodDateSelOption.PeriodFixedDate:
                                occurrence.ScheduledDate = _financialPeriodProvider.PeriodStartDate(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate)).AddDays((short)scheduleParameters.PeriodFixedDay - 1);
                                if (((DateTime)occurrence.ScheduledDate).CompareTo(_financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate))) > 0)
                                {
                                    occurrence.ScheduledDate = _financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate));
                                }

                                DateTime?OldNextRunDate = scheduleParameters.NextRunDate;
                                scheduleParameters.NextRunDate = _financialPeriodProvider.PeriodStartDate(_graph, _financialPeriodProvider.PeriodPlusPeriod(_graph, _financialPeriodProvider.PeriodFromDate(_graph, scheduleParameters.NextRunDate), (short)scheduleParameters.PeriodFrequency)).AddDays((short)scheduleParameters.PeriodFixedDay - 1);
                                if (((DateTime)scheduleParameters.NextRunDate).CompareTo(_financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodPlusPeriod(_graph, _financialPeriodProvider.PeriodFromDate(_graph, OldNextRunDate), (short)scheduleParameters.PeriodFrequency))) > 0)
                                {
                                    scheduleParameters.NextRunDate = _financialPeriodProvider.PeriodEndDate(_graph, _financialPeriodProvider.PeriodPlusPeriod(_graph, _financialPeriodProvider.PeriodFromDate(_graph, OldNextRunDate), (short)scheduleParameters.PeriodFrequency));
                                }
                                break;
                            }
                        }
                        catch (PXFinPeriodException financialPeriodException)
                        {
                            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(
                                          financialPeriodException,
                                          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 = _financialPeriodProvider.PeriodFromDate(_graph, occurrence.ScheduledDate);
                    }
                    catch (PXFinPeriodException financialPeriodException)
                    {
                        scheduleParameters.RunCntr = oldRunCounter;
                        throw new PXFinPeriodException(
                                  financialPeriodException,
                                  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);
        }