Exemplo 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,
            Amount lineAmount,
            bool attachedToOriginalSchedule)
        {
            if (schedule.IsOverridden == true && _isDraft == false)
            {
                decimal?totalComponentAmt = _drEntityStorage.GetScheduleDetails(schedule.ScheduleID).Sum(s => s.TotalAmt);
                if (totalComponentAmt != lineAmount.Cury)
                {
                    throw new PXException(Messages.CannotReleaseOverriden, totalComponentAmt, lineAmount.Base, _currencyInfo.BaseCuryID);
                }
            }

            _dataProvider.DeleteAllDetails(schedule.ScheduleID);

            _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);

            CreateScheduleDetails(scheduleParameters, lineAmount);
        }
Exemplo n.º 2
0
        /// <param name="deferralCode">The item-level deferral code for the inventory item
        /// <param name="transactionAmount">Total transaction amount (with ALL discounts applied).</param>
        /// <param name="fairUnitPrice">The item price from the price list.</param>
        /// <param name="compoundDiscountRate"> Compound discount rate of all discounts
        /// (including line, group and document discounts) that are applicable to deferred components.</param>
        public void CreateOriginalSchedule(
            DRProcess.DRScheduleParameters scheduleParameters,
            Amount lineTotal)
        {
            _schedule = _drEntityStorage.CreateCopy(scheduleParameters);

            _schedule.IsDraft  = _isDraft;
            _schedule.IsCustom = false;

            _schedule = _drEntityStorage.Insert(_schedule);
            CreateScheduleDetails(scheduleParameters, lineTotal);
        }
Exemplo n.º 3
0
        public static Amount CalculateSalesPostingAmount(PXGraph graph, DRSchedule customSchedule)
        {
            var netLinesAmount = new Amount(0m, 0m);

            var processedTrans = new HashSet <ARTran>();

            foreach (PXResult <ARTran, ARRegister, ARTax, Tax> item in PXSelectJoin <
                         ARTran,
                         InnerJoin <ARRegister, On <ARTran.tranType, Equal <ARRegister.docType>,
                                                    And <ARTran.refNbr, Equal <ARRegister.refNbr> > >,
                                    LeftJoin <ARTax,
                                              On <ARTran.tranType, Equal <ARTax.tranType>,
                                                  And <ARTran.refNbr, Equal <ARTax.refNbr>,
                                                       And <ARTran.lineNbr, Equal <ARTax.lineNbr> > > >,
                                              LeftJoin <Tax,
                                                        On <Tax.taxID, Equal <ARTax.taxID> > > > >,
                         Where <ARTran.tranType, Equal <Required <ARInvoice.docType> >,
                                And <ARTran.refNbr, Equal <Required <ARInvoice.refNbr> >,
                                     And <ARTran.deferredCode, IsNull,
                                          And <Where <ARTran.lineType, IsNull,
                                                      Or <ARTran.lineType, NotEqual <SO.SOLineType.discount> > > > > > > >
                     .Select(graph, customSchedule.DocType, customSchedule.RefNbr))
            {
                ARTran     line     = item;
                ARRegister register = item;
                ARTax      artax    = item;
                Tax        tax      = item;

                if (processedTrans.Contains(line))
                {
                    continue;
                }

                var netLineAmount = ARReleaseProcess.GetSalesPostingAmount(graph, register, line, artax, tax,
                                                                           amnt => PXDBCurrencyAttribute.Round(graph.Caches[typeof(ARTran)], line, amnt, CMPrecision.TRANCURY));

                netLinesAmount += netLineAmount;

                processedTrans.Add(line);
            }

            return(netLinesAmount);
        }
Exemplo n.º 4
0
        private static Amount CalculateNetAmountForDeferredLines(PXGraph graph, string docType, string refNbr,
                                                                 out decimal deferredNetDiscountRate, out int?defScheduleID, decimal?invoiceCuryDiscTotal = null)
        {
            var     netLinesAmount = new Amount(0m, 0m);
            decimal deferredDistributedDiscountAmount = 0m;

            deferredNetDiscountRate = 0m;
            defScheduleID           = null;

            foreach (ARTran line in PXSelect <ARTran,
                                              Where <ARTran.tranType, Equal <Required <ARInvoice.docType> >,
                                                     And <ARTran.refNbr, Equal <Required <ARInvoice.refNbr> >,
                                                          And <ARTran.inventoryID, IsNotNull,
                                                               And <ARTran.deferredCode, IsNotNull,
                                                                    And <Where <
                                                                             ARTran.lineType, IsNull,
                                                                             Or <ARTran.lineType, NotEqual <SO.SOLineType.discount> > > > > > > > > .Select(graph, docType, refNbr))
            {
                Func <decimal, decimal> round = amount => PXDBCurrencyAttribute.Round(graph.Caches[typeof(ARTran)], line, amount, CMPrecision.TRANCURY);

                var origCuryDiscountAmount    = (decimal)(line.CuryTranAmt * line.OrigGroupDiscountRate * line.OrigDocumentDiscountRate);
                var currentCuryDiscountAmount = round((decimal)(line.CuryTranAmt * line.DocumentDiscountRate * line.GroupDiscountRate));
                var currentBaseDiscountAmount = round((decimal)(line.TranAmt * line.DocumentDiscountRate * line.GroupDiscountRate));

                decimal?curyAmt = (line.CuryTaxableAmt == 0m) ? currentCuryDiscountAmount : line.CuryTaxableAmt;
                decimal?baseAmt = (line.TaxableAmt == 0m) ? currentBaseDiscountAmount : line.TaxableAmt;
                decimal?discountAmountPerLine = line.CuryTranAmt - origCuryDiscountAmount + line.CuryTranAmt - currentCuryDiscountAmount;

                deferredDistributedDiscountAmount += discountAmountPerLine ?? 0m;

                netLinesAmount += new Amount(curyAmt, baseAmt);
            }

            if (invoiceCuryDiscTotal.HasValue && invoiceCuryDiscTotal > 0m)
            {
                deferredNetDiscountRate = deferredDistributedDiscountAmount / invoiceCuryDiscTotal.Value;
            }

            return(netLinesAmount);
        }
Exemplo n.º 5
0
 public TaxByLine(APTran apTran, InventoryItem item, Amount taxAmt)
 {
     APTran = apTran;
     Item   = item;
     TaxAmt = taxAmt;
 }
Exemplo n.º 6
0
        private void CreateScheduleDetails(DRProcess.DRScheduleParameters scheduleParameters, Amount lineTotal)
        {
            decimal scheduleFairTotal = 0;

            var errors = new List <string>();

            foreach (PXResult <ARTran, InventoryItem, DRDeferredCode, INComponent,
                               DRSingleProcess.ComponentINItem, DRSingleProcess.ComponentDeferredCode> item in _singleScheduleViewProvider.GetParentDocumentDetails())
            {
                ARTran         artran        = item;
                InventoryItem  inventoryItem = item;
                DRDeferredCode deferredCode  = item;
                INComponent    component     = item;
                DRSingleProcess.ComponentINItem       componentINItem       = item;
                DRSingleProcess.ComponentDeferredCode componentDeferredCode = item;

                bool isMDA = deferredCode.MultiDeliverableArrangement == true;

                AccountSubaccountPair deferralAccountSubaccount = GetDeferralAccountSubaccount(
                    isMDA ? componentDeferredCode: deferredCode,
                    isMDA ? componentINItem : inventoryItem,
                    scheduleParameters,
                    artran.SubID);

                AccountSubaccountPair salesAccountSubaccount = GetSalesAccountSubaccount(deferredCode, inventoryItem, component, artran);

                bool isFlexibleMethod = deferredCode.Method == DeferredMethodType.FlexibleProrateDays ||
                                        deferredCode.Method == DeferredMethodType.FlexibleExactDays ||
                                        componentDeferredCode?.Method == DeferredMethodType.FlexibleProrateDays ||
                                        componentDeferredCode?.Method == DeferredMethodType.FlexibleExactDays;

                try
                {
                    DRScheduleDetail detail = CreateScheduleDetail(
                        artran,
                        component,
                        deferredCode,
                        deferralAccountSubaccount,
                        salesAccountSubaccount,
                        isFlexibleMethod);

                    detail = _drEntityStorage.Insert(detail);
                    SetFairValuePrice(detail);
                    detail = _drEntityStorage.Update(detail);

                    if (!_isDraft)
                    {
                        _drEntityStorage.CreateCreditLineTransaction(detail, deferredCode, _branchID);
                    }

                    scheduleFairTotal += detail.EffectiveFairValuePrice.Value * detail.Qty.Value;
                }
                catch (NoFairValuePriceFoundException e)
                {
                    errors.Add(e.Message);
                    continue;
                }
            }

            if (errors.Any())
            {
                throw new NoFairValuePricesFoundException(string.Join(Environment.NewLine, errors));
            }

            if (scheduleFairTotal == 0m)
            {
                throw new PXException(Messages.SumOfFairValuePricesEqualToZero);
            }

            IEnumerable <DRScheduleDetail> scheduleDetails = _drEntityStorage.GetScheduleDetails(_schedule.ScheduleID)
                                                             .RowCast <DRScheduleDetail>()
                                                             .ToList();

            if (scheduleDetails.IsSingleElement())
            {
                DRScheduleDetail scheduleDetail = scheduleDetails.Single();
                scheduleDetail.CuryTotalAmt = lineTotal.Cury;
                scheduleDetail.CuryDefAmt   = lineTotal.Cury;
                scheduleDetail.Percentage   = 1m;
                _drEntityStorage.Update(scheduleDetail);
            }
            else if (scheduleDetails.HasAtLeastTwoItems())
            {
                decimal          sumPercent = 0m;
                decimal          sumResult  = 0m;
                DRScheduleDetail maxAmtLine = null;

                scheduleDetails.ForEach(scheduleDetail =>
                {
                    scheduleDetail.Percentage = scheduleDetail.EffectiveFairValuePrice * scheduleDetail.Qty / scheduleFairTotal;
                    sumPercent += scheduleDetail.Percentage ?? 0m;

                    decimal?rawResult = lineTotal.Cury * scheduleDetail.Percentage;
                    decimal?result    = _roundingFunction(rawResult.Value);
                    sumResult        += result ?? 0m;

                    scheduleDetail.CuryTotalAmt = result;
                    scheduleDetail.CuryDefAmt   = result;

                    var detail = _drEntityStorage.Update(scheduleDetail);

                    if ((maxAmtLine?.CuryTotalAmt ?? 0m) < detail.CuryTotalAmt)
                    {
                        maxAmtLine = detail;
                    }
                });

                if (sumPercent != 1m || sumResult != lineTotal.Cury)
                {
                    decimal?amtDiff = lineTotal.Cury - sumResult;

                    maxAmtLine.CuryTotalAmt += amtDiff;
                    maxAmtLine.CuryDefAmt   += amtDiff;
                    maxAmtLine.Percentage   += 1m - sumPercent;

                    _drEntityStorage.Update(maxAmtLine);
                }
            }

            if (!_isDraft)
            {
                foreach (PXResult <DRScheduleDetail, DRDeferredCode> detail in _dataProvider.GetScheduleDetailsResultset(_schedule.ScheduleID))
                {
                    DRScheduleDetail scheduleDetail = detail;
                    DRDeferredCode   deferralCode   = detail;

                    IEnumerable <DRScheduleTran> deferralTransactions =
                        _drEntityStorage.CreateDeferralTransactions(_schedule, scheduleDetail, deferralCode, _branchID);

                    _drEntityStorage.NonDraftDeferralTransactionsPrepared(scheduleDetail, deferralCode, deferralTransactions);
                }
            }
        }