Ejemplo n.º 1
0
        /// <param name="attachedToOriginalSchedule">
        /// Flag added to handle <see cref="DRScheduleDetail"/>'s status
        /// in the same way as <see cref="DRProcess"/> had done for documents
        /// attached to original schedule.
        /// </param>
        public void ReevaluateSchedule(
            DRSchedule schedule,
            DRProcess.DRScheduleParameters scheduleParameters,
            DRDeferredCode deferralCode,
            decimal?lineAmount,
            bool attachedToOriginalSchedule)
        {
            _schedule = schedule;

            _schedule.DocDate       = scheduleParameters.DocDate;
            _schedule.BAccountID    = scheduleParameters.BAccountID;
            _schedule.BAccountLocID = scheduleParameters.BAccountLocID;
            _schedule.FinPeriodID   = scheduleParameters.FinPeriodID;
            _schedule.TranDesc      = scheduleParameters.TranDesc;
            _schedule.IsCustom      = false;
            _schedule.IsDraft       = _isDraft;
            _schedule.BAccountType  = _schedule.Module == BatchModule.AP ? BAccountType.VendorType : BAccountType.CustomerType;
            _schedule.TermStartDate = scheduleParameters.TermStartDate;
            _schedule.TermEndDate   = scheduleParameters.TermEndDate;
            _schedule.ProjectID     = scheduleParameters.ProjectID;
            _schedule.TaskID        = scheduleParameters.TaskID;

            _schedule = _drEntityStorage.Update(_schedule);

            IList <DRScheduleDetail> scheduleDetails = _drEntityStorage.GetScheduleDetails(_schedule.ScheduleID);

            ReevaluateComponentAmounts(scheduleDetails, lineAmount);

            foreach (DRScheduleDetail scheduleDetail in scheduleDetails)
            {
                scheduleDetail.DocDate    = _schedule.DocDate;
                scheduleDetail.BAccountID = _schedule.BAccountID;

                FinPeriod detailFinPeriod = FinPeriodRepository
                                            .GetFinPeriodByMasterPeriodID(PXAccess.GetParentOrganizationID(scheduleDetail.BranchID),
                                                                          _schedule.FinPeriodID).GetValueOrRaiseError();

                scheduleDetail.FinPeriodID  = detailFinPeriod.FinPeriodID;
                scheduleDetail.TranPeriodID = detailFinPeriod.MasterFinPeriodID;

                if (!attachedToOriginalSchedule)
                {
                    scheduleDetail.Status = _isDraft ?
                                            DRScheduleStatus.Draft :
                                            (scheduleDetail.IsResidual == null ? DRScheduleStatus.Closed : DRScheduleStatus.Open);
                }
                else
                {
                    scheduleDetail.Status = _isDraft ?
                                            DRScheduleStatus.Draft :
                                            (scheduleDetail.IsOpen == true ? DRScheduleStatus.Open : DRScheduleStatus.Closed);
                }

                _drEntityStorage.Update(scheduleDetail);

                if (scheduleDetail.IsResidual != true)
                {
                    DRDeferredCode detailDeferralCode = _drEntityStorage.GetDeferralCode(scheduleDetail.DefCode);

                    IEnumerable <DRScheduleTran> componentTransactions =
                        _drEntityStorage.GetDeferralTransactions(scheduleDetail.ScheduleID, scheduleDetail.ComponentID, scheduleDetail.DetailLineNbr);

                    if (componentTransactions.Any())
                    {
                        ReevaluateTransactionAmounts(scheduleDetail, detailDeferralCode, componentTransactions);
                    }

                    if (!_isDraft)
                    {
                        if (!componentTransactions.Any())
                        {
                            componentTransactions = _drEntityStorage.CreateDeferralTransactions(_schedule, scheduleDetail, detailDeferralCode, _branchID);
                        }

                        _drEntityStorage.CreateCreditLineTransaction(scheduleDetail, deferralCode, _branchID);
                        _drEntityStorage.NonDraftDeferralTransactionsPrepared(scheduleDetail, detailDeferralCode, componentTransactions);
                    }
                }
            }
        }