private void CheckPaymentTranForceSync(TPrimary doc)
        {
            CheckPaymentTransaction(doc);
            IExternalTransaction storedTran = GetExtTrans().FirstOrDefault();
            bool needSyncUnsettled          = false;

            if (storedTran != null && ExternalTranHelper.GetTransactionState(Base, storedTran).IsActive)
            {
                SyncPaymentTransactionById(doc, new List <string>()
                {
                    storedTran.TranNumber
                });
                ClearTransactionСaches();
                storedTran = GetExtTrans().FirstOrDefault();
                if (storedTran?.Active == false)
                {
                    needSyncUnsettled = true;
                }
            }
            else
            {
                needSyncUnsettled = true;
            }

            if (needSyncUnsettled)
            {
                ICCPayment pDoc = GetPaymentDoc(doc);
                IEnumerable <V2.TransactionData> trans  = GetPaymentProcessing().GetUnsettledTransactions(SelectedProcessingCenter);
                IEnumerable <string>             result = PrepeareTransactionIds(GetTransByDoc(pDoc, trans));
                SyncPaymentTransactionById(doc, result);
            }
        }
Esempio n. 2
0
        public ExternalTransactionState GetActiveTransactionState()
        {
            var trans = GetExtTrans();
            var ret   = ExternalTranHelper.GetActiveTransactionState(Base, trans);

            return(ret);
        }
        private void CheckPaymentTransaction(TPrimary doc)
        {
            if (!IsFeatureSupported(SelectedProcessingCenter, CCProcessingFeature.TransactionGetter))
            {
                return;
            }
            ICCPayment pDoc = GetPaymentDoc(doc);
            IEnumerable <V2.TransactionData> trans = null;

            if (LockExists(doc))
            {
                retryUnsettledTran.HandleError(i => GetTransByDoc(pDoc, i).Count > 0 ? true : false);
                try
                {
                    trans = retryUnsettledTran.Execute(() => GetPaymentProcessing().GetUnsettledTransactions(SelectedProcessingCenter));
                }
                catch (InvalidOperationException)
                { }
            }

            if (trans != null)
            {
                IEnumerable <string> result = PrepeareTransactionIds(GetTransByDoc(pDoc, trans));
                SyncPaymentTransactionById(doc, result);
            }
            ClearTransactionСaches();

            IExternalTransaction tran = ExternalTranHelper.GetActiveTransaction(GetExtTrans());

            if (tran != null)
            {
                TranStatusChanged(pDoc, tran.TransactionID);
            }
        }
Esempio n. 4
0
        public void CaptureCCpayment(ICCPayment doc, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }

            ExternalTransactionState state = ExternalTranHelper.GetActiveTransactionState(graph, paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, state.ExternalTransaction))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (state.IsCaptured)
            {
                throw new PXException(Messages.ERR_CCAuthorizedPaymentAlreadyCaptured);
            }
            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }

            ICCPayment           toProc   = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;
            IExternalTransaction tranCopy = null;

            if (state.IsPreAuthorized && !ExternalTranHelper.IsExpired(state.ExternalTransaction))
            {
                tranCopy = graph.Caches[state.ExternalTransaction.GetType()].CreateCopy(state.ExternalTransaction) as IExternalTransaction;
            }
            CCTranType operation = tranCopy != null ? CCTranType.PriorAuthorizedCapture : CCTranType.AuthorizeAndCapture;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    if (operation == CCTranType.PriorAuthorizedCapture)
                    {
                        TransactionProcessor.ProcessPriorAuthorizedCapture(toProc, tranCopy);
                    }
                    else
                    {
                        TransactionProcessor.ProcessAuthorizeCapture(toProc, tranCopy);
                    }
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)doc, operation, success);
                }
            });
        }
Esempio n. 5
0
        public void RecordCCCredit(ICCPayment doc, ICCManualInputPaymentInfo info, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }
            ExternalTransactionState state = ExternalTranHelper.GetActiveTransactionState(graph, paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, state.ExternalTransaction))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (string.IsNullOrEmpty(info.PCTranNumber))
            {
                throw new PXException(Messages.ERR_PCTransactionNumberOfTheOriginalPaymentIsRequired);
            }
            if (state.IsRefunded)
            {
                throw new PXException(Messages.ERR_CCPaymentIsAlreadyRefunded);
            }

            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }
            ICCPayment toProc    = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;
            CCTranType operation = CCTranType.Credit;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    var procGraph                = PXGraph.CreateInstance <CCPaymentProcessingGraph>();
                    TranRecordData recordData    = new TranRecordData();
                    recordData.RefExternalTranId = toProc.RefTranExtNbr;
                    recordData.ExternalTranId    = info.PCTranNumber;
                    recordData.AuthCode          = info.AuthNumber;
                    procGraph.RecordCredit(doc, recordData);
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)doc, operation, success);
                }
            });
        }
Esempio n. 6
0
        public string GetLastTransactionDescription()
        {
            string ret  = null;
            var    tran = GetExtTrans().FirstOrDefault();

            if (tran != null)
            {
                if (!ExternalTranHelper.HasVoidPreAuthorizedInHistory(Base, tran))
                {
                    ret = ExternalTranHelper.GetTransactionState(Base, tran).Description;
                }
            }
            return(ret);
        }
Esempio n. 7
0
        public void VoidCCPayment(ICCPayment doc, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }
            ExternalTransactionState state = ExternalTranHelper.GetActiveTransactionState(graph, paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, state.ExternalTransaction))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (!state.IsActive)
            {
                throw new PXException(Messages.ERR_CCNoTransactionToVoid);
            }

            if (state.IsRefunded)
            {
                throw new PXException(Messages.ERR_CCTransactionOfThisTypeInvalidToVoid);
            }

            if (ExternalTranHelper.IsExpired(state.ExternalTransaction))
            {
                throw new PXException(Messages.TransactionHasExpired);
            }
            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }
            ICCPayment toProc = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    TransactionProcessor.ProcessVoidOrCredit(toProc, state.ExternalTransaction);
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)doc, CCTranType.VoidOrCredit, success);
                }
            });
        }
Esempio n. 8
0
        public static void CheckForHeldForReviewStatusAfterProc(IBqlTable aTable, CCTranType procTran, bool success)
        {
            ICCPayment doc = aTable as ICCPayment;

            if (doc != null && success)
            {
                var graph = PXGraph.CreateInstance <ARPaymentEntry>();
                var query = new PXSelect <ExternalTransaction, Where <ExternalTransaction.docType, Equal <Required <ExternalTransaction.docType> >,
                                                                      And <ExternalTransaction.refNbr, Equal <Required <ExternalTransaction.refNbr> > > >, OrderBy <Desc <ExternalTransaction.transactionID> > >(graph);
                var result = query.Select(doc.DocType, doc.RefNbr);
                ExternalTransactionState state = ExternalTranHelper.GetActiveTransactionState(graph, result.RowCast <ExternalTransaction>());
                if (state.IsOpenForReview)
                {
                    throw new PXSetPropertyException(AR.Messages.CCProcessingTranHeldWarning, PXErrorLevel.RowWarning);
                }
            }
        }
Esempio n. 9
0
        public void CaptureOnlyCCPayment(InputPaymentInfo paymentInfo, ICCPayment doc, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }

            IExternalTransaction extTran = ExternalTranHelper.GetActiveTransaction(paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, extTran))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (string.IsNullOrEmpty(paymentInfo.AuthNumber))
            {
                throw new PXException(Messages.ERR_CCExternalAuthorizationNumberIsRequiredForCaptureOnlyTrans);
            }
            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }
            ICCPayment toProc = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    IExternalTransaction tran = new ExternalTransaction();
                    tran.AuthNumber           = paymentInfo.AuthNumber;
                    TransactionProcessor.ProcessCaptureOnly(toProc, tran);
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)toProc, CCTranType.CaptureOnly, success);
                }
            });
        }
Esempio n. 10
0
        public void AuthorizeCCpayment(ICCPayment doc, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }

            ExternalTransactionState state = ExternalTranHelper.GetActiveTransactionState(graph, paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, state.ExternalTransaction))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (state.IsCaptured || state.IsPreAuthorized)
            {
                throw new PXException(Messages.ERR_CCPaymentAlreadyAuthorized);
            }
            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }

            ICCPayment toProc = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    TransactionProcessor.ProcessAuthorize(toProc, null);
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)doc, CCTranType.AuthorizeOnly, success);
                }
            });
        }
Esempio n. 11
0
        public virtual IEnumerable ValidateCCPayment(PXAdapter adapter)
        {
            string methodName = GetClassMethodName();

            PXTrace.WriteInformation($"{methodName} started.");
            List <TPrimary> list = new List <TPrimary>();

            foreach (TPrimary doc in adapter.Get <TPrimary>())
            {
                list.Add(doc);
                ICCPayment pDoc = GetPaymentDoc(doc);
                PXLongOperation.StartOperation(Base, delegate
                {
                    IExternalTransaction tran = ExternalTranHelper.GetActiveTransaction(GetExtTrans());
                    if (tran != null)
                    {
                        TranStatusChanged(pDoc, tran.TransactionID);
                    }
                });
            }
            return(list);
        }
Esempio n. 12
0
        public void CreditCCPayment(ICCPayment doc, IExternalTransactionAdapter paymentTransaction)
        {
            if (doc == null || doc.CuryDocBal == null)
            {
                return;
            }
            IExternalTransaction extTran = ExternalTranHelper.GetActiveTransaction(paymentTransaction.Select());

            if (ExternalTranHelper.HasOpenCCProcTran(graph, extTran))
            {
                throw new PXException(Messages.ERR_CCTransactionCurrentlyInProgress);
            }
            if (doc.Released == false)
            {
                graph.Actions.PressSave();
            }
            ICCPayment toProc = graph.Caches[doc.GetType()].CreateCopy(doc) as ICCPayment;

            PXLongOperation.StartOperation(graph, delegate()
            {
                bool success = true;
                try
                {
                    IExternalTransaction tran = new ExternalTransaction();
                    tran.TranNumber           = doc.RefTranExtNbr;
                    TransactionProcessor.ProcessCredit(toProc, tran);
                }
                catch
                {
                    success = false;
                    throw;
                }
                finally
                {
                    RunCallbacks((IBqlTable)doc, CCTranType.VoidOrCredit, success);
                }
            });
        }
Esempio n. 13
0
        public static void ReleaseARDocument(IBqlTable aTable, CCTranType procTran, bool success)
        {
            AR.ARRegister doc = aTable as AR.ARRegister;
            if (doc != null && success)
            {
                ExternalTransaction tran  = null;
                PXGraph             graph = null;
                if (doc.DocType == ARDocType.CashSale || doc.DocType == ARDocType.CashReturn)
                {
                    ARCashSaleEntry cashSaleGraph = PXGraph.CreateInstance <ARCashSaleEntry>();
                    cashSaleGraph.Document.Current = PXSelect <ARCashSale, Where <ARCashSale.docType, Equal <Required <ARCashSale.docType> >,
                                                                                  And <ARCashSale.refNbr, Equal <Required <ARCashSale.refNbr> > > > > .SelectWindowed(cashSaleGraph, 0, 1, doc.DocType, doc.RefNbr);

                    tran  = cashSaleGraph.ExternalTran.SelectSingle(doc.DocType, doc.RefNbr);
                    graph = cashSaleGraph;
                }
                else
                {
                    ARPaymentEntry paymentGraph = PXGraph.CreateInstance <ARPaymentEntry>();
                    paymentGraph.Document.Current = PXSelect <AR.ARPayment, Where <AR.ARPayment.docType, Equal <Required <AR.ARPayment.docType> >,
                                                                                   And <AR.ARPayment.refNbr, Equal <Required <AR.ARPayment.refNbr> > > > > .SelectWindowed(paymentGraph, 0, 1, doc.DocType, doc.RefNbr);

                    tran  = paymentGraph.ExternalTran.SelectSingle(doc.DocType, doc.RefNbr);
                    graph = paymentGraph;
                }

                if (tran != null)
                {
                    ExternalTransactionState state = ExternalTranHelper.GetTransactionState(graph, tran);
                    if (!state.IsDeclined && !state.IsOpenForReview)
                    {
                        ReleaseARDocument(aTable);
                    }
                }
            }
        }
Esempio n. 14
0
        protected virtual IEnumerable ardocumentlist()
        {
            DateTime now = DateTime.Now.Date;
            PXSelectBase <ExternalTransaction> tranSelect = new PXSelect <ExternalTransaction, Where <ExternalTransaction.docType, Equal <Optional <ExternalTransaction.docType> >, And <ExternalTransaction.refNbr, Equal <Optional <ExternalTransaction.refNbr> > > >, OrderBy <Desc <ExternalTransaction.transactionID> > >(this);

            foreach (PXResult <ARPaymentInfo, Customer, PaymentMethod, CustomerPaymentMethod, CCProcessingCenterPmntMethod> it
                     in PXSelectJoin <ARPaymentInfo,
                                      InnerJoin <Customer, On <Customer.bAccountID, Equal <ARPaymentInfo.customerID> >,
                                                 InnerJoin <PaymentMethod, On <PaymentMethod.paymentMethodID, Equal <ARPaymentInfo.paymentMethodID>,
                                                                               And <PaymentMethod.paymentType, Equal <PaymentMethodType.creditCard>,
                                                                                    And <PaymentMethod.aRIsProcessingRequired, Equal <True> > > >,
                                                            LeftJoin <CustomerPaymentMethod, On <CustomerPaymentMethod.pMInstanceID, Equal <ARPaymentInfo.pMInstanceID> >,
                                                                      LeftJoin <CCProcessingCenterPmntMethod, On <CCProcessingCenterPmntMethod.paymentMethodID, Equal <PaymentMethod.paymentMethodID>,
                                                                                                                  And <CCProcessingCenterPmntMethod.isDefault, Equal <True>,
                                                                                                                       And <CCProcessingCenterPmntMethod.isActive, Equal <True> > > > > > > >,
                                      Where <ARPaymentInfo.released, Equal <False>,
                                             And <ARPaymentInfo.hold, Equal <False>,
                                                  And <ARPaymentInfo.voided, Equal <False>,
                                                       And <ARPaymentInfo.docType, Equal <ARPaymentType.payment>,
                                                            And <ARPaymentInfo.docDate, LessEqual <Current <PaymentFilter.payDate> >,
                                                                 And <ARPaymentInfo.isMigratedRecord, NotEqual <True>,
                                                                      And2 <Where <Customer.statementCycleId, Equal <Current <PaymentFilter.statementCycleId> >,
                                                                                   Or <Current <PaymentFilter.statementCycleId>, IsNull> >,
                                                                            And2 <Where <PaymentMethod.paymentMethodID, Equal <Current <PaymentFilter.paymentMethodID> >,
                                                                                         Or <Current <PaymentFilter.paymentMethodID>, IsNull> >,
                                                                                  And <Match <Customer, Current <AccessInfo.userName> > > > > > > > > > >,
                                      OrderBy <Asc <ARPaymentInfo.refNbr> > > .Select(this))
            {
                ARPaymentInfo                doc  = (ARPaymentInfo)it;
                CustomerPaymentMethod        cpm  = (CustomerPaymentMethod)it;
                CCProcessingCenterPmntMethod pcpm = (CCProcessingCenterPmntMethod)it;
                if (!string.IsNullOrEmpty(this.Filter.Current.ProcessingCenterID) && (this.Filter.Current.ProcessingCenterID != pcpm.ProcessingCenterID))
                {
                    continue;
                }
                ARDocKey key = new ARDocKey(doc);
                if (Filter.Current == null || Filter.Current.CustomerID == null || object.Equals(Filter.Current.CustomerID, doc.CustomerID))
                {
                    if (cpm?.PMInstanceID != null)
                    {
                        doc.PMInstanceDescr = cpm.Descr;
                        doc.PaymentMethodID = cpm.PaymentMethodID;
                        doc.IsCCExpired     = (cpm.ExpirationDate < now);
                    }
                    doc.ProcessingCenterID = (pcpm != null) ? pcpm.ProcessingCenterID : string.Empty;
                    ExternalTransactionState paymentState = ExternalTranHelper.GetActiveTransactionState(this, tranSelect.Select(doc.DocType, doc.RefNbr).RowCast <ExternalTransaction>());
                    ExternalTransaction      lastTran     = (ExternalTransaction)paymentState.ExternalTransaction;
                    doc.CCPaymentStateDescr = paymentState.Description;
                    int?tranId = paymentState?.ExternalTransaction?.TransactionID;
                    if (paymentState.HasErrors && tranId != null)
                    {
                        string errText = tranRepo.GetCCProcTranByTranID(tranId).OrderByDescending(i => i.TranNbr).Select(i => i.ErrorText).FirstOrDefault();
                        doc.CCTranDescr = errText;
                    }
                    if (doc.IsCCExpired == true && string.IsNullOrEmpty(doc.CCTranDescr))
                    {
                        doc.CCTranDescr = Messages.CreditCardIsExpired;
                    }
                    if (doc.PMInstanceID == PaymentTranExtConstants.NewPaymentProfile && paymentState.IsOpenForReview)
                    {
                        yield return(doc);
                    }
                    if (doc.PMInstanceID != PaymentTranExtConstants.NewPaymentProfile &&
                        (!paymentState.IsCaptured || (paymentState.IsCaptured && paymentState.IsOpenForReview)))
                    {
                        yield return(doc);
                    }
                }
            }
        }