public HpsCheckResponse BuildTransaction(checkActionType action, HpsCheck check, decimal?amount, long?clientTransactionId = null, bool checkVerify = false, bool achVerify = false) { if (amount.HasValue) { HpsInputValidation.CheckAmount(amount.Value); } if (check.SecCode == "CCD" && (check.CheckHolder == null || check.CheckHolder.CheckName == null)) { throw new HpsInvalidRequestException(HpsExceptionCodes.MissingCheckName, "For SEC Code CCD the check name is required.", "CheckName"); } var block1 = new CheckSaleReqBlock1Type { CheckAction = action, SECCode = check.SecCode, AccountInfo = HydrateCheckData(check), AmtSpecified = amount.HasValue, CheckTypeSpecified = check.CheckType.HasValue, DataEntryModeSpecified = check.DataEntryMode.HasValue, VerifyInfo = new VerifyInfoType { ACHVerify = achVerify ? booleanType.Y : booleanType.N, ACHVerifySpecified = true, CheckVerify = checkVerify ? booleanType.Y : booleanType.N, CheckVerifySpecified = true } }; if (block1.AmtSpecified) { block1.Amt = amount.Value; } if (block1.CheckTypeSpecified) { block1.CheckType = check.CheckType.Value; } if (block1.DataEntryModeSpecified) { block1.DataEntryMode = check.DataEntryMode.Value; } if (check.CheckHolder != null) { block1.ConsumerInfo = HydrateConsumerInfo(check.CheckHolder); } var transaction = new PosRequestVer10Transaction { Item = new PosCheckSaleReqType { Block1 = block1 }, ItemElementName = ItemChoiceType1.CheckSale }; return(SubmitTransaction(transaction, clientTransactionId)); }
internal AccountInfoType HydrateCheckData(HpsCheck check) { var accountInfo = new AccountInfoType(); accountInfo.AccountNumber = check.AccountNumber; accountInfo.CheckNumber = check.CheckNumber; accountInfo.MICRData = check.MicrNumber; accountInfo.RoutingNumber = check.RoutingNumber; if (check.AccountType.HasValue) { accountInfo.AccountType = check.AccountType.Value; accountInfo.AccountTypeSpecified = true; } return(accountInfo); }
/// <summary> /// A <b>Sale</b> transaction is used to process transactions using bank account information as the payment method. /// The transaction service can be used to perform a Sale or Return transaction by indicating the Check Action. /// <br></br><br></br> /// <b>NOTE:</b> The Portico Gateway supports both GETI and HPS Colonnade for processing check transactions. While /// the available services are the same regardless of the check processor, the services may have different behaviors. /// For example, GETI-processed Check Sale transactions support the ability to override a Check Sale transaction /// already presented as well as the ability to verify a check. /// </summary> /// <param name="action">Type of Check Action (Sale, Return, Override).</param> /// <param name="check">The Check information.</param> /// <param name="amount">The amount of the sale.</param> /// <returns>The <see cref="HpsCheckResponse"/>.</returns> public HpsCheckResponse Sale(checkActionType action, HpsCheck check, decimal amount) { HpsInputValidation.CheckAmount(amount); /* Build the transaction request. */ var transaction = new PosRequestVer10Transaction { Item = new PosCheckSaleReqType { Block1 = new CheckSaleReqBlock1Type { Amt = amount, AccountInfo = new AccountInfoType { AccountNumber = check.AccountNumber, CheckNumber = check.CheckNumber, MICRData = check.MicrNumber, RoutingNumber = check.RoutingNumber }, AmtSpecified = true, CheckAction = action, SECCode = check.SecCode, VerifyInfo = new VerifyInfoType { CheckVerify = check.CheckVerify ? booleanType.Y : booleanType.N, CheckVerifySpecified = true, ACHVerify = check.AchVerify ? booleanType.Y : booleanType.N, ACHVerifySpecified = true } } }, ItemElementName = ItemChoiceType1.CheckSale }; var block1 = ((PosCheckSaleReqType)transaction.Item).Block1; if (check.AccountType.HasValue) { block1.AccountInfo.AccountType = check.AccountType.Value; block1.AccountInfo.AccountTypeSpecified = true; } else { block1.AccountInfo.AccountTypeSpecified = false; } if (check.CheckType.HasValue) { block1.CheckType = check.CheckType.Value; block1.CheckTypeSpecified = true; } else { block1.CheckTypeSpecified = false; } if (check.DataEntryMode.HasValue) { block1.DataEntryMode = check.DataEntryMode.Value; block1.DataEntryModeSpecified = true; } else { block1.DataEntryModeSpecified = false; } if (check.CheckHolder != null) { block1.ConsumerInfo = new ConsumerInfoType { Address1 = check.CheckHolder.Address != null ? check.CheckHolder.Address.Address : null, CheckName = check.CheckHolder.CheckName, City = check.CheckHolder.Address != null ? check.CheckHolder.Address.City : null, CourtesyCard = check.CheckHolder.CourtesyCard, DLNumber = check.CheckHolder.DlNumber, DLState = check.CheckHolder.DlState, EmailAddress = check.CheckHolder.Email, FirstName = check.CheckHolder.FirstName, LastName = check.CheckHolder.LastName, PhoneNumber = check.CheckHolder.Phone, State = check.CheckHolder.Address != null ? check.CheckHolder.Address.State : null, Zip = check.CheckHolder.Address != null ? check.CheckHolder.Address.Zip : null, IdentityInfo = new IdentityInfoType { DOBYear = check.CheckHolder.DobYear != null?check.CheckHolder.DobYear.ToString() : null, SSNL4 = check.CheckHolder.Ssl4 != null ? check.CheckHolder.Ssl4 : null } }; } /* Submit the transaction. */ var rsp = DoTransaction(transaction).Ver10; HpsGatewayResponseValidation.CheckResponse(rsp, ItemChoiceType2.CheckSale); var saleRsp = (PosCheckSaleRspType)rsp.Transaction.Item; if (saleRsp.RspCode != 0) { throw new HpsCheckException(rsp.Header.GatewayTxnId, GetResponseDetails(saleRsp.CheckRspInfo), saleRsp.RspCode, saleRsp.RspMessage); } /* Start to fill out a new transaction response (HpsCheckResponse). */ var response = new HpsCheckResponse { Header = HydrateTransactionHeader(rsp.Header), TransactionId = rsp.Header.GatewayTxnId, AuthorizationCode = saleRsp.AuthCode, ResponseCode = saleRsp.RspCode.ToString(CultureInfo.InvariantCulture), ResponseText = saleRsp.RspMessage, Details = GetResponseDetails(saleRsp.CheckRspInfo) }; return(response); }
public CheckSaleBuilder WithCheck(HpsCheck check) { this.check = check; return(this); }