public void Validate(List <APAdjust> adjustments)
        {
            foreach (var adjustment in adjustments)
            {
                var invoice = InvoiceDataProvider.GetInvoice(Graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);

                var invoiceJCExt = invoice.GetExtension <APInvoiceJCExt>();

                if (invoiceJCExt.IsJointPayees == true)
                {
                    APInvoice origBill = null;

                    if (invoice.IsRetainageDocument == true)
                    {
                        origBill = InvoiceDataProvider.GetOriginalInvoice(Graph, invoice);
                    }

                    if (PaymentCycleWorkflowIsStartedAndItIsOtherPayment(adjustment.AdjgDocType,
                                                                         adjustment.AdjgRefNbr,
                                                                         origBill?.DocType ?? invoice.DocType,
                                                                         origBill?.RefNbr ?? invoice.RefNbr))
                    {
                        ShowErrorMessage <APAdjust.adjdRefNbr>(adjustment,
                                                               JointCheckMessages.PaymentCycleWorkflowIsStarted);
                    }
                }
            }
        }
        protected virtual decimal?GetVendorAmountToPay(APAdjust adjustment)
        {
            var invoice          = InvoiceDataProvider.GetInvoice(Graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var invoiceExtension = PXCache <APInvoice> .GetExtension <APInvoiceJCExt>(invoice);

            return(invoiceExtension.AmountToPay);
        }
예제 #3
0
        private bool IsJointPayment(APAdjust adjustment)
        {
            var invoice          = InvoiceDataProvider.GetInvoice(Base, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var invoiceExtension = PXCache <APInvoice> .GetExtension <APInvoiceJCExt>(invoice);

            return(invoiceExtension.IsJointPayees == true);
        }
 public static IEnumerable <int?> GetProjectIds(PXGraph graph, IEnumerable <APAdjust> adjustments)
 {
     return(adjustments.Select(adjustment =>
                               InvoiceDataProvider.GetOriginalInvoice(graph, adjustment.AdjdRefNbr, adjustment.AdjdDocType))
            .SelectMany(inv => TransactionDataProvider
                        .GetTransactions(graph, inv.DocType, inv.RefNbr).Select(t => t.ProjectID)).Distinct().ToList());
 }
        private static IEnumerable <APTran> GetTransactions(PXGraph graph, IDocumentAdjustment adjustment)
        {
            var originalBill =
                InvoiceDataProvider.GetOriginalInvoice(graph, adjustment.AdjdRefNbr, adjustment.AdjdDocType);

            return(TransactionDataProvider.GetTransactions(graph, originalBill.DocType, originalBill.RefNbr));
        }
        public virtual decimal?GetVendorPreparedBalance(APAdjust adjustment)
        {
            FinDocumentExtKey actualDocLineKey = InvoiceDataProvider.GetSourceEntityKeyByRetainage(Graph,
                                                                                                   adjustment.AdjdDocType, adjustment.AdjdRefNbr, adjustment.AdjdLineNbr);

            decimal?fullAmount;

            if (adjustment.AdjdLineNbr == 0)
            {
                APInvoice bill = InvoiceDataProvider.GetInvoice(Graph, actualDocLineKey.Type, actualDocLineKey.RefNbr);

                fullAmount = bill.CuryOrigDocAmt + bill.CuryRetainageTotal;
            }
            else
            {
                APTran tran = TransactionDataProvider.GetTransaction(Graph, actualDocLineKey.Type, actualDocLineKey.RefNbr, actualDocLineKey.LineNbr);

                fullAmount = tran.CuryOrigTranAmt + tran.CuryRetainageAmt;
            }

            var totalJointAmountOwed = JointPayeeDataProvider.GetJointPayees(Graph, actualDocLineKey.RefNbr, actualDocLineKey.LineNbr)
                                       .Sum(jp => jp.JointAmountOwed.GetValueOrDefault());
            var totalVendorPaymentAmount   = GetTotalVendorPaymentAmount(adjustment, actualDocLineKey.RefNbr, actualDocLineKey.LineNbr);
            var currentVendorPaymentAmount = GetVendorPaymentAmount(adjustment);
            var reversedRetainageAmount    = GetReversedRetainageAmount(actualDocLineKey.RefNbr, actualDocLineKey.LineNbr);

            return(fullAmount + reversedRetainageAmount - totalJointAmountOwed
                   - (totalVendorPaymentAmount - currentVendorPaymentAmount));
        }
예제 #7
0
        private bool IsJointPayeesInvoice(IDocumentKey document)
        {
            var invoice          = InvoiceDataProvider.GetInvoice(Base, document.DocType, document.RefNbr);
            var invoiceExtension = PXCache <APInvoice> .GetExtension <APInvoiceJCExt>(invoice);

            return(invoiceExtension?.IsJointPayees == true);
        }
        private static APTran GetTransaction(PXGraph graph, JointPayee jointPayee, IDocumentAdjustment adjustment)
        {
            var originalBill =
                InvoiceDataProvider.GetOriginalInvoice(graph, adjustment.AdjdRefNbr, adjustment.AdjdDocType);

            return(TransactionDataProvider.GetTransaction(graph, originalBill.DocType, originalBill.RefNbr,
                                                          jointPayee.BillLineNumber));
        }
예제 #9
0
        private bool DoesAnyInvoiceJointPayeeExist(IDocumentKey document)
        {
            var noteId = InvoiceDataProvider.GetOriginalInvoice(Base, document.RefNbr, document.DocType)?.NoteID;

            return(SelectFrom <JointPayee>
                   .Where <JointPayee.billId.IsEqual <P.AsGuid> > .View
                   .Select(Base, noteId).Any());
        }
예제 #10
0
        private bool IsPaymentCycleWorkflow(IDocumentKey invoice)
        {
            var allRelatedBills =
                InvoiceDataProvider.GetAllBillsFromRetainageGroup(Base, invoice.RefNbr, invoice.DocType);

            return(allRelatedBills.Any(inv =>
                                       JointPayeePaymentDataProvider.DoesAnyNonReleasedJointPayeePaymentExist(Base, inv)));
        }
예제 #11
0
        private void SetCashDiscountBalance(APAdjust adjustment)
        {
            var invoice = InvoiceDataProvider.GetInvoice(Base, adjustment.AdjdDocType, adjustment.AdjdRefNbr);

            adjustment.CuryDiscBal = invoice.PaymentsByLinesAllowed == true
                ? TransactionDataProvider.GetTransaction(Base, invoice.DocType, invoice.RefNbr, adjustment.AdjdLineNbr)
                                     .CuryCashDiscBal
                : invoice.CuryOrigDiscAmt;
        }
예제 #12
0
        public virtual decimal?GetNonReleasedCashDiscountTakenExceptCurrentAdjustment(APAdjust apAdjust)
        {
            var adjustments = AdjustmentDataProvider.GetInvoiceAdjustments(Graph, apAdjust.AdjdRefNbr);
            var releasedCashDiscountTaken = InvoiceDataProvider
                                            .GetInvoice(Graph, apAdjust.AdjdDocType, apAdjust.AdjdRefNbr).CuryDiscTaken;
            var totalCashDiscountTaken = adjustments.Sum(adjustment => adjustment.CuryAdjgPPDAmt);

            return(totalCashDiscountTaken - releasedCashDiscountTaken - apAdjust.CuryAdjgPPDAmt);
        }
        public void ClosePaymentCycleWorkflowIfNeeded(APAdjust adjustment)
        {
            var invoice = InvoiceDataProvider.GetInvoice(graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);

            if (!JointPayeePaymentDataProvider.DoesAnyNonReleasedJointPayeePaymentExist(graph, invoice))
            {
                UpdateIsPaymentCycleWorkflow(invoice, false);
            }
        }
예제 #14
0
        protected override decimal?GetOpenBalanceByAllBillsFromRetainageGroup(APInvoice invoice)
        {
            var originalInvoice                  = InvoiceDataProvider.GetOriginalInvoice(Graph, invoice.RefNbr, invoice.DocType);
            var billLineNumbers                  = JointPayees.Select(jp => jp.BillLineNumber).ToList();
            var unreleasedRetainageAmount        = GetUnreleasedRetainageAmount(originalInvoice, billLineNumbers);
            var releasedAmountFromRetainageGroup = GeReleasedAmountFromRetainageGroup(invoice, billLineNumbers);

            return(invoice.CuryDocBal + unreleasedRetainageAmount + releasedAmountFromRetainageGroup);
        }
        protected virtual decimal?GetOpenBalanceByAllBillsFromRetainageGroup(APInvoice invoice)
        {
            var originalBill          = InvoiceDataProvider.GetOriginalInvoice(Graph, invoice.RefNbr, invoice.DocType);
            var relatedRetainageBills =
                InvoiceDataProvider.GetRelatedRetainageBills(Graph, originalBill.RefNbr, originalBill.DocType);

            return(originalBill.CuryDocBal + originalBill.CuryRetainageUnreleasedAmt +
                   relatedRetainageBills.Sum(x => x.CuryDocBal));
        }
예제 #16
0
        private bool IsFinalAdjustment(APAdjust adjustment)
        {
            var invoice = InvoiceDataProvider.GetInvoice(Base, adjustment.AdjdDocType, adjustment.AdjdRefNbr);

            invoiceBalanceCalculationService = invoice.PaymentsByLinesAllowed == true
                ? new InvoiceLineBalanceCalculationService(Base)
                : new InvoiceBalanceCalculationService(Base);
            return(invoiceBalanceCalculationService.GetInvoiceBalance(adjustment) == adjustment.CuryAdjgAmt);
        }
        public void InitializePaymentCycleWorkflowIfRequired(APAdjust adjustment)
        {
            var invoice          = InvoiceDataProvider.GetInvoice(graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var invoiceExtension = invoice.GetExtension <APInvoiceJCExt>();

            if (invoiceExtension.IsJointPayees == true && invoiceExtension.IsPaymentCycleWorkflow == false)
            {
                UpdateIsPaymentCycleWorkflow(invoice, true);
            }
        }
        private void RefreshCurrentInvoice(PXGraph graph)
        {
            var currentBill = Base.Document.Current;

            currentBill = InvoiceDataProvider.GetOriginalInvoice(graph, currentBill.RefNbr, currentBill.DocType);
            if (currentBill.PaymentsByLinesAllowed.GetValueOrDefault())
            {
                RecalculateTotalJointAmountOwedPerLine();
            }
        }
예제 #19
0
        private decimal?GeReleasedAmountFromRetainageGroup(APInvoice invoice, IEnumerable <int?> billLineNumbers)
        {
            var allReleasedBillsFromRetainageGroup = InvoiceDataProvider
                                                     .GetAllBillsFromRetainageGroup(Graph, invoice.RefNbr, invoice.DocType)
                                                     .Except(invoice).Where(bill => bill.Released == true);

            return(allReleasedBillsFromRetainageGroup.SelectMany(bill => TransactionDataProvider
                                                                 .GetTransactions(Graph, bill.DocType, bill.RefNbr, billLineNumbers))
                   .Sum(transaction => transaction.CuryTranBal));
        }
예제 #20
0
        private void SetBillId(IEnumerable <APTran> transactions)
        {
            var invoices = InvoiceDataProvider.GetInvoices(Graph, transactions);
            var invoice  = invoices.SingleOrNull();

            if (invoice != null)
            {
                ComplianceDocumentRefNoteAttribute.SetComplianceDocumentReference <ComplianceDocument.billID>(
                    Cache, lienWaiver, invoice.DocType, invoice.RefNbr, invoice.NoteID);
            }
        }
예제 #21
0
        protected virtual decimal GetAllowableCashDiscountConsiderBillBalance(APAdjust apAdjust)
        {
            var invoiceAdjustments = AdjustmentDataProvider.GetInvoiceAdjustments(Graph, apAdjust.AdjdRefNbr);
            var unappliedBalance   = invoiceAdjustments
                                     .Sum(adjustment => adjustment.CuryAdjgAmt + adjustment.CuryAdjgPPDAmt);
            var billBalance = InvoiceDataProvider.GetInvoice(Graph, apAdjust.AdjdDocType, apAdjust.AdjdRefNbr)
                              .CuryOrigDocAmt;
            var cashDiscount = billBalance - unappliedBalance + apAdjust.CuryAdjgPPDAmt;

            return(Math.Max(cashDiscount.GetValueOrDefault(), 0));
        }
        public void AddJointPayeePayments(APAdjust adjustment)
        {
            var originalBillReferenceNumber =
                InvoiceDataProvider.GetOriginalInvoice(graph, adjustment.AdjdRefNbr, adjustment.AdjdDocType).RefNbr;
            var jointPayees = JointPayeeDataProvider.GetJointPayees(graph, originalBillReferenceNumber, adjustment.AdjdLineNbr);

            foreach (var jointPayee in jointPayees)
            {
                AddJointPayeePayment(jointPayee, adjustment);
            }
        }
예제 #23
0
        private void CreateJointPayeePayments(APAdjust adjustment)
        {
            var originalInvoice =
                InvoiceDataProvider.GetOriginalInvoice(Base, adjustment.AdjdRefNbr, adjustment.AdjdDocType);
            var jointPayees =
                JointPayeeDataProvider.GetJointPayees(Base, originalInvoice.RefNbr, adjustment.AdjdLineNbr);
            var jointPayeePayments = jointPayees
                                     .Select(jointPayee => CreateJointPayeePayment(jointPayee.JointPayeeId, adjustment));

            JointPayeePayments.Cache.InsertAll(jointPayeePayments);
        }
        public static IEnumerable <int?> GetProjectIds(APAdjust adjustment, PXGraph graph)
        {
            FinDocumentExtKey actualDocLineKey = InvoiceDataProvider.GetSourceEntityKeyByRetainage(graph,
                                                                                                   adjustment.AdjdDocType, adjustment.AdjdRefNbr, adjustment.AdjdLineNbr);

            var transactions = adjustment.AdjdLineNbr == 0
                                ? TransactionDataProvider.GetTransactions(graph, actualDocLineKey.Type, actualDocLineKey.RefNbr)
                                : TransactionDataProvider.GetTransaction(graph, actualDocLineKey.Type, actualDocLineKey.RefNbr, actualDocLineKey.LineNbr).SingleToList();

            return(transactions.Select(tran => tran.ProjectID));
        }
예제 #25
0
        private decimal?GetOpenBalanceByAllBillsFromRetainageGroupPerLine(
            APAdjust adjustment, decimal?transactionBalance)
        {
            var invoice                   = InvoiceDataProvider.GetInvoice(Graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var originalInvoice           = InvoiceDataProvider.GetOriginalInvoice(Graph, invoice);
            var unreleasedRetainageAmount =
                GetUnreleasedRetainageAmount(originalInvoice, adjustment.AdjdLineNbr.CreateArray());
            var releasedAmountFromRetainageGroup =
                GeReleasedAmountFromRetainageGroup(invoice, adjustment.AdjdLineNbr.CreateArray());

            return(transactionBalance + unreleasedRetainageAmount + releasedAmountFromRetainageGroup);
        }
        private void CheckPaymentLifeCycle(PXGraph graph)
        {
            var currentBill     = Base.Document.Current;
            var allRelatedBills =
                InvoiceDataProvider.GetAllBillsFromRetainageGroup(graph, currentBill.RefNbr, currentBill.DocType);

            if (allRelatedBills.Select(retainageBill => retainageBill.GetExtension <APInvoiceJCExt>())
                .Any(ext => ext.IsPaymentCycleWorkflow == true))
            {
                throw new PXException(JointCheckMessages.PaymentCycleWorkflowIsStarted);
            }
        }
예제 #27
0
        private void SetAmountToPayIfEmpty(APAdjust adjustment)
        {
            var invoice          = InvoiceDataProvider.GetInvoice(Base, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var invoiceExtension = PXCache <APInvoice> .GetExtension <APInvoiceJCExt>(invoice);

            var adjustmentExtension = PXCache <APAdjust> .GetExtension <ApAdjustExt>(adjustment);

            if (invoiceExtension.IsJointPayees == true && adjustmentExtension.AmountToPayPerLine == null)
            {
                adjustmentExtension.AmountToPayPerLine = GetVendorBalance(adjustment, invoice);
                adjustment.CuryAdjgAmt = adjustmentExtension.AmountToPayPerLine;
            }
        }
 protected virtual decimal?GetReversedRetainageAmount(string referenceNumber, int?lineNumber)
 {
     if (lineNumber == 0)
     {
         return(InvoiceDataProvider.GetReversedRetainageDebitAdjustments(Graph, referenceNumber)
                .Sum(inv => inv.CuryOrigDocAmt));
     }
     else
     {
         return(InvoiceDataProvider.GetReversedRetainageDebitAdjustmentLines(Graph, referenceNumber, lineNumber)
                .Sum(inv => inv.CuryOrigTranAmt));
     }
 }
        public static IEnumerable <int?> GetProjectIds(APInvoiceEntry graph, JointPayee jointPayee)
        {
            var originalBill = InvoiceDataProvider.GetOriginalInvoice(graph, graph.Document.Current);
            var transactions = TransactionDataProvider.GetTransactions(graph, originalBill.DocType, originalBill.RefNbr)
                               .ToList();

            if (IsSingleProjectPerDocumentContext(graph.APSetup.Current, transactions))
            {
                return(graph.Document.Current.ProjectID.AsSingleEnumerable());
            }
            if (jointPayee != null && graph.Document.Current.PaymentsByLinesAllowed == true)
            {
                transactions = transactions.Where(tran => tran.LineNbr == jointPayee.BillLineNumber).ToList();
            }
            return(transactions.Select(tran => tran.ProjectID).Distinct());
        }
        public void ValidateApAdjustment <TField>(APAdjust adjustment)
            where TField : IBqlField
        {
            if (adjustment.IsSelfAdjustment())
            {
                return;
            }

            var apInvoice = InvoiceDataProvider.GetInvoice(graph, adjustment.AdjdDocType, adjustment.AdjdRefNbr);
            var hasExpiredComplianceDocuments =
                ValidateRelatedField <APAdjust, ComplianceDocument.billID, TField>(adjustment,
                                                                                   ComplianceDocumentReferenceRetriever.GetComplianceDocumentReferenceId(graph, apInvoice));

            ValidateRelatedRow <APAdjust, ApAdjustExt.hasExpiredComplianceDocuments>(adjustment,
                                                                                     hasExpiredComplianceDocuments);
        }