package com.braintreegateway;
import com.braintreegateway.util.EnumUtils;
import com.braintreegateway.util.NodeWrapper;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
public class Transaction {
public boolean isDisbursed() {
return getDisbursementDetails().isValid();
}
public enum CreatedUsing {
FULL_INFORMATION("full_information"),
TOKEN("token"),
UNRECOGNIZED("unrecognized");
private final String name;
CreatedUsing(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public enum EscrowStatus {
HELD,
HOLD_PENDING,
RELEASE_PENDING,
RELEASED,
REFUNDED,
UNRECOGNIZED;
}
public enum GatewayRejectionReason {
APPLICATION_INCOMPLETE("application_incomplete"),
AVS("avs"),
AVS_AND_CVV("avs_and_cvv"),
CVV("cvv"),
DUPLICATE("duplicate"),
FRAUD("fraud"),
THREE_D_SECURE("three_d_secure"),
UNRECOGNIZED("unrecognized");
private final String name;
GatewayRejectionReason(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public enum Source {
API("api"),
CONTROL_PANEL("control_panel"),
RECURRING("recurring"),
UNRECOGNIZED("unrecognized");
private final String name;
Source(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public enum Status {
AUTHORIZATION_EXPIRED, AUTHORIZED, AUTHORIZING, FAILED, GATEWAY_REJECTED, PROCESSOR_DECLINED, SETTLED, SETTLEMENT_CONFIRMED, SETTLEMENT_DECLINED, SETTLEMENT_PENDING, SETTLING, SUBMITTED_FOR_SETTLEMENT, UNRECOGNIZED, VOIDED;
}
public enum IndustryType {
LODGING("lodging"),
TRAVEL_CRUISE("travel_cruise");
private final String name;
IndustryType(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public enum Type {
CREDIT("credit"),
SALE("sale"),
UNRECOGNIZED("unrecognized");
private final String name;
Type(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
private List<AddOn> addOns;
private BigDecimal amount;
private String avsErrorResponseCode;
private String avsPostalCodeResponseCode;
private String avsStreetAddressResponseCode;
private Address billingAddress;
private String channel;
private Calendar createdAt;
private CreditCard creditCard;
private String currencyIsoCode;
private Customer customer;
private Map<String, String> customFields;
private String cvvResponseCode;
private DisbursementDetails disbursementDetails;
private List<Dispute> disputes;
private Descriptor descriptor;
private List<Discount> discounts;
private EscrowStatus escrowStatus;
private GatewayRejectionReason gatewayRejectionReason;
private String id;
private String merchantAccountId;
private String orderId;
private PayPalDetails paypalDetails;
private ApplePayDetails applePayDetails;
private AndroidPayDetails androidPayDetails;
private AmexExpressCheckoutDetails amexExpressCheckoutDetails;
private VenmoAccountDetails venmoAccountDetails;
private UsBankAccountDetails usBankAccountDetails;
private IdealPaymentDetails idealPaymentDetails;
private VisaCheckoutCardDetails visaCheckoutCardDetails;
private MasterpassCardDetails masterpassCardDetails;
private String planId;
private String processorAuthorizationCode;
private String processorResponseCode;
private String processorResponseText;
private String processorSettlementResponseCode;
private String processorSettlementResponseText;
private String additionalProcessorResponse;
private String voiceReferralNumber;
private String purchaseOrderNumber;
private Boolean recurring;
private String refundedTransactionId;
private String refundId;
private List<String> refundIds;
private String settlementBatchId;
private Address shippingAddress;
private Status status;
private List<StatusEvent> statusHistory;
private String subscriptionId;
private Subscription subscription;
private BigDecimal taxAmount;
private Boolean taxExempt;
private Type type;
private Calendar updatedAt;
private BigDecimal serviceFeeAmount;
private String paymentInstrumentType;
private RiskData riskData;
private ThreeDSecureInfo threeDSecureInfo;
private CoinbaseDetails coinbaseDetails;
private String authorizedTransactionId;
private List<String> partialSettlementTransactionIds;
public Transaction(NodeWrapper node) {
amount = node.findBigDecimal("amount");
avsErrorResponseCode = node.findString("avs-error-response-code");
avsPostalCodeResponseCode = node.findString("avs-postal-code-response-code");
avsStreetAddressResponseCode = node.findString("avs-street-address-response-code");
billingAddress = new Address(node.findFirst("billing"));
channel = node.findString("channel");
createdAt = node.findDateTime("created-at");
creditCard = new CreditCard(node.findFirst("credit-card"));
currencyIsoCode = node.findString("currency-iso-code");
customFields = node.findMap("custom-fields/*");
customer = new Customer(node.findFirst("customer"));
cvvResponseCode = node.findString("cvv-response-code");
disbursementDetails = new DisbursementDetails(node.findFirst("disbursement-details"));
descriptor = new Descriptor(node.findFirst("descriptor"));
escrowStatus = EnumUtils.findByName(EscrowStatus.class, node.findString("escrow-status"), EscrowStatus.UNRECOGNIZED);
gatewayRejectionReason = EnumUtils.findByName(GatewayRejectionReason.class, node.findString("gateway-rejection-reason"), GatewayRejectionReason.UNRECOGNIZED);
id = node.findString("id");
merchantAccountId = node.findString("merchant-account-id");
orderId = node.findString("order-id");
NodeWrapper paypalNode = node.findFirst("paypal");
if (paypalNode != null) {
paypalDetails = new PayPalDetails(paypalNode);
}
NodeWrapper applePayNode = node.findFirst("apple-pay");
if (applePayNode != null) {
applePayDetails = new ApplePayDetails(applePayNode);
}
NodeWrapper androidPayCardNode = node.findFirst("android-pay-card");
if (androidPayCardNode != null) {
androidPayDetails = new AndroidPayDetails(androidPayCardNode);
}
NodeWrapper amexExpressCheckoutCardNode = node.findFirst("amex-express-checkout-card");
if (amexExpressCheckoutCardNode != null) {
amexExpressCheckoutDetails = new AmexExpressCheckoutDetails(amexExpressCheckoutCardNode);
}
NodeWrapper coinbaseNode = node.findFirst("coinbase-account");
if (coinbaseNode != null) {
coinbaseDetails = new CoinbaseDetails(coinbaseNode);
}
NodeWrapper venmoAccountNode = node.findFirst("venmo-account");
if (venmoAccountNode != null) {
venmoAccountDetails = new VenmoAccountDetails(venmoAccountNode);
}
NodeWrapper usBankAccountNode = node.findFirst("us-bank-account");
if (usBankAccountNode != null) {
usBankAccountDetails = new UsBankAccountDetails(usBankAccountNode);
}
NodeWrapper idealPaymentNode = node.findFirst("ideal-payment");
if (idealPaymentNode != null) {
idealPaymentDetails = new IdealPaymentDetails(idealPaymentNode);
}
NodeWrapper visaCheckoutCardNode = node.findFirst("visa-checkout-card");
if (visaCheckoutCardNode != null) {
visaCheckoutCardDetails = new VisaCheckoutCardDetails(visaCheckoutCardNode);
}
NodeWrapper masterpassCardNode = node.findFirst("masterpass-card");
if (masterpassCardNode != null) {
masterpassCardDetails = new MasterpassCardDetails(masterpassCardNode);
}
planId = node.findString("plan-id");
processorAuthorizationCode = node.findString("processor-authorization-code");
processorResponseCode = node.findString("processor-response-code");
processorResponseText = node.findString("processor-response-text");
processorSettlementResponseCode = node.findString("processor-settlement-response-code");
processorSettlementResponseText = node.findString("processor-settlement-response-text");
additionalProcessorResponse = node.findString("additional-processor-response");
voiceReferralNumber = node.findString("voice-referral-number");
purchaseOrderNumber = node.findString("purchase-order-number");
recurring = node.findBoolean("recurring");
refundedTransactionId = node.findString("refunded-transaction-id");
refundId = node.findString("refund-id");
NodeWrapper riskDataNode = node.findFirst("risk-data");
if (riskDataNode != null) {
riskData = new RiskData(riskDataNode);
}
NodeWrapper threeDSecureInfoNode = node.findFirst("three-d-secure-info");
if (threeDSecureInfoNode != null && !threeDSecureInfoNode.isBlank()) {
threeDSecureInfo = new ThreeDSecureInfo(threeDSecureInfoNode);
}
serviceFeeAmount = node.findBigDecimal("service-fee-amount");
settlementBatchId = node.findString("settlement-batch-id");
shippingAddress = new Address(node.findFirst("shipping"));
status = EnumUtils.findByName(Status.class, node.findString("status"), Status.UNRECOGNIZED);
subscription = new Subscription(node.findFirst("subscription"));
subscriptionId = node.findString("subscription-id");
taxAmount = node.findBigDecimal("tax-amount");
taxExempt = node.findBoolean("tax-exempt");
type = EnumUtils.findByName(Type.class, node.findString("type"), Type.UNRECOGNIZED);
updatedAt = node.findDateTime("updated-at");
refundIds = new ArrayList<String>();
for (NodeWrapper refundIdNode : node.findAll("refund-ids/item")) {
refundIds.add(refundIdNode.findString("."));
}
statusHistory = new ArrayList<StatusEvent>();
for (NodeWrapper statusNode : node.findAll("status-history/status-event")) {
statusHistory.add(new StatusEvent(statusNode));
}
addOns = new ArrayList<AddOn>();
for (NodeWrapper addOnResponse : node.findAll("add-ons/add-on")) {
addOns.add(new AddOn(addOnResponse));
}
discounts = new ArrayList<Discount>();
for (NodeWrapper discountResponse : node.findAll("discounts/discount")) {
discounts.add(new Discount(discountResponse));
}
disputes = new ArrayList<Dispute>();
for (NodeWrapper dispute : node.findAll("disputes/dispute")) {
disputes.add(new Dispute(dispute));
}
paymentInstrumentType = node.findString("payment-instrument-type");
authorizedTransactionId = node.findString("authorized-transaction-id");
partialSettlementTransactionIds = new ArrayList<String>();
for (NodeWrapper partialSettlementTransactionIdNode : node.findAll("partial-settlement-transaction-ids/*")) {
partialSettlementTransactionIds.add(partialSettlementTransactionIdNode.findString("."));
}
}
public List<AddOn> getAddOns() {
return addOns;
}
public BigDecimal getAmount() {
return amount;
}
public String getAvsErrorResponseCode() {
return avsErrorResponseCode;
}
public String getAvsPostalCodeResponseCode() {
return avsPostalCodeResponseCode;
}
public String getAvsStreetAddressResponseCode() {
return avsStreetAddressResponseCode;
}
public Address getBillingAddress() {
return billingAddress;
}
public String getChannel() {
return channel;
}
public Calendar getCreatedAt() {
return createdAt;
}
public CreditCard getCreditCard() {
return creditCard;
}
public String getCurrencyIsoCode() {
return currencyIsoCode;
}
public Customer getCustomer() {
return customer;
}
public Map<String, String> getCustomFields() {
return customFields;
}
public String getCvvResponseCode() {
return cvvResponseCode;
}
public DisbursementDetails getDisbursementDetails() {
return disbursementDetails;
}
public List<Dispute> getDisputes() {
return disputes;
}
public Descriptor getDescriptor() {
return descriptor;
}
public List<Discount> getDiscounts() {
return discounts;
}
public EscrowStatus getEscrowStatus() {
return escrowStatus;
}
public GatewayRejectionReason getGatewayRejectionReason() {
return gatewayRejectionReason;
}
public String getId() {
return id;
}
public String getMerchantAccountId() {
return merchantAccountId;
}
public String getOrderId() {
return orderId;
}
public PayPalDetails getPayPalDetails() {
return paypalDetails;
}
public ApplePayDetails getApplePayDetails() {
return applePayDetails;
}
public AndroidPayDetails getAndroidPayDetails() {
return androidPayDetails;
}
public AmexExpressCheckoutDetails getAmexExpressCheckoutDetails() {
return amexExpressCheckoutDetails;
}
public CoinbaseDetails getCoinbaseDetails() {
return coinbaseDetails;
}
public VenmoAccountDetails getVenmoAccountDetails() {
return venmoAccountDetails;
}
public UsBankAccountDetails getUsBankAccountDetails() {
return usBankAccountDetails;
}
public IdealPaymentDetails getIdealPaymentDetails() {
return idealPaymentDetails;
}
public VisaCheckoutCardDetails getVisaCheckoutCardDetails() {
return visaCheckoutCardDetails;
}
public MasterpassCardDetails getMasterpassCardDetails() {
return masterpassCardDetails;
}
public String getPlanId() {
return planId;
}
public String getProcessorAuthorizationCode() {
return processorAuthorizationCode;
}
public String getProcessorResponseCode() {
return processorResponseCode;
}
public String getProcessorResponseText() {
return processorResponseText;
}
public String getProcessorSettlementResponseCode() {
return processorSettlementResponseCode;
}
public String getProcessorSettlementResponseText() {
return processorSettlementResponseText;
}
public String getAdditionalProcessorResponse() {
return additionalProcessorResponse;
}
public String getVoiceReferralNumber() {
return voiceReferralNumber;
}
public String getPurchaseOrderNumber() {
return purchaseOrderNumber;
}
public String getRefundedTransactionId() {
return refundedTransactionId;
}
/**
* Please use Transaction.getRefundIds() instead
*/
@Deprecated
public String getRefundId() {
return refundId;
}
public List<String> getRefundIds() {
return refundIds;
}
public RiskData getRiskData() {
return riskData;
}
public ThreeDSecureInfo getThreeDSecureInfo() {
return threeDSecureInfo;
}
public BigDecimal getServiceFeeAmount() {
return serviceFeeAmount;
}
public String getSettlementBatchId() {
return settlementBatchId;
}
public Address getShippingAddress() {
return shippingAddress;
}
public Status getStatus() {
return status;
}
public List<StatusEvent> getStatusHistory() {
return statusHistory;
}
public String getSubscriptionId() {
return subscriptionId;
}
public Subscription getSubscription() {
return subscription;
}
public BigDecimal getTaxAmount() {
return taxAmount;
}
public Type getType() {
return type;
}
public Boolean getRecurring() {
return recurring;
}
public Calendar getUpdatedAt() {
return updatedAt;
}
public Address getVaultBillingAddress(BraintreeGateway gateway) {
if (billingAddress.getId() == null) {
return null;
}
return gateway.address().find(customer.getId(), billingAddress.getId());
}
public CreditCard getVaultCreditCard(BraintreeGateway gateway) {
if (creditCard.getToken() == null) {
return null;
}
return gateway.creditCard().find(creditCard.getToken());
}
public Customer getVaultCustomer(BraintreeGateway gateway) {
if (customer.getId() == null) {
return null;
}
return gateway.customer().find(customer.getId());
}
public Address getVaultShippingAddress(BraintreeGateway gateway) {
if (shippingAddress.getId() == null) {
return null;
}
return gateway.address().find(customer.getId(), shippingAddress.getId());
}
public Boolean isTaxExempt() {
return taxExempt;
}
public String getPaymentInstrumentType() {
return paymentInstrumentType;
}
public String getAuthorizedTransactionId() {
return authorizedTransactionId;
}
public List<String> getPartialSettlementTransactionIds() {
return partialSettlementTransactionIds;
}
}