content: /*
   * Adyen Checkout API
   *
   * The version of the OpenAPI document: 71
   *
   *
   * 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.checkout;
  
  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.LocalDate;
  import java.time.OffsetDateTime;
  import java.util.*;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.logging.Logger;
  
  /** PaymentLinkRequest */
  @JsonPropertyOrder({
    PaymentLinkRequest.JSON_PROPERTY_ALLOWED_PAYMENT_METHODS,
    PaymentLinkRequest.JSON_PROPERTY_AMOUNT,
    PaymentLinkRequest.JSON_PROPERTY_APPLICATION_INFO,
    PaymentLinkRequest.JSON_PROPERTY_BILLING_ADDRESS,
    PaymentLinkRequest.JSON_PROPERTY_BLOCKED_PAYMENT_METHODS,
    PaymentLinkRequest.JSON_PROPERTY_CAPTURE_DELAY_HOURS,
    PaymentLinkRequest.JSON_PROPERTY_COUNTRY_CODE,
    PaymentLinkRequest.JSON_PROPERTY_DATE_OF_BIRTH,
    PaymentLinkRequest.JSON_PROPERTY_DELIVER_AT,
    PaymentLinkRequest.JSON_PROPERTY_DELIVERY_ADDRESS,
    PaymentLinkRequest.JSON_PROPERTY_DESCRIPTION,
    PaymentLinkRequest.JSON_PROPERTY_EXPIRES_AT,
    PaymentLinkRequest.JSON_PROPERTY_FUND_ORIGIN,
    PaymentLinkRequest.JSON_PROPERTY_FUND_RECIPIENT,
    PaymentLinkRequest.JSON_PROPERTY_INSTALLMENT_OPTIONS,
    PaymentLinkRequest.JSON_PROPERTY_LINE_ITEMS,
    PaymentLinkRequest.JSON_PROPERTY_MANUAL_CAPTURE,
    PaymentLinkRequest.JSON_PROPERTY_MCC,
    PaymentLinkRequest.JSON_PROPERTY_MERCHANT_ACCOUNT,
    PaymentLinkRequest.JSON_PROPERTY_MERCHANT_ORDER_REFERENCE,
    PaymentLinkRequest.JSON_PROPERTY_METADATA,
    PaymentLinkRequest.JSON_PROPERTY_PLATFORM_CHARGEBACK_LOGIC,
    PaymentLinkRequest.JSON_PROPERTY_RECURRING_PROCESSING_MODEL,
    PaymentLinkRequest.JSON_PROPERTY_REFERENCE,
    PaymentLinkRequest.JSON_PROPERTY_REQUIRED_SHOPPER_FIELDS,
    PaymentLinkRequest.JSON_PROPERTY_RETURN_URL,
    PaymentLinkRequest.JSON_PROPERTY_REUSABLE,
    PaymentLinkRequest.JSON_PROPERTY_RISK_DATA,
    PaymentLinkRequest.JSON_PROPERTY_SHOPPER_EMAIL,
    PaymentLinkRequest.JSON_PROPERTY_SHOPPER_LOCALE,
    PaymentLinkRequest.JSON_PROPERTY_SHOPPER_NAME,
    PaymentLinkRequest.JSON_PROPERTY_SHOPPER_REFERENCE,
    PaymentLinkRequest.JSON_PROPERTY_SHOPPER_STATEMENT,
    PaymentLinkRequest.JSON_PROPERTY_SHOW_REMOVE_PAYMENT_METHOD_BUTTON,
    PaymentLinkRequest.JSON_PROPERTY_SOCIAL_SECURITY_NUMBER,
    PaymentLinkRequest.JSON_PROPERTY_SPLIT_CARD_FUNDING_SOURCES,
    PaymentLinkRequest.JSON_PROPERTY_SPLITS,
    PaymentLinkRequest.JSON_PROPERTY_STORE,
    PaymentLinkRequest.JSON_PROPERTY_STORE_PAYMENT_METHOD_MODE,
    PaymentLinkRequest.JSON_PROPERTY_TELEPHONE_NUMBER,
    PaymentLinkRequest.JSON_PROPERTY_THEME_ID,
    PaymentLinkRequest.JSON_PROPERTY_THREE_D_S2_REQUEST_DATA
  })
  public class PaymentLinkRequest {
    public static final String JSON_PROPERTY_ALLOWED_PAYMENT_METHODS = "allowedPaymentMethods";
    private List<String> allowedPaymentMethods;
  
    public static final String JSON_PROPERTY_AMOUNT = "amount";
    private Amount amount;
  
    public static final String JSON_PROPERTY_APPLICATION_INFO = "applicationInfo";
    private ApplicationInfo applicationInfo;
  
    public static final String JSON_PROPERTY_BILLING_ADDRESS = "billingAddress";
    private Address billingAddress;
  
    public static final String JSON_PROPERTY_BLOCKED_PAYMENT_METHODS = "blockedPaymentMethods";
    private List<String> blockedPaymentMethods;
  
    public static final String JSON_PROPERTY_CAPTURE_DELAY_HOURS = "captureDelayHours";
    private Integer captureDelayHours;
  
    public static final String JSON_PROPERTY_COUNTRY_CODE = "countryCode";
    private String countryCode;
  
    public static final String JSON_PROPERTY_DATE_OF_BIRTH = "dateOfBirth";
    private LocalDate dateOfBirth;
  
    public static final String JSON_PROPERTY_DELIVER_AT = "deliverAt";
    private OffsetDateTime deliverAt;
  
    public static final String JSON_PROPERTY_DELIVERY_ADDRESS = "deliveryAddress";
    private Address deliveryAddress;
  
    public static final String JSON_PROPERTY_DESCRIPTION = "description";
    private String description;
  
    public static final String JSON_PROPERTY_EXPIRES_AT = "expiresAt";
    private OffsetDateTime expiresAt;
  
    public static final String JSON_PROPERTY_FUND_ORIGIN = "fundOrigin";
    private FundOrigin fundOrigin;
  
    public static final String JSON_PROPERTY_FUND_RECIPIENT = "fundRecipient";
    private FundRecipient fundRecipient;
  
    public static final String JSON_PROPERTY_INSTALLMENT_OPTIONS = "installmentOptions";
    private Map<String, InstallmentOption> installmentOptions;
  
    public static final String JSON_PROPERTY_LINE_ITEMS = "lineItems";
    private List<LineItem> lineItems;
  
    public static final String JSON_PROPERTY_MANUAL_CAPTURE = "manualCapture";
    private Boolean manualCapture;
  
    public static final String JSON_PROPERTY_MCC = "mcc";
    private String mcc;
  
    public static final String JSON_PROPERTY_MERCHANT_ACCOUNT = "merchantAccount";
    private String merchantAccount;
  
    public static final String JSON_PROPERTY_MERCHANT_ORDER_REFERENCE = "merchantOrderReference";
    private String merchantOrderReference;
  
    public static final String JSON_PROPERTY_METADATA = "metadata";
    private Map<String, String> metadata;
  
    public static final String JSON_PROPERTY_PLATFORM_CHARGEBACK_LOGIC = "platformChargebackLogic";
    private PlatformChargebackLogic platformChargebackLogic;
  
    /**
     * Defines a recurring payment type. Required when &#x60;storePaymentMethodMode&#x60; is set to
     * **askForConsent** or **enabled**. Possible values: * **Subscription** – A transaction for a
     * fixed or variable amount, which follows a fixed schedule. * **CardOnFile** – With a
     * card-on-file (CoF) transaction, card details are stored to enable one-click or omnichannel
     * journeys, or simply to streamline the checkout process. Any subscription not following a fixed
     * schedule is also considered a card-on-file transaction. * **UnscheduledCardOnFile** – An
     * unscheduled card-on-file (UCoF) transaction is a transaction that occurs on a non-fixed
     * schedule and/or has variable amounts. For example, automatic top-ups when a cardholder&#39;s
     * balance drops below a certain amount.
     */
    public enum RecurringProcessingModelEnum {
      CARDONFILE(String.valueOf("CardOnFile")),
  
      SUBSCRIPTION(String.valueOf("Subscription")),
  
      UNSCHEDULEDCARDONFILE(String.valueOf("UnscheduledCardOnFile"));
  
      private static final Logger LOG =
          Logger.getLogger(RecurringProcessingModelEnum.class.getName());
  
      private String value;
  
      RecurringProcessingModelEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static RecurringProcessingModelEnum fromValue(String value) {
        for (RecurringProcessingModelEnum b : RecurringProcessingModelEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "RecurringProcessingModelEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(RecurringProcessingModelEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_RECURRING_PROCESSING_MODEL = "recurringProcessingModel";
    private RecurringProcessingModelEnum recurringProcessingModel;
  
    public static final String JSON_PROPERTY_REFERENCE = "reference";
    private String reference;
  
    /** Gets or Sets requiredShopperFields */
    public enum RequiredShopperFieldsEnum {
      BILLINGADDRESS(String.valueOf("billingAddress")),
  
      DELIVERYADDRESS(String.valueOf("deliveryAddress")),
  
      SHOPPEREMAIL(String.valueOf("shopperEmail")),
  
      SHOPPERNAME(String.valueOf("shopperName")),
  
      TELEPHONENUMBER(String.valueOf("telephoneNumber"));
  
      private static final Logger LOG = Logger.getLogger(RequiredShopperFieldsEnum.class.getName());
  
      private String value;
  
      RequiredShopperFieldsEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static RequiredShopperFieldsEnum fromValue(String value) {
        for (RequiredShopperFieldsEnum b : RequiredShopperFieldsEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "RequiredShopperFieldsEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(RequiredShopperFieldsEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_REQUIRED_SHOPPER_FIELDS = "requiredShopperFields";
    private List<RequiredShopperFieldsEnum> requiredShopperFields;
  
    public static final String JSON_PROPERTY_RETURN_URL = "returnUrl";
    private String returnUrl;
  
    public static final String JSON_PROPERTY_REUSABLE = "reusable";
    private Boolean reusable;
  
    public static final String JSON_PROPERTY_RISK_DATA = "riskData";
    private RiskData riskData;
  
    public static final String JSON_PROPERTY_SHOPPER_EMAIL = "shopperEmail";
    private String shopperEmail;
  
    public static final String JSON_PROPERTY_SHOPPER_LOCALE = "shopperLocale";
    private String shopperLocale;
  
    public static final String JSON_PROPERTY_SHOPPER_NAME = "shopperName";
    private Name shopperName;
  
    public static final String JSON_PROPERTY_SHOPPER_REFERENCE = "shopperReference";
    private String shopperReference;
  
    public static final String JSON_PROPERTY_SHOPPER_STATEMENT = "shopperStatement";
    private String shopperStatement;
  
    public static final String JSON_PROPERTY_SHOW_REMOVE_PAYMENT_METHOD_BUTTON =
        "showRemovePaymentMethodButton";
    private Boolean showRemovePaymentMethodButton;
  
    public static final String JSON_PROPERTY_SOCIAL_SECURITY_NUMBER = "socialSecurityNumber";
    private String socialSecurityNumber;
  
    public static final String JSON_PROPERTY_SPLIT_CARD_FUNDING_SOURCES = "splitCardFundingSources";
    private Boolean splitCardFundingSources;
  
    public static final String JSON_PROPERTY_SPLITS = "splits";
    private List<Split> splits;
  
    public static final String JSON_PROPERTY_STORE = "store";
    private String store;
  
    /**
     * Indicates if the details of the payment method will be stored for the shopper. Possible values:
     * * **disabled** – No details will be stored (default). * **askForConsent** – If the
     * &#x60;shopperReference&#x60; is provided, the UI lets the shopper choose if they want their
     * payment details to be stored. * **enabled** – If the &#x60;shopperReference&#x60; is provided,
     * the details will be stored without asking the shopper for consent. When set to
     * **askForConsent** or **enabled**, you must also include the
     * &#x60;recurringProcessingModel&#x60; parameter.
     */
    public enum StorePaymentMethodModeEnum {
      ASKFORCONSENT(String.valueOf("askForConsent")),
  
      DISABLED(String.valueOf("disabled")),
  
      ENABLED(String.valueOf("enabled"));
  
      private static final Logger LOG = Logger.getLogger(StorePaymentMethodModeEnum.class.getName());
  
      private String value;
  
      StorePaymentMethodModeEnum(String value) {
        this.value = value;
      }
  
      @JsonValue
      public String getValue() {
        return value;
      }
  
      @Override
      public String toString() {
        return String.valueOf(value);
      }
  
      @JsonCreator
      public static StorePaymentMethodModeEnum fromValue(String value) {
        for (StorePaymentMethodModeEnum b : StorePaymentMethodModeEnum.values()) {
          if (b.value.equals(value)) {
            return b;
          }
        }
        // handling unexpected value
        LOG.warning(
            "StorePaymentMethodModeEnum: unexpected enum value '"
                + value
                + "' - Supported values are "
                + Arrays.toString(StorePaymentMethodModeEnum.values()));
        return null;
      }
    }
  
    public static final String JSON_PROPERTY_STORE_PAYMENT_METHOD_MODE = "storePaymentMethodMode";
    private StorePaymentMethodModeEnum storePaymentMethodMode;
  
    public static final String JSON_PROPERTY_TELEPHONE_NUMBER = "telephoneNumber";
    private String telephoneNumber;
  
    public static final String JSON_PROPERTY_THEME_ID = "themeId";
    private String themeId;
  
    public static final String JSON_PROPERTY_THREE_D_S2_REQUEST_DATA = "threeDS2RequestData";
    private CheckoutSessionThreeDS2RequestData threeDS2RequestData;
  
    public PaymentLinkRequest() {}
  
    /**
     * List of payment methods to be presented to the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @param allowedPaymentMethods List of payment methods to be presented to the shopper. To refer
     *     to payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest allowedPaymentMethods(List<String> allowedPaymentMethods) {
      this.allowedPaymentMethods = allowedPaymentMethods;
      return this;
    }
  
    public PaymentLinkRequest addAllowedPaymentMethodsItem(String allowedPaymentMethodsItem) {
      if (this.allowedPaymentMethods == null) {
        this.allowedPaymentMethods = new ArrayList<>();
      }
      this.allowedPaymentMethods.add(allowedPaymentMethodsItem);
      return this;
    }
  
    /**
     * List of payment methods to be presented to the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @return allowedPaymentMethods List of payment methods to be presented to the shopper. To refer
     *     to payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     */
    @JsonProperty(JSON_PROPERTY_ALLOWED_PAYMENT_METHODS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<String> getAllowedPaymentMethods() {
      return allowedPaymentMethods;
    }
  
    /**
     * List of payment methods to be presented to the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @param allowedPaymentMethods List of payment methods to be presented to the shopper. To refer
     *     to payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;allowedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     */
    @JsonProperty(JSON_PROPERTY_ALLOWED_PAYMENT_METHODS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setAllowedPaymentMethods(List<String> allowedPaymentMethods) {
      this.allowedPaymentMethods = allowedPaymentMethods;
    }
  
    /**
     * amount
     *
     * @param amount
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest 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;
    }
  
    /**
     * applicationInfo
     *
     * @param applicationInfo
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest applicationInfo(ApplicationInfo applicationInfo) {
      this.applicationInfo = applicationInfo;
      return this;
    }
  
    /**
     * Get applicationInfo
     *
     * @return applicationInfo
     */
    @JsonProperty(JSON_PROPERTY_APPLICATION_INFO)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public ApplicationInfo getApplicationInfo() {
      return applicationInfo;
    }
  
    /**
     * applicationInfo
     *
     * @param applicationInfo
     */
    @JsonProperty(JSON_PROPERTY_APPLICATION_INFO)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setApplicationInfo(ApplicationInfo applicationInfo) {
      this.applicationInfo = applicationInfo;
    }
  
    /**
     * billingAddress
     *
     * @param billingAddress
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest billingAddress(Address billingAddress) {
      this.billingAddress = billingAddress;
      return this;
    }
  
    /**
     * Get billingAddress
     *
     * @return billingAddress
     */
    @JsonProperty(JSON_PROPERTY_BILLING_ADDRESS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Address getBillingAddress() {
      return billingAddress;
    }
  
    /**
     * billingAddress
     *
     * @param billingAddress
     */
    @JsonProperty(JSON_PROPERTY_BILLING_ADDRESS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setBillingAddress(Address billingAddress) {
      this.billingAddress = billingAddress;
    }
  
    /**
     * List of payment methods to be hidden from the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @param blockedPaymentMethods List of payment methods to be hidden from the shopper. To refer to
     *     payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest blockedPaymentMethods(List<String> blockedPaymentMethods) {
      this.blockedPaymentMethods = blockedPaymentMethods;
      return this;
    }
  
    public PaymentLinkRequest addBlockedPaymentMethodsItem(String blockedPaymentMethodsItem) {
      if (this.blockedPaymentMethods == null) {
        this.blockedPaymentMethods = new ArrayList<>();
      }
      this.blockedPaymentMethods.add(blockedPaymentMethodsItem);
      return this;
    }
  
    /**
     * List of payment methods to be hidden from the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @return blockedPaymentMethods List of payment methods to be hidden from the shopper. To refer
     *     to payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     */
    @JsonProperty(JSON_PROPERTY_BLOCKED_PAYMENT_METHODS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<String> getBlockedPaymentMethods() {
      return blockedPaymentMethods;
    }
  
    /**
     * List of payment methods to be hidden from the shopper. To refer to payment methods, use their
     * [payment method type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     * &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     *
     * @param blockedPaymentMethods List of payment methods to be hidden from the shopper. To refer to
     *     payment methods, use their [payment method
     *     type](https://docs.adyen.com/payment-methods/payment-method-types). Example:
     *     &#x60;\&quot;blockedPaymentMethods\&quot;:[\&quot;ideal\&quot;,\&quot;applepay\&quot;]&#x60;
     */
    @JsonProperty(JSON_PROPERTY_BLOCKED_PAYMENT_METHODS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setBlockedPaymentMethods(List<String> blockedPaymentMethods) {
      this.blockedPaymentMethods = blockedPaymentMethods;
    }
  
    /**
     * The delay between the authorisation and scheduled auto-capture, specified in hours.
     *
     * @param captureDelayHours The delay between the authorisation and scheduled auto-capture,
     *     specified in hours.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest captureDelayHours(Integer captureDelayHours) {
      this.captureDelayHours = captureDelayHours;
      return this;
    }
  
    /**
     * The delay between the authorisation and scheduled auto-capture, specified in hours.
     *
     * @return captureDelayHours The delay between the authorisation and scheduled auto-capture,
     *     specified in hours.
     */
    @JsonProperty(JSON_PROPERTY_CAPTURE_DELAY_HOURS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Integer getCaptureDelayHours() {
      return captureDelayHours;
    }
  
    /**
     * The delay between the authorisation and scheduled auto-capture, specified in hours.
     *
     * @param captureDelayHours The delay between the authorisation and scheduled auto-capture,
     *     specified in hours.
     */
    @JsonProperty(JSON_PROPERTY_CAPTURE_DELAY_HOURS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCaptureDelayHours(Integer captureDelayHours) {
      this.captureDelayHours = captureDelayHours;
    }
  
    /**
     * The shopper&#39;s two-letter country code.
     *
     * @param countryCode The shopper&#39;s two-letter country code.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest countryCode(String countryCode) {
      this.countryCode = countryCode;
      return this;
    }
  
    /**
     * The shopper&#39;s two-letter country code.
     *
     * @return countryCode The shopper&#39;s two-letter country code.
     */
    @JsonProperty(JSON_PROPERTY_COUNTRY_CODE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getCountryCode() {
      return countryCode;
    }
  
    /**
     * The shopper&#39;s two-letter country code.
     *
     * @param countryCode The shopper&#39;s two-letter country code.
     */
    @JsonProperty(JSON_PROPERTY_COUNTRY_CODE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setCountryCode(String countryCode) {
      this.countryCode = countryCode;
    }
  
    /**
     * The shopper&#39;s date of birth. Format [ISO-8601](https://www.w3.org/TR/NOTE-datetime):
     * YYYY-MM-DD
     *
     * @param dateOfBirth The shopper&#39;s date of birth. Format
     *     [ISO-8601](https://www.w3.org/TR/NOTE-datetime): YYYY-MM-DD
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest dateOfBirth(LocalDate dateOfBirth) {
      this.dateOfBirth = dateOfBirth;
      return this;
    }
  
    /**
     * The shopper&#39;s date of birth. Format [ISO-8601](https://www.w3.org/TR/NOTE-datetime):
     * YYYY-MM-DD
     *
     * @return dateOfBirth The shopper&#39;s date of birth. Format
     *     [ISO-8601](https://www.w3.org/TR/NOTE-datetime): YYYY-MM-DD
     */
    @JsonProperty(JSON_PROPERTY_DATE_OF_BIRTH)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public LocalDate getDateOfBirth() {
      return dateOfBirth;
    }
  
    /**
     * The shopper&#39;s date of birth. Format [ISO-8601](https://www.w3.org/TR/NOTE-datetime):
     * YYYY-MM-DD
     *
     * @param dateOfBirth The shopper&#39;s date of birth. Format
     *     [ISO-8601](https://www.w3.org/TR/NOTE-datetime): YYYY-MM-DD
     */
    @JsonProperty(JSON_PROPERTY_DATE_OF_BIRTH)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDateOfBirth(LocalDate dateOfBirth) {
      this.dateOfBirth = dateOfBirth;
    }
  
    /**
     * The date and time when the purchased goods should be delivered. [ISO
     * 8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param deliverAt The date and time when the purchased goods should be delivered. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     *     **2020-12-18T10:15:30+01:00**.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest deliverAt(OffsetDateTime deliverAt) {
      this.deliverAt = deliverAt;
      return this;
    }
  
    /**
     * The date and time when the purchased goods should be delivered. [ISO
     * 8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @return deliverAt The date and time when the purchased goods should be delivered. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     *     **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_DELIVER_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public OffsetDateTime getDeliverAt() {
      return deliverAt;
    }
  
    /**
     * The date and time when the purchased goods should be delivered. [ISO
     * 8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     * **2020-12-18T10:15:30+01:00**.
     *
     * @param deliverAt The date and time when the purchased goods should be delivered. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format: YYYY-MM-DDThh:mm:ss+TZD, for example,
     *     **2020-12-18T10:15:30+01:00**.
     */
    @JsonProperty(JSON_PROPERTY_DELIVER_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDeliverAt(OffsetDateTime deliverAt) {
      this.deliverAt = deliverAt;
    }
  
    /**
     * deliveryAddress
     *
     * @param deliveryAddress
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest deliveryAddress(Address deliveryAddress) {
      this.deliveryAddress = deliveryAddress;
      return this;
    }
  
    /**
     * Get deliveryAddress
     *
     * @return deliveryAddress
     */
    @JsonProperty(JSON_PROPERTY_DELIVERY_ADDRESS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Address getDeliveryAddress() {
      return deliveryAddress;
    }
  
    /**
     * deliveryAddress
     *
     * @param deliveryAddress
     */
    @JsonProperty(JSON_PROPERTY_DELIVERY_ADDRESS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDeliveryAddress(Address deliveryAddress) {
      this.deliveryAddress = deliveryAddress;
    }
  
    /**
     * A short description visible on the payment page. Maximum length: 280 characters.
     *
     * @param description A short description visible on the payment page. Maximum length: 280
     *     characters.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest description(String description) {
      this.description = description;
      return this;
    }
  
    /**
     * A short description visible on the payment page. Maximum length: 280 characters.
     *
     * @return description A short description visible on the payment page. Maximum length: 280
     *     characters.
     */
    @JsonProperty(JSON_PROPERTY_DESCRIPTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getDescription() {
      return description;
    }
  
    /**
     * A short description visible on the payment page. Maximum length: 280 characters.
     *
     * @param description A short description visible on the payment page. Maximum length: 280
     *     characters.
     */
    @JsonProperty(JSON_PROPERTY_DESCRIPTION)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setDescription(String description) {
      this.description = description;
    }
  
    /**
     * The date when the payment link expires. [ISO 8601](https://www.w3.org/TR/NOTE-datetime) format
     * with time zone offset: YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The
     * maximum expiry date is 70 days after the payment link is created. If not provided, the payment
     * link expires 24 hours after it was created.
     *
     * @param expiresAt The date when the payment link expires. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format with time zone offset:
     *     YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The maximum expiry
     *     date is 70 days after the payment link is created. If not provided, the payment link
     *     expires 24 hours after it was created.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest expiresAt(OffsetDateTime expiresAt) {
      this.expiresAt = expiresAt;
      return this;
    }
  
    /**
     * The date when the payment link expires. [ISO 8601](https://www.w3.org/TR/NOTE-datetime) format
     * with time zone offset: YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The
     * maximum expiry date is 70 days after the payment link is created. If not provided, the payment
     * link expires 24 hours after it was created.
     *
     * @return expiresAt The date when the payment link expires. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format with time zone offset:
     *     YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The maximum expiry
     *     date is 70 days after the payment link is created. If not provided, the payment link
     *     expires 24 hours after it was created.
     */
    @JsonProperty(JSON_PROPERTY_EXPIRES_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public OffsetDateTime getExpiresAt() {
      return expiresAt;
    }
  
    /**
     * The date when the payment link expires. [ISO 8601](https://www.w3.org/TR/NOTE-datetime) format
     * with time zone offset: YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The
     * maximum expiry date is 70 days after the payment link is created. If not provided, the payment
     * link expires 24 hours after it was created.
     *
     * @param expiresAt The date when the payment link expires. [ISO
     *     8601](https://www.w3.org/TR/NOTE-datetime) format with time zone offset:
     *     YYYY-MM-DDThh:mm:ss+TZD, for example, **2020-12-18T10:15:30+01:00**. The maximum expiry
     *     date is 70 days after the payment link is created. If not provided, the payment link
     *     expires 24 hours after it was created.
     */
    @JsonProperty(JSON_PROPERTY_EXPIRES_AT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setExpiresAt(OffsetDateTime expiresAt) {
      this.expiresAt = expiresAt;
    }
  
    /**
     * fundOrigin
     *
     * @param fundOrigin
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest fundOrigin(FundOrigin fundOrigin) {
      this.fundOrigin = fundOrigin;
      return this;
    }
  
    /**
     * Get fundOrigin
     *
     * @return fundOrigin
     */
    @JsonProperty(JSON_PROPERTY_FUND_ORIGIN)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public FundOrigin getFundOrigin() {
      return fundOrigin;
    }
  
    /**
     * fundOrigin
     *
     * @param fundOrigin
     */
    @JsonProperty(JSON_PROPERTY_FUND_ORIGIN)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setFundOrigin(FundOrigin fundOrigin) {
      this.fundOrigin = fundOrigin;
    }
  
    /**
     * fundRecipient
     *
     * @param fundRecipient
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest fundRecipient(FundRecipient fundRecipient) {
      this.fundRecipient = fundRecipient;
      return this;
    }
  
    /**
     * Get fundRecipient
     *
     * @return fundRecipient
     */
    @JsonProperty(JSON_PROPERTY_FUND_RECIPIENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public FundRecipient getFundRecipient() {
      return fundRecipient;
    }
  
    /**
     * fundRecipient
     *
     * @param fundRecipient
     */
    @JsonProperty(JSON_PROPERTY_FUND_RECIPIENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setFundRecipient(FundRecipient fundRecipient) {
      this.fundRecipient = fundRecipient;
    }
  
    /**
     * A set of key-value pairs that specifies the installment options available per payment method.
     * The key must be a payment method name in lowercase. For example, **card** to specify
     * installment options for all cards, or **visa** or **mc**. The value must be an object
     * containing the installment options.
     *
     * @param installmentOptions A set of key-value pairs that specifies the installment options
     *     available per payment method. The key must be a payment method name in lowercase. For
     *     example, **card** to specify installment options for all cards, or **visa** or **mc**. The
     *     value must be an object containing the installment options.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest installmentOptions(Map<String, InstallmentOption> installmentOptions) {
      this.installmentOptions = installmentOptions;
      return this;
    }
  
    public PaymentLinkRequest putInstallmentOptionsItem(
        String key, InstallmentOption installmentOptionsItem) {
      if (this.installmentOptions == null) {
        this.installmentOptions = new HashMap<>();
      }
      this.installmentOptions.put(key, installmentOptionsItem);
      return this;
    }
  
    /**
     * A set of key-value pairs that specifies the installment options available per payment method.
     * The key must be a payment method name in lowercase. For example, **card** to specify
     * installment options for all cards, or **visa** or **mc**. The value must be an object
     * containing the installment options.
     *
     * @return installmentOptions A set of key-value pairs that specifies the installment options
     *     available per payment method. The key must be a payment method name in lowercase. For
     *     example, **card** to specify installment options for all cards, or **visa** or **mc**. The
     *     value must be an object containing the installment options.
     */
    @JsonProperty(JSON_PROPERTY_INSTALLMENT_OPTIONS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Map<String, InstallmentOption> getInstallmentOptions() {
      return installmentOptions;
    }
  
    /**
     * A set of key-value pairs that specifies the installment options available per payment method.
     * The key must be a payment method name in lowercase. For example, **card** to specify
     * installment options for all cards, or **visa** or **mc**. The value must be an object
     * containing the installment options.
     *
     * @param installmentOptions A set of key-value pairs that specifies the installment options
     *     available per payment method. The key must be a payment method name in lowercase. For
     *     example, **card** to specify installment options for all cards, or **visa** or **mc**. The
     *     value must be an object containing the installment options.
     */
    @JsonProperty(JSON_PROPERTY_INSTALLMENT_OPTIONS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setInstallmentOptions(Map<String, InstallmentOption> installmentOptions) {
      this.installmentOptions = installmentOptions;
    }
  
    /**
     * Price and product information about the purchased items, to be included on the invoice sent to
     * the shopper. &gt; This field is required for 3x 4x Oney, Affirm, Afterpay, Clearpay, Klarna,
     * Ratepay, and Riverty.
     *
     * @param lineItems Price and product information about the purchased items, to be included on the
     *     invoice sent to the shopper. &gt; This field is required for 3x 4x Oney, Affirm, Afterpay,
     *     Clearpay, Klarna, Ratepay, and Riverty.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest lineItems(List<LineItem> lineItems) {
      this.lineItems = lineItems;
      return this;
    }
  
    public PaymentLinkRequest addLineItemsItem(LineItem lineItemsItem) {
      if (this.lineItems == null) {
        this.lineItems = new ArrayList<>();
      }
      this.lineItems.add(lineItemsItem);
      return this;
    }
  
    /**
     * Price and product information about the purchased items, to be included on the invoice sent to
     * the shopper. &gt; This field is required for 3x 4x Oney, Affirm, Afterpay, Clearpay, Klarna,
     * Ratepay, and Riverty.
     *
     * @return lineItems Price and product information about the purchased items, to be included on
     *     the invoice sent to the shopper. &gt; This field is required for 3x 4x Oney, Affirm,
     *     Afterpay, Clearpay, Klarna, Ratepay, and Riverty.
     */
    @JsonProperty(JSON_PROPERTY_LINE_ITEMS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<LineItem> getLineItems() {
      return lineItems;
    }
  
    /**
     * Price and product information about the purchased items, to be included on the invoice sent to
     * the shopper. &gt; This field is required for 3x 4x Oney, Affirm, Afterpay, Clearpay, Klarna,
     * Ratepay, and Riverty.
     *
     * @param lineItems Price and product information about the purchased items, to be included on the
     *     invoice sent to the shopper. &gt; This field is required for 3x 4x Oney, Affirm, Afterpay,
     *     Clearpay, Klarna, Ratepay, and Riverty.
     */
    @JsonProperty(JSON_PROPERTY_LINE_ITEMS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setLineItems(List<LineItem> lineItems) {
      this.lineItems = lineItems;
    }
  
    /**
     * Indicates if the payment must be [captured
     * manually](https://docs.adyen.com/online-payments/capture).
     *
     * @param manualCapture Indicates if the payment must be [captured
     *     manually](https://docs.adyen.com/online-payments/capture).
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest manualCapture(Boolean manualCapture) {
      this.manualCapture = manualCapture;
      return this;
    }
  
    /**
     * Indicates if the payment must be [captured
     * manually](https://docs.adyen.com/online-payments/capture).
     *
     * @return manualCapture Indicates if the payment must be [captured
     *     manually](https://docs.adyen.com/online-payments/capture).
     */
    @JsonProperty(JSON_PROPERTY_MANUAL_CAPTURE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Boolean getManualCapture() {
      return manualCapture;
    }
  
    /**
     * Indicates if the payment must be [captured
     * manually](https://docs.adyen.com/online-payments/capture).
     *
     * @param manualCapture Indicates if the payment must be [captured
     *     manually](https://docs.adyen.com/online-payments/capture).
     */
    @JsonProperty(JSON_PROPERTY_MANUAL_CAPTURE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setManualCapture(Boolean manualCapture) {
      this.manualCapture = manualCapture;
    }
  
    /**
     * The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code) (MCC) is a
     * four-digit number, which relates to a particular market segment. This code reflects the
     * predominant activity that is conducted by the merchant.
     *
     * @param mcc The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code)
     *     (MCC) is a four-digit number, which relates to a particular market segment. This code
     *     reflects the predominant activity that is conducted by the merchant.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest mcc(String mcc) {
      this.mcc = mcc;
      return this;
    }
  
    /**
     * The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code) (MCC) is a
     * four-digit number, which relates to a particular market segment. This code reflects the
     * predominant activity that is conducted by the merchant.
     *
     * @return mcc The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code)
     *     (MCC) is a four-digit number, which relates to a particular market segment. This code
     *     reflects the predominant activity that is conducted by the merchant.
     */
    @JsonProperty(JSON_PROPERTY_MCC)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getMcc() {
      return mcc;
    }
  
    /**
     * The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code) (MCC) is a
     * four-digit number, which relates to a particular market segment. This code reflects the
     * predominant activity that is conducted by the merchant.
     *
     * @param mcc The [merchant category code](https://en.wikipedia.org/wiki/Merchant_category_code)
     *     (MCC) is a four-digit number, which relates to a particular market segment. This code
     *     reflects the predominant activity that is conducted by the merchant.
     */
    @JsonProperty(JSON_PROPERTY_MCC)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setMcc(String mcc) {
      this.mcc = mcc;
    }
  
    /**
     * The merchant account identifier for which the payment link is created.
     *
     * @param merchantAccount The merchant account identifier for which the payment link is created.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest merchantAccount(String merchantAccount) {
      this.merchantAccount = merchantAccount;
      return this;
    }
  
    /**
     * The merchant account identifier for which the payment link is created.
     *
     * @return merchantAccount The merchant account identifier for which the payment link is created.
     */
    @JsonProperty(JSON_PROPERTY_MERCHANT_ACCOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getMerchantAccount() {
      return merchantAccount;
    }
  
    /**
     * The merchant account identifier for which the payment link is created.
     *
     * @param merchantAccount The merchant account identifier for which the payment link is created.
     */
    @JsonProperty(JSON_PROPERTY_MERCHANT_ACCOUNT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setMerchantAccount(String merchantAccount) {
      this.merchantAccount = merchantAccount;
    }
  
    /**
     * This reference allows linking multiple transactions to each other for reporting purposes (for
     * example, order auth-rate). The reference should be unique per billing cycle.
     *
     * @param merchantOrderReference This reference allows linking multiple transactions to each other
     *     for reporting purposes (for example, order auth-rate). The reference should be unique per
     *     billing cycle.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest merchantOrderReference(String merchantOrderReference) {
      this.merchantOrderReference = merchantOrderReference;
      return this;
    }
  
    /**
     * This reference allows linking multiple transactions to each other for reporting purposes (for
     * example, order auth-rate). The reference should be unique per billing cycle.
     *
     * @return merchantOrderReference This reference allows linking multiple transactions to each
     *     other for reporting purposes (for example, order auth-rate). The reference should be unique
     *     per billing cycle.
     */
    @JsonProperty(JSON_PROPERTY_MERCHANT_ORDER_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getMerchantOrderReference() {
      return merchantOrderReference;
    }
  
    /**
     * This reference allows linking multiple transactions to each other for reporting purposes (for
     * example, order auth-rate). The reference should be unique per billing cycle.
     *
     * @param merchantOrderReference This reference allows linking multiple transactions to each other
     *     for reporting purposes (for example, order auth-rate). The reference should be unique per
     *     billing cycle.
     */
    @JsonProperty(JSON_PROPERTY_MERCHANT_ORDER_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setMerchantOrderReference(String merchantOrderReference) {
      this.merchantOrderReference = merchantOrderReference;
    }
  
    /**
     * Metadata consists of entries, each of which includes a key and a value. Limitations: * Maximum
     * 20 key-value pairs per request. Otherwise, error \&quot;177\&quot; occurs: \&quot;Metadata size
     * exceeds limit\&quot; * Maximum 20 characters per key. Otherwise, error \&quot;178\&quot;
     * occurs: \&quot;Metadata key size exceeds limit\&quot; * A key cannot have the name
     * &#x60;checkout.linkId&#x60;. Any value that you provide with this key is going to be replaced
     * by the real payment link ID.
     *
     * @param metadata Metadata consists of entries, each of which includes a key and a value.
     *     Limitations: * Maximum 20 key-value pairs per request. Otherwise, error \&quot;177\&quot;
     *     occurs: \&quot;Metadata size exceeds limit\&quot; * Maximum 20 characters per key.
     *     Otherwise, error \&quot;178\&quot; occurs: \&quot;Metadata key size exceeds limit\&quot; *
     *     A key cannot have the name &#x60;checkout.linkId&#x60;. Any value that you provide with
     *     this key is going to be replaced by the real payment link ID.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest metadata(Map<String, String> metadata) {
      this.metadata = metadata;
      return this;
    }
  
    public PaymentLinkRequest putMetadataItem(String key, String metadataItem) {
      if (this.metadata == null) {
        this.metadata = new HashMap<>();
      }
      this.metadata.put(key, metadataItem);
      return this;
    }
  
    /**
     * Metadata consists of entries, each of which includes a key and a value. Limitations: * Maximum
     * 20 key-value pairs per request. Otherwise, error \&quot;177\&quot; occurs: \&quot;Metadata size
     * exceeds limit\&quot; * Maximum 20 characters per key. Otherwise, error \&quot;178\&quot;
     * occurs: \&quot;Metadata key size exceeds limit\&quot; * A key cannot have the name
     * &#x60;checkout.linkId&#x60;. Any value that you provide with this key is going to be replaced
     * by the real payment link ID.
     *
     * @return metadata Metadata consists of entries, each of which includes a key and a value.
     *     Limitations: * Maximum 20 key-value pairs per request. Otherwise, error \&quot;177\&quot;
     *     occurs: \&quot;Metadata size exceeds limit\&quot; * Maximum 20 characters per key.
     *     Otherwise, error \&quot;178\&quot; occurs: \&quot;Metadata key size exceeds limit\&quot; *
     *     A key cannot have the name &#x60;checkout.linkId&#x60;. Any value that you provide with
     *     this key is going to be replaced by the real payment link ID.
     */
    @JsonProperty(JSON_PROPERTY_METADATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Map<String, String> getMetadata() {
      return metadata;
    }
  
    /**
     * Metadata consists of entries, each of which includes a key and a value. Limitations: * Maximum
     * 20 key-value pairs per request. Otherwise, error \&quot;177\&quot; occurs: \&quot;Metadata size
     * exceeds limit\&quot; * Maximum 20 characters per key. Otherwise, error \&quot;178\&quot;
     * occurs: \&quot;Metadata key size exceeds limit\&quot; * A key cannot have the name
     * &#x60;checkout.linkId&#x60;. Any value that you provide with this key is going to be replaced
     * by the real payment link ID.
     *
     * @param metadata Metadata consists of entries, each of which includes a key and a value.
     *     Limitations: * Maximum 20 key-value pairs per request. Otherwise, error \&quot;177\&quot;
     *     occurs: \&quot;Metadata size exceeds limit\&quot; * Maximum 20 characters per key.
     *     Otherwise, error \&quot;178\&quot; occurs: \&quot;Metadata key size exceeds limit\&quot; *
     *     A key cannot have the name &#x60;checkout.linkId&#x60;. Any value that you provide with
     *     this key is going to be replaced by the real payment link ID.
     */
    @JsonProperty(JSON_PROPERTY_METADATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setMetadata(Map<String, String> metadata) {
      this.metadata = metadata;
    }
  
    /**
     * platformChargebackLogic
     *
     * @param platformChargebackLogic
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest platformChargebackLogic(
        PlatformChargebackLogic platformChargebackLogic) {
      this.platformChargebackLogic = platformChargebackLogic;
      return this;
    }
  
    /**
     * Get platformChargebackLogic
     *
     * @return platformChargebackLogic
     */
    @JsonProperty(JSON_PROPERTY_PLATFORM_CHARGEBACK_LOGIC)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public PlatformChargebackLogic getPlatformChargebackLogic() {
      return platformChargebackLogic;
    }
  
    /**
     * platformChargebackLogic
     *
     * @param platformChargebackLogic
     */
    @JsonProperty(JSON_PROPERTY_PLATFORM_CHARGEBACK_LOGIC)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setPlatformChargebackLogic(PlatformChargebackLogic platformChargebackLogic) {
      this.platformChargebackLogic = platformChargebackLogic;
    }
  
    /**
     * Defines a recurring payment type. Required when &#x60;storePaymentMethodMode&#x60; is set to
     * **askForConsent** or **enabled**. Possible values: * **Subscription** – A transaction for a
     * fixed or variable amount, which follows a fixed schedule. * **CardOnFile** – With a
     * card-on-file (CoF) transaction, card details are stored to enable one-click or omnichannel
     * journeys, or simply to streamline the checkout process. Any subscription not following a fixed
     * schedule is also considered a card-on-file transaction. * **UnscheduledCardOnFile** – An
     * unscheduled card-on-file (UCoF) transaction is a transaction that occurs on a non-fixed
     * schedule and/or has variable amounts. For example, automatic top-ups when a cardholder&#39;s
     * balance drops below a certain amount.
     *
     * @param recurringProcessingModel Defines a recurring payment type. Required when
     *     &#x60;storePaymentMethodMode&#x60; is set to **askForConsent** or **enabled**. Possible
     *     values: * **Subscription** – A transaction for a fixed or variable amount, which follows a
     *     fixed schedule. * **CardOnFile** – With a card-on-file (CoF) transaction, card details are
     *     stored to enable one-click or omnichannel journeys, or simply to streamline the checkout
     *     process. Any subscription not following a fixed schedule is also considered a card-on-file
     *     transaction. * **UnscheduledCardOnFile** – An unscheduled card-on-file (UCoF) transaction
     *     is a transaction that occurs on a non-fixed schedule and/or has variable amounts. For
     *     example, automatic top-ups when a cardholder&#39;s balance drops below a certain amount.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest recurringProcessingModel(
        RecurringProcessingModelEnum recurringProcessingModel) {
      this.recurringProcessingModel = recurringProcessingModel;
      return this;
    }
  
    /**
     * Defines a recurring payment type. Required when &#x60;storePaymentMethodMode&#x60; is set to
     * **askForConsent** or **enabled**. Possible values: * **Subscription** – A transaction for a
     * fixed or variable amount, which follows a fixed schedule. * **CardOnFile** – With a
     * card-on-file (CoF) transaction, card details are stored to enable one-click or omnichannel
     * journeys, or simply to streamline the checkout process. Any subscription not following a fixed
     * schedule is also considered a card-on-file transaction. * **UnscheduledCardOnFile** – An
     * unscheduled card-on-file (UCoF) transaction is a transaction that occurs on a non-fixed
     * schedule and/or has variable amounts. For example, automatic top-ups when a cardholder&#39;s
     * balance drops below a certain amount.
     *
     * @return recurringProcessingModel Defines a recurring payment type. Required when
     *     &#x60;storePaymentMethodMode&#x60; is set to **askForConsent** or **enabled**. Possible
     *     values: * **Subscription** – A transaction for a fixed or variable amount, which follows a
     *     fixed schedule. * **CardOnFile** – With a card-on-file (CoF) transaction, card details are
     *     stored to enable one-click or omnichannel journeys, or simply to streamline the checkout
     *     process. Any subscription not following a fixed schedule is also considered a card-on-file
     *     transaction. * **UnscheduledCardOnFile** – An unscheduled card-on-file (UCoF) transaction
     *     is a transaction that occurs on a non-fixed schedule and/or has variable amounts. For
     *     example, automatic top-ups when a cardholder&#39;s balance drops below a certain amount.
     */
    @JsonProperty(JSON_PROPERTY_RECURRING_PROCESSING_MODEL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public RecurringProcessingModelEnum getRecurringProcessingModel() {
      return recurringProcessingModel;
    }
  
    /**
     * Defines a recurring payment type. Required when &#x60;storePaymentMethodMode&#x60; is set to
     * **askForConsent** or **enabled**. Possible values: * **Subscription** – A transaction for a
     * fixed or variable amount, which follows a fixed schedule. * **CardOnFile** – With a
     * card-on-file (CoF) transaction, card details are stored to enable one-click or omnichannel
     * journeys, or simply to streamline the checkout process. Any subscription not following a fixed
     * schedule is also considered a card-on-file transaction. * **UnscheduledCardOnFile** – An
     * unscheduled card-on-file (UCoF) transaction is a transaction that occurs on a non-fixed
     * schedule and/or has variable amounts. For example, automatic top-ups when a cardholder&#39;s
     * balance drops below a certain amount.
     *
     * @param recurringProcessingModel Defines a recurring payment type. Required when
     *     &#x60;storePaymentMethodMode&#x60; is set to **askForConsent** or **enabled**. Possible
     *     values: * **Subscription** – A transaction for a fixed or variable amount, which follows a
     *     fixed schedule. * **CardOnFile** – With a card-on-file (CoF) transaction, card details are
     *     stored to enable one-click or omnichannel journeys, or simply to streamline the checkout
     *     process. Any subscription not following a fixed schedule is also considered a card-on-file
     *     transaction. * **UnscheduledCardOnFile** – An unscheduled card-on-file (UCoF) transaction
     *     is a transaction that occurs on a non-fixed schedule and/or has variable amounts. For
     *     example, automatic top-ups when a cardholder&#39;s balance drops below a certain amount.
     */
    @JsonProperty(JSON_PROPERTY_RECURRING_PROCESSING_MODEL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setRecurringProcessingModel(RecurringProcessingModelEnum recurringProcessingModel) {
      this.recurringProcessingModel = recurringProcessingModel;
    }
  
    /**
     * A reference that is used to uniquely identify the payment in future communications about the
     * payment status.
     *
     * @param reference A reference that is used to uniquely identify the payment in future
     *     communications about the payment status.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest reference(String reference) {
      this.reference = reference;
      return this;
    }
  
    /**
     * A reference that is used to uniquely identify the payment in future communications about the
     * payment status.
     *
     * @return reference A reference that is used to uniquely identify the payment in future
     *     communications about the payment status.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getReference() {
      return reference;
    }
  
    /**
     * A reference that is used to uniquely identify the payment in future communications about the
     * payment status.
     *
     * @param reference A reference that is used to uniquely identify the payment in future
     *     communications about the payment status.
     */
    @JsonProperty(JSON_PROPERTY_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReference(String reference) {
      this.reference = reference;
    }
  
    /**
     * List of fields that the shopper has to provide on the payment page before completing the
     * payment. For more information, refer to [Provide shopper
     * information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     * Possible values: * **billingAddress** – The address where to send the invoice. *
     * **deliveryAddress** – The address where the purchased goods should be delivered. *
     * **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s full
     * name. * **telephoneNumber** – The shopper&#39;s phone number.
     *
     * @param requiredShopperFields List of fields that the shopper has to provide on the payment page
     *     before completing the payment. For more information, refer to [Provide shopper
     *     information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     *     Possible values: * **billingAddress** – The address where to send the invoice. *
     *     **deliveryAddress** – The address where the purchased goods should be delivered. *
     *     **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s
     *     full name. * **telephoneNumber** – The shopper&#39;s phone number.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest requiredShopperFields(
        List<RequiredShopperFieldsEnum> requiredShopperFields) {
      this.requiredShopperFields = requiredShopperFields;
      return this;
    }
  
    public PaymentLinkRequest addRequiredShopperFieldsItem(
        RequiredShopperFieldsEnum requiredShopperFieldsItem) {
      if (this.requiredShopperFields == null) {
        this.requiredShopperFields = new ArrayList<>();
      }
      this.requiredShopperFields.add(requiredShopperFieldsItem);
      return this;
    }
  
    /**
     * List of fields that the shopper has to provide on the payment page before completing the
     * payment. For more information, refer to [Provide shopper
     * information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     * Possible values: * **billingAddress** – The address where to send the invoice. *
     * **deliveryAddress** – The address where the purchased goods should be delivered. *
     * **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s full
     * name. * **telephoneNumber** – The shopper&#39;s phone number.
     *
     * @return requiredShopperFields List of fields that the shopper has to provide on the payment
     *     page before completing the payment. For more information, refer to [Provide shopper
     *     information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     *     Possible values: * **billingAddress** – The address where to send the invoice. *
     *     **deliveryAddress** – The address where the purchased goods should be delivered. *
     *     **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s
     *     full name. * **telephoneNumber** – The shopper&#39;s phone number.
     */
    @JsonProperty(JSON_PROPERTY_REQUIRED_SHOPPER_FIELDS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<RequiredShopperFieldsEnum> getRequiredShopperFields() {
      return requiredShopperFields;
    }
  
    /**
     * List of fields that the shopper has to provide on the payment page before completing the
     * payment. For more information, refer to [Provide shopper
     * information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     * Possible values: * **billingAddress** – The address where to send the invoice. *
     * **deliveryAddress** – The address where the purchased goods should be delivered. *
     * **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s full
     * name. * **telephoneNumber** – The shopper&#39;s phone number.
     *
     * @param requiredShopperFields List of fields that the shopper has to provide on the payment page
     *     before completing the payment. For more information, refer to [Provide shopper
     *     information](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#shopper-information).
     *     Possible values: * **billingAddress** – The address where to send the invoice. *
     *     **deliveryAddress** – The address where the purchased goods should be delivered. *
     *     **shopperEmail** – The shopper&#39;s email address. * **shopperName** – The shopper&#39;s
     *     full name. * **telephoneNumber** – The shopper&#39;s phone number.
     */
    @JsonProperty(JSON_PROPERTY_REQUIRED_SHOPPER_FIELDS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setRequiredShopperFields(List<RequiredShopperFieldsEnum> requiredShopperFields) {
      this.requiredShopperFields = requiredShopperFields;
    }
  
    /**
     * Website URL used for redirection after payment is completed. If provided, a **Continue** button
     * will be shown on the payment page. If shoppers select the button, they are redirected to the
     * specified URL.
     *
     * @param returnUrl Website URL used for redirection after payment is completed. If provided, a
     *     **Continue** button will be shown on the payment page. If shoppers select the button, they
     *     are redirected to the specified URL.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest returnUrl(String returnUrl) {
      this.returnUrl = returnUrl;
      return this;
    }
  
    /**
     * Website URL used for redirection after payment is completed. If provided, a **Continue** button
     * will be shown on the payment page. If shoppers select the button, they are redirected to the
     * specified URL.
     *
     * @return returnUrl Website URL used for redirection after payment is completed. If provided, a
     *     **Continue** button will be shown on the payment page. If shoppers select the button, they
     *     are redirected to the specified URL.
     */
    @JsonProperty(JSON_PROPERTY_RETURN_URL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getReturnUrl() {
      return returnUrl;
    }
  
    /**
     * Website URL used for redirection after payment is completed. If provided, a **Continue** button
     * will be shown on the payment page. If shoppers select the button, they are redirected to the
     * specified URL.
     *
     * @param returnUrl Website URL used for redirection after payment is completed. If provided, a
     *     **Continue** button will be shown on the payment page. If shoppers select the button, they
     *     are redirected to the specified URL.
     */
    @JsonProperty(JSON_PROPERTY_RETURN_URL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReturnUrl(String returnUrl) {
      this.returnUrl = returnUrl;
    }
  
    /**
     * Indicates whether the payment link can be reused for multiple payments. If not provided, this
     * defaults to **false** which means the link can be used for one successful payment only.
     *
     * @param reusable Indicates whether the payment link can be reused for multiple payments. If not
     *     provided, this defaults to **false** which means the link can be used for one successful
     *     payment only.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest reusable(Boolean reusable) {
      this.reusable = reusable;
      return this;
    }
  
    /**
     * Indicates whether the payment link can be reused for multiple payments. If not provided, this
     * defaults to **false** which means the link can be used for one successful payment only.
     *
     * @return reusable Indicates whether the payment link can be reused for multiple payments. If not
     *     provided, this defaults to **false** which means the link can be used for one successful
     *     payment only.
     */
    @JsonProperty(JSON_PROPERTY_REUSABLE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Boolean getReusable() {
      return reusable;
    }
  
    /**
     * Indicates whether the payment link can be reused for multiple payments. If not provided, this
     * defaults to **false** which means the link can be used for one successful payment only.
     *
     * @param reusable Indicates whether the payment link can be reused for multiple payments. If not
     *     provided, this defaults to **false** which means the link can be used for one successful
     *     payment only.
     */
    @JsonProperty(JSON_PROPERTY_REUSABLE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setReusable(Boolean reusable) {
      this.reusable = reusable;
    }
  
    /**
     * riskData
     *
     * @param riskData
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest riskData(RiskData riskData) {
      this.riskData = riskData;
      return this;
    }
  
    /**
     * Get riskData
     *
     * @return riskData
     */
    @JsonProperty(JSON_PROPERTY_RISK_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public RiskData getRiskData() {
      return riskData;
    }
  
    /**
     * riskData
     *
     * @param riskData
     */
    @JsonProperty(JSON_PROPERTY_RISK_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setRiskData(RiskData riskData) {
      this.riskData = riskData;
    }
  
    /**
     * The shopper&#39;s email address.
     *
     * @param shopperEmail The shopper&#39;s email address.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest shopperEmail(String shopperEmail) {
      this.shopperEmail = shopperEmail;
      return this;
    }
  
    /**
     * The shopper&#39;s email address.
     *
     * @return shopperEmail The shopper&#39;s email address.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_EMAIL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getShopperEmail() {
      return shopperEmail;
    }
  
    /**
     * The shopper&#39;s email address.
     *
     * @param shopperEmail The shopper&#39;s email address.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_EMAIL)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShopperEmail(String shopperEmail) {
      this.shopperEmail = shopperEmail;
    }
  
    /**
     * The language to be used in the payment page, specified by a combination of a language and
     * country code. For example, &#x60;en-US&#x60;. For a list of shopper locales that Pay by Link
     * supports, refer to [Language and
     * localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     *
     * @param shopperLocale The language to be used in the payment page, specified by a combination of
     *     a language and country code. For example, &#x60;en-US&#x60;. For a list of shopper locales
     *     that Pay by Link supports, refer to [Language and
     *     localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest shopperLocale(String shopperLocale) {
      this.shopperLocale = shopperLocale;
      return this;
    }
  
    /**
     * The language to be used in the payment page, specified by a combination of a language and
     * country code. For example, &#x60;en-US&#x60;. For a list of shopper locales that Pay by Link
     * supports, refer to [Language and
     * localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     *
     * @return shopperLocale The language to be used in the payment page, specified by a combination
     *     of a language and country code. For example, &#x60;en-US&#x60;. For a list of shopper
     *     locales that Pay by Link supports, refer to [Language and
     *     localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_LOCALE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getShopperLocale() {
      return shopperLocale;
    }
  
    /**
     * The language to be used in the payment page, specified by a combination of a language and
     * country code. For example, &#x60;en-US&#x60;. For a list of shopper locales that Pay by Link
     * supports, refer to [Language and
     * localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     *
     * @param shopperLocale The language to be used in the payment page, specified by a combination of
     *     a language and country code. For example, &#x60;en-US&#x60;. For a list of shopper locales
     *     that Pay by Link supports, refer to [Language and
     *     localization](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#language).
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_LOCALE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShopperLocale(String shopperLocale) {
      this.shopperLocale = shopperLocale;
    }
  
    /**
     * shopperName
     *
     * @param shopperName
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest shopperName(Name shopperName) {
      this.shopperName = shopperName;
      return this;
    }
  
    /**
     * Get shopperName
     *
     * @return shopperName
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_NAME)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Name getShopperName() {
      return shopperName;
    }
  
    /**
     * shopperName
     *
     * @param shopperName
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_NAME)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShopperName(Name shopperName) {
      this.shopperName = shopperName;
    }
  
    /**
     * Your reference to uniquely identify this shopper, for example user ID or account ID. The value
     * is case-sensitive and must be at least three characters. &gt; Your reference must not include
     * personally identifiable information (PII) such as name or email address.
     *
     * @param shopperReference Your reference to uniquely identify this shopper, for example user ID
     *     or account ID. The value is case-sensitive and must be at least three characters. &gt; Your
     *     reference must not include personally identifiable information (PII) such as name or email
     *     address.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest shopperReference(String shopperReference) {
      this.shopperReference = shopperReference;
      return this;
    }
  
    /**
     * Your reference to uniquely identify this shopper, for example user ID or account ID. The value
     * is case-sensitive and must be at least three characters. &gt; Your reference must not include
     * personally identifiable information (PII) such as name or email address.
     *
     * @return shopperReference Your reference to uniquely identify this shopper, for example user ID
     *     or account ID. The value is case-sensitive and must be at least three characters. &gt; Your
     *     reference must not include personally identifiable information (PII) such as name or email
     *     address.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getShopperReference() {
      return shopperReference;
    }
  
    /**
     * Your reference to uniquely identify this shopper, for example user ID or account ID. The value
     * is case-sensitive and must be at least three characters. &gt; Your reference must not include
     * personally identifiable information (PII) such as name or email address.
     *
     * @param shopperReference Your reference to uniquely identify this shopper, for example user ID
     *     or account ID. The value is case-sensitive and must be at least three characters. &gt; Your
     *     reference must not include personally identifiable information (PII) such as name or email
     *     address.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_REFERENCE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShopperReference(String shopperReference) {
      this.shopperReference = shopperReference;
    }
  
    /**
     * The text to be shown on the shopper&#39;s bank statement. We recommend sending a maximum of 22
     * characters, otherwise banks might truncate the string. Allowed characters: **a-z**, **A-Z**,
     * **0-9**, spaces, and special characters **. , &#39; _ - ? + * /_**.
     *
     * @param shopperStatement The text to be shown on the shopper&#39;s bank statement. We recommend
     *     sending a maximum of 22 characters, otherwise banks might truncate the string. Allowed
     *     characters: **a-z**, **A-Z**, **0-9**, spaces, and special characters **. , &#39; _ - ? + *
     *     /_**.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest shopperStatement(String shopperStatement) {
      this.shopperStatement = shopperStatement;
      return this;
    }
  
    /**
     * The text to be shown on the shopper&#39;s bank statement. We recommend sending a maximum of 22
     * characters, otherwise banks might truncate the string. Allowed characters: **a-z**, **A-Z**,
     * **0-9**, spaces, and special characters **. , &#39; _ - ? + * /_**.
     *
     * @return shopperStatement The text to be shown on the shopper&#39;s bank statement. We recommend
     *     sending a maximum of 22 characters, otherwise banks might truncate the string. Allowed
     *     characters: **a-z**, **A-Z**, **0-9**, spaces, and special characters **. , &#39; _ - ? + *
     *     /_**.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_STATEMENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getShopperStatement() {
      return shopperStatement;
    }
  
    /**
     * The text to be shown on the shopper&#39;s bank statement. We recommend sending a maximum of 22
     * characters, otherwise banks might truncate the string. Allowed characters: **a-z**, **A-Z**,
     * **0-9**, spaces, and special characters **. , &#39; _ - ? + * /_**.
     *
     * @param shopperStatement The text to be shown on the shopper&#39;s bank statement. We recommend
     *     sending a maximum of 22 characters, otherwise banks might truncate the string. Allowed
     *     characters: **a-z**, **A-Z**, **0-9**, spaces, and special characters **. , &#39; _ - ? + *
     *     /_**.
     */
    @JsonProperty(JSON_PROPERTY_SHOPPER_STATEMENT)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShopperStatement(String shopperStatement) {
      this.shopperStatement = shopperStatement;
    }
  
    /**
     * Set to **false** to hide the button that lets the shopper remove a stored payment method.
     *
     * @param showRemovePaymentMethodButton Set to **false** to hide the button that lets the shopper
     *     remove a stored payment method.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest showRemovePaymentMethodButton(Boolean showRemovePaymentMethodButton) {
      this.showRemovePaymentMethodButton = showRemovePaymentMethodButton;
      return this;
    }
  
    /**
     * Set to **false** to hide the button that lets the shopper remove a stored payment method.
     *
     * @return showRemovePaymentMethodButton Set to **false** to hide the button that lets the shopper
     *     remove a stored payment method.
     */
    @JsonProperty(JSON_PROPERTY_SHOW_REMOVE_PAYMENT_METHOD_BUTTON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Boolean getShowRemovePaymentMethodButton() {
      return showRemovePaymentMethodButton;
    }
  
    /**
     * Set to **false** to hide the button that lets the shopper remove a stored payment method.
     *
     * @param showRemovePaymentMethodButton Set to **false** to hide the button that lets the shopper
     *     remove a stored payment method.
     */
    @JsonProperty(JSON_PROPERTY_SHOW_REMOVE_PAYMENT_METHOD_BUTTON)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setShowRemovePaymentMethodButton(Boolean showRemovePaymentMethodButton) {
      this.showRemovePaymentMethodButton = showRemovePaymentMethodButton;
    }
  
    /**
     * The shopper&#39;s social security number.
     *
     * @param socialSecurityNumber The shopper&#39;s social security number.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest socialSecurityNumber(String socialSecurityNumber) {
      this.socialSecurityNumber = socialSecurityNumber;
      return this;
    }
  
    /**
     * The shopper&#39;s social security number.
     *
     * @return socialSecurityNumber The shopper&#39;s social security number.
     */
    @JsonProperty(JSON_PROPERTY_SOCIAL_SECURITY_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getSocialSecurityNumber() {
      return socialSecurityNumber;
    }
  
    /**
     * The shopper&#39;s social security number.
     *
     * @param socialSecurityNumber The shopper&#39;s social security number.
     */
    @JsonProperty(JSON_PROPERTY_SOCIAL_SECURITY_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setSocialSecurityNumber(String socialSecurityNumber) {
      this.socialSecurityNumber = socialSecurityNumber;
    }
  
    /**
     * Boolean value indicating whether the card payment method should be split into separate debit
     * and credit options.
     *
     * @param splitCardFundingSources Boolean value indicating whether the card payment method should
     *     be split into separate debit and credit options.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest splitCardFundingSources(Boolean splitCardFundingSources) {
      this.splitCardFundingSources = splitCardFundingSources;
      return this;
    }
  
    /**
     * Boolean value indicating whether the card payment method should be split into separate debit
     * and credit options.
     *
     * @return splitCardFundingSources Boolean value indicating whether the card payment method should
     *     be split into separate debit and credit options.
     */
    @JsonProperty(JSON_PROPERTY_SPLIT_CARD_FUNDING_SOURCES)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public Boolean getSplitCardFundingSources() {
      return splitCardFundingSources;
    }
  
    /**
     * Boolean value indicating whether the card payment method should be split into separate debit
     * and credit options.
     *
     * @param splitCardFundingSources Boolean value indicating whether the card payment method should
     *     be split into separate debit and credit options.
     */
    @JsonProperty(JSON_PROPERTY_SPLIT_CARD_FUNDING_SOURCES)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setSplitCardFundingSources(Boolean splitCardFundingSources) {
      this.splitCardFundingSources = splitCardFundingSources;
    }
  
    /**
     * An array of objects specifying how to split a payment when using [Adyen for
     * Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     * [Classic Platforms
     * integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     * or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     *
     * @param splits An array of objects specifying how to split a payment when using [Adyen for
     *     Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     *     [Classic Platforms
     *     integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     *     or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest splits(List<Split> splits) {
      this.splits = splits;
      return this;
    }
  
    public PaymentLinkRequest addSplitsItem(Split splitsItem) {
      if (this.splits == null) {
        this.splits = new ArrayList<>();
      }
      this.splits.add(splitsItem);
      return this;
    }
  
    /**
     * An array of objects specifying how to split a payment when using [Adyen for
     * Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     * [Classic Platforms
     * integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     * or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     *
     * @return splits An array of objects specifying how to split a payment when using [Adyen for
     *     Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     *     [Classic Platforms
     *     integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     *     or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     */
    @JsonProperty(JSON_PROPERTY_SPLITS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public List<Split> getSplits() {
      return splits;
    }
  
    /**
     * An array of objects specifying how to split a payment when using [Adyen for
     * Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     * [Classic Platforms
     * integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     * or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     *
     * @param splits An array of objects specifying how to split a payment when using [Adyen for
     *     Platforms](https://docs.adyen.com/platforms/process-payments#providing-split-information),
     *     [Classic Platforms
     *     integration](https://docs.adyen.com/classic-platforms/processing-payments#providing-split-information),
     *     or [Issuing](https://docs.adyen.com/issuing/manage-funds#split).
     */
    @JsonProperty(JSON_PROPERTY_SPLITS)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setSplits(List<Split> splits) {
      this.splits = splits;
    }
  
    /**
     * The physical store, for which this payment is processed.
     *
     * @param store The physical store, for which this payment is processed.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest store(String store) {
      this.store = store;
      return this;
    }
  
    /**
     * The physical store, for which this payment is processed.
     *
     * @return store The physical store, for which this payment is processed.
     */
    @JsonProperty(JSON_PROPERTY_STORE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getStore() {
      return store;
    }
  
    /**
     * The physical store, for which this payment is processed.
     *
     * @param store The physical store, for which this payment is processed.
     */
    @JsonProperty(JSON_PROPERTY_STORE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setStore(String store) {
      this.store = store;
    }
  
    /**
     * Indicates if the details of the payment method will be stored for the shopper. Possible values:
     * * **disabled** – No details will be stored (default). * **askForConsent** – If the
     * &#x60;shopperReference&#x60; is provided, the UI lets the shopper choose if they want their
     * payment details to be stored. * **enabled** – If the &#x60;shopperReference&#x60; is provided,
     * the details will be stored without asking the shopper for consent. When set to
     * **askForConsent** or **enabled**, you must also include the
     * &#x60;recurringProcessingModel&#x60; parameter.
     *
     * @param storePaymentMethodMode Indicates if the details of the payment method will be stored for
     *     the shopper. Possible values: * **disabled** – No details will be stored (default). *
     *     **askForConsent** – If the &#x60;shopperReference&#x60; is provided, the UI lets the
     *     shopper choose if they want their payment details to be stored. * **enabled** – If the
     *     &#x60;shopperReference&#x60; is provided, the details will be stored without asking the
     *     shopper for consent. When set to **askForConsent** or **enabled**, you must also include
     *     the &#x60;recurringProcessingModel&#x60; parameter.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest storePaymentMethodMode(
        StorePaymentMethodModeEnum storePaymentMethodMode) {
      this.storePaymentMethodMode = storePaymentMethodMode;
      return this;
    }
  
    /**
     * Indicates if the details of the payment method will be stored for the shopper. Possible values:
     * * **disabled** – No details will be stored (default). * **askForConsent** – If the
     * &#x60;shopperReference&#x60; is provided, the UI lets the shopper choose if they want their
     * payment details to be stored. * **enabled** – If the &#x60;shopperReference&#x60; is provided,
     * the details will be stored without asking the shopper for consent. When set to
     * **askForConsent** or **enabled**, you must also include the
     * &#x60;recurringProcessingModel&#x60; parameter.
     *
     * @return storePaymentMethodMode Indicates if the details of the payment method will be stored
     *     for the shopper. Possible values: * **disabled** – No details will be stored (default). *
     *     **askForConsent** – If the &#x60;shopperReference&#x60; is provided, the UI lets the
     *     shopper choose if they want their payment details to be stored. * **enabled** – If the
     *     &#x60;shopperReference&#x60; is provided, the details will be stored without asking the
     *     shopper for consent. When set to **askForConsent** or **enabled**, you must also include
     *     the &#x60;recurringProcessingModel&#x60; parameter.
     */
    @JsonProperty(JSON_PROPERTY_STORE_PAYMENT_METHOD_MODE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public StorePaymentMethodModeEnum getStorePaymentMethodMode() {
      return storePaymentMethodMode;
    }
  
    /**
     * Indicates if the details of the payment method will be stored for the shopper. Possible values:
     * * **disabled** – No details will be stored (default). * **askForConsent** – If the
     * &#x60;shopperReference&#x60; is provided, the UI lets the shopper choose if they want their
     * payment details to be stored. * **enabled** – If the &#x60;shopperReference&#x60; is provided,
     * the details will be stored without asking the shopper for consent. When set to
     * **askForConsent** or **enabled**, you must also include the
     * &#x60;recurringProcessingModel&#x60; parameter.
     *
     * @param storePaymentMethodMode Indicates if the details of the payment method will be stored for
     *     the shopper. Possible values: * **disabled** – No details will be stored (default). *
     *     **askForConsent** – If the &#x60;shopperReference&#x60; is provided, the UI lets the
     *     shopper choose if they want their payment details to be stored. * **enabled** – If the
     *     &#x60;shopperReference&#x60; is provided, the details will be stored without asking the
     *     shopper for consent. When set to **askForConsent** or **enabled**, you must also include
     *     the &#x60;recurringProcessingModel&#x60; parameter.
     */
    @JsonProperty(JSON_PROPERTY_STORE_PAYMENT_METHOD_MODE)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setStorePaymentMethodMode(StorePaymentMethodModeEnum storePaymentMethodMode) {
      this.storePaymentMethodMode = storePaymentMethodMode;
    }
  
    /**
     * The shopper&#39;s telephone number. The phone number must include a plus sign (+) and a country
     * code (1-3 digits), followed by the number (4-15 digits). If the value you provide does not
     * follow the guidelines, we do not submit it for authentication. &gt; Required for Visa and JCB
     * transactions that require 3D Secure 2 authentication, if you did not include the
     * &#x60;shopperEmail&#x60;.
     *
     * @param telephoneNumber The shopper&#39;s telephone number. The phone number must include a plus
     *     sign (+) and a country code (1-3 digits), followed by the number (4-15 digits). If the
     *     value you provide does not follow the guidelines, we do not submit it for authentication.
     *     &gt; Required for Visa and JCB transactions that require 3D Secure 2 authentication, if you
     *     did not include the &#x60;shopperEmail&#x60;.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest telephoneNumber(String telephoneNumber) {
      this.telephoneNumber = telephoneNumber;
      return this;
    }
  
    /**
     * The shopper&#39;s telephone number. The phone number must include a plus sign (+) and a country
     * code (1-3 digits), followed by the number (4-15 digits). If the value you provide does not
     * follow the guidelines, we do not submit it for authentication. &gt; Required for Visa and JCB
     * transactions that require 3D Secure 2 authentication, if you did not include the
     * &#x60;shopperEmail&#x60;.
     *
     * @return telephoneNumber The shopper&#39;s telephone number. The phone number must include a
     *     plus sign (+) and a country code (1-3 digits), followed by the number (4-15 digits). If the
     *     value you provide does not follow the guidelines, we do not submit it for authentication.
     *     &gt; Required for Visa and JCB transactions that require 3D Secure 2 authentication, if you
     *     did not include the &#x60;shopperEmail&#x60;.
     */
    @JsonProperty(JSON_PROPERTY_TELEPHONE_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getTelephoneNumber() {
      return telephoneNumber;
    }
  
    /**
     * The shopper&#39;s telephone number. The phone number must include a plus sign (+) and a country
     * code (1-3 digits), followed by the number (4-15 digits). If the value you provide does not
     * follow the guidelines, we do not submit it for authentication. &gt; Required for Visa and JCB
     * transactions that require 3D Secure 2 authentication, if you did not include the
     * &#x60;shopperEmail&#x60;.
     *
     * @param telephoneNumber The shopper&#39;s telephone number. The phone number must include a plus
     *     sign (+) and a country code (1-3 digits), followed by the number (4-15 digits). If the
     *     value you provide does not follow the guidelines, we do not submit it for authentication.
     *     &gt; Required for Visa and JCB transactions that require 3D Secure 2 authentication, if you
     *     did not include the &#x60;shopperEmail&#x60;.
     */
    @JsonProperty(JSON_PROPERTY_TELEPHONE_NUMBER)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setTelephoneNumber(String telephoneNumber) {
      this.telephoneNumber = telephoneNumber;
    }
  
    /**
     * A [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     * customize the appearance of the payment page. If not specified, the payment page is rendered
     * according to the theme set as default in your Customer Area.
     *
     * @param themeId A
     *     [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     *     customize the appearance of the payment page. If not specified, the payment page is
     *     rendered according to the theme set as default in your Customer Area.
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest themeId(String themeId) {
      this.themeId = themeId;
      return this;
    }
  
    /**
     * A [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     * customize the appearance of the payment page. If not specified, the payment page is rendered
     * according to the theme set as default in your Customer Area.
     *
     * @return themeId A
     *     [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     *     customize the appearance of the payment page. If not specified, the payment page is
     *     rendered according to the theme set as default in your Customer Area.
     */
    @JsonProperty(JSON_PROPERTY_THEME_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public String getThemeId() {
      return themeId;
    }
  
    /**
     * A [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     * customize the appearance of the payment page. If not specified, the payment page is rendered
     * according to the theme set as default in your Customer Area.
     *
     * @param themeId A
     *     [theme](https://docs.adyen.com/unified-commerce/pay-by-link/payment-links/api#themes) to
     *     customize the appearance of the payment page. If not specified, the payment page is
     *     rendered according to the theme set as default in your Customer Area.
     */
    @JsonProperty(JSON_PROPERTY_THEME_ID)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setThemeId(String themeId) {
      this.themeId = themeId;
    }
  
    /**
     * threeDS2RequestData
     *
     * @param threeDS2RequestData
     * @return the current {@code PaymentLinkRequest} instance, allowing for method chaining
     */
    public PaymentLinkRequest threeDS2RequestData(
        CheckoutSessionThreeDS2RequestData threeDS2RequestData) {
      this.threeDS2RequestData = threeDS2RequestData;
      return this;
    }
  
    /**
     * Get threeDS2RequestData
     *
     * @return threeDS2RequestData
     */
    @JsonProperty(JSON_PROPERTY_THREE_D_S2_REQUEST_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public CheckoutSessionThreeDS2RequestData getThreeDS2RequestData() {
      return threeDS2RequestData;
    }
  
    /**
     * threeDS2RequestData
     *
     * @param threeDS2RequestData
     */
    @JsonProperty(JSON_PROPERTY_THREE_D_S2_REQUEST_DATA)
    @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
    public void setThreeDS2RequestData(CheckoutSessionThreeDS2RequestData threeDS2RequestData) {
      this.threeDS2RequestData = threeDS2RequestData;
    }
  
    /** Return true if this PaymentLinkRequest object is equal to o. */
    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      PaymentLinkRequest paymentLinkRequest = (PaymentLinkRequest) o;
      return Objects.equals(this.allowedPaymentMethods, paymentLinkRequest.allowedPaymentMethods)
          && Objects.equals(this.amount, paymentLinkRequest.amount)
          && Objects.equals(this.applicationInfo, paymentLinkRequest.applicationInfo)
          && Objects.equals(this.billingAddress, paymentLinkRequest.billingAddress)
          && Objects.equals(this.blockedPaymentMethods, paymentLinkRequest.blockedPaymentMethods)
          && Objects.equals(this.captureDelayHours, paymentLinkRequest.captureDelayHours)
          && Objects.equals(this.countryCode, paymentLinkRequest.countryCode)
          && Objects.equals(this.dateOfBirth, paymentLinkRequest.dateOfBirth)
          && Objects.equals(this.deliverAt, paymentLinkRequest.deliverAt)
          && Objects.equals(this.deliveryAddress, paymentLinkRequest.deliveryAddress)
          && Objects.equals(this.description, paymentLinkRequest.description)
          && Objects.equals(this.expiresAt, paymentLinkRequest.expiresAt)
          && Objects.equals(this.fundOrigin, paymentLinkRequest.fundOrigin)
          && Objects.equals(this.fundRecipient, paymentLinkRequest.fundRecipient)
          && Objects.equals(this.installmentOptions, paymentLinkRequest.installmentOptions)
          && Objects.equals(this.lineItems, paymentLinkRequest.lineItems)
          && Objects.equals(this.manualCapture, paymentLinkRequest.manualCapture)
          && Objects.equals(this.mcc, paymentLinkRequest.mcc)
          && Objects.equals(this.merchantAccount, paymentLinkRequest.merchantAccount)
          && Objects.equals(this.merchantOrderReference, paymentLinkRequest.merchantOrderReference)
          && Objects.equals(this.metadata, paymentLinkRequest.metadata)
          && Objects.equals(this.platformChargebackLogic, paymentLinkRequest.platformChargebackLogic)
          && Objects.equals(
              this.recurringProcessingModel, paymentLinkRequest.recurringProcessingModel)
          && Objects.equals(this.reference, paymentLinkRequest.reference)
          && Objects.equals(this.requiredShopperFields, paymentLinkRequest.requiredShopperFields)
          && Objects.equals(this.returnUrl, paymentLinkRequest.returnUrl)
          && Objects.equals(this.reusable, paymentLinkRequest.reusable)
          && Objects.equals(this.riskData, paymentLinkRequest.riskData)
          && Objects.equals(this.shopperEmail, paymentLinkRequest.shopperEmail)
          && Objects.equals(this.shopperLocale, paymentLinkRequest.shopperLocale)
          && Objects.equals(this.shopperName, paymentLinkRequest.shopperName)
          && Objects.equals(this.shopperReference, paymentLinkRequest.shopperReference)
          && Objects.equals(this.shopperStatement, paymentLinkRequest.shopperStatement)
          && Objects.equals(
              this.showRemovePaymentMethodButton, paymentLinkRequest.showRemovePaymentMethodButton)
          && Objects.equals(this.socialSecurityNumber, paymentLinkRequest.socialSecurityNumber)
          && Objects.equals(this.splitCardFundingSources, paymentLinkRequest.splitCardFundingSources)
          && Objects.equals(this.splits, paymentLinkRequest.splits)
          && Objects.equals(this.store, paymentLinkRequest.store)
          && Objects.equals(this.storePaymentMethodMode, paymentLinkRequest.storePaymentMethodMode)
          && Objects.equals(this.telephoneNumber, paymentLinkRequest.telephoneNumber)
          && Objects.equals(this.themeId, paymentLinkRequest.themeId)
          && Objects.equals(this.threeDS2RequestData, paymentLinkRequest.threeDS2RequestData);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(
          allowedPaymentMethods,
          amount,
          applicationInfo,
          billingAddress,
          blockedPaymentMethods,
          captureDelayHours,
          countryCode,
          dateOfBirth,
          deliverAt,
          deliveryAddress,
          description,
          expiresAt,
          fundOrigin,
          fundRecipient,
          installmentOptions,
          lineItems,
          manualCapture,
          mcc,
          merchantAccount,
          merchantOrderReference,
          metadata,
          platformChargebackLogic,
          recurringProcessingModel,
          reference,
          requiredShopperFields,
          returnUrl,
          reusable,
          riskData,
          shopperEmail,
          shopperLocale,
          shopperName,
          shopperReference,
          shopperStatement,
          showRemovePaymentMethodButton,
          socialSecurityNumber,
          splitCardFundingSources,
          splits,
          store,
          storePaymentMethodMode,
          telephoneNumber,
          themeId,
          threeDS2RequestData);
    }
  
    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append("class PaymentLinkRequest {\n");
      sb.append("    allowedPaymentMethods: ")
          .append(toIndentedString(allowedPaymentMethods))
          .append("\n");
      sb.append("    amount: ").append(toIndentedString(amount)).append("\n");
      sb.append("    applicationInfo: ").append(toIndentedString(applicationInfo)).append("\n");
      sb.append("    billingAddress: ").append(toIndentedString(billingAddress)).append("\n");
      sb.append("    blockedPaymentMethods: ")
          .append(toIndentedString(blockedPaymentMethods))
          .append("\n");
      sb.append("    captureDelayHours: ").append(toIndentedString(captureDelayHours)).append("\n");
      sb.append("    countryCode: ").append(toIndentedString(countryCode)).append("\n");
      sb.append("    dateOfBirth: ").append(toIndentedString(dateOfBirth)).append("\n");
      sb.append("    deliverAt: ").append(toIndentedString(deliverAt)).append("\n");
      sb.append("    deliveryAddress: ").append(toIndentedString(deliveryAddress)).append("\n");
      sb.append("    description: ").append(toIndentedString(description)).append("\n");
      sb.append("    expiresAt: ").append(toIndentedString(expiresAt)).append("\n");
      sb.append("    fundOrigin: ").append(toIndentedString(fundOrigin)).append("\n");
      sb.append("    fundRecipient: ").append(toIndentedString(fundRecipient)).append("\n");
      sb.append("    installmentOptions: ").append(toIndentedString(installmentOptions)).append("\n");
      sb.append("    lineItems: ").append(toIndentedString(lineItems)).append("\n");
      sb.append("    manualCapture: ").append(toIndentedString(manualCapture)).append("\n");
      sb.append("    mcc: ").append(toIndentedString(mcc)).append("\n");
      sb.append("    merchantAccount: ").append(toIndentedString(merchantAccount)).append("\n");
      sb.append("    merchantOrderReference: ")
          .append(toIndentedString(merchantOrderReference))
          .append("\n");
      sb.append("    metadata: ").append(toIndentedString(metadata)).append("\n");
      sb.append("    platformChargebackLogic: ")
          .append(toIndentedString(platformChargebackLogic))
          .append("\n");
      sb.append("    recurringProcessingModel: ")
          .append(toIndentedString(recurringProcessingModel))
          .append("\n");
      sb.append("    reference: ").append(toIndentedString(reference)).append("\n");
      sb.append("    requiredShopperFields: ")
          .append(toIndentedString(requiredShopperFields))
          .append("\n");
      sb.append("    returnUrl: ").append(toIndentedString(returnUrl)).append("\n");
      sb.append("    reusable: ").append(toIndentedString(reusable)).append("\n");
      sb.append("    riskData: ").append(toIndentedString(riskData)).append("\n");
      sb.append("    shopperEmail: ").append(toIndentedString(shopperEmail)).append("\n");
      sb.append("    shopperLocale: ").append(toIndentedString(shopperLocale)).append("\n");
      sb.append("    shopperName: ").append(toIndentedString(shopperName)).append("\n");
      sb.append("    shopperReference: ").append(toIndentedString(shopperReference)).append("\n");
      sb.append("    shopperStatement: ").append(toIndentedString(shopperStatement)).append("\n");
      sb.append("    showRemovePaymentMethodButton: ")
          .append(toIndentedString(showRemovePaymentMethodButton))
          .append("\n");
      sb.append("    socialSecurityNumber: ")
          .append(toIndentedString(socialSecurityNumber))
          .append("\n");
      sb.append("    splitCardFundingSources: ")
          .append(toIndentedString(splitCardFundingSources))
          .append("\n");
      sb.append("    splits: ").append(toIndentedString(splits)).append("\n");
      sb.append("    store: ").append(toIndentedString(store)).append("\n");
      sb.append("    storePaymentMethodMode: ")
          .append(toIndentedString(storePaymentMethodMode))
          .append("\n");
      sb.append("    telephoneNumber: ").append(toIndentedString(telephoneNumber)).append("\n");
      sb.append("    themeId: ").append(toIndentedString(themeId)).append("\n");
      sb.append("    threeDS2RequestData: ")
          .append(toIndentedString(threeDS2RequestData))
          .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 PaymentLinkRequest given an JSON string
     *
     * @param jsonString JSON string
     * @return An instance of PaymentLinkRequest
     * @throws JsonProcessingException if the JSON string is invalid with respect to
     *     PaymentLinkRequest
     */
    public static PaymentLinkRequest fromJson(String jsonString) throws JsonProcessingException {
      return JSON.getMapper().readValue(jsonString, PaymentLinkRequest.class);
    }
  
    /**
     * Convert an instance of PaymentLinkRequest to an JSON string
     *
     * @return JSON string
     */
    public String toJson() throws JsonProcessingException {
      return JSON.getMapper().writeValueAsString(this);
    }
  }
  