content: /*
   * Transfers API
   *
   * The version of the OpenAPI document: 4
   *
   *
   * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
   * https://openapi-generator.tech
   * Do not edit the class manually.
   */
  
  package com.adyen.model.transfers;
  
  import com.fasterxml.jackson.annotation.JsonCreator;
  import com.fasterxml.jackson.annotation.JsonInclude;
  import com.fasterxml.jackson.annotation.JsonProperty;
  import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  import com.fasterxml.jackson.annotation.JsonValue;
  import com.fasterxml.jackson.core.JsonProcessingException;
  import java.time.OffsetDateTime;
  import java.util.*;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  import java.util.logging.Logger;
  
  /** TransferData */
  @JsonPropertyOrder({
    TransferData.JSON_PROPERTY_ACCOUNT_HOLDER,
    TransferData.JSON_PROPERTY_AMOUNT,
    TransferData.JSON_PROPERTY_BALANCE_ACCOUNT,
    TransferData.JSON_PROPERTY_BALANCE_PLATFORM,
    TransferData.JSON_PROPERTY_BALANCES,
    TransferData.JSON_PROPERTY_CATEGORY,
    TransferData.JSON_PROPERTY_CATEGORY_DATA,
    TransferData.JSON_PROPERTY_COUNTERPARTY,
    TransferData.JSON_PROPERTY_CREATED_AT,
    TransferData.JSON_PROPERTY_CREATION_DATE,
    TransferData.JSON_PROPERTY_DESCRIPTION,
    TransferData.JSON_PROPERTY_DIRECT_DEBIT_INFORMATION,
    TransferData.JSON_PROPERTY_DIRECTION,
    TransferData.JSON_PROPERTY_EVENT_ID,
    TransferData.JSON_PROPERTY_EVENTS,
    TransferData.JSON_PROPERTY_EXECUTION_DATE,
    TransferData.JSON_PROPERTY_EXTERNAL_REASON,
    TransferData.JSON_PROPERTY_ID,
    TransferData.JSON_PROPERTY_PAYMENT_INSTRUMENT,
    TransferData.JSON_PROPERTY_REASON,
    TransferData.JSON_PROPERTY_REFERENCE,
    TransferData.JSON_PROPERTY_REFERENCE_FOR_BENEFICIARY,
    TransferData.JSON_PROPERTY_REVIEW,
    TransferData.JSON_PROPERTY_SEQUENCE_NUMBER,
    TransferData.JSON_PROPERTY_STATUS,
    TransferData.JSON_PROPERTY_TRACKING,
    TransferData.JSON_PROPERTY_TRANSACTION_RULES_RESULT,
    TransferData.JSON_PROPERTY_TYPE,
    TransferData.JSON_PROPERTY_UPDATED_AT
  })
  public class TransferData {
    public static final String JSON_PROPERTY_ACCOUNT_HOLDER = "accountHolder";
    private ResourceReference accountHolder;
  
    public static final String JSON_PROPERTY_AMOUNT = "amount";
    private Amount amount;
  
    public static final String JSON_PROPERTY_BALANCE_ACCOUNT = "balanceAccount";
    private ResourceReference balanceAccount;
  
    public static final String JSON_PROPERTY_BALANCE_PLATFORM = "balancePlatform";
    private String balancePlatform;
  
    public static final String JSON_PROPERTY_BALANCES = "balances";
    private List<BalanceMutation> balances;
  
    /**
     * The category of the transfer. Possible values: - **bank**: a transfer involving a [transfer
     * instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     * or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     * transfer between [balance
     * accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     * within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     * **platformPayment**: funds movements related to payments that are acquired for your users. -
     * **topUp**: an incoming transfer initiated by your user to top up their balance account.
     */
    public enum CategoryEnum {
      BANK(String.valueOf("bank")),
  
      CARD(String.valueOf("card")),
  
      INTERNAL(String.valueOf("internal")),
  
      ISSUEDCARD(String.valueOf("issuedCard")),
  
      PLATFORMPAYMENT(String.valueOf("platformPayment")),
  
      TOPUP(String.valueOf("topUp"));
  
      private static final Logger LOG = Logger.getLogger(CategoryEnum.class.getName());
  
      private String value;
  
      CategoryEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static CategoryEnum fromValue(String value) {
        for (CategoryEnum b : CategoryEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "CategoryEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(CategoryEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_CATEGORY = "category";
    private CategoryEnum category;
  
    public static final String JSON_PROPERTY_CATEGORY_DATA = "categoryData";
    private TransferCategoryData categoryData;
  
    public static final String JSON_PROPERTY_COUNTERPARTY = "counterparty";
    private TransferNotificationCounterParty counterparty;
  
    public static final String JSON_PROPERTY_CREATED_AT = "createdAt";
    private OffsetDateTime createdAt;
  
    public static final String JSON_PROPERTY_CREATION_DATE = "creationDate";
    @Deprecated // deprecated since Transfers API v3: Use createdAt or updatedAt
    private OffsetDateTime creationDate;
  
    public static final String JSON_PROPERTY_DESCRIPTION = "description";
    private String description;
  
    public static final String JSON_PROPERTY_DIRECT_DEBIT_INFORMATION = "directDebitInformation";
    private DirectDebitInformation directDebitInformation;
  
    /** The direction of the transfer. Possible values: **incoming**, **outgoing**. */
    public enum DirectionEnum {
      INCOMING(String.valueOf("incoming")),
  
      OUTGOING(String.valueOf("outgoing"));
  
      private static final Logger LOG = Logger.getLogger(DirectionEnum.class.getName());
  
      private String value;
  
      DirectionEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static DirectionEnum fromValue(String value) {
        for (DirectionEnum b : DirectionEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "DirectionEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(DirectionEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_DIRECTION = "direction";
    private DirectionEnum direction;
  
    public static final String JSON_PROPERTY_EVENT_ID = "eventId";
    private String eventId;
  
    public static final String JSON_PROPERTY_EVENTS = "events";
    private List<TransferEvent> events;
  
    public static final String JSON_PROPERTY_EXECUTION_DATE = "executionDate";
    private ExecutionDate executionDate;
  
    public static final String JSON_PROPERTY_EXTERNAL_REASON = "externalReason";
    private ExternalReason externalReason;
  
    public static final String JSON_PROPERTY_ID = "id";
    private String id;
  
    public static final String JSON_PROPERTY_PAYMENT_INSTRUMENT = "paymentInstrument";
    private PaymentInstrument paymentInstrument;
  
    /** Additional information about the status of the transfer. */
    public enum ReasonEnum {
      ACCOUNTHIERARCHYNOTACTIVE(String.valueOf("accountHierarchyNotActive")),
  
      AMOUNTLIMITEXCEEDED(String.valueOf("amountLimitExceeded")),
  
      APPROVALEXPIRED(String.valueOf("approvalExpired")),
  
      APPROVED(String.valueOf("approved")),
  
      BALANCEACCOUNTTEMPORARILYBLOCKEDBYTRANSACTIONRULE(
          String.valueOf("balanceAccountTemporarilyBlockedByTransactionRule")),
  
      COUNTERPARTYACCOUNTBLOCKED(String.valueOf("counterpartyAccountBlocked")),
  
      COUNTERPARTYACCOUNTCLOSED(String.valueOf("counterpartyAccountClosed")),
  
      COUNTERPARTYACCOUNTNOTFOUND(String.valueOf("counterpartyAccountNotFound")),
  
      COUNTERPARTYADDRESSREQUIRED(String.valueOf("counterpartyAddressRequired")),
  
      COUNTERPARTYBANKTIMEDOUT(String.valueOf("counterpartyBankTimedOut")),
  
      COUNTERPARTYBANKUNAVAILABLE(String.valueOf("counterpartyBankUnavailable")),
  
      DECLINED(String.valueOf("declined")),
  
      DECLINEDBYTRANSACTIONRULE(String.valueOf("declinedByTransactionRule")),
  
      DIRECTDEBITNOTSUPPORTED(String.valueOf("directDebitNotSupported")),
  
      ERROR(String.valueOf("error")),
  
      NOTENOUGHBALANCE(String.valueOf("notEnoughBalance")),
  
      PENDING(String.valueOf("pending")),
  
      PENDINGAPPROVAL(String.valueOf("pendingApproval")),
  
      PENDINGEXECUTION(String.valueOf("pendingExecution")),
  
      REFUSEDBYCOUNTERPARTYBANK(String.valueOf("refusedByCounterpartyBank")),
  
      REFUSEDBYCUSTOMER(String.valueOf("refusedByCustomer")),
  
      ROUTENOTFOUND(String.valueOf("routeNotFound")),
  
      SCAFAILED(String.valueOf("scaFailed")),
  
      TRANSFERINSTRUMENTDOESNOTEXIST(String.valueOf("transferInstrumentDoesNotExist")),
  
      UNKNOWN(String.valueOf("unknown"));
  
      private static final Logger LOG = Logger.getLogger(ReasonEnum.class.getName());
  
      private String value;
  
      ReasonEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static ReasonEnum fromValue(String value) {
        for (ReasonEnum b : ReasonEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "ReasonEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(ReasonEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_REASON = "reason";
    private ReasonEnum reason;
  
    public static final String JSON_PROPERTY_REFERENCE = "reference";
    private String reference;
  
    public static final String JSON_PROPERTY_REFERENCE_FOR_BENEFICIARY = "referenceForBeneficiary";
    private String referenceForBeneficiary;
  
    public static final String JSON_PROPERTY_REVIEW = "review";
    private TransferReview review;
  
    public static final String JSON_PROPERTY_SEQUENCE_NUMBER = "sequenceNumber";
    private Integer sequenceNumber;
  
    /**
     * The result of the transfer. For example: - **received**: an outgoing transfer request is
     * created. - **authorised**: the transfer request is authorized and the funds are reserved. -
     * **booked**: the funds are deducted from your user&#39;s balance account. - **failed**: the
     * transfer is rejected by the counterparty&#39;s bank. - **returned**: the transfer is returned
     * by the counterparty&#39;s bank.
     */
    public enum StatusEnum {
      APPROVALPENDING(String.valueOf("approvalPending")),
  
      ATMWITHDRAWAL(String.valueOf("atmWithdrawal")),
  
      ATMWITHDRAWALREVERSALPENDING(String.valueOf("atmWithdrawalReversalPending")),
  
      ATMWITHDRAWALREVERSED(String.valueOf("atmWithdrawalReversed")),
  
      AUTHADJUSTMENTAUTHORISED(String.valueOf("authAdjustmentAuthorised")),
  
      AUTHADJUSTMENTERROR(String.valueOf("authAdjustmentError")),
  
      AUTHADJUSTMENTREFUSED(String.valueOf("authAdjustmentRefused")),
  
      AUTHORISED(String.valueOf("authorised")),
  
      BANKTRANSFER(String.valueOf("bankTransfer")),
  
      BANKTRANSFERPENDING(String.valueOf("bankTransferPending")),
  
      BOOKED(String.valueOf("booked")),
  
      BOOKINGPENDING(String.valueOf("bookingPending")),
  
      CANCELLED(String.valueOf("cancelled")),
  
      CAPTUREPENDING(String.valueOf("capturePending")),
  
      CAPTUREREVERSALPENDING(String.valueOf("captureReversalPending")),
  
      CAPTUREREVERSED(String.valueOf("captureReversed")),
  
      CAPTURED(String.valueOf("captured")),
  
      CAPTUREDEXTERNALLY(String.valueOf("capturedExternally")),
  
      CHARGEBACK(String.valueOf("chargeback")),
  
      CHARGEBACKEXTERNALLY(String.valueOf("chargebackExternally")),
  
      CHARGEBACKPENDING(String.valueOf("chargebackPending")),
  
      CHARGEBACKREVERSALPENDING(String.valueOf("chargebackReversalPending")),
  
      CHARGEBACKREVERSED(String.valueOf("chargebackReversed")),
  
      CREDITED(String.valueOf("credited")),
  
      DEPOSITCORRECTION(String.valueOf("depositCorrection")),
  
      DEPOSITCORRECTIONPENDING(String.valueOf("depositCorrectionPending")),
  
      DISPUTE(String.valueOf("dispute")),
  
      DISPUTECLOSED(String.valueOf("disputeClosed")),
  
      DISPUTEEXPIRED(String.valueOf("disputeExpired")),
  
      DISPUTENEEDSREVIEW(String.valueOf("disputeNeedsReview")),
  
      ERROR(String.valueOf("error")),
  
      EXPIRED(String.valueOf("expired")),
  
      FAILED(String.valueOf("failed")),
  
      FEE(String.valueOf("fee")),
  
      FEEPENDING(String.valueOf("feePending")),
  
      INTERNALTRANSFER(String.valueOf("internalTransfer")),
  
      INTERNALTRANSFERPENDING(String.valueOf("internalTransferPending")),
  
      INVOICEDEDUCTION(String.valueOf("invoiceDeduction")),
  
      INVOICEDEDUCTIONPENDING(String.valueOf("invoiceDeductionPending")),
  
      MANUALCORRECTIONPENDING(String.valueOf("manualCorrectionPending")),
  
      MANUALLYCORRECTED(String.valueOf("manuallyCorrected")),
  
      MATCHEDSTATEMENT(String.valueOf("matchedStatement")),
  
      MATCHEDSTATEMENTPENDING(String.valueOf("matchedStatementPending")),
  
      MERCHANTPAYIN(String.valueOf("merchantPayin")),
  
      MERCHANTPAYINPENDING(String.valueOf("merchantPayinPending")),
  
      MERCHANTPAYINREVERSED(String.valueOf("merchantPayinReversed")),
  
      MERCHANTPAYINREVERSEDPENDING(String.valueOf("merchantPayinReversedPending")),
  
      MISCCOST(String.valueOf("miscCost")),
  
      MISCCOSTPENDING(String.valueOf("miscCostPending")),
  
      PAYMENTCOST(String.valueOf("paymentCost")),
  
      PAYMENTCOSTPENDING(String.valueOf("paymentCostPending")),
  
      PENDINGAPPROVAL(String.valueOf("pendingApproval")),
  
      PENDINGEXECUTION(String.valueOf("pendingExecution")),
  
      RECEIVED(String.valueOf("received")),
  
      REFUNDPENDING(String.valueOf("refundPending")),
  
      REFUNDREVERSALPENDING(String.valueOf("refundReversalPending")),
  
      REFUNDREVERSED(String.valueOf("refundReversed")),
  
      REFUNDED(String.valueOf("refunded")),
  
      REFUNDEDEXTERNALLY(String.valueOf("refundedExternally")),
  
      REFUSED(String.valueOf("refused")),
  
      REJECTED(String.valueOf("rejected")),
  
      RESERVEADJUSTMENT(String.valueOf("reserveAdjustment")),
  
      RESERVEADJUSTMENTPENDING(String.valueOf("reserveAdjustmentPending")),
  
      RETURNED(String.valueOf("returned")),
  
      SECONDCHARGEBACK(String.valueOf("secondChargeback")),
  
      SECONDCHARGEBACKPENDING(String.valueOf("secondChargebackPending")),
  
      UNDEFINED(String.valueOf("undefined"));
  
      private static final Logger LOG = Logger.getLogger(StatusEnum.class.getName());
  
      private String value;
  
      StatusEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static StatusEnum fromValue(String value) {
        for (StatusEnum b : StatusEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "StatusEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(StatusEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_STATUS = "status";
    private StatusEnum status;
  
    public static final String JSON_PROPERTY_TRACKING = "tracking";
    private TransferDataTracking tracking;
  
    public static final String JSON_PROPERTY_TRANSACTION_RULES_RESULT = "transactionRulesResult";
    private TransactionRulesResult transactionRulesResult;
  
    /**
     * The type of transfer or transaction. For example, **refund**, **payment**,
     * **internalTransfer**, **bankTransfer**.
     */
    public enum TypeEnum {
      PAYMENT(String.valueOf("payment")),
  
      CAPTURE(String.valueOf("capture")),
  
      CAPTUREREVERSAL(String.valueOf("captureReversal")),
  
      REFUND(String.valueOf("refund")),
  
      REFUNDREVERSAL(String.valueOf("refundReversal")),
  
      CHARGEBACK(String.valueOf("chargeback")),
  
      CHARGEBACKCORRECTION(String.valueOf("chargebackCorrection")),
  
      CHARGEBACKREVERSAL(String.valueOf("chargebackReversal")),
  
      CHARGEBACKREVERSALCORRECTION(String.valueOf("chargebackReversalCorrection")),
  
      SECONDCHARGEBACK(String.valueOf("secondChargeback")),
  
      SECONDCHARGEBACKCORRECTION(String.valueOf("secondChargebackCorrection")),
  
      ATMWITHDRAWAL(String.valueOf("atmWithdrawal")),
  
      ATMWITHDRAWALREVERSAL(String.valueOf("atmWithdrawalReversal")),
  
      INTERNALTRANSFER(String.valueOf("internalTransfer")),
  
      INTERNALDIRECTDEBIT(String.valueOf("internalDirectDebit")),
  
      MANUALCORRECTION(String.valueOf("manualCorrection")),
  
      INVOICEDEDUCTION(String.valueOf("invoiceDeduction")),
  
      DEPOSITCORRECTION(String.valueOf("depositCorrection")),
  
      RESERVEADJUSTMENT(String.valueOf("reserveAdjustment")),
  
      BANKTRANSFER(String.valueOf("bankTransfer")),
  
      BANKDIRECTDEBIT(String.valueOf("bankDirectDebit")),
  
      CARDTRANSFER(String.valueOf("cardTransfer")),
  
      MISCCOST(String.valueOf("miscCost")),
  
      PAYMENTCOST(String.valueOf("paymentCost")),
  
      FEE(String.valueOf("fee")),
  
      LEFTOVER(String.valueOf("leftover")),
  
      GRANT(String.valueOf("grant")),
  
      CAPITALFUNDSCOLLECTION(String.valueOf("capitalFundsCollection")),
  
      CASHOUTINSTRUCTION(String.valueOf("cashOutInstruction")),
  
      CASHOUTFEE(String.valueOf("cashoutFee")),
  
      CASHOUTREPAYMENT(String.valueOf("cashoutRepayment")),
  
      CASHOUTFUNDING(String.valueOf("cashoutFunding")),
  
      REPAYMENT(String.valueOf("repayment")),
  
      INSTALLMENT(String.valueOf("installment")),
  
      INSTALLMENTREVERSAL(String.valueOf("installmentReversal")),
  
      BALANCEADJUSTMENT(String.valueOf("balanceAdjustment")),
  
      BALANCEROLLOVER(String.valueOf("balanceRollover")),
  
      BALANCEMIGRATION(String.valueOf("balanceMigration"));
  
      private static final Logger LOG = Logger.getLogger(TypeEnum.class.getName());
  
      private String value;
  
      TypeEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static TypeEnum fromValue(String value) {
        for (TypeEnum b : TypeEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "TypeEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(TypeEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_TYPE = "type";
    private TypeEnum type;
  
    public static final String JSON_PROPERTY_UPDATED_AT = "updatedAt";
    private OffsetDateTime updatedAt;
  
    public TransferData() {}
  
    /**
     * accountHolder
     *
     * @param accountHolder
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData accountHolder(ResourceReference accountHolder) {
      this.accountHolder = accountHolder;
      return this;
    }
  
    /**
     * Get accountHolder
     *
     * @return accountHolder
     */
    @JsonProperty(JSON_PROPERTY_ACCOUNT_HOLDER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ResourceReference getAccountHolder() {
      return accountHolder;
    }
  
    /**
     * accountHolder
     *
     * @param accountHolder
     */
    @JsonProperty(JSON_PROPERTY_ACCOUNT_HOLDER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setAccountHolder(ResourceReference accountHolder) {
      this.accountHolder = accountHolder;
    }
  
    /**
     * amount
     *
     * @param amount
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData amount(Amount amount) {
      this.amount = amount;
      return this;
    }
  
    /**
     * Get amount
     *
     * @return amount
     */
    @JsonProperty(JSON_PROPERTY_AMOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Amount getAmount() {
      return amount;
    }
  
    /**
     * amount
     *
     * @param amount
     */
    @JsonProperty(JSON_PROPERTY_AMOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setAmount(Amount amount) {
      this.amount = amount;
    }
  
    /**
     * balanceAccount
     *
     * @param balanceAccount
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData balanceAccount(ResourceReference balanceAccount) {
      this.balanceAccount = balanceAccount;
      return this;
    }
  
    /**
     * Get balanceAccount
     *
     * @return balanceAccount
     */
    @JsonProperty(JSON_PROPERTY_BALANCE_ACCOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ResourceReference getBalanceAccount() {
      return balanceAccount;
    }
  
    /**
     * balanceAccount
     *
     * @param balanceAccount
     */
    @JsonProperty(JSON_PROPERTY_BALANCE_ACCOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setBalanceAccount(ResourceReference balanceAccount) {
      this.balanceAccount = balanceAccount;
    }
  
    /**
     * The unique identifier of the balance platform.
     *
     * @param balancePlatform The unique identifier of the balance platform.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData balancePlatform(String balancePlatform) {
      this.balancePlatform = balancePlatform;
      return this;
    }
  
    /**
     * The unique identifier of the balance platform.
     *
     * @return balancePlatform The unique identifier of the balance platform.
     */
    @JsonProperty(JSON_PROPERTY_BALANCE_PLATFORM)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getBalancePlatform() {
      return balancePlatform;
    }
  
    /**
     * The unique identifier of the balance platform.
     *
     * @param balancePlatform The unique identifier of the balance platform.
     */
    @JsonProperty(JSON_PROPERTY_BALANCE_PLATFORM)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setBalancePlatform(String balancePlatform) {
      this.balancePlatform = balancePlatform;
    }
  
    /**
     * The list of the latest balance statuses in the transfer.
     *
     * @param balances The list of the latest balance statuses in the transfer.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData balances(List<BalanceMutation> balances) {
      this.balances = balances;
      return this;
    }
  
    public TransferData addBalancesItem(BalanceMutation balancesItem) {
      if (this.balances == null) {
        this.balances = new ArrayList<>();
      }
      this.balances.add(balancesItem);
      return this;
    }
  
    /**
     * The list of the latest balance statuses in the transfer.
     *
     * @return balances The list of the latest balance statuses in the transfer.
     */
    @JsonProperty(JSON_PROPERTY_BALANCES)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<BalanceMutation> getBalances() {
      return balances;
    }
  
    /**
     * The list of the latest balance statuses in the transfer.
     *
     * @param balances The list of the latest balance statuses in the transfer.
     */
    @JsonProperty(JSON_PROPERTY_BALANCES)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setBalances(List<BalanceMutation> balances) {
      this.balances = balances;
    }
  
    /**
     * The category of the transfer. Possible values: - **bank**: a transfer involving a [transfer
     * instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     * or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     * transfer between [balance
     * accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     * within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     * **platformPayment**: funds movements related to payments that are acquired for your users. -
     * **topUp**: an incoming transfer initiated by your user to top up their balance account.
     *
     * @param category The category of the transfer. Possible values: - **bank**: a transfer involving
     *     a [transfer
     *     instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     *     or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     *     transfer between [balance
     *     accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     *     within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     *     **platformPayment**: funds movements related to payments that are acquired for your users.
     *     - **topUp**: an incoming transfer initiated by your user to top up their balance account.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData category(CategoryEnum category) {
      this.category = category;
      return this;
    }
  
    /**
     * The category of the transfer. Possible values: - **bank**: a transfer involving a [transfer
     * instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     * or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     * transfer between [balance
     * accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     * within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     * **platformPayment**: funds movements related to payments that are acquired for your users. -
     * **topUp**: an incoming transfer initiated by your user to top up their balance account.
     *
     * @return category The category of the transfer. Possible values: - **bank**: a transfer
     *     involving a [transfer
     *     instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     *     or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     *     transfer between [balance
     *     accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     *     within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     *     **platformPayment**: funds movements related to payments that are acquired for your users.
     *     - **topUp**: an incoming transfer initiated by your user to top up their balance account.
     */
    @JsonProperty(JSON_PROPERTY_CATEGORY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public CategoryEnum getCategory() {
      return category;
    }
  
    /**
     * The category of the transfer. Possible values: - **bank**: a transfer involving a [transfer
     * instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     * or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     * transfer between [balance
     * accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     * within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     * **platformPayment**: funds movements related to payments that are acquired for your users. -
     * **topUp**: an incoming transfer initiated by your user to top up their balance account.
     *
     * @param category The category of the transfer. Possible values: - **bank**: a transfer involving
     *     a [transfer
     *     instrument](https://docs.adyen.com/api-explorer/#/legalentity/latest/post/transferInstruments__resParam_id)
     *     or a bank account. - **card**: a transfer involving a third-party card. - **internal**: a
     *     transfer between [balance
     *     accounts](https://docs.adyen.com/api-explorer/#/balanceplatform/latest/post/balanceAccounts__resParam_id)
     *     within your platform. - **issuedCard**: a transfer initiated by an Adyen-issued card. -
     *     **platformPayment**: funds movements related to payments that are acquired for your users.
     *     - **topUp**: an incoming transfer initiated by your user to top up their balance account.
     */
    @JsonProperty(JSON_PROPERTY_CATEGORY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCategory(CategoryEnum category) {
      this.category = category;
    }
  
    /**
     * categoryData
     *
     * @param categoryData
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData categoryData(TransferCategoryData categoryData) {
      this.categoryData = categoryData;
      return this;
    }
  
    /**
     * Get categoryData
     *
     * @return categoryData
     */
    @JsonProperty(JSON_PROPERTY_CATEGORY_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TransferCategoryData getCategoryData() {
      return categoryData;
    }
  
    /**
     * categoryData
     *
     * @param categoryData
     */
    @JsonProperty(JSON_PROPERTY_CATEGORY_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCategoryData(TransferCategoryData categoryData) {
      this.categoryData = categoryData;
    }
  
    /**
     * counterparty
     *
     * @param counterparty
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData counterparty(TransferNotificationCounterParty counterparty) {
      this.counterparty = counterparty;
      return this;
    }
  
    /**
     * Get counterparty
     *
     * @return counterparty
     */
    @JsonProperty(JSON_PROPERTY_COUNTERPARTY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TransferNotificationCounterParty getCounterparty() {
      return counterparty;
    }
  
    /**
     * counterparty
     *
     * @param counterparty
     */
    @JsonProperty(JSON_PROPERTY_COUNTERPARTY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCounterparty(TransferNotificationCounterParty counterparty) {
      this.counterparty = counterparty;
    }
  
    /**
     * The date and time when the transfer was created, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param createdAt The date and time when the transfer was created, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData createdAt(OffsetDateTime createdAt) {
      this.createdAt = createdAt;
      return this;
    }
  
    /**
     * The date and time when the transfer was created, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @return createdAt The date and time when the transfer was created, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_CREATED_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public OffsetDateTime getCreatedAt() {
      return createdAt;
    }
  
    /**
     * The date and time when the transfer was created, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param createdAt The date and time when the transfer was created, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_CREATED_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCreatedAt(OffsetDateTime createdAt) {
      this.createdAt = createdAt;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param creationDate The date and time when the event was triggered, in ISO 8601 extended
     *     format. For example, **2020-12-18T10:15:30+01:00**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     * @deprecated since Transfers API v3 Use createdAt or updatedAt
     */
    @Deprecated // deprecated since Transfers API v3: Use createdAt or updatedAt
    public TransferData creationDate(OffsetDateTime creationDate) {
      this.creationDate = creationDate;
      return this;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @return creationDate The date and time when the event was triggered, in ISO 8601 extended
     *     format. For example, **2020-12-18T10:15:30+01:00**.
     * @deprecated // deprecated since Transfers API v3: Use createdAt or updatedAt
     */
    @Deprecated // deprecated since Transfers API v3: Use createdAt or updatedAt
    @JsonProperty(JSON_PROPERTY_CREATION_DATE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public OffsetDateTime getCreationDate() {
      return creationDate;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param creationDate The date and time when the event was triggered, in ISO 8601 extended
     *     format. For example, **2020-12-18T10:15:30+01:00**.
     * @deprecated since Transfers API v3 Use createdAt or updatedAt
     */
    @Deprecated // deprecated since Transfers API v3: Use createdAt or updatedAt
    @JsonProperty(JSON_PROPERTY_CREATION_DATE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCreationDate(OffsetDateTime creationDate) {
      this.creationDate = creationDate;
    }
  
    /**
     * Your description for the transfer. It is used by most banks as the transfer description. We
     * recommend sending a maximum of 140 characters, otherwise the description may be truncated.
     * Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; + Space** Supported
     * characters for **regular** and **fast** transfers to a US counterparty: **[a-z] [A-Z] [0-9]
     * &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     *
     * @param description Your description for the transfer. It is used by most banks as the transfer
     *     description. We recommend sending a maximum of 140 characters, otherwise the description
     *     may be truncated. Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; +
     *     Space** Supported characters for **regular** and **fast** transfers to a US counterparty:
     *     **[a-z] [A-Z] [0-9] &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData description(String description) {
      this.description = description;
      return this;
    }
  
    /**
     * Your description for the transfer. It is used by most banks as the transfer description. We
     * recommend sending a maximum of 140 characters, otherwise the description may be truncated.
     * Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; + Space** Supported
     * characters for **regular** and **fast** transfers to a US counterparty: **[a-z] [A-Z] [0-9]
     * &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     *
     * @return description Your description for the transfer. It is used by most banks as the transfer
     *     description. We recommend sending a maximum of 140 characters, otherwise the description
     *     may be truncated. Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; +
     *     Space** Supported characters for **regular** and **fast** transfers to a US counterparty:
     *     **[a-z] [A-Z] [0-9] &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     */
    @JsonProperty(JSON_PROPERTY_DESCRIPTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getDescription() {
      return description;
    }
  
    /**
     * Your description for the transfer. It is used by most banks as the transfer description. We
     * recommend sending a maximum of 140 characters, otherwise the description may be truncated.
     * Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; + Space** Supported
     * characters for **regular** and **fast** transfers to a US counterparty: **[a-z] [A-Z] [0-9]
     * &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     *
     * @param description Your description for the transfer. It is used by most banks as the transfer
     *     description. We recommend sending a maximum of 140 characters, otherwise the description
     *     may be truncated. Supported characters: **[a-z] [A-Z] [0-9] / - ?** **: ( ) . , &#39; +
     *     Space** Supported characters for **regular** and **fast** transfers to a US counterparty:
     *     **[a-z] [A-Z] [0-9] &amp; $ % # @** **~ &#x3D; + - _ &#39; \&quot; ! ?**
     */
    @JsonProperty(JSON_PROPERTY_DESCRIPTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDescription(String description) {
      this.description = description;
    }
  
    /**
     * directDebitInformation
     *
     * @param directDebitInformation
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData directDebitInformation(DirectDebitInformation directDebitInformation) {
      this.directDebitInformation = directDebitInformation;
      return this;
    }
  
    /**
     * Get directDebitInformation
     *
     * @return directDebitInformation
     */
    @JsonProperty(JSON_PROPERTY_DIRECT_DEBIT_INFORMATION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public DirectDebitInformation getDirectDebitInformation() {
      return directDebitInformation;
    }
  
    /**
     * directDebitInformation
     *
     * @param directDebitInformation
     */
    @JsonProperty(JSON_PROPERTY_DIRECT_DEBIT_INFORMATION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDirectDebitInformation(DirectDebitInformation directDebitInformation) {
      this.directDebitInformation = directDebitInformation;
    }
  
    /**
     * The direction of the transfer. Possible values: **incoming**, **outgoing**.
     *
     * @param direction The direction of the transfer. Possible values: **incoming**, **outgoing**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData direction(DirectionEnum direction) {
      this.direction = direction;
      return this;
    }
  
    /**
     * The direction of the transfer. Possible values: **incoming**, **outgoing**.
     *
     * @return direction The direction of the transfer. Possible values: **incoming**, **outgoing**.
     */
    @JsonProperty(JSON_PROPERTY_DIRECTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public DirectionEnum getDirection() {
      return direction;
    }
  
    /**
     * The direction of the transfer. Possible values: **incoming**, **outgoing**.
     *
     * @param direction The direction of the transfer. Possible values: **incoming**, **outgoing**.
     */
    @JsonProperty(JSON_PROPERTY_DIRECTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDirection(DirectionEnum direction) {
      this.direction = direction;
    }
  
    /**
     * The unique identifier of the latest transfer event. Included only when the &#x60;category&#x60;
     * is **issuedCard**.
     *
     * @param eventId The unique identifier of the latest transfer event. Included only when the
     *     &#x60;category&#x60; is **issuedCard**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData eventId(String eventId) {
      this.eventId = eventId;
      return this;
    }
  
    /**
     * The unique identifier of the latest transfer event. Included only when the &#x60;category&#x60;
     * is **issuedCard**.
     *
     * @return eventId The unique identifier of the latest transfer event. Included only when the
     *     &#x60;category&#x60; is **issuedCard**.
     */
    @JsonProperty(JSON_PROPERTY_EVENT_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getEventId() {
      return eventId;
    }
  
    /**
     * The unique identifier of the latest transfer event. Included only when the &#x60;category&#x60;
     * is **issuedCard**.
     *
     * @param eventId The unique identifier of the latest transfer event. Included only when the
     *     &#x60;category&#x60; is **issuedCard**.
     */
    @JsonProperty(JSON_PROPERTY_EVENT_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setEventId(String eventId) {
      this.eventId = eventId;
    }
  
    /**
     * The list of events leading up to the current status of the transfer.
     *
     * @param events The list of events leading up to the current status of the transfer.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData events(List<TransferEvent> events) {
      this.events = events;
      return this;
    }
  
    public TransferData addEventsItem(TransferEvent eventsItem) {
      if (this.events == null) {
        this.events = new ArrayList<>();
      }
      this.events.add(eventsItem);
      return this;
    }
  
    /**
     * The list of events leading up to the current status of the transfer.
     *
     * @return events The list of events leading up to the current status of the transfer.
     */
    @JsonProperty(JSON_PROPERTY_EVENTS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<TransferEvent> getEvents() {
      return events;
    }
  
    /**
     * The list of events leading up to the current status of the transfer.
     *
     * @param events The list of events leading up to the current status of the transfer.
     */
    @JsonProperty(JSON_PROPERTY_EVENTS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setEvents(List<TransferEvent> events) {
      this.events = events;
    }
  
    /**
     * executionDate
     *
     * @param executionDate
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData executionDate(ExecutionDate executionDate) {
      this.executionDate = executionDate;
      return this;
    }
  
    /**
     * Get executionDate
     *
     * @return executionDate
     */
    @JsonProperty(JSON_PROPERTY_EXECUTION_DATE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ExecutionDate getExecutionDate() {
      return executionDate;
    }
  
    /**
     * executionDate
     *
     * @param executionDate
     */
    @JsonProperty(JSON_PROPERTY_EXECUTION_DATE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setExecutionDate(ExecutionDate executionDate) {
      this.executionDate = executionDate;
    }
  
    /**
     * externalReason
     *
     * @param externalReason
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData externalReason(ExternalReason externalReason) {
      this.externalReason = externalReason;
      return this;
    }
  
    /**
     * Get externalReason
     *
     * @return externalReason
     */
    @JsonProperty(JSON_PROPERTY_EXTERNAL_REASON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ExternalReason getExternalReason() {
      return externalReason;
    }
  
    /**
     * externalReason
     *
     * @param externalReason
     */
    @JsonProperty(JSON_PROPERTY_EXTERNAL_REASON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setExternalReason(ExternalReason externalReason) {
      this.externalReason = externalReason;
    }
  
    /**
     * The ID of the resource.
     *
     * @param id The ID of the resource.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData id(String id) {
      this.id = id;
      return this;
    }
  
    /**
     * The ID of the resource.
     *
     * @return id The ID of the resource.
     */
    @JsonProperty(JSON_PROPERTY_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getId() {
      return id;
    }
  
    /**
     * The ID of the resource.
     *
     * @param id The ID of the resource.
     */
    @JsonProperty(JSON_PROPERTY_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setId(String id) {
      this.id = id;
    }
  
    /**
     * paymentInstrument
     *
     * @param paymentInstrument
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData paymentInstrument(PaymentInstrument paymentInstrument) {
      this.paymentInstrument = paymentInstrument;
      return this;
    }
  
    /**
     * Get paymentInstrument
     *
     * @return paymentInstrument
     */
    @JsonProperty(JSON_PROPERTY_PAYMENT_INSTRUMENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public PaymentInstrument getPaymentInstrument() {
      return paymentInstrument;
    }
  
    /**
     * paymentInstrument
     *
     * @param paymentInstrument
     */
    @JsonProperty(JSON_PROPERTY_PAYMENT_INSTRUMENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setPaymentInstrument(PaymentInstrument paymentInstrument) {
      this.paymentInstrument = paymentInstrument;
    }
  
    /**
     * Additional information about the status of the transfer.
     *
     * @param reason Additional information about the status of the transfer.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData reason(ReasonEnum reason) {
      this.reason = reason;
      return this;
    }
  
    /**
     * Additional information about the status of the transfer.
     *
     * @return reason Additional information about the status of the transfer.
     */
    @JsonProperty(JSON_PROPERTY_REASON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ReasonEnum getReason() {
      return reason;
    }
  
    /**
     * Additional information about the status of the transfer.
     *
     * @param reason Additional information about the status of the transfer.
     */
    @JsonProperty(JSON_PROPERTY_REASON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReason(ReasonEnum reason) {
      this.reason = reason;
    }
  
    /**
     * Your reference for the transfer, used internally within your platform. If you don&#39;t provide
     * this in the request, Adyen generates a unique reference.
     *
     * @param reference Your reference for the transfer, used internally within your platform. If you
     *     don&#39;t provide this in the request, Adyen generates a unique reference.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData reference(String reference) {
      this.reference = reference;
      return this;
    }
  
    /**
     * Your reference for the transfer, used internally within your platform. If you don&#39;t provide
     * this in the request, Adyen generates a unique reference.
     *
     * @return reference Your reference for the transfer, used internally within your platform. If you
     *     don&#39;t provide this in the request, Adyen generates a unique reference.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getReference() {
      return reference;
    }
  
    /**
     * Your reference for the transfer, used internally within your platform. If you don&#39;t provide
     * this in the request, Adyen generates a unique reference.
     *
     * @param reference Your reference for the transfer, used internally within your platform. If you
     *     don&#39;t provide this in the request, Adyen generates a unique reference.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReference(String reference) {
      this.reference = reference;
    }
  
    /**
     * A reference that is sent to the recipient. This reference is also sent in all webhooks related
     * to the transfer, so you can use it to track statuses for both the source and recipient of
     * funds. Supported characters: **a-z**, **A-Z**, **0-9**.The maximum length depends on the
     * &#x60;category&#x60;. - **internal**: 80 characters - **bank**: 35 characters when transferring
     * to an IBAN, 15 characters for others.
     *
     * @param referenceForBeneficiary A reference that is sent to the recipient. This reference is
     *     also sent in all webhooks related to the transfer, so you can use it to track statuses for
     *     both the source and recipient of funds. Supported characters: **a-z**, **A-Z**, **0-9**.The
     *     maximum length depends on the &#x60;category&#x60;. - **internal**: 80 characters -
     *     **bank**: 35 characters when transferring to an IBAN, 15 characters for others.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData referenceForBeneficiary(String referenceForBeneficiary) {
      this.referenceForBeneficiary = referenceForBeneficiary;
      return this;
    }
  
    /**
     * A reference that is sent to the recipient. This reference is also sent in all webhooks related
     * to the transfer, so you can use it to track statuses for both the source and recipient of
     * funds. Supported characters: **a-z**, **A-Z**, **0-9**.The maximum length depends on the
     * &#x60;category&#x60;. - **internal**: 80 characters - **bank**: 35 characters when transferring
     * to an IBAN, 15 characters for others.
     *
     * @return referenceForBeneficiary A reference that is sent to the recipient. This reference is
     *     also sent in all webhooks related to the transfer, so you can use it to track statuses for
     *     both the source and recipient of funds. Supported characters: **a-z**, **A-Z**, **0-9**.The
     *     maximum length depends on the &#x60;category&#x60;. - **internal**: 80 characters -
     *     **bank**: 35 characters when transferring to an IBAN, 15 characters for others.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE_FOR_BENEFICIARY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getReferenceForBeneficiary() {
      return referenceForBeneficiary;
    }
  
    /**
     * A reference that is sent to the recipient. This reference is also sent in all webhooks related
     * to the transfer, so you can use it to track statuses for both the source and recipient of
     * funds. Supported characters: **a-z**, **A-Z**, **0-9**.The maximum length depends on the
     * &#x60;category&#x60;. - **internal**: 80 characters - **bank**: 35 characters when transferring
     * to an IBAN, 15 characters for others.
     *
     * @param referenceForBeneficiary A reference that is sent to the recipient. This reference is
     *     also sent in all webhooks related to the transfer, so you can use it to track statuses for
     *     both the source and recipient of funds. Supported characters: **a-z**, **A-Z**, **0-9**.The
     *     maximum length depends on the &#x60;category&#x60;. - **internal**: 80 characters -
     *     **bank**: 35 characters when transferring to an IBAN, 15 characters for others.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE_FOR_BENEFICIARY)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReferenceForBeneficiary(String referenceForBeneficiary) {
      this.referenceForBeneficiary = referenceForBeneficiary;
    }
  
    /**
     * review
     *
     * @param review
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData review(TransferReview review) {
      this.review = review;
      return this;
    }
  
    /**
     * Get review
     *
     * @return review
     */
    @JsonProperty(JSON_PROPERTY_REVIEW)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TransferReview getReview() {
      return review;
    }
  
    /**
     * review
     *
     * @param review
     */
    @JsonProperty(JSON_PROPERTY_REVIEW)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReview(TransferReview review) {
      this.review = review;
    }
  
    /**
     * The sequence number of the transfer webhook. The numbers start from 1 and increase with each
     * new webhook for a specific transfer. The sequence number can help you restore the correct
     * sequence of events even if they arrive out of order.
     *
     * @param sequenceNumber The sequence number of the transfer webhook. The numbers start from 1 and
     *     increase with each new webhook for a specific transfer. The sequence number can help you
     *     restore the correct sequence of events even if they arrive out of order.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData sequenceNumber(Integer sequenceNumber) {
      this.sequenceNumber = sequenceNumber;
      return this;
    }
  
    /**
     * The sequence number of the transfer webhook. The numbers start from 1 and increase with each
     * new webhook for a specific transfer. The sequence number can help you restore the correct
     * sequence of events even if they arrive out of order.
     *
     * @return sequenceNumber The sequence number of the transfer webhook. The numbers start from 1
     *     and increase with each new webhook for a specific transfer. The sequence number can help
     *     you restore the correct sequence of events even if they arrive out of order.
     */
    @JsonProperty(JSON_PROPERTY_SEQUENCE_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Integer getSequenceNumber() {
      return sequenceNumber;
    }
  
    /**
     * The sequence number of the transfer webhook. The numbers start from 1 and increase with each
     * new webhook for a specific transfer. The sequence number can help you restore the correct
     * sequence of events even if they arrive out of order.
     *
     * @param sequenceNumber The sequence number of the transfer webhook. The numbers start from 1 and
     *     increase with each new webhook for a specific transfer. The sequence number can help you
     *     restore the correct sequence of events even if they arrive out of order.
     */
    @JsonProperty(JSON_PROPERTY_SEQUENCE_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setSequenceNumber(Integer sequenceNumber) {
      this.sequenceNumber = sequenceNumber;
    }
  
    /**
     * The result of the transfer. For example: - **received**: an outgoing transfer request is
     * created. - **authorised**: the transfer request is authorized and the funds are reserved. -
     * **booked**: the funds are deducted from your user&#39;s balance account. - **failed**: the
     * transfer is rejected by the counterparty&#39;s bank. - **returned**: the transfer is returned
     * by the counterparty&#39;s bank.
     *
     * @param status The result of the transfer. For example: - **received**: an outgoing transfer
     *     request is created. - **authorised**: the transfer request is authorized and the funds are
     *     reserved. - **booked**: the funds are deducted from your user&#39;s balance account. -
     *     **failed**: the transfer is rejected by the counterparty&#39;s bank. - **returned**: the
     *     transfer is returned by the counterparty&#39;s bank.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData status(StatusEnum status) {
      this.status = status;
      return this;
    }
  
    /**
     * The result of the transfer. For example: - **received**: an outgoing transfer request is
     * created. - **authorised**: the transfer request is authorized and the funds are reserved. -
     * **booked**: the funds are deducted from your user&#39;s balance account. - **failed**: the
     * transfer is rejected by the counterparty&#39;s bank. - **returned**: the transfer is returned
     * by the counterparty&#39;s bank.
     *
     * @return status The result of the transfer. For example: - **received**: an outgoing transfer
     *     request is created. - **authorised**: the transfer request is authorized and the funds are
     *     reserved. - **booked**: the funds are deducted from your user&#39;s balance account. -
     *     **failed**: the transfer is rejected by the counterparty&#39;s bank. - **returned**: the
     *     transfer is returned by the counterparty&#39;s bank.
     */
    @JsonProperty(JSON_PROPERTY_STATUS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public StatusEnum getStatus() {
      return status;
    }
  
    /**
     * The result of the transfer. For example: - **received**: an outgoing transfer request is
     * created. - **authorised**: the transfer request is authorized and the funds are reserved. -
     * **booked**: the funds are deducted from your user&#39;s balance account. - **failed**: the
     * transfer is rejected by the counterparty&#39;s bank. - **returned**: the transfer is returned
     * by the counterparty&#39;s bank.
     *
     * @param status The result of the transfer. For example: - **received**: an outgoing transfer
     *     request is created. - **authorised**: the transfer request is authorized and the funds are
     *     reserved. - **booked**: the funds are deducted from your user&#39;s balance account. -
     *     **failed**: the transfer is rejected by the counterparty&#39;s bank. - **returned**: the
     *     transfer is returned by the counterparty&#39;s bank.
     */
    @JsonProperty(JSON_PROPERTY_STATUS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setStatus(StatusEnum status) {
      this.status = status;
    }
  
    /**
     * tracking
     *
     * @param tracking
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData tracking(TransferDataTracking tracking) {
      this.tracking = tracking;
      return this;
    }
  
    /**
     * Get tracking
     *
     * @return tracking
     */
    @JsonProperty(JSON_PROPERTY_TRACKING)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TransferDataTracking getTracking() {
      return tracking;
    }
  
    /**
     * tracking
     *
     * @param tracking
     */
    @JsonProperty(JSON_PROPERTY_TRACKING)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setTracking(TransferDataTracking tracking) {
      this.tracking = tracking;
    }
  
    /**
     * transactionRulesResult
     *
     * @param transactionRulesResult
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData transactionRulesResult(TransactionRulesResult transactionRulesResult) {
      this.transactionRulesResult = transactionRulesResult;
      return this;
    }
  
    /**
     * Get transactionRulesResult
     *
     * @return transactionRulesResult
     */
    @JsonProperty(JSON_PROPERTY_TRANSACTION_RULES_RESULT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TransactionRulesResult getTransactionRulesResult() {
      return transactionRulesResult;
    }
  
    /**
     * transactionRulesResult
     *
     * @param transactionRulesResult
     */
    @JsonProperty(JSON_PROPERTY_TRANSACTION_RULES_RESULT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setTransactionRulesResult(TransactionRulesResult transactionRulesResult) {
      this.transactionRulesResult = transactionRulesResult;
    }
  
    /**
     * The type of transfer or transaction. For example, **refund**, **payment**,
     * **internalTransfer**, **bankTransfer**.
     *
     * @param type The type of transfer or transaction. For example, **refund**, **payment**,
     *     **internalTransfer**, **bankTransfer**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData type(TypeEnum type) {
      this.type = type;
      return this;
    }
  
    /**
     * The type of transfer or transaction. For example, **refund**, **payment**,
     * **internalTransfer**, **bankTransfer**.
     *
     * @return type The type of transfer or transaction. For example, **refund**, **payment**,
     *     **internalTransfer**, **bankTransfer**.
     */
    @JsonProperty(JSON_PROPERTY_TYPE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public TypeEnum getType() {
      return type;
    }
  
    /**
     * The type of transfer or transaction. For example, **refund**, **payment**,
     * **internalTransfer**, **bankTransfer**.
     *
     * @param type The type of transfer or transaction. For example, **refund**, **payment**,
     *     **internalTransfer**, **bankTransfer**.
     */
    @JsonProperty(JSON_PROPERTY_TYPE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setType(TypeEnum type) {
      this.type = type;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param updatedAt The date and time when the event was triggered, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     * @return the current {@code TransferData} instance, allowing for method chaining
     */
    public TransferData updatedAt(OffsetDateTime updatedAt) {
      this.updatedAt = updatedAt;
      return this;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @return updatedAt The date and time when the event was triggered, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_UPDATED_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public OffsetDateTime getUpdatedAt() {
      return updatedAt;
    }
  
    /**
     * The date and time when the event was triggered, in ISO 8601 extended format. For example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param updatedAt The date and time when the event was triggered, in ISO 8601 extended format.
     *     For example, **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_UPDATED_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setUpdatedAt(OffsetDateTime updatedAt) {
      this.updatedAt = updatedAt;
    }
  
    /** Return true if this TransferData object is equal to o. */
    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      TransferData transferData = (TransferData) o;
      return Objects.equals(this.accountHolder, transferData.accountHolder)
          && Objects.equals(this.amount, transferData.amount)
          && Objects.equals(this.balanceAccount, transferData.balanceAccount)
          && Objects.equals(this.balancePlatform, transferData.balancePlatform)
          && Objects.equals(this.balances, transferData.balances)
          && Objects.equals(this.category, transferData.category)
          && Objects.equals(this.categoryData, transferData.categoryData)
          && Objects.equals(this.counterparty, transferData.counterparty)
          && Objects.equals(this.createdAt, transferData.createdAt)
          && Objects.equals(this.creationDate, transferData.creationDate)
          && Objects.equals(this.description, transferData.description)
          && Objects.equals(this.directDebitInformation, transferData.directDebitInformation)
          && Objects.equals(this.direction, transferData.direction)
          && Objects.equals(this.eventId, transferData.eventId)
          && Objects.equals(this.events, transferData.events)
          && Objects.equals(this.executionDate, transferData.executionDate)
          && Objects.equals(this.externalReason, transferData.externalReason)
          && Objects.equals(this.id, transferData.id)
          && Objects.equals(this.paymentInstrument, transferData.paymentInstrument)
          && Objects.equals(this.reason, transferData.reason)
          && Objects.equals(this.reference, transferData.reference)
          && Objects.equals(this.referenceForBeneficiary, transferData.referenceForBeneficiary)
          && Objects.equals(this.review, transferData.review)
          && Objects.equals(this.sequenceNumber, transferData.sequenceNumber)
          && Objects.equals(this.status, transferData.status)
          && Objects.equals(this.tracking, transferData.tracking)
          && Objects.equals(this.transactionRulesResult, transferData.transactionRulesResult)
          && Objects.equals(this.type, transferData.type)
          && Objects.equals(this.updatedAt, transferData.updatedAt);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(
          accountHolder,
          amount,
          balanceAccount,
          balancePlatform,
          balances,
          category,
          categoryData,
          counterparty,
          createdAt,
          creationDate,
          description,
          directDebitInformation,
          direction,
          eventId,
          events,
          executionDate,
          externalReason,
          id,
          paymentInstrument,
          reason,
          reference,
          referenceForBeneficiary,
          review,
          sequenceNumber,
          status,
          tracking,
          transactionRulesResult,
          type,
          updatedAt);
    }
  
    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append("class TransferData {\n");
      sb.append("    accountHolder: ").append(toIndentedString(accountHolder)).append("\n");
      sb.append("    amount: ").append(toIndentedString(amount)).append("\n");
      sb.append("    balanceAccount: ").append(toIndentedString(balanceAccount)).append("\n");
      sb.append("    balancePlatform: ").append(toIndentedString(balancePlatform)).append("\n");
      sb.append("    balances: ").append(toIndentedString(balances)).append("\n");
      sb.append("    category: ").append(toIndentedString(category)).append("\n");
      sb.append("    categoryData: ").append(toIndentedString(categoryData)).append("\n");
      sb.append("    counterparty: ").append(toIndentedString(counterparty)).append("\n");
      sb.append("    createdAt: ").append(toIndentedString(createdAt)).append("\n");
      sb.append("    creationDate: ").append(toIndentedString(creationDate)).append("\n");
      sb.append("    description: ").append(toIndentedString(description)).append("\n");
      sb.append("    directDebitInformation: ")
          .append(toIndentedString(directDebitInformation))
          .append("\n");
      sb.append("    direction: ").append(toIndentedString(direction)).append("\n");
      sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
      sb.append("    events: ").append(toIndentedString(events)).append("\n");
      sb.append("    executionDate: ").append(toIndentedString(executionDate)).append("\n");
      sb.append("    externalReason: ").append(toIndentedString(externalReason)).append("\n");
      sb.append("    id: ").append(toIndentedString(id)).append("\n");
      sb.append("    paymentInstrument: ").append(toIndentedString(paymentInstrument)).append("\n");
      sb.append("    reason: ").append(toIndentedString(reason)).append("\n");
      sb.append("    reference: ").append(toIndentedString(reference)).append("\n");
      sb.append("    referenceForBeneficiary: ")
          .append(toIndentedString(referenceForBeneficiary))
          .append("\n");
      sb.append("    review: ").append(toIndentedString(review)).append("\n");
      sb.append("    sequenceNumber: ").append(toIndentedString(sequenceNumber)).append("\n");
      sb.append("    status: ").append(toIndentedString(status)).append("\n");
      sb.append("    tracking: ").append(toIndentedString(tracking)).append("\n");
      sb.append("    transactionRulesResult: ")
          .append(toIndentedString(transactionRulesResult))
          .append("\n");
      sb.append("    type: ").append(toIndentedString(type)).append("\n");
      sb.append("    updatedAt: ").append(toIndentedString(updatedAt)).append("\n");
      sb.append("}");
      return sb.toString();
    }
  
    /**
     * Convert the given object to string with each line indented by 4 spaces (except the first line).
     */
    private String toIndentedString(Object o) {
      if (o == null) {
        return "null";
      }
      return o.toString().replace("\n", "\n    ");
    }
  
    /**
     * Create an instance of TransferData given an JSON string
     *
     * @param jsonString JSON string
     * @return An instance of TransferData
     * @throws JsonProcessingException if the JSON string is invalid with respect to TransferData
     */
    public static TransferData fromJson(String jsonString) throws JsonProcessingException {
      return JSON.getMapper().readValue(jsonString, TransferData.class);
    }
  
    /**
     * Convert an instance of TransferData to an JSON string
     *
     * @return JSON string
     */
    public String toJson() throws JsonProcessingException {
      return JSON.getMapper().writeValueAsString(this);
    }
  }
  