Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }