content: /*
   * 支付宝开放平台API
   * 支付宝开放平台v3协议文档
   *
   * The version of the OpenAPI document: 2025-08-26
   * 
   *
   * 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.alipay.v3.model;
  
  import java.util.Objects;
  import java.util.Arrays;
  import com.alipay.v3.model.EinvTrade;
  import com.alipay.v3.model.InvoiceItemOpenModel;
  import com.alipay.v3.model.InvoiceTitleOpenModel;
  import com.google.gson.TypeAdapter;
  import com.google.gson.annotations.JsonAdapter;
  import com.google.gson.annotations.SerializedName;
  import com.google.gson.stream.JsonReader;
  import com.google.gson.stream.JsonWriter;
  import io.swagger.annotations.ApiModel;
  import io.swagger.annotations.ApiModelProperty;
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
  
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;
  import com.google.gson.JsonArray;
  import com.google.gson.JsonDeserializationContext;
  import com.google.gson.JsonDeserializer;
  import com.google.gson.JsonElement;
  import com.google.gson.JsonObject;
  import com.google.gson.JsonParseException;
  import com.google.gson.TypeAdapterFactory;
  import com.google.gson.reflect.TypeToken;
  
  import java.lang.reflect.Type;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Map.Entry;
  import java.util.Set;
  
  import com.alipay.v3.JSON;
  
  /**
   * InvoiceSendOpenModel
   */
  @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen")
  public class InvoiceSendOpenModel {
    public static final String SERIALIZED_NAME_APPLY_ID = "apply_id";
    @SerializedName(SERIALIZED_NAME_APPLY_ID)
    private String applyId;
  
    public static final String SERIALIZED_NAME_CHECK_CODE = "check_code";
    @SerializedName(SERIALIZED_NAME_CHECK_CODE)
    private String checkCode;
  
    public static final String SERIALIZED_NAME_CHECKER = "checker";
    @SerializedName(SERIALIZED_NAME_CHECKER)
    private String checker;
  
    public static final String SERIALIZED_NAME_CLERK = "clerk";
    @SerializedName(SERIALIZED_NAME_CLERK)
    private String clerk;
  
    public static final String SERIALIZED_NAME_EX_TAX_AMOUNT = "ex_tax_amount";
    @SerializedName(SERIALIZED_NAME_EX_TAX_AMOUNT)
    private String exTaxAmount;
  
    public static final String SERIALIZED_NAME_EXTEND_FIELDS = "extend_fields";
    @SerializedName(SERIALIZED_NAME_EXTEND_FIELDS)
    private String extendFields;
  
    public static final String SERIALIZED_NAME_FILE_DOWNLOAD_TYPE = "file_download_type";
    @SerializedName(SERIALIZED_NAME_FILE_DOWNLOAD_TYPE)
    private String fileDownloadType;
  
    public static final String SERIALIZED_NAME_FILE_DOWNLOAD_URL = "file_download_url";
    @SerializedName(SERIALIZED_NAME_FILE_DOWNLOAD_URL)
    private String fileDownloadUrl;
  
    public static final String SERIALIZED_NAME_FINANCIAL_ELECTRONIC_TYPE = "financial_electronic_type";
    @SerializedName(SERIALIZED_NAME_FINANCIAL_ELECTRONIC_TYPE)
    private String financialElectronicType;
  
    public static final String SERIALIZED_NAME_INVOICE_CODE = "invoice_code";
    @SerializedName(SERIALIZED_NAME_INVOICE_CODE)
    private String invoiceCode;
  
    public static final String SERIALIZED_NAME_INVOICE_CONTENT = "invoice_content";
    @SerializedName(SERIALIZED_NAME_INVOICE_CONTENT)
    private List<InvoiceItemOpenModel> invoiceContent = null;
  
    public static final String SERIALIZED_NAME_INVOICE_DATE = "invoice_date";
    @SerializedName(SERIALIZED_NAME_INVOICE_DATE)
    private String invoiceDate;
  
    public static final String SERIALIZED_NAME_INVOICE_KIND = "invoice_kind";
    @SerializedName(SERIALIZED_NAME_INVOICE_KIND)
    private String invoiceKind;
  
    public static final String SERIALIZED_NAME_INVOICE_MEMO = "invoice_memo";
    @SerializedName(SERIALIZED_NAME_INVOICE_MEMO)
    private String invoiceMemo;
  
    public static final String SERIALIZED_NAME_INVOICE_NO = "invoice_no";
    @SerializedName(SERIALIZED_NAME_INVOICE_NO)
    private String invoiceNo;
  
    public static final String SERIALIZED_NAME_INVOICE_TITLE = "invoice_title";
    @SerializedName(SERIALIZED_NAME_INVOICE_TITLE)
    private InvoiceTitleOpenModel invoiceTitle;
  
    public static final String SERIALIZED_NAME_INVOICE_TYPE = "invoice_type";
    @SerializedName(SERIALIZED_NAME_INVOICE_TYPE)
    private String invoiceType;
  
    public static final String SERIALIZED_NAME_OPEN_ID = "open_id";
    @SerializedName(SERIALIZED_NAME_OPEN_ID)
    private String openId;
  
    public static final String SERIALIZED_NAME_ORI_BLUE_INV_CODE = "ori_blue_inv_code";
    @SerializedName(SERIALIZED_NAME_ORI_BLUE_INV_CODE)
    private String oriBlueInvCode;
  
    public static final String SERIALIZED_NAME_ORI_BLUE_INV_NO = "ori_blue_inv_no";
    @SerializedName(SERIALIZED_NAME_ORI_BLUE_INV_NO)
    private String oriBlueInvNo;
  
    public static final String SERIALIZED_NAME_OUT_INVOICE_ID = "out_invoice_id";
    @SerializedName(SERIALIZED_NAME_OUT_INVOICE_ID)
    private String outInvoiceId;
  
    public static final String SERIALIZED_NAME_OUT_TRADE_NO = "out_trade_no";
    @SerializedName(SERIALIZED_NAME_OUT_TRADE_NO)
    private String outTradeNo;
  
    public static final String SERIALIZED_NAME_PAYEE = "payee";
    @SerializedName(SERIALIZED_NAME_PAYEE)
    private String payee;
  
    public static final String SERIALIZED_NAME_PAYEE_ADDRESS_TEL = "payee_address_tel";
    @SerializedName(SERIALIZED_NAME_PAYEE_ADDRESS_TEL)
    private String payeeAddressTel;
  
    public static final String SERIALIZED_NAME_PAYEE_BANK_NAME_ACCOUNT = "payee_bank_name_account";
    @SerializedName(SERIALIZED_NAME_PAYEE_BANK_NAME_ACCOUNT)
    private String payeeBankNameAccount;
  
    public static final String SERIALIZED_NAME_PAYEE_REGISTER_NAME = "payee_register_name";
    @SerializedName(SERIALIZED_NAME_PAYEE_REGISTER_NAME)
    private String payeeRegisterName;
  
    public static final String SERIALIZED_NAME_PAYEE_REGISTER_NO = "payee_register_no";
    @SerializedName(SERIALIZED_NAME_PAYEE_REGISTER_NO)
    private String payeeRegisterNo;
  
    public static final String SERIALIZED_NAME_SUM_AMOUNT = "sum_amount";
    @SerializedName(SERIALIZED_NAME_SUM_AMOUNT)
    private String sumAmount;
  
    public static final String SERIALIZED_NAME_TAX_AMOUNT = "tax_amount";
    @SerializedName(SERIALIZED_NAME_TAX_AMOUNT)
    private String taxAmount;
  
    public static final String SERIALIZED_NAME_TRADE_LIST = "trade_list";
    @SerializedName(SERIALIZED_NAME_TRADE_LIST)
    private List<EinvTrade> tradeList = null;
  
    public static final String SERIALIZED_NAME_USER_ID = "user_id";
    @SerializedName(SERIALIZED_NAME_USER_ID)
    private String userId;
  
    public InvoiceSendOpenModel() { 
    }
  
    public InvoiceSendOpenModel applyId(String applyId) {
      
      this.applyId = applyId;
      return this;
    }
  
     /**
     * 支付宝端的申请id。如果在开票过程中，是通过支付宝提交的申请到机构端，支付宝会带上开票申请在支付宝生成的申请id，机构在回传发票的时候只需要回传这个申请id，不用获取用户的uid，支付宝可以根据申请id将发票归集到对应的用户名下
     * @return applyId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2016112800152005000000000239", value = "支付宝端的申请id。如果在开票过程中，是通过支付宝提交的申请到机构端，支付宝会带上开票申请在支付宝生成的申请id，机构在回传发票的时候只需要回传这个申请id，不用获取用户的uid，支付宝可以根据申请id将发票归集到对应的用户名下")
  
    public String getApplyId() {
      return applyId;
    }
  
  
    public void setApplyId(String applyId) {
      this.applyId = applyId;
    }
  
  
    public InvoiceSendOpenModel checkCode(String checkCode) {
      
      this.checkCode = checkCode;
      return this;
    }
  
     /**
     * 票面上的校验码信息。
     * @return checkCode
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "15170246985745164986", value = "票面上的校验码信息。")
  
    public String getCheckCode() {
      return checkCode;
    }
  
  
    public void setCheckCode(String checkCode) {
      this.checkCode = checkCode;
    }
  
  
    public InvoiceSendOpenModel checker(String checker) {
      
      this.checker = checker;
      return this;
    }
  
     /**
     * 票面上复核人信息。
     * @return checker
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "李四", value = "票面上复核人信息。")
  
    public String getChecker() {
      return checker;
    }
  
  
    public void setChecker(String checker) {
      this.checker = checker;
    }
  
  
    public InvoiceSendOpenModel clerk(String clerk) {
      
      this.clerk = clerk;
      return this;
    }
  
     /**
     * 票面上开票员信息。
     * @return clerk
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "赵吴", value = "票面上开票员信息。")
  
    public String getClerk() {
      return clerk;
    }
  
  
    public void setClerk(String clerk) {
      this.clerk = clerk;
    }
  
  
    public InvoiceSendOpenModel exTaxAmount(String exTaxAmount) {
      
      this.exTaxAmount = exTaxAmount;
      return this;
    }
  
     /**
     * 不含税金额，票面上的不含税金额，单位（元），保留两位小数。
     * @return exTaxAmount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "100.00", value = "不含税金额，票面上的不含税金额，单位（元），保留两位小数。")
  
    public String getExTaxAmount() {
      return exTaxAmount;
    }
  
  
    public void setExTaxAmount(String exTaxAmount) {
      this.exTaxAmount = exTaxAmount;
    }
  
  
    public InvoiceSendOpenModel extendFields(String extendFields) {
      
      this.extendFields = extendFields;
      return this;
    }
  
     /**
     * 预留的扩展字段，格式如：key1&#x3D;value1\\nkey2&#x3D;value2\\nkey3&#x3D;value3，字段之间以\\n分隔。
     * @return extendFields
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "m_invoice_detail_url=http://196.021.871.011:8080/invoice/detail.action?fpdm= 4112740003&fphm=41791003", value = "预留的扩展字段，格式如：key1=value1\\nkey2=value2\\nkey3=value3，字段之间以\\n分隔。")
  
    public String getExtendFields() {
      return extendFields;
    }
  
  
    public void setExtendFields(String extendFields) {
      this.extendFields = extendFields;
    }
  
  
    public InvoiceSendOpenModel fileDownloadType(String fileDownloadType) {
      
      this.fileDownloadType = fileDownloadType;
      return this;
    }
  
     /**
     * 下载版式文件类型，需要回传文件下载链接的情况下必传
     * @return fileDownloadType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "PDF", value = "下载版式文件类型，需要回传文件下载链接的情况下必传")
  
    public String getFileDownloadType() {
      return fileDownloadType;
    }
  
  
    public void setFileDownloadType(String fileDownloadType) {
      this.fileDownloadType = fileDownloadType;
    }
  
  
    public InvoiceSendOpenModel fileDownloadUrl(String fileDownloadUrl) {
      
      this.fileDownloadUrl = fileDownloadUrl;
      return this;
    }
  
     /**
     * 发票版式文件下载地址。
     * @return fileDownloadUrl
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "http://img.hadalo.com/aa/kq/ddhrtdefgxKVXXXXa6apXXXXXXXXXX.pdf", value = "发票版式文件下载地址。")
  
    public String getFileDownloadUrl() {
      return fileDownloadUrl;
    }
  
  
    public void setFileDownloadUrl(String fileDownloadUrl) {
      this.fileDownloadUrl = fileDownloadUrl;
    }
  
  
    public InvoiceSendOpenModel financialElectronicType(String financialElectronicType) {
      
      this.financialElectronicType = financialElectronicType;
      return this;
    }
  
     /**
     * 财政电子票据子类型
     * @return financialElectronicType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "01", value = "财政电子票据子类型")
  
    public String getFinancialElectronicType() {
      return financialElectronicType;
    }
  
  
    public void setFinancialElectronicType(String financialElectronicType) {
      this.financialElectronicType = financialElectronicType;
    }
  
  
    public InvoiceSendOpenModel invoiceCode(String invoiceCode) {
      
      this.invoiceCode = invoiceCode;
      return this;
    }
  
     /**
     * 发票代码，该字段与invoice_no构成一张发票的唯一标识。
     * @return invoiceCode
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "4112740003", value = "发票代码，该字段与invoice_no构成一张发票的唯一标识。")
  
    public String getInvoiceCode() {
      return invoiceCode;
    }
  
  
    public void setInvoiceCode(String invoiceCode) {
      this.invoiceCode = invoiceCode;
    }
  
  
    public InvoiceSendOpenModel invoiceContent(List<InvoiceItemOpenModel> invoiceContent) {
      
      this.invoiceContent = invoiceContent;
      return this;
    }
  
    public InvoiceSendOpenModel addInvoiceContentItem(InvoiceItemOpenModel invoiceContentItem) {
      if (this.invoiceContent == null) {
        this.invoiceContent = new ArrayList<>();
      }
      this.invoiceContent.add(invoiceContentItem);
      return this;
    }
  
     /**
     * 发票明细项。
     * @return invoiceContent
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "发票明细项。")
  
    public List<InvoiceItemOpenModel> getInvoiceContent() {
      return invoiceContent;
    }
  
  
    public void setInvoiceContent(List<InvoiceItemOpenModel> invoiceContent) {
      this.invoiceContent = invoiceContent;
    }
  
  
    public InvoiceSendOpenModel invoiceDate(String invoiceDate) {
      
      this.invoiceDate = invoiceDate;
      return this;
    }
  
     /**
     * 开票日期，格式如：YYYY-MM-DD。
     * @return invoiceDate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2017-10-10", value = "开票日期，格式如：YYYY-MM-DD。")
  
    public String getInvoiceDate() {
      return invoiceDate;
    }
  
  
    public void setInvoiceDate(String invoiceDate) {
      this.invoiceDate = invoiceDate;
    }
  
  
    public InvoiceSendOpenModel invoiceKind(String invoiceKind) {
      
      this.invoiceKind = invoiceKind;
      return this;
    }
  
     /**
     * 标识发票的类型， PLAIN:增值税电子普通发票; SPECIAL:增值税专用发票; ALL_ELECTRONIC_GENERAL:电子发票（普通发票）; ALL_ELECTRONIC_SPECIAL:电子发票（增值税专用发票）; PLAIN_INVOICE:增值税普通发票; FINANCIAL_ELECTRONIC_BILL:财政电子票据;
     * @return invoiceKind
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "PLAIN", value = "标识发票的类型， PLAIN:增值税电子普通发票; SPECIAL:增值税专用发票; ALL_ELECTRONIC_GENERAL:电子发票（普通发票）; ALL_ELECTRONIC_SPECIAL:电子发票（增值税专用发票）; PLAIN_INVOICE:增值税普通发票; FINANCIAL_ELECTRONIC_BILL:财政电子票据;")
  
    public String getInvoiceKind() {
      return invoiceKind;
    }
  
  
    public void setInvoiceKind(String invoiceKind) {
      this.invoiceKind = invoiceKind;
    }
  
  
    public InvoiceSendOpenModel invoiceMemo(String invoiceMemo) {
      
      this.invoiceMemo = invoiceMemo;
      return this;
    }
  
     /**
     * 票面上备注信息。
     * @return invoiceMemo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "订单号：2017120800001", value = "票面上备注信息。")
  
    public String getInvoiceMemo() {
      return invoiceMemo;
    }
  
  
    public void setInvoiceMemo(String invoiceMemo) {
      this.invoiceMemo = invoiceMemo;
    }
  
  
    public InvoiceSendOpenModel invoiceNo(String invoiceNo) {
      
      this.invoiceNo = invoiceNo;
      return this;
    }
  
     /**
     * 发票号码，该字段与invoice_code构成一张发票的唯一标识。
     * @return invoiceNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "41791003", value = "发票号码，该字段与invoice_code构成一张发票的唯一标识。")
  
    public String getInvoiceNo() {
      return invoiceNo;
    }
  
  
    public void setInvoiceNo(String invoiceNo) {
      this.invoiceNo = invoiceNo;
    }
  
  
    public InvoiceSendOpenModel invoiceTitle(InvoiceTitleOpenModel invoiceTitle) {
      
      this.invoiceTitle = invoiceTitle;
      return this;
    }
  
     /**
     * Get invoiceTitle
     * @return invoiceTitle
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public InvoiceTitleOpenModel getInvoiceTitle() {
      return invoiceTitle;
    }
  
  
    public void setInvoiceTitle(InvoiceTitleOpenModel invoiceTitle) {
      this.invoiceTitle = invoiceTitle;
    }
  
  
    public InvoiceSendOpenModel invoiceType(String invoiceType) {
      
      this.invoiceType = invoiceType;
      return this;
    }
  
     /**
     * 标识是红票还是蓝票，RED:红票;BLUE:蓝票。
     * @return invoiceType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "BLUE", value = "标识是红票还是蓝票，RED:红票;BLUE:蓝票。")
  
    public String getInvoiceType() {
      return invoiceType;
    }
  
  
    public void setInvoiceType(String invoiceType) {
      this.invoiceType = invoiceType;
    }
  
  
    public InvoiceSendOpenModel openId(String openId) {
      
      this.openId = openId;
      return this;
    }
  
     /**
     * 支付宝用户userId，当发送红字发票时，即invoice_type＝RED时，可选填；或者apply_id不为空的时候，可选填；其他情况必填。
     * @return openId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "074a1CcTG1LelxKe4xQC0zgNdId0nxi95b5lsNpazWYoCo5", value = "支付宝用户userId，当发送红字发票时，即invoice_type＝RED时，可选填；或者apply_id不为空的时候，可选填；其他情况必填。")
  
    public String getOpenId() {
      return openId;
    }
  
  
    public void setOpenId(String openId) {
      this.openId = openId;
    }
  
  
    public InvoiceSendOpenModel oriBlueInvCode(String oriBlueInvCode) {
      
      this.oriBlueInvCode = oriBlueInvCode;
      return this;
    }
  
     /**
     * 红票情况下，必须填入原始蓝票的发票代码（全电票时为空）。
     * @return oriBlueInvCode
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "4112740002", value = "红票情况下，必须填入原始蓝票的发票代码（全电票时为空）。")
  
    public String getOriBlueInvCode() {
      return oriBlueInvCode;
    }
  
  
    public void setOriBlueInvCode(String oriBlueInvCode) {
      this.oriBlueInvCode = oriBlueInvCode;
    }
  
  
    public InvoiceSendOpenModel oriBlueInvNo(String oriBlueInvNo) {
      
      this.oriBlueInvNo = oriBlueInvNo;
      return this;
    }
  
     /**
     * 红票情况下，必须填入原始蓝票的发票号码。
     * @return oriBlueInvNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "41791002", value = "红票情况下，必须填入原始蓝票的发票号码。")
  
    public String getOriBlueInvNo() {
      return oriBlueInvNo;
    }
  
  
    public void setOriBlueInvNo(String oriBlueInvNo) {
      this.oriBlueInvNo = oriBlueInvNo;
    }
  
  
    public InvoiceSendOpenModel outInvoiceId(String outInvoiceId) {
      
      this.outInvoiceId = outInvoiceId;
      return this;
    }
  
     /**
     * 外部发票id，isv生成发票之后所生成的发票流水号，主要用做存储。
     * @return outInvoiceId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "201710283459661232435535", value = "外部发票id，isv生成发票之后所生成的发票流水号，主要用做存储。")
  
    public String getOutInvoiceId() {
      return outInvoiceId;
    }
  
  
    public void setOutInvoiceId(String outInvoiceId) {
      this.outInvoiceId = outInvoiceId;
    }
  
  
    public InvoiceSendOpenModel outTradeNo(String outTradeNo) {
      
      this.outTradeNo = outTradeNo;
      return this;
    }
  
     /**
     * 该发票基于的实际交易流水号。
     * @return outTradeNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20171023293456785924325", value = "该发票基于的实际交易流水号。")
  
    public String getOutTradeNo() {
      return outTradeNo;
    }
  
  
    public void setOutTradeNo(String outTradeNo) {
      this.outTradeNo = outTradeNo;
    }
  
  
    public InvoiceSendOpenModel payee(String payee) {
      
      this.payee = payee;
      return this;
    }
  
     /**
     * 票面上收款人信息。
     * @return payee
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "张三", value = "票面上收款人信息。")
  
    public String getPayee() {
      return payee;
    }
  
  
    public void setPayee(String payee) {
      this.payee = payee;
    }
  
  
    public InvoiceSendOpenModel payeeAddressTel(String payeeAddressTel) {
      
      this.payeeAddressTel = payeeAddressTel;
      return this;
    }
  
     /**
     * 票面上销售方地址、电话信息。
     * @return payeeAddressTel
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "杭州市西湖区某某办公楼 0571-237405862", value = "票面上销售方地址、电话信息。")
  
    public String getPayeeAddressTel() {
      return payeeAddressTel;
    }
  
  
    public void setPayeeAddressTel(String payeeAddressTel) {
      this.payeeAddressTel = payeeAddressTel;
    }
  
  
    public InvoiceSendOpenModel payeeBankNameAccount(String payeeBankNameAccount) {
      
      this.payeeBankNameAccount = payeeBankNameAccount;
      return this;
    }
  
     /**
     * 票面上销售方开户行及账号。
     * @return payeeBankNameAccount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "西湖区建行11111111111", value = "票面上销售方开户行及账号。")
  
    public String getPayeeBankNameAccount() {
      return payeeBankNameAccount;
    }
  
  
    public void setPayeeBankNameAccount(String payeeBankNameAccount) {
      this.payeeBankNameAccount = payeeBankNameAccount;
    }
  
  
    public InvoiceSendOpenModel payeeRegisterName(String payeeRegisterName) {
      
      this.payeeRegisterName = payeeRegisterName;
      return this;
    }
  
     /**
     * 票面上销售方企业名称。
     * @return payeeRegisterName
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "支付宝（杭州）信息技术有限公司", value = "票面上销售方企业名称。")
  
    public String getPayeeRegisterName() {
      return payeeRegisterName;
    }
  
  
    public void setPayeeRegisterName(String payeeRegisterName) {
      this.payeeRegisterName = payeeRegisterName;
    }
  
  
    public InvoiceSendOpenModel payeeRegisterNo(String payeeRegisterNo) {
      
      this.payeeRegisterNo = payeeRegisterNo;
      return this;
    }
  
     /**
     * 票面上销售方税号信息。
     * @return payeeRegisterNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "310101000000090", value = "票面上销售方税号信息。")
  
    public String getPayeeRegisterNo() {
      return payeeRegisterNo;
    }
  
  
    public void setPayeeRegisterNo(String payeeRegisterNo) {
      this.payeeRegisterNo = payeeRegisterNo;
    }
  
  
    public InvoiceSendOpenModel sumAmount(String sumAmount) {
      
      this.sumAmount = sumAmount;
      return this;
    }
  
     /**
     * 价税合计，票面上的总开票金额，单位（元），保留两位小数，sum_amount&#x3D;ex_tax_amount+tax_amount。
     * @return sumAmount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "101.00", value = "价税合计，票面上的总开票金额，单位（元），保留两位小数，sum_amount=ex_tax_amount+tax_amount。")
  
    public String getSumAmount() {
      return sumAmount;
    }
  
  
    public void setSumAmount(String sumAmount) {
      this.sumAmount = sumAmount;
    }
  
  
    public InvoiceSendOpenModel taxAmount(String taxAmount) {
      
      this.taxAmount = taxAmount;
      return this;
    }
  
     /**
     * 合计税额，票面上的合计税额，单位（元），保留两位小数。
     * @return taxAmount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1.00", value = "合计税额，票面上的合计税额，单位（元），保留两位小数。")
  
    public String getTaxAmount() {
      return taxAmount;
    }
  
  
    public void setTaxAmount(String taxAmount) {
      this.taxAmount = taxAmount;
    }
  
  
    public InvoiceSendOpenModel tradeList(List<EinvTrade> tradeList) {
      
      this.tradeList = tradeList;
      return this;
    }
  
    public InvoiceSendOpenModel addTradeListItem(EinvTrade tradeListItem) {
      if (this.tradeList == null) {
        this.tradeList = new ArrayList<>();
      }
      this.tradeList.add(tradeListItem);
      return this;
    }
  
     /**
     * 交易内容，非必填但是不可以传空值，如果无需回传trade_list则不需要传该对象
     * @return tradeList
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "交易内容，非必填但是不可以传空值，如果无需回传trade_list则不需要传该对象")
  
    public List<EinvTrade> getTradeList() {
      return tradeList;
    }
  
  
    public void setTradeList(List<EinvTrade> tradeList) {
      this.tradeList = tradeList;
    }
  
  
    public InvoiceSendOpenModel userId(String userId) {
      
      this.userId = userId;
      return this;
    }
  
     /**
     * 支付宝用户userId，当发送红字发票时，即invoice_type＝RED时，可选填；或者apply_id不为空的时候，可选填；其他情况必填。
     * @return userId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2088399922382233", value = "支付宝用户userId，当发送红字发票时，即invoice_type＝RED时，可选填；或者apply_id不为空的时候，可选填；其他情况必填。")
  
    public String getUserId() {
      return userId;
    }
  
  
    public void setUserId(String userId) {
      this.userId = userId;
    }
  
    /**
     * A container for additional, undeclared properties.
     * This is a holder for any undeclared properties as specified with
     * the 'additionalProperties' keyword in the OAS document.
     */
    private Map<String, Object> additionalProperties;
  
    /**
     * Set the additional (undeclared) property with the specified name and value.
     * If the property does not already exist, create it otherwise replace it.
     *
     * @param key name of the property
     * @param value value of the property
     * @return the InvoiceSendOpenModel instance itself
     */
    public InvoiceSendOpenModel putAdditionalProperty(String key, Object value) {
      if (this.additionalProperties == null) {
          this.additionalProperties = new HashMap<String, Object>();
      }
      this.additionalProperties.put(key, value);
      return this;
    }
  
    /**
     * Return the additional (undeclared) property.
     *
     * @return a map of objects
     */
    public Map<String, Object> getAdditionalProperties() {
      return additionalProperties;
    }
  
    /**
     * Return the additional (undeclared) property with the specified name.
     *
     * @param key name of the property
     * @return an object
     */
    public Object getAdditionalProperty(String key) {
      if (this.additionalProperties == null) {
          return null;
      }
      return this.additionalProperties.get(key);
    }
  
  
    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      InvoiceSendOpenModel invoiceSendOpenModel = (InvoiceSendOpenModel) o;
      return Objects.equals(this.applyId, invoiceSendOpenModel.applyId) &&
          Objects.equals(this.checkCode, invoiceSendOpenModel.checkCode) &&
          Objects.equals(this.checker, invoiceSendOpenModel.checker) &&
          Objects.equals(this.clerk, invoiceSendOpenModel.clerk) &&
          Objects.equals(this.exTaxAmount, invoiceSendOpenModel.exTaxAmount) &&
          Objects.equals(this.extendFields, invoiceSendOpenModel.extendFields) &&
          Objects.equals(this.fileDownloadType, invoiceSendOpenModel.fileDownloadType) &&
          Objects.equals(this.fileDownloadUrl, invoiceSendOpenModel.fileDownloadUrl) &&
          Objects.equals(this.financialElectronicType, invoiceSendOpenModel.financialElectronicType) &&
          Objects.equals(this.invoiceCode, invoiceSendOpenModel.invoiceCode) &&
          Objects.equals(this.invoiceContent, invoiceSendOpenModel.invoiceContent) &&
          Objects.equals(this.invoiceDate, invoiceSendOpenModel.invoiceDate) &&
          Objects.equals(this.invoiceKind, invoiceSendOpenModel.invoiceKind) &&
          Objects.equals(this.invoiceMemo, invoiceSendOpenModel.invoiceMemo) &&
          Objects.equals(this.invoiceNo, invoiceSendOpenModel.invoiceNo) &&
          Objects.equals(this.invoiceTitle, invoiceSendOpenModel.invoiceTitle) &&
          Objects.equals(this.invoiceType, invoiceSendOpenModel.invoiceType) &&
          Objects.equals(this.openId, invoiceSendOpenModel.openId) &&
          Objects.equals(this.oriBlueInvCode, invoiceSendOpenModel.oriBlueInvCode) &&
          Objects.equals(this.oriBlueInvNo, invoiceSendOpenModel.oriBlueInvNo) &&
          Objects.equals(this.outInvoiceId, invoiceSendOpenModel.outInvoiceId) &&
          Objects.equals(this.outTradeNo, invoiceSendOpenModel.outTradeNo) &&
          Objects.equals(this.payee, invoiceSendOpenModel.payee) &&
          Objects.equals(this.payeeAddressTel, invoiceSendOpenModel.payeeAddressTel) &&
          Objects.equals(this.payeeBankNameAccount, invoiceSendOpenModel.payeeBankNameAccount) &&
          Objects.equals(this.payeeRegisterName, invoiceSendOpenModel.payeeRegisterName) &&
          Objects.equals(this.payeeRegisterNo, invoiceSendOpenModel.payeeRegisterNo) &&
          Objects.equals(this.sumAmount, invoiceSendOpenModel.sumAmount) &&
          Objects.equals(this.taxAmount, invoiceSendOpenModel.taxAmount) &&
          Objects.equals(this.tradeList, invoiceSendOpenModel.tradeList) &&
          Objects.equals(this.userId, invoiceSendOpenModel.userId)&&
          Objects.equals(this.additionalProperties, invoiceSendOpenModel.additionalProperties);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(applyId, checkCode, checker, clerk, exTaxAmount, extendFields, fileDownloadType, fileDownloadUrl, financialElectronicType, invoiceCode, invoiceContent, invoiceDate, invoiceKind, invoiceMemo, invoiceNo, invoiceTitle, invoiceType, openId, oriBlueInvCode, oriBlueInvNo, outInvoiceId, outTradeNo, payee, payeeAddressTel, payeeBankNameAccount, payeeRegisterName, payeeRegisterNo, sumAmount, taxAmount, tradeList, userId, additionalProperties);
    }
  
    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append("class InvoiceSendOpenModel {\n");
      sb.append("    applyId: ").append(toIndentedString(applyId)).append("\n");
      sb.append("    checkCode: ").append(toIndentedString(checkCode)).append("\n");
      sb.append("    checker: ").append(toIndentedString(checker)).append("\n");
      sb.append("    clerk: ").append(toIndentedString(clerk)).append("\n");
      sb.append("    exTaxAmount: ").append(toIndentedString(exTaxAmount)).append("\n");
      sb.append("    extendFields: ").append(toIndentedString(extendFields)).append("\n");
      sb.append("    fileDownloadType: ").append(toIndentedString(fileDownloadType)).append("\n");
      sb.append("    fileDownloadUrl: ").append(toIndentedString(fileDownloadUrl)).append("\n");
      sb.append("    financialElectronicType: ").append(toIndentedString(financialElectronicType)).append("\n");
      sb.append("    invoiceCode: ").append(toIndentedString(invoiceCode)).append("\n");
      sb.append("    invoiceContent: ").append(toIndentedString(invoiceContent)).append("\n");
      sb.append("    invoiceDate: ").append(toIndentedString(invoiceDate)).append("\n");
      sb.append("    invoiceKind: ").append(toIndentedString(invoiceKind)).append("\n");
      sb.append("    invoiceMemo: ").append(toIndentedString(invoiceMemo)).append("\n");
      sb.append("    invoiceNo: ").append(toIndentedString(invoiceNo)).append("\n");
      sb.append("    invoiceTitle: ").append(toIndentedString(invoiceTitle)).append("\n");
      sb.append("    invoiceType: ").append(toIndentedString(invoiceType)).append("\n");
      sb.append("    openId: ").append(toIndentedString(openId)).append("\n");
      sb.append("    oriBlueInvCode: ").append(toIndentedString(oriBlueInvCode)).append("\n");
      sb.append("    oriBlueInvNo: ").append(toIndentedString(oriBlueInvNo)).append("\n");
      sb.append("    outInvoiceId: ").append(toIndentedString(outInvoiceId)).append("\n");
      sb.append("    outTradeNo: ").append(toIndentedString(outTradeNo)).append("\n");
      sb.append("    payee: ").append(toIndentedString(payee)).append("\n");
      sb.append("    payeeAddressTel: ").append(toIndentedString(payeeAddressTel)).append("\n");
      sb.append("    payeeBankNameAccount: ").append(toIndentedString(payeeBankNameAccount)).append("\n");
      sb.append("    payeeRegisterName: ").append(toIndentedString(payeeRegisterName)).append("\n");
      sb.append("    payeeRegisterNo: ").append(toIndentedString(payeeRegisterNo)).append("\n");
      sb.append("    sumAmount: ").append(toIndentedString(sumAmount)).append("\n");
      sb.append("    taxAmount: ").append(toIndentedString(taxAmount)).append("\n");
      sb.append("    tradeList: ").append(toIndentedString(tradeList)).append("\n");
      sb.append("    userId: ").append(toIndentedString(userId)).append("\n");
      sb.append("    additionalProperties: ").append(toIndentedString(additionalProperties)).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    ");
    }
  
  
    public static HashSet<String> openapiFields;
    public static HashSet<String> openapiRequiredFields;
  
    static {
      // a set of all properties/fields (JSON key names)
      openapiFields = new HashSet<String>();
      openapiFields.add("apply_id");
      openapiFields.add("check_code");
      openapiFields.add("checker");
      openapiFields.add("clerk");
      openapiFields.add("ex_tax_amount");
      openapiFields.add("extend_fields");
      openapiFields.add("file_download_type");
      openapiFields.add("file_download_url");
      openapiFields.add("financial_electronic_type");
      openapiFields.add("invoice_code");
      openapiFields.add("invoice_content");
      openapiFields.add("invoice_date");
      openapiFields.add("invoice_kind");
      openapiFields.add("invoice_memo");
      openapiFields.add("invoice_no");
      openapiFields.add("invoice_title");
      openapiFields.add("invoice_type");
      openapiFields.add("open_id");
      openapiFields.add("ori_blue_inv_code");
      openapiFields.add("ori_blue_inv_no");
      openapiFields.add("out_invoice_id");
      openapiFields.add("out_trade_no");
      openapiFields.add("payee");
      openapiFields.add("payee_address_tel");
      openapiFields.add("payee_bank_name_account");
      openapiFields.add("payee_register_name");
      openapiFields.add("payee_register_no");
      openapiFields.add("sum_amount");
      openapiFields.add("tax_amount");
      openapiFields.add("trade_list");
      openapiFields.add("user_id");
  
      // a set of required properties/fields (JSON key names)
      openapiRequiredFields = new HashSet<String>();
    }
  
   /**
    * Validates the JSON Object and throws an exception if issues found
    *
    * @param jsonObj JSON Object
    * @throws IOException if the JSON Object is invalid with respect to InvoiceSendOpenModel
    */
    public static void validateJsonObject(JsonObject jsonObj) throws IOException {
        if (jsonObj == null) {
          if (InvoiceSendOpenModel.openapiRequiredFields.isEmpty()) {
            return;
          } else { // has required fields
            throw new IllegalArgumentException(String.format("The required field(s) %s in InvoiceSendOpenModel is not found in the empty JSON string", InvoiceSendOpenModel.openapiRequiredFields.toString()));
          }
        }
        if (jsonObj.get("apply_id") != null && !jsonObj.get("apply_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `apply_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("apply_id").toString()));
        }
        if (jsonObj.get("check_code") != null && !jsonObj.get("check_code").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `check_code` to be a primitive type in the JSON string but got `%s`", jsonObj.get("check_code").toString()));
        }
        if (jsonObj.get("checker") != null && !jsonObj.get("checker").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `checker` to be a primitive type in the JSON string but got `%s`", jsonObj.get("checker").toString()));
        }
        if (jsonObj.get("clerk") != null && !jsonObj.get("clerk").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `clerk` to be a primitive type in the JSON string but got `%s`", jsonObj.get("clerk").toString()));
        }
        if (jsonObj.get("ex_tax_amount") != null && !jsonObj.get("ex_tax_amount").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ex_tax_amount` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ex_tax_amount").toString()));
        }
        if (jsonObj.get("extend_fields") != null && !jsonObj.get("extend_fields").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `extend_fields` to be a primitive type in the JSON string but got `%s`", jsonObj.get("extend_fields").toString()));
        }
        if (jsonObj.get("file_download_type") != null && !jsonObj.get("file_download_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `file_download_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("file_download_type").toString()));
        }
        if (jsonObj.get("file_download_url") != null && !jsonObj.get("file_download_url").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `file_download_url` to be a primitive type in the JSON string but got `%s`", jsonObj.get("file_download_url").toString()));
        }
        if (jsonObj.get("financial_electronic_type") != null && !jsonObj.get("financial_electronic_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `financial_electronic_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("financial_electronic_type").toString()));
        }
        if (jsonObj.get("invoice_code") != null && !jsonObj.get("invoice_code").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_code` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_code").toString()));
        }
        JsonArray jsonArrayinvoiceContent = jsonObj.getAsJsonArray("invoice_content");
        if (jsonArrayinvoiceContent != null) {
          // ensure the json data is an array
          if (!jsonObj.get("invoice_content").isJsonArray()) {
            throw new IllegalArgumentException(String.format("Expected the field `invoice_content` to be an array in the JSON string but got `%s`", jsonObj.get("invoice_content").toString()));
          }
  
          // validate the optional field `invoice_content` (array)
          for (int i = 0; i < jsonArrayinvoiceContent.size(); i++) {
            InvoiceItemOpenModel.validateJsonObject(jsonArrayinvoiceContent.get(i).getAsJsonObject());
          };
        }
        if (jsonObj.get("invoice_date") != null && !jsonObj.get("invoice_date").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_date` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_date").toString()));
        }
        if (jsonObj.get("invoice_kind") != null && !jsonObj.get("invoice_kind").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_kind` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_kind").toString()));
        }
        if (jsonObj.get("invoice_memo") != null && !jsonObj.get("invoice_memo").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_memo` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_memo").toString()));
        }
        if (jsonObj.get("invoice_no") != null && !jsonObj.get("invoice_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_no").toString()));
        }
        // validate the optional field `invoice_title`
        if (jsonObj.getAsJsonObject("invoice_title") != null) {
          InvoiceTitleOpenModel.validateJsonObject(jsonObj.getAsJsonObject("invoice_title"));
        }
        if (jsonObj.get("invoice_type") != null && !jsonObj.get("invoice_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `invoice_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("invoice_type").toString()));
        }
        if (jsonObj.get("open_id") != null && !jsonObj.get("open_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `open_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("open_id").toString()));
        }
        if (jsonObj.get("ori_blue_inv_code") != null && !jsonObj.get("ori_blue_inv_code").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ori_blue_inv_code` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ori_blue_inv_code").toString()));
        }
        if (jsonObj.get("ori_blue_inv_no") != null && !jsonObj.get("ori_blue_inv_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ori_blue_inv_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ori_blue_inv_no").toString()));
        }
        if (jsonObj.get("out_invoice_id") != null && !jsonObj.get("out_invoice_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `out_invoice_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("out_invoice_id").toString()));
        }
        if (jsonObj.get("out_trade_no") != null && !jsonObj.get("out_trade_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `out_trade_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("out_trade_no").toString()));
        }
        if (jsonObj.get("payee") != null && !jsonObj.get("payee").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee").toString()));
        }
        if (jsonObj.get("payee_address_tel") != null && !jsonObj.get("payee_address_tel").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee_address_tel` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee_address_tel").toString()));
        }
        if (jsonObj.get("payee_bank_name_account") != null && !jsonObj.get("payee_bank_name_account").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee_bank_name_account` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee_bank_name_account").toString()));
        }
        if (jsonObj.get("payee_register_name") != null && !jsonObj.get("payee_register_name").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee_register_name` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee_register_name").toString()));
        }
        if (jsonObj.get("payee_register_no") != null && !jsonObj.get("payee_register_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee_register_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee_register_no").toString()));
        }
        if (jsonObj.get("sum_amount") != null && !jsonObj.get("sum_amount").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `sum_amount` to be a primitive type in the JSON string but got `%s`", jsonObj.get("sum_amount").toString()));
        }
        if (jsonObj.get("tax_amount") != null && !jsonObj.get("tax_amount").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `tax_amount` to be a primitive type in the JSON string but got `%s`", jsonObj.get("tax_amount").toString()));
        }
        JsonArray jsonArraytradeList = jsonObj.getAsJsonArray("trade_list");
        if (jsonArraytradeList != null) {
          // ensure the json data is an array
          if (!jsonObj.get("trade_list").isJsonArray()) {
            throw new IllegalArgumentException(String.format("Expected the field `trade_list` to be an array in the JSON string but got `%s`", jsonObj.get("trade_list").toString()));
          }
  
          // validate the optional field `trade_list` (array)
          for (int i = 0; i < jsonArraytradeList.size(); i++) {
            EinvTrade.validateJsonObject(jsonArraytradeList.get(i).getAsJsonObject());
          };
        }
        if (jsonObj.get("user_id") != null && !jsonObj.get("user_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `user_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("user_id").toString()));
        }
    }
  
    public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
      @SuppressWarnings("unchecked")
      @Override
      public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
         if (!InvoiceSendOpenModel.class.isAssignableFrom(type.getRawType())) {
           return null; // this class only serializes 'InvoiceSendOpenModel' and its subtypes
         }
         final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
         final TypeAdapter<InvoiceSendOpenModel> thisAdapter
                          = gson.getDelegateAdapter(this, TypeToken.get(InvoiceSendOpenModel.class));
  
         return (TypeAdapter<T>) new TypeAdapter<InvoiceSendOpenModel>() {
             @Override
             public void write(JsonWriter out, InvoiceSendOpenModel value) throws IOException {
               JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject();
               obj.remove("additionalProperties");
               // serialize additonal properties
               if (value.getAdditionalProperties() != null) {
                 for (Map.Entry<String, Object> entry : value.getAdditionalProperties().entrySet()) {
                   if (entry.getValue() instanceof String)
                     obj.addProperty(entry.getKey(), (String) entry.getValue());
                   else if (entry.getValue() instanceof Number)
                     obj.addProperty(entry.getKey(), (Number) entry.getValue());
                   else if (entry.getValue() instanceof Boolean)
                     obj.addProperty(entry.getKey(), (Boolean) entry.getValue());
                   else if (entry.getValue() instanceof Character)
                     obj.addProperty(entry.getKey(), (Character) entry.getValue());
                   else {
                     obj.add(entry.getKey(), gson.toJsonTree(entry.getValue()).getAsJsonObject());
                   }
                 }
               }
               elementAdapter.write(out, obj);
             }
  
             @Override
             public InvoiceSendOpenModel read(JsonReader in) throws IOException {
               JsonObject jsonObj = elementAdapter.read(in).getAsJsonObject();
               validateJsonObject(jsonObj);
               // store additional fields in the deserialized instance
               InvoiceSendOpenModel instance = thisAdapter.fromJsonTree(jsonObj);
               for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
                 if (!openapiFields.contains(entry.getKey())) {
                   if (entry.getValue().isJsonPrimitive()) { // primitive type
                     if (entry.getValue().getAsJsonPrimitive().isString())
                       instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsString());
                     else if (entry.getValue().getAsJsonPrimitive().isNumber())
                       instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsNumber());
                     else if (entry.getValue().getAsJsonPrimitive().isBoolean())
                       instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsBoolean());
                     else
                       throw new IllegalArgumentException(String.format("The field `%s` has unknown primitive type. Value: %s", entry.getKey(), entry.getValue().toString()));
                   } else { // non-primitive type
                     instance.putAdditionalProperty(entry.getKey(), gson.fromJson(entry.getValue(), HashMap.class));
                   }
                 }
               }
               return instance;
             }
  
         }.nullSafe();
      }
    }
  
   /**
    * Create an instance of InvoiceSendOpenModel given an JSON string
    *
    * @param jsonString JSON string
    * @return An instance of InvoiceSendOpenModel
    * @throws IOException if the JSON string is invalid with respect to InvoiceSendOpenModel
    */
    public static InvoiceSendOpenModel fromJson(String jsonString) throws IOException {
      return JSON.getGson().fromJson(jsonString, InvoiceSendOpenModel.class);
    }
  
   /**
    * Convert an instance of InvoiceSendOpenModel to an JSON string
    *
    * @return JSON string
    */
    public String toJson() {
      return JSON.getGson().toJson(this);
    }
  }
  
  