public static void SyncNewPMI <TPaymentMethodType, TDetialsType>(PXGraph graph, PXSelectBase <TPaymentMethodType> customerPaymentMethodView, PXSelectBase <TDetialsType> detailsView) where TPaymentMethodType : CustomerPaymentMethod, new() where TDetialsType : CustomerPaymentMethodDetail, new() { bool isHF = CCProcessingUtils.isHFPaymentMethod(graph, customerPaymentMethodView.Current.PMInstanceID); bool isConverting = customerPaymentMethodView.Current.Selected == true; isHF = isHF && !isConverting; TDetialsType CCPIDDet = null; bool isIDFilled = false; bool isOtherDetsFilled = false; foreach (PXResult <TDetialsType, PaymentMethodDetail> det in detailsView.Select()) { TDetialsType cpmd = det; PaymentMethodDetail cmd = det; if (cmd.IsCCProcessingID == true) { isIDFilled = cpmd.Value != null; CCPIDDet = (TDetialsType)detailsView.Cache.CreateCopy(cpmd); } else { isOtherDetsFilled = cpmd.Value != null || isOtherDetsFilled; } } if (CCPIDDet == null) { //something's very wrong throw new PXException(Messages.NOCCPID, customerPaymentMethodView.Current.Descr); } if (isIDFilled && isOtherDetsFilled) { return; } if ((isIDFilled || isOtherDetsFilled) && !isHF || isIDFilled && !isOtherDetsFilled) { CCCustomerInformationManager cim = new CCCustomerInformationManager(customerPaymentMethodView.Current.CCProcessingCenterID, CCProcessingFeature.Tokenization, new ProcessingContext() { aCustomerID = customerPaymentMethodView.Current.BAccountID, aPMInstanceID = customerPaymentMethodView.Current.PMInstanceID, callerGraph = graph }); if (customerPaymentMethodView.Current.CustomerCCPID == null) { string id = cim.CreateCustomer(); TPaymentMethodType cpm = (TPaymentMethodType)customerPaymentMethodView.Cache.CreateCopy(customerPaymentMethodView.Current); cpm.CustomerCCPID = id; customerPaymentMethodView.Update(cpm); } if (isOtherDetsFilled) { string newPMId = cim.CreatePaymentMethod(); CCPIDDet.Value = newPMId; CCPIDDet = detailsView.Update(CCPIDDet); } SyncPMResponse syncResponse = cim.GetPaymentMethod(); if (syncResponse.PMList.ContainsKey(CCPIDDet.Value)) { foreach (PXResult <TDetialsType, PaymentMethodDetail> det in detailsView.Select()) { TDetialsType cpmd = det; if (cpmd.DetailID == CCPIDDet.DetailID) { continue; } string detailValue; if (!syncResponse.PMList[CCPIDDet.Value].TryGetValue(cpmd.DetailID, out detailValue)) { detailValue = null; } TDetialsType newcpmd = (TDetialsType)detailsView.Cache.CreateCopy(cpmd); newcpmd.Value = detailValue; detailsView.Update(newcpmd); } } else { throw new PXException(Messages.CouldntGetPMIDetails, customerPaymentMethodView.Current.Descr); } } }