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.MultiCurrencyMoneyOpenApi;
  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 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;
  
  /**
   * ArMonthlyBillDTO
   */
  @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen")
  public class ArMonthlyBillDTO {
    public static final String SERIALIZED_NAME_ACCOUNT_DAY = "account_day";
    @SerializedName(SERIALIZED_NAME_ACCOUNT_DAY)
    private String accountDay;
  
    public static final String SERIALIZED_NAME_ACCRUED_DATE = "accrued_date";
    @SerializedName(SERIALIZED_NAME_ACCRUED_DATE)
    private String accruedDate;
  
    public static final String SERIALIZED_NAME_ADJUST_AMT = "adjust_amt";
    @SerializedName(SERIALIZED_NAME_ADJUST_AMT)
    private MultiCurrencyMoneyOpenApi adjustAmt;
  
    public static final String SERIALIZED_NAME_ANALYSIS_DMSN1 = "analysis_dmsn_1";
    @SerializedName(SERIALIZED_NAME_ANALYSIS_DMSN1)
    private String analysisDmsn1;
  
    public static final String SERIALIZED_NAME_ANALYSIS_DMSN2 = "analysis_dmsn_2";
    @SerializedName(SERIALIZED_NAME_ANALYSIS_DMSN2)
    private String analysisDmsn2;
  
    public static final String SERIALIZED_NAME_ANALYSIS_DMSN3 = "analysis_dmsn_3";
    @SerializedName(SERIALIZED_NAME_ANALYSIS_DMSN3)
    private String analysisDmsn3;
  
    public static final String SERIALIZED_NAME_ANALYSIS_DMSN4 = "analysis_dmsn_4";
    @SerializedName(SERIALIZED_NAME_ANALYSIS_DMSN4)
    private String analysisDmsn4;
  
    public static final String SERIALIZED_NAME_ARRANGEMENT_NO = "arrangement_no";
    @SerializedName(SERIALIZED_NAME_ARRANGEMENT_NO)
    private String arrangementNo;
  
    public static final String SERIALIZED_NAME_BILL_AMT = "bill_amt";
    @SerializedName(SERIALIZED_NAME_BILL_AMT)
    private MultiCurrencyMoneyOpenApi billAmt;
  
    public static final String SERIALIZED_NAME_BILL_END_DATE = "bill_end_date";
    @SerializedName(SERIALIZED_NAME_BILL_END_DATE)
    private String billEndDate;
  
    public static final String SERIALIZED_NAME_BILL_MONTH = "bill_month";
    @SerializedName(SERIALIZED_NAME_BILL_MONTH)
    private String billMonth;
  
    public static final String SERIALIZED_NAME_BILL_NO = "bill_no";
    @SerializedName(SERIALIZED_NAME_BILL_NO)
    private String billNo;
  
    public static final String SERIALIZED_NAME_BILL_START_DATE = "bill_start_date";
    @SerializedName(SERIALIZED_NAME_BILL_START_DATE)
    private String billStartDate;
  
    public static final String SERIALIZED_NAME_BILL_TYPE = "bill_type";
    @SerializedName(SERIALIZED_NAME_BILL_TYPE)
    private String billType;
  
    public static final String SERIALIZED_NAME_CHARGE_ITEM_CODE = "charge_item_code";
    @SerializedName(SERIALIZED_NAME_CHARGE_ITEM_CODE)
    private String chargeItemCode;
  
    public static final String SERIALIZED_NAME_CHARGE_TYPE = "charge_type";
    @SerializedName(SERIALIZED_NAME_CHARGE_TYPE)
    private String chargeType;
  
    public static final String SERIALIZED_NAME_CHECK_STATUS = "check_status";
    @SerializedName(SERIALIZED_NAME_CHECK_STATUS)
    private String checkStatus;
  
    public static final String SERIALIZED_NAME_CHECKED_AMT = "checked_amt";
    @SerializedName(SERIALIZED_NAME_CHECKED_AMT)
    private MultiCurrencyMoneyOpenApi checkedAmt;
  
    public static final String SERIALIZED_NAME_CHECKING_AMT = "checking_amt";
    @SerializedName(SERIALIZED_NAME_CHECKING_AMT)
    private MultiCurrencyMoneyOpenApi checkingAmt;
  
    public static final String SERIALIZED_NAME_CLCN_BASIC_AMT = "clcn_basic_amt";
    @SerializedName(SERIALIZED_NAME_CLCN_BASIC_AMT)
    private Integer clcnBasicAmt;
  
    public static final String SERIALIZED_NAME_CLCN_BASIC_TYPE = "clcn_basic_type";
    @SerializedName(SERIALIZED_NAME_CLCN_BASIC_TYPE)
    private String clcnBasicType;
  
    public static final String SERIALIZED_NAME_CLCN_METHOD = "clcn_method";
    @SerializedName(SERIALIZED_NAME_CLCN_METHOD)
    private String clcnMethod;
  
    public static final String SERIALIZED_NAME_FREEZE_AMT = "freeze_amt";
    @SerializedName(SERIALIZED_NAME_FREEZE_AMT)
    private MultiCurrencyMoneyOpenApi freezeAmt;
  
    public static final String SERIALIZED_NAME_GMT_CREATE = "gmt_create";
    @SerializedName(SERIALIZED_NAME_GMT_CREATE)
    private String gmtCreate;
  
    public static final String SERIALIZED_NAME_GMT_MODIFIED = "gmt_modified";
    @SerializedName(SERIALIZED_NAME_GMT_MODIFIED)
    private String gmtModified;
  
    public static final String SERIALIZED_NAME_GMT_PAY = "gmt_pay";
    @SerializedName(SERIALIZED_NAME_GMT_PAY)
    private String gmtPay;
  
    public static final String SERIALIZED_NAME_INST_ID = "inst_id";
    @SerializedName(SERIALIZED_NAME_INST_ID)
    private String instId;
  
    public static final String SERIALIZED_NAME_INVOICE_AMT = "invoice_amt";
    @SerializedName(SERIALIZED_NAME_INVOICE_AMT)
    private MultiCurrencyMoneyOpenApi invoiceAmt;
  
    public static final String SERIALIZED_NAME_INVOICED_AMT = "invoiced_amt";
    @SerializedName(SERIALIZED_NAME_INVOICED_AMT)
    private MultiCurrencyMoneyOpenApi invoicedAmt;
  
    public static final String SERIALIZED_NAME_IP_ID = "ip_id";
    @SerializedName(SERIALIZED_NAME_IP_ID)
    private String ipId;
  
    public static final String SERIALIZED_NAME_IP_NAME = "ip_name";
    @SerializedName(SERIALIZED_NAME_IP_NAME)
    private String ipName;
  
    public static final String SERIALIZED_NAME_IP_ROLE_ID = "ip_role_id";
    @SerializedName(SERIALIZED_NAME_IP_ROLE_ID)
    private String ipRoleId;
  
    public static final String SERIALIZED_NAME_LAST_MODER = "last_moder";
    @SerializedName(SERIALIZED_NAME_LAST_MODER)
    private String lastModer;
  
    public static final String SERIALIZED_NAME_LINK_INVOICE_AMT = "link_invoice_amt";
    @SerializedName(SERIALIZED_NAME_LINK_INVOICE_AMT)
    private MultiCurrencyMoneyOpenApi linkInvoiceAmt;
  
    public static final String SERIALIZED_NAME_PAY_ORIGINAL = "pay_original";
    @SerializedName(SERIALIZED_NAME_PAY_ORIGINAL)
    private String payOriginal;
  
    public static final String SERIALIZED_NAME_PAY_STATUS = "pay_status";
    @SerializedName(SERIALIZED_NAME_PAY_STATUS)
    private String payStatus;
  
    public static final String SERIALIZED_NAME_PAY_WAY = "pay_way";
    @SerializedName(SERIALIZED_NAME_PAY_WAY)
    private String payWay;
  
    public static final String SERIALIZED_NAME_PAYEE_ACCOUNT = "payee_account";
    @SerializedName(SERIALIZED_NAME_PAYEE_ACCOUNT)
    private String payeeAccount;
  
    public static final String SERIALIZED_NAME_PAYER_ACCOUNT = "payer_account";
    @SerializedName(SERIALIZED_NAME_PAYER_ACCOUNT)
    private String payerAccount;
  
    public static final String SERIALIZED_NAME_PAYER_IP_ROLE_ID = "payer_ip_role_id";
    @SerializedName(SERIALIZED_NAME_PAYER_IP_ROLE_ID)
    private String payerIpRoleId;
  
    public static final String SERIALIZED_NAME_PROD_CODE = "prod_code";
    @SerializedName(SERIALIZED_NAME_PROD_CODE)
    private String prodCode;
  
    public static final String SERIALIZED_NAME_RECEIVED_AMT = "received_amt";
    @SerializedName(SERIALIZED_NAME_RECEIVED_AMT)
    private MultiCurrencyMoneyOpenApi receivedAmt;
  
    public static final String SERIALIZED_NAME_RECORD_ID = "record_id";
    @SerializedName(SERIALIZED_NAME_RECORD_ID)
    private String recordId;
  
    public static final String SERIALIZED_NAME_SERVICE_AMT = "service_amt";
    @SerializedName(SERIALIZED_NAME_SERVICE_AMT)
    private MultiCurrencyMoneyOpenApi serviceAmt;
  
    public static final String SERIALIZED_NAME_SETTLE_TYPE = "settle_type";
    @SerializedName(SERIALIZED_NAME_SETTLE_TYPE)
    private String settleType;
  
    public static final String SERIALIZED_NAME_SIGN_IP_ID = "sign_ip_id";
    @SerializedName(SERIALIZED_NAME_SIGN_IP_ID)
    private String signIpId;
  
    public static final String SERIALIZED_NAME_SIGN_IP_ROLE_ID = "sign_ip_role_id";
    @SerializedName(SERIALIZED_NAME_SIGN_IP_ROLE_ID)
    private String signIpRoleId;
  
    public static final String SERIALIZED_NAME_STL_IP_ROLE_ID = "stl_ip_role_id";
    @SerializedName(SERIALIZED_NAME_STL_IP_ROLE_ID)
    private String stlIpRoleId;
  
    public static final String SERIALIZED_NAME_TAX_AMT = "tax_amt";
    @SerializedName(SERIALIZED_NAME_TAX_AMT)
    private MultiCurrencyMoneyOpenApi taxAmt;
  
    public static final String SERIALIZED_NAME_TAX_RATE = "tax_rate";
    @SerializedName(SERIALIZED_NAME_TAX_RATE)
    private Integer taxRate;
  
    public static final String SERIALIZED_NAME_TAX_TYPE = "tax_type";
    @SerializedName(SERIALIZED_NAME_TAX_TYPE)
    private String taxType;
  
    public static final String SERIALIZED_NAME_TO_WRITEOFF_DETAIL_COUNT = "to_writeoff_detail_count";
    @SerializedName(SERIALIZED_NAME_TO_WRITEOFF_DETAIL_COUNT)
    private Integer toWriteoffDetailCount;
  
    public static final String SERIALIZED_NAME_TYPE = "type";
    @SerializedName(SERIALIZED_NAME_TYPE)
    private String type;
  
    public static final String SERIALIZED_NAME_WRITEOFF_DETAIL_DOUNT = "writeoff_detail_dount";
    @SerializedName(SERIALIZED_NAME_WRITEOFF_DETAIL_DOUNT)
    private Integer writeoffDetailDount;
  
    public static final String SERIALIZED_NAME_WRITINGOFF_AMT = "writingoff_amt";
    @SerializedName(SERIALIZED_NAME_WRITINGOFF_AMT)
    private MultiCurrencyMoneyOpenApi writingoffAmt;
  
    public ArMonthlyBillDTO() { 
    }
  
    public ArMonthlyBillDTO accountDay(String accountDay) {
      
      this.accountDay = accountDay;
      return this;
    }
  
     /**
     * 出账日
     * @return accountDay
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20180723", value = "出账日")
  
    public String getAccountDay() {
      return accountDay;
    }
  
  
    public void setAccountDay(String accountDay) {
      this.accountDay = accountDay;
    }
  
  
    public ArMonthlyBillDTO accruedDate(String accruedDate) {
      
      this.accruedDate = accruedDate;
      return this;
    }
  
     /**
     * 应收日期(yyyyMMdd)
     * @return accruedDate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20180723", value = "应收日期(yyyyMMdd)")
  
    public String getAccruedDate() {
      return accruedDate;
    }
  
  
    public void setAccruedDate(String accruedDate) {
      this.accruedDate = accruedDate;
    }
  
  
    public ArMonthlyBillDTO adjustAmt(MultiCurrencyMoneyOpenApi adjustAmt) {
      
      this.adjustAmt = adjustAmt;
      return this;
    }
  
     /**
     * Get adjustAmt
     * @return adjustAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getAdjustAmt() {
      return adjustAmt;
    }
  
  
    public void setAdjustAmt(MultiCurrencyMoneyOpenApi adjustAmt) {
      this.adjustAmt = adjustAmt;
    }
  
  
    public ArMonthlyBillDTO analysisDmsn1(String analysisDmsn1) {
      
      this.analysisDmsn1 = analysisDmsn1;
      return this;
    }
  
     /**
     * 分析维度1
     * @return analysisDmsn1
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "biz_pd_code=G1010100100000000004", value = "分析维度1")
  
    public String getAnalysisDmsn1() {
      return analysisDmsn1;
    }
  
  
    public void setAnalysisDmsn1(String analysisDmsn1) {
      this.analysisDmsn1 = analysisDmsn1;
    }
  
  
    public ArMonthlyBillDTO analysisDmsn2(String analysisDmsn2) {
      
      this.analysisDmsn2 = analysisDmsn2;
      return this;
    }
  
     /**
     * 分析维度2
     * @return analysisDmsn2
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "recon_inst=V_F51_SZBK", value = "分析维度2")
  
    public String getAnalysisDmsn2() {
      return analysisDmsn2;
    }
  
  
    public void setAnalysisDmsn2(String analysisDmsn2) {
      this.analysisDmsn2 = analysisDmsn2;
    }
  
  
    public ArMonthlyBillDTO analysisDmsn3(String analysisDmsn3) {
      
      this.analysisDmsn3 = analysisDmsn3;
      return this;
    }
  
     /**
     * 分析维度3
     * @return analysisDmsn3
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "payer_inst_code=SZBK", value = "分析维度3")
  
    public String getAnalysisDmsn3() {
      return analysisDmsn3;
    }
  
  
    public void setAnalysisDmsn3(String analysisDmsn3) {
      this.analysisDmsn3 = analysisDmsn3;
    }
  
  
    public ArMonthlyBillDTO analysisDmsn4(String analysisDmsn4) {
      
      this.analysisDmsn4 = analysisDmsn4;
      return this;
    }
  
     /**
     * 分析维度4
     * @return analysisDmsn4
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "groupIpId=123&groupIpRoleId=def", value = "分析维度4")
  
    public String getAnalysisDmsn4() {
      return analysisDmsn4;
    }
  
  
    public void setAnalysisDmsn4(String analysisDmsn4) {
      this.analysisDmsn4 = analysisDmsn4;
    }
  
  
    public ArMonthlyBillDTO arrangementNo(String arrangementNo) {
      
      this.arrangementNo = arrangementNo;
      return this;
    }
  
     /**
     * 合约号，商户签约产品对应的合约号
     * @return arrangementNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20180321I1019001104967771632", value = "合约号，商户签约产品对应的合约号")
  
    public String getArrangementNo() {
      return arrangementNo;
    }
  
  
    public void setArrangementNo(String arrangementNo) {
      this.arrangementNo = arrangementNo;
    }
  
  
    public ArMonthlyBillDTO billAmt(MultiCurrencyMoneyOpenApi billAmt) {
      
      this.billAmt = billAmt;
      return this;
    }
  
     /**
     * Get billAmt
     * @return billAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getBillAmt() {
      return billAmt;
    }
  
  
    public void setBillAmt(MultiCurrencyMoneyOpenApi billAmt) {
      this.billAmt = billAmt;
    }
  
  
    public ArMonthlyBillDTO billEndDate(String billEndDate) {
      
      this.billEndDate = billEndDate;
      return this;
    }
  
     /**
     * 账单结束日期
     * @return billEndDate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20180723", value = "账单结束日期")
  
    public String getBillEndDate() {
      return billEndDate;
    }
  
  
    public void setBillEndDate(String billEndDate) {
      this.billEndDate = billEndDate;
    }
  
  
    public ArMonthlyBillDTO billMonth(String billMonth) {
      
      this.billMonth = billMonth;
      return this;
    }
  
     /**
     * 账单月
     * @return billMonth
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "201807", value = "账单月")
  
    public String getBillMonth() {
      return billMonth;
    }
  
  
    public void setBillMonth(String billMonth) {
      this.billMonth = billMonth;
    }
  
  
    public ArMonthlyBillDTO billNo(String billNo) {
      
      this.billNo = billNo;
      return this;
    }
  
     /**
     * 月账单号,唯一标识月账单的ID
     * @return billNo
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2016092910122000040400930000000001", value = "月账单号,唯一标识月账单的ID")
  
    public String getBillNo() {
      return billNo;
    }
  
  
    public void setBillNo(String billNo) {
      this.billNo = billNo;
    }
  
  
    public ArMonthlyBillDTO billStartDate(String billStartDate) {
      
      this.billStartDate = billStartDate;
      return this;
    }
  
     /**
     * 账单开始日期
     * @return billStartDate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20180723", value = "账单开始日期")
  
    public String getBillStartDate() {
      return billStartDate;
    }
  
  
    public void setBillStartDate(String billStartDate) {
      this.billStartDate = billStartDate;
    }
  
  
    public ArMonthlyBillDTO billType(String billType) {
      
      this.billType = billType;
      return this;
    }
  
     /**
     * 账单类型  21：应收月账单  目前仅支持该类型的账单类型
     * @return billType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "21", value = "账单类型  21：应收月账单  目前仅支持该类型的账单类型")
  
    public String getBillType() {
      return billType;
    }
  
  
    public void setBillType(String billType) {
      this.billType = billType;
    }
  
  
    public ArMonthlyBillDTO chargeItemCode(String chargeItemCode) {
      
      this.chargeItemCode = chargeItemCode;
      return this;
    }
  
     /**
     * 收费项编码
     * @return chargeItemCode
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "CREDIT_QUERY_FEE", value = "收费项编码")
  
    public String getChargeItemCode() {
      return chargeItemCode;
    }
  
  
    public void setChargeItemCode(String chargeItemCode) {
      this.chargeItemCode = chargeItemCode;
    }
  
  
    public ArMonthlyBillDTO chargeType(String chargeType) {
      
      this.chargeType = chargeType;
      return this;
    }
  
     /**
     * 计费类型  01：云在线计费，02：离线计费，03：老主站计收费，04：芝麻在线计收费
     * @return chargeType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "01", value = "计费类型  01：云在线计费，02：离线计费，03：老主站计收费，04：芝麻在线计收费")
  
    public String getChargeType() {
      return chargeType;
    }
  
  
    public void setChargeType(String chargeType) {
      this.chargeType = chargeType;
    }
  
  
    public ArMonthlyBillDTO checkStatus(String checkStatus) {
      
      this.checkStatus = checkStatus;
      return this;
    }
  
     /**
     * 出账状态  01：账单生成，02：待确认出账，03：已出账，04：客户已对账，05：对账差异，06：部分出账
     * @return checkStatus
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "03", value = "出账状态  01：账单生成，02：待确认出账，03：已出账，04：客户已对账，05：对账差异，06：部分出账")
  
    public String getCheckStatus() {
      return checkStatus;
    }
  
  
    public void setCheckStatus(String checkStatus) {
      this.checkStatus = checkStatus;
    }
  
  
    public ArMonthlyBillDTO checkedAmt(MultiCurrencyMoneyOpenApi checkedAmt) {
      
      this.checkedAmt = checkedAmt;
      return this;
    }
  
     /**
     * Get checkedAmt
     * @return checkedAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getCheckedAmt() {
      return checkedAmt;
    }
  
  
    public void setCheckedAmt(MultiCurrencyMoneyOpenApi checkedAmt) {
      this.checkedAmt = checkedAmt;
    }
  
  
    public ArMonthlyBillDTO checkingAmt(MultiCurrencyMoneyOpenApi checkingAmt) {
      
      this.checkingAmt = checkingAmt;
      return this;
    }
  
     /**
     * Get checkingAmt
     * @return checkingAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getCheckingAmt() {
      return checkingAmt;
    }
  
  
    public void setCheckingAmt(MultiCurrencyMoneyOpenApi checkingAmt) {
      this.checkingAmt = checkingAmt;
    }
  
  
    public ArMonthlyBillDTO clcnBasicAmt(Integer clcnBasicAmt) {
      
      this.clcnBasicAmt = clcnBasicAmt;
      return this;
    }
  
     /**
     * 计算依据
     * @return clcnBasicAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "100", value = "计算依据")
  
    public Integer getClcnBasicAmt() {
      return clcnBasicAmt;
    }
  
  
    public void setClcnBasicAmt(Integer clcnBasicAmt) {
      this.clcnBasicAmt = clcnBasicAmt;
    }
  
  
    public ArMonthlyBillDTO clcnBasicType(String clcnBasicType) {
      
      this.clcnBasicType = clcnBasicType;
      return this;
    }
  
     /**
     * 计算依据类型  01：交易金额，02：交易笔数，03：交易张数，04：资费依据扩展，05：其他
     * @return clcnBasicType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "01", value = "计算依据类型  01：交易金额，02：交易笔数，03：交易张数，04：资费依据扩展，05：其他")
  
    public String getClcnBasicType() {
      return clcnBasicType;
    }
  
  
    public void setClcnBasicType(String clcnBasicType) {
      this.clcnBasicType = clcnBasicType;
    }
  
  
    public ArMonthlyBillDTO clcnMethod(String clcnMethod) {
      
      this.clcnMethod = clcnMethod;
      return this;
    }
  
     /**
     * 计算方法  01：差额累进，02：全额累进，03：按传入金额收费，04：价格包量，05：包时间周期，06：按时间全额累进，07：包时间周期差额累进，08：期间差额累进，09：期间全额累进，10：包时间周期单笔，11：标准单笔计费，12：包时间周期单笔-按照传入金额计费，13：期间靠档差额累进，靠档计息使用，14：自定义
     * @return clcnMethod
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "02", value = "计算方法  01：差额累进，02：全额累进，03：按传入金额收费，04：价格包量，05：包时间周期，06：按时间全额累进，07：包时间周期差额累进，08：期间差额累进，09：期间全额累进，10：包时间周期单笔，11：标准单笔计费，12：包时间周期单笔-按照传入金额计费，13：期间靠档差额累进，靠档计息使用，14：自定义")
  
    public String getClcnMethod() {
      return clcnMethod;
    }
  
  
    public void setClcnMethod(String clcnMethod) {
      this.clcnMethod = clcnMethod;
    }
  
  
    public ArMonthlyBillDTO freezeAmt(MultiCurrencyMoneyOpenApi freezeAmt) {
      
      this.freezeAmt = freezeAmt;
      return this;
    }
  
     /**
     * Get freezeAmt
     * @return freezeAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getFreezeAmt() {
      return freezeAmt;
    }
  
  
    public void setFreezeAmt(MultiCurrencyMoneyOpenApi freezeAmt) {
      this.freezeAmt = freezeAmt;
    }
  
  
    public ArMonthlyBillDTO gmtCreate(String gmtCreate) {
      
      this.gmtCreate = gmtCreate;
      return this;
    }
  
     /**
     * 创建时间（创建备份时需要）
     * @return gmtCreate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1533039333744", value = "创建时间（创建备份时需要）")
  
    public String getGmtCreate() {
      return gmtCreate;
    }
  
  
    public void setGmtCreate(String gmtCreate) {
      this.gmtCreate = gmtCreate;
    }
  
  
    public ArMonthlyBillDTO gmtModified(String gmtModified) {
      
      this.gmtModified = gmtModified;
      return this;
    }
  
     /**
     * 修改时间（创建备份时需要）
     * @return gmtModified
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1533039333744", value = "修改时间（创建备份时需要）")
  
    public String getGmtModified() {
      return gmtModified;
    }
  
  
    public void setGmtModified(String gmtModified) {
      this.gmtModified = gmtModified;
    }
  
  
    public ArMonthlyBillDTO gmtPay(String gmtPay) {
      
      this.gmtPay = gmtPay;
      return this;
    }
  
     /**
     * 付款时间
     * @return gmtPay
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1533039333744", value = "付款时间")
  
    public String getGmtPay() {
      return gmtPay;
    }
  
  
    public void setGmtPay(String gmtPay) {
      this.gmtPay = gmtPay;
    }
  
  
    public ArMonthlyBillDTO instId(String instId) {
      
      this.instId = instId;
      return this;
    }
  
     /**
     * 分支机构号
     * @return instId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "Z50", value = "分支机构号")
  
    public String getInstId() {
      return instId;
    }
  
  
    public void setInstId(String instId) {
      this.instId = instId;
    }
  
  
    public ArMonthlyBillDTO invoiceAmt(MultiCurrencyMoneyOpenApi invoiceAmt) {
      
      this.invoiceAmt = invoiceAmt;
      return this;
    }
  
     /**
     * Get invoiceAmt
     * @return invoiceAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getInvoiceAmt() {
      return invoiceAmt;
    }
  
  
    public void setInvoiceAmt(MultiCurrencyMoneyOpenApi invoiceAmt) {
      this.invoiceAmt = invoiceAmt;
    }
  
  
    public ArMonthlyBillDTO invoicedAmt(MultiCurrencyMoneyOpenApi invoicedAmt) {
      
      this.invoicedAmt = invoicedAmt;
      return this;
    }
  
     /**
     * Get invoicedAmt
     * @return invoicedAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getInvoicedAmt() {
      return invoicedAmt;
    }
  
  
    public void setInvoicedAmt(MultiCurrencyMoneyOpenApi invoicedAmt) {
      this.invoicedAmt = invoicedAmt;
    }
  
  
    public ArMonthlyBillDTO ipId(String ipId) {
      
      this.ipId = ipId;
      return this;
    }
  
     /**
     * 结算对象参与者标识
     * @return ipId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "17998789", value = "结算对象参与者标识")
  
    public String getIpId() {
      return ipId;
    }
  
  
    public void setIpId(String ipId) {
      this.ipId = ipId;
    }
  
  
    public ArMonthlyBillDTO ipName(String ipName) {
      
      this.ipName = ipName;
      return this;
    }
  
     /**
     * 参与者名字
     * @return ipName
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "ip_name", value = "参与者名字")
  
    public String getIpName() {
      return ipName;
    }
  
  
    public void setIpName(String ipName) {
      this.ipName = ipName;
    }
  
  
    public ArMonthlyBillDTO ipRoleId(String ipRoleId) {
      
      this.ipRoleId = ipRoleId;
      return this;
    }
  
     /**
     * 结算对象参与者角色标识
     * @return ipRoleId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2088421727939934", value = "结算对象参与者角色标识")
  
    public String getIpRoleId() {
      return ipRoleId;
    }
  
  
    public void setIpRoleId(String ipRoleId) {
      this.ipRoleId = ipRoleId;
    }
  
  
    public ArMonthlyBillDTO lastModer(String lastModer) {
      
      this.lastModer = lastModer;
      return this;
    }
  
     /**
     * 最后修改人
     * @return lastModer
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "李某某", value = "最后修改人")
  
    public String getLastModer() {
      return lastModer;
    }
  
  
    public void setLastModer(String lastModer) {
      this.lastModer = lastModer;
    }
  
  
    public ArMonthlyBillDTO linkInvoiceAmt(MultiCurrencyMoneyOpenApi linkInvoiceAmt) {
      
      this.linkInvoiceAmt = linkInvoiceAmt;
      return this;
    }
  
     /**
     * Get linkInvoiceAmt
     * @return linkInvoiceAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getLinkInvoiceAmt() {
      return linkInvoiceAmt;
    }
  
  
    public void setLinkInvoiceAmt(MultiCurrencyMoneyOpenApi linkInvoiceAmt) {
      this.linkInvoiceAmt = linkInvoiceAmt;
    }
  
  
    public ArMonthlyBillDTO payOriginal(String payOriginal) {
      
      this.payOriginal = payOriginal;
      return this;
    }
  
     /**
     * 付款来源  1：主账务，2：包量，3：预收，4：预存，5：银行，6：积分，7：统一支付，8：支付受理
     * @return payOriginal
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1", value = "付款来源  1：主账务，2：包量，3：预收，4：预存，5：银行，6：积分，7：统一支付，8：支付受理")
  
    public String getPayOriginal() {
      return payOriginal;
    }
  
  
    public void setPayOriginal(String payOriginal) {
      this.payOriginal = payOriginal;
    }
  
  
    public ArMonthlyBillDTO payStatus(String payStatus) {
      
      this.payStatus = payStatus;
      return this;
    }
  
     /**
     * 付款状态  01：待结算；02：部分结算；03：结算完成
     * @return payStatus
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "01", value = "付款状态  01：待结算；02：部分结算；03：结算完成")
  
    public String getPayStatus() {
      return payStatus;
    }
  
  
    public void setPayStatus(String payStatus) {
      this.payStatus = payStatus;
    }
  
  
    public ArMonthlyBillDTO payWay(String payWay) {
      
      this.payWay = payWay;
      return this;
    }
  
     /**
     * 付款方式  1：资金；2：包量
     * @return payWay
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1", value = "付款方式  1：资金；2：包量")
  
    public String getPayWay() {
      return payWay;
    }
  
  
    public void setPayWay(String payWay) {
      this.payWay = payWay;
    }
  
  
    public ArMonthlyBillDTO payeeAccount(String payeeAccount) {
      
      this.payeeAccount = payeeAccount;
      return this;
    }
  
     /**
     * 收款方账号
     * @return payeeAccount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20880013684318990156", value = "收款方账号")
  
    public String getPayeeAccount() {
      return payeeAccount;
    }
  
  
    public void setPayeeAccount(String payeeAccount) {
      this.payeeAccount = payeeAccount;
    }
  
  
    public ArMonthlyBillDTO payerAccount(String payerAccount) {
      
      this.payerAccount = payerAccount;
      return this;
    }
  
     /**
     * 付款方账号
     * @return payerAccount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "20880013684318990156", value = "付款方账号")
  
    public String getPayerAccount() {
      return payerAccount;
    }
  
  
    public void setPayerAccount(String payerAccount) {
      this.payerAccount = payerAccount;
    }
  
  
    public ArMonthlyBillDTO payerIpRoleId(String payerIpRoleId) {
      
      this.payerIpRoleId = payerIpRoleId;
      return this;
    }
  
     /**
     * 扣款对象pid
     * @return payerIpRoleId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2088301287583636", value = "扣款对象pid")
  
    public String getPayerIpRoleId() {
      return payerIpRoleId;
    }
  
  
    public void setPayerIpRoleId(String payerIpRoleId) {
      this.payerIpRoleId = payerIpRoleId;
    }
  
  
    public ArMonthlyBillDTO prodCode(String prodCode) {
      
      this.prodCode = prodCode;
      return this;
    }
  
     /**
     * 产品码
     * @return prodCode
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "w1010100100000000018", value = "产品码")
  
    public String getProdCode() {
      return prodCode;
    }
  
  
    public void setProdCode(String prodCode) {
      this.prodCode = prodCode;
    }
  
  
    public ArMonthlyBillDTO receivedAmt(MultiCurrencyMoneyOpenApi receivedAmt) {
      
      this.receivedAmt = receivedAmt;
      return this;
    }
  
     /**
     * Get receivedAmt
     * @return receivedAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getReceivedAmt() {
      return receivedAmt;
    }
  
  
    public void setReceivedAmt(MultiCurrencyMoneyOpenApi receivedAmt) {
      this.receivedAmt = receivedAmt;
    }
  
  
    public ArMonthlyBillDTO recordId(String recordId) {
      
      this.recordId = recordId;
      return this;
    }
  
     /**
     * 记录id，账单全局唯一号
     * @return recordId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "70cf1a075478780bc0c38d1e9e28c001", value = "记录id，账单全局唯一号")
  
    public String getRecordId() {
      return recordId;
    }
  
  
    public void setRecordId(String recordId) {
      this.recordId = recordId;
    }
  
  
    public ArMonthlyBillDTO serviceAmt(MultiCurrencyMoneyOpenApi serviceAmt) {
      
      this.serviceAmt = serviceAmt;
      return this;
    }
  
     /**
     * Get serviceAmt
     * @return serviceAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getServiceAmt() {
      return serviceAmt;
    }
  
  
    public void setServiceAmt(MultiCurrencyMoneyOpenApi serviceAmt) {
      this.serviceAmt = serviceAmt;
    }
  
  
    public ArMonthlyBillDTO settleType(String settleType) {
      
      this.settleType = settleType;
      return this;
    }
  
     /**
     * 结算类型  01：实时；02：预收；03：后收；04：周期结算；05：按日汇总结算；09：延期结算
     * @return settleType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "03", value = "结算类型  01：实时；02：预收；03：后收；04：周期结算；05：按日汇总结算；09：延期结算")
  
    public String getSettleType() {
      return settleType;
    }
  
  
    public void setSettleType(String settleType) {
      this.settleType = settleType;
    }
  
  
    public ArMonthlyBillDTO signIpId(String signIpId) {
      
      this.signIpId = signIpId;
      return this;
    }
  
     /**
     * 签约对象参与者标识
     * @return signIpId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "203668", value = "签约对象参与者标识")
  
    public String getSignIpId() {
      return signIpId;
    }
  
  
    public void setSignIpId(String signIpId) {
      this.signIpId = signIpId;
    }
  
  
    public ArMonthlyBillDTO signIpRoleId(String signIpRoleId) {
      
      this.signIpRoleId = signIpRoleId;
      return this;
    }
  
     /**
     * 签约对象参与者角色标识
     * @return signIpRoleId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2088101106290325", value = "签约对象参与者角色标识")
  
    public String getSignIpRoleId() {
      return signIpRoleId;
    }
  
  
    public void setSignIpRoleId(String signIpRoleId) {
      this.signIpRoleId = signIpRoleId;
    }
  
  
    public ArMonthlyBillDTO stlIpRoleId(String stlIpRoleId) {
      
      this.stlIpRoleId = stlIpRoleId;
      return this;
    }
  
     /**
     * 结算对象PID
     * @return stlIpRoleId
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "2088301287583636", value = "结算对象PID")
  
    public String getStlIpRoleId() {
      return stlIpRoleId;
    }
  
  
    public void setStlIpRoleId(String stlIpRoleId) {
      this.stlIpRoleId = stlIpRoleId;
    }
  
  
    public ArMonthlyBillDTO taxAmt(MultiCurrencyMoneyOpenApi taxAmt) {
      
      this.taxAmt = taxAmt;
      return this;
    }
  
     /**
     * Get taxAmt
     * @return taxAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getTaxAmt() {
      return taxAmt;
    }
  
  
    public void setTaxAmt(MultiCurrencyMoneyOpenApi taxAmt) {
      this.taxAmt = taxAmt;
    }
  
  
    public ArMonthlyBillDTO taxRate(Integer taxRate) {
      
      this.taxRate = taxRate;
      return this;
    }
  
     /**
     * 税率
     * @return taxRate
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "税率")
  
    public Integer getTaxRate() {
      return taxRate;
    }
  
  
    public void setTaxRate(Integer taxRate) {
      this.taxRate = taxRate;
    }
  
  
    public ArMonthlyBillDTO taxType(String taxType) {
      
      this.taxType = taxType;
      return this;
    }
  
     /**
     * 税收类型，01：增值税，02：营业税  营业税已经在大部分行业废弃，要传入需咨询后再确认
     * @return taxType
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "01", value = "税收类型，01：增值税，02：营业税  营业税已经在大部分行业废弃，要传入需咨询后再确认")
  
    public String getTaxType() {
      return taxType;
    }
  
  
    public void setTaxType(String taxType) {
      this.taxType = taxType;
    }
  
  
    public ArMonthlyBillDTO toWriteoffDetailCount(Integer toWriteoffDetailCount) {
      
      this.toWriteoffDetailCount = toWriteoffDetailCount;
      return this;
    }
  
     /**
     * 待核销明细数量
     * @return toWriteoffDetailCount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "3", value = "待核销明细数量")
  
    public Integer getToWriteoffDetailCount() {
      return toWriteoffDetailCount;
    }
  
  
    public void setToWriteoffDetailCount(Integer toWriteoffDetailCount) {
      this.toWriteoffDetailCount = toWriteoffDetailCount;
    }
  
  
    public ArMonthlyBillDTO type(String type) {
      
      this.type = type;
      return this;
    }
  
     /**
     * 账单分类 1应收，2返点
     * @return type
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "1", value = "账单分类 1应收，2返点")
  
    public String getType() {
      return type;
    }
  
  
    public void setType(String type) {
      this.type = type;
    }
  
  
    public ArMonthlyBillDTO writeoffDetailDount(Integer writeoffDetailDount) {
      
      this.writeoffDetailDount = writeoffDetailDount;
      return this;
    }
  
     /**
     * 核销明细数量
     * @return writeoffDetailDount
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(example = "5", value = "核销明细数量")
  
    public Integer getWriteoffDetailDount() {
      return writeoffDetailDount;
    }
  
  
    public void setWriteoffDetailDount(Integer writeoffDetailDount) {
      this.writeoffDetailDount = writeoffDetailDount;
    }
  
  
    public ArMonthlyBillDTO writingoffAmt(MultiCurrencyMoneyOpenApi writingoffAmt) {
      
      this.writingoffAmt = writingoffAmt;
      return this;
    }
  
     /**
     * Get writingoffAmt
     * @return writingoffAmt
    **/
    @javax.annotation.Nullable
    @ApiModelProperty(value = "")
  
    public MultiCurrencyMoneyOpenApi getWritingoffAmt() {
      return writingoffAmt;
    }
  
  
    public void setWritingoffAmt(MultiCurrencyMoneyOpenApi writingoffAmt) {
      this.writingoffAmt = writingoffAmt;
    }
  
    /**
     * 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 ArMonthlyBillDTO instance itself
     */
    public ArMonthlyBillDTO 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;
      }
      ArMonthlyBillDTO arMonthlyBillDTO = (ArMonthlyBillDTO) o;
      return Objects.equals(this.accountDay, arMonthlyBillDTO.accountDay) &&
          Objects.equals(this.accruedDate, arMonthlyBillDTO.accruedDate) &&
          Objects.equals(this.adjustAmt, arMonthlyBillDTO.adjustAmt) &&
          Objects.equals(this.analysisDmsn1, arMonthlyBillDTO.analysisDmsn1) &&
          Objects.equals(this.analysisDmsn2, arMonthlyBillDTO.analysisDmsn2) &&
          Objects.equals(this.analysisDmsn3, arMonthlyBillDTO.analysisDmsn3) &&
          Objects.equals(this.analysisDmsn4, arMonthlyBillDTO.analysisDmsn4) &&
          Objects.equals(this.arrangementNo, arMonthlyBillDTO.arrangementNo) &&
          Objects.equals(this.billAmt, arMonthlyBillDTO.billAmt) &&
          Objects.equals(this.billEndDate, arMonthlyBillDTO.billEndDate) &&
          Objects.equals(this.billMonth, arMonthlyBillDTO.billMonth) &&
          Objects.equals(this.billNo, arMonthlyBillDTO.billNo) &&
          Objects.equals(this.billStartDate, arMonthlyBillDTO.billStartDate) &&
          Objects.equals(this.billType, arMonthlyBillDTO.billType) &&
          Objects.equals(this.chargeItemCode, arMonthlyBillDTO.chargeItemCode) &&
          Objects.equals(this.chargeType, arMonthlyBillDTO.chargeType) &&
          Objects.equals(this.checkStatus, arMonthlyBillDTO.checkStatus) &&
          Objects.equals(this.checkedAmt, arMonthlyBillDTO.checkedAmt) &&
          Objects.equals(this.checkingAmt, arMonthlyBillDTO.checkingAmt) &&
          Objects.equals(this.clcnBasicAmt, arMonthlyBillDTO.clcnBasicAmt) &&
          Objects.equals(this.clcnBasicType, arMonthlyBillDTO.clcnBasicType) &&
          Objects.equals(this.clcnMethod, arMonthlyBillDTO.clcnMethod) &&
          Objects.equals(this.freezeAmt, arMonthlyBillDTO.freezeAmt) &&
          Objects.equals(this.gmtCreate, arMonthlyBillDTO.gmtCreate) &&
          Objects.equals(this.gmtModified, arMonthlyBillDTO.gmtModified) &&
          Objects.equals(this.gmtPay, arMonthlyBillDTO.gmtPay) &&
          Objects.equals(this.instId, arMonthlyBillDTO.instId) &&
          Objects.equals(this.invoiceAmt, arMonthlyBillDTO.invoiceAmt) &&
          Objects.equals(this.invoicedAmt, arMonthlyBillDTO.invoicedAmt) &&
          Objects.equals(this.ipId, arMonthlyBillDTO.ipId) &&
          Objects.equals(this.ipName, arMonthlyBillDTO.ipName) &&
          Objects.equals(this.ipRoleId, arMonthlyBillDTO.ipRoleId) &&
          Objects.equals(this.lastModer, arMonthlyBillDTO.lastModer) &&
          Objects.equals(this.linkInvoiceAmt, arMonthlyBillDTO.linkInvoiceAmt) &&
          Objects.equals(this.payOriginal, arMonthlyBillDTO.payOriginal) &&
          Objects.equals(this.payStatus, arMonthlyBillDTO.payStatus) &&
          Objects.equals(this.payWay, arMonthlyBillDTO.payWay) &&
          Objects.equals(this.payeeAccount, arMonthlyBillDTO.payeeAccount) &&
          Objects.equals(this.payerAccount, arMonthlyBillDTO.payerAccount) &&
          Objects.equals(this.payerIpRoleId, arMonthlyBillDTO.payerIpRoleId) &&
          Objects.equals(this.prodCode, arMonthlyBillDTO.prodCode) &&
          Objects.equals(this.receivedAmt, arMonthlyBillDTO.receivedAmt) &&
          Objects.equals(this.recordId, arMonthlyBillDTO.recordId) &&
          Objects.equals(this.serviceAmt, arMonthlyBillDTO.serviceAmt) &&
          Objects.equals(this.settleType, arMonthlyBillDTO.settleType) &&
          Objects.equals(this.signIpId, arMonthlyBillDTO.signIpId) &&
          Objects.equals(this.signIpRoleId, arMonthlyBillDTO.signIpRoleId) &&
          Objects.equals(this.stlIpRoleId, arMonthlyBillDTO.stlIpRoleId) &&
          Objects.equals(this.taxAmt, arMonthlyBillDTO.taxAmt) &&
          Objects.equals(this.taxRate, arMonthlyBillDTO.taxRate) &&
          Objects.equals(this.taxType, arMonthlyBillDTO.taxType) &&
          Objects.equals(this.toWriteoffDetailCount, arMonthlyBillDTO.toWriteoffDetailCount) &&
          Objects.equals(this.type, arMonthlyBillDTO.type) &&
          Objects.equals(this.writeoffDetailDount, arMonthlyBillDTO.writeoffDetailDount) &&
          Objects.equals(this.writingoffAmt, arMonthlyBillDTO.writingoffAmt)&&
          Objects.equals(this.additionalProperties, arMonthlyBillDTO.additionalProperties);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(accountDay, accruedDate, adjustAmt, analysisDmsn1, analysisDmsn2, analysisDmsn3, analysisDmsn4, arrangementNo, billAmt, billEndDate, billMonth, billNo, billStartDate, billType, chargeItemCode, chargeType, checkStatus, checkedAmt, checkingAmt, clcnBasicAmt, clcnBasicType, clcnMethod, freezeAmt, gmtCreate, gmtModified, gmtPay, instId, invoiceAmt, invoicedAmt, ipId, ipName, ipRoleId, lastModer, linkInvoiceAmt, payOriginal, payStatus, payWay, payeeAccount, payerAccount, payerIpRoleId, prodCode, receivedAmt, recordId, serviceAmt, settleType, signIpId, signIpRoleId, stlIpRoleId, taxAmt, taxRate, taxType, toWriteoffDetailCount, type, writeoffDetailDount, writingoffAmt, additionalProperties);
    }
  
    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append("class ArMonthlyBillDTO {\n");
      sb.append("    accountDay: ").append(toIndentedString(accountDay)).append("\n");
      sb.append("    accruedDate: ").append(toIndentedString(accruedDate)).append("\n");
      sb.append("    adjustAmt: ").append(toIndentedString(adjustAmt)).append("\n");
      sb.append("    analysisDmsn1: ").append(toIndentedString(analysisDmsn1)).append("\n");
      sb.append("    analysisDmsn2: ").append(toIndentedString(analysisDmsn2)).append("\n");
      sb.append("    analysisDmsn3: ").append(toIndentedString(analysisDmsn3)).append("\n");
      sb.append("    analysisDmsn4: ").append(toIndentedString(analysisDmsn4)).append("\n");
      sb.append("    arrangementNo: ").append(toIndentedString(arrangementNo)).append("\n");
      sb.append("    billAmt: ").append(toIndentedString(billAmt)).append("\n");
      sb.append("    billEndDate: ").append(toIndentedString(billEndDate)).append("\n");
      sb.append("    billMonth: ").append(toIndentedString(billMonth)).append("\n");
      sb.append("    billNo: ").append(toIndentedString(billNo)).append("\n");
      sb.append("    billStartDate: ").append(toIndentedString(billStartDate)).append("\n");
      sb.append("    billType: ").append(toIndentedString(billType)).append("\n");
      sb.append("    chargeItemCode: ").append(toIndentedString(chargeItemCode)).append("\n");
      sb.append("    chargeType: ").append(toIndentedString(chargeType)).append("\n");
      sb.append("    checkStatus: ").append(toIndentedString(checkStatus)).append("\n");
      sb.append("    checkedAmt: ").append(toIndentedString(checkedAmt)).append("\n");
      sb.append("    checkingAmt: ").append(toIndentedString(checkingAmt)).append("\n");
      sb.append("    clcnBasicAmt: ").append(toIndentedString(clcnBasicAmt)).append("\n");
      sb.append("    clcnBasicType: ").append(toIndentedString(clcnBasicType)).append("\n");
      sb.append("    clcnMethod: ").append(toIndentedString(clcnMethod)).append("\n");
      sb.append("    freezeAmt: ").append(toIndentedString(freezeAmt)).append("\n");
      sb.append("    gmtCreate: ").append(toIndentedString(gmtCreate)).append("\n");
      sb.append("    gmtModified: ").append(toIndentedString(gmtModified)).append("\n");
      sb.append("    gmtPay: ").append(toIndentedString(gmtPay)).append("\n");
      sb.append("    instId: ").append(toIndentedString(instId)).append("\n");
      sb.append("    invoiceAmt: ").append(toIndentedString(invoiceAmt)).append("\n");
      sb.append("    invoicedAmt: ").append(toIndentedString(invoicedAmt)).append("\n");
      sb.append("    ipId: ").append(toIndentedString(ipId)).append("\n");
      sb.append("    ipName: ").append(toIndentedString(ipName)).append("\n");
      sb.append("    ipRoleId: ").append(toIndentedString(ipRoleId)).append("\n");
      sb.append("    lastModer: ").append(toIndentedString(lastModer)).append("\n");
      sb.append("    linkInvoiceAmt: ").append(toIndentedString(linkInvoiceAmt)).append("\n");
      sb.append("    payOriginal: ").append(toIndentedString(payOriginal)).append("\n");
      sb.append("    payStatus: ").append(toIndentedString(payStatus)).append("\n");
      sb.append("    payWay: ").append(toIndentedString(payWay)).append("\n");
      sb.append("    payeeAccount: ").append(toIndentedString(payeeAccount)).append("\n");
      sb.append("    payerAccount: ").append(toIndentedString(payerAccount)).append("\n");
      sb.append("    payerIpRoleId: ").append(toIndentedString(payerIpRoleId)).append("\n");
      sb.append("    prodCode: ").append(toIndentedString(prodCode)).append("\n");
      sb.append("    receivedAmt: ").append(toIndentedString(receivedAmt)).append("\n");
      sb.append("    recordId: ").append(toIndentedString(recordId)).append("\n");
      sb.append("    serviceAmt: ").append(toIndentedString(serviceAmt)).append("\n");
      sb.append("    settleType: ").append(toIndentedString(settleType)).append("\n");
      sb.append("    signIpId: ").append(toIndentedString(signIpId)).append("\n");
      sb.append("    signIpRoleId: ").append(toIndentedString(signIpRoleId)).append("\n");
      sb.append("    stlIpRoleId: ").append(toIndentedString(stlIpRoleId)).append("\n");
      sb.append("    taxAmt: ").append(toIndentedString(taxAmt)).append("\n");
      sb.append("    taxRate: ").append(toIndentedString(taxRate)).append("\n");
      sb.append("    taxType: ").append(toIndentedString(taxType)).append("\n");
      sb.append("    toWriteoffDetailCount: ").append(toIndentedString(toWriteoffDetailCount)).append("\n");
      sb.append("    type: ").append(toIndentedString(type)).append("\n");
      sb.append("    writeoffDetailDount: ").append(toIndentedString(writeoffDetailDount)).append("\n");
      sb.append("    writingoffAmt: ").append(toIndentedString(writingoffAmt)).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("account_day");
      openapiFields.add("accrued_date");
      openapiFields.add("adjust_amt");
      openapiFields.add("analysis_dmsn_1");
      openapiFields.add("analysis_dmsn_2");
      openapiFields.add("analysis_dmsn_3");
      openapiFields.add("analysis_dmsn_4");
      openapiFields.add("arrangement_no");
      openapiFields.add("bill_amt");
      openapiFields.add("bill_end_date");
      openapiFields.add("bill_month");
      openapiFields.add("bill_no");
      openapiFields.add("bill_start_date");
      openapiFields.add("bill_type");
      openapiFields.add("charge_item_code");
      openapiFields.add("charge_type");
      openapiFields.add("check_status");
      openapiFields.add("checked_amt");
      openapiFields.add("checking_amt");
      openapiFields.add("clcn_basic_amt");
      openapiFields.add("clcn_basic_type");
      openapiFields.add("clcn_method");
      openapiFields.add("freeze_amt");
      openapiFields.add("gmt_create");
      openapiFields.add("gmt_modified");
      openapiFields.add("gmt_pay");
      openapiFields.add("inst_id");
      openapiFields.add("invoice_amt");
      openapiFields.add("invoiced_amt");
      openapiFields.add("ip_id");
      openapiFields.add("ip_name");
      openapiFields.add("ip_role_id");
      openapiFields.add("last_moder");
      openapiFields.add("link_invoice_amt");
      openapiFields.add("pay_original");
      openapiFields.add("pay_status");
      openapiFields.add("pay_way");
      openapiFields.add("payee_account");
      openapiFields.add("payer_account");
      openapiFields.add("payer_ip_role_id");
      openapiFields.add("prod_code");
      openapiFields.add("received_amt");
      openapiFields.add("record_id");
      openapiFields.add("service_amt");
      openapiFields.add("settle_type");
      openapiFields.add("sign_ip_id");
      openapiFields.add("sign_ip_role_id");
      openapiFields.add("stl_ip_role_id");
      openapiFields.add("tax_amt");
      openapiFields.add("tax_rate");
      openapiFields.add("tax_type");
      openapiFields.add("to_writeoff_detail_count");
      openapiFields.add("type");
      openapiFields.add("writeoff_detail_dount");
      openapiFields.add("writingoff_amt");
  
      // 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 ArMonthlyBillDTO
    */
    public static void validateJsonObject(JsonObject jsonObj) throws IOException {
        if (jsonObj == null) {
          if (ArMonthlyBillDTO.openapiRequiredFields.isEmpty()) {
            return;
          } else { // has required fields
            throw new IllegalArgumentException(String.format("The required field(s) %s in ArMonthlyBillDTO is not found in the empty JSON string", ArMonthlyBillDTO.openapiRequiredFields.toString()));
          }
        }
        if (jsonObj.get("account_day") != null && !jsonObj.get("account_day").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `account_day` to be a primitive type in the JSON string but got `%s`", jsonObj.get("account_day").toString()));
        }
        if (jsonObj.get("accrued_date") != null && !jsonObj.get("accrued_date").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `accrued_date` to be a primitive type in the JSON string but got `%s`", jsonObj.get("accrued_date").toString()));
        }
        // validate the optional field `adjust_amt`
        if (jsonObj.getAsJsonObject("adjust_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("adjust_amt"));
        }
        if (jsonObj.get("analysis_dmsn_1") != null && !jsonObj.get("analysis_dmsn_1").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `analysis_dmsn_1` to be a primitive type in the JSON string but got `%s`", jsonObj.get("analysis_dmsn_1").toString()));
        }
        if (jsonObj.get("analysis_dmsn_2") != null && !jsonObj.get("analysis_dmsn_2").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `analysis_dmsn_2` to be a primitive type in the JSON string but got `%s`", jsonObj.get("analysis_dmsn_2").toString()));
        }
        if (jsonObj.get("analysis_dmsn_3") != null && !jsonObj.get("analysis_dmsn_3").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `analysis_dmsn_3` to be a primitive type in the JSON string but got `%s`", jsonObj.get("analysis_dmsn_3").toString()));
        }
        if (jsonObj.get("analysis_dmsn_4") != null && !jsonObj.get("analysis_dmsn_4").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `analysis_dmsn_4` to be a primitive type in the JSON string but got `%s`", jsonObj.get("analysis_dmsn_4").toString()));
        }
        if (jsonObj.get("arrangement_no") != null && !jsonObj.get("arrangement_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `arrangement_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("arrangement_no").toString()));
        }
        // validate the optional field `bill_amt`
        if (jsonObj.getAsJsonObject("bill_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("bill_amt"));
        }
        if (jsonObj.get("bill_end_date") != null && !jsonObj.get("bill_end_date").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `bill_end_date` to be a primitive type in the JSON string but got `%s`", jsonObj.get("bill_end_date").toString()));
        }
        if (jsonObj.get("bill_month") != null && !jsonObj.get("bill_month").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `bill_month` to be a primitive type in the JSON string but got `%s`", jsonObj.get("bill_month").toString()));
        }
        if (jsonObj.get("bill_no") != null && !jsonObj.get("bill_no").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `bill_no` to be a primitive type in the JSON string but got `%s`", jsonObj.get("bill_no").toString()));
        }
        if (jsonObj.get("bill_start_date") != null && !jsonObj.get("bill_start_date").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `bill_start_date` to be a primitive type in the JSON string but got `%s`", jsonObj.get("bill_start_date").toString()));
        }
        if (jsonObj.get("bill_type") != null && !jsonObj.get("bill_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `bill_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("bill_type").toString()));
        }
        if (jsonObj.get("charge_item_code") != null && !jsonObj.get("charge_item_code").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `charge_item_code` to be a primitive type in the JSON string but got `%s`", jsonObj.get("charge_item_code").toString()));
        }
        if (jsonObj.get("charge_type") != null && !jsonObj.get("charge_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `charge_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("charge_type").toString()));
        }
        if (jsonObj.get("check_status") != null && !jsonObj.get("check_status").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `check_status` to be a primitive type in the JSON string but got `%s`", jsonObj.get("check_status").toString()));
        }
        // validate the optional field `checked_amt`
        if (jsonObj.getAsJsonObject("checked_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("checked_amt"));
        }
        // validate the optional field `checking_amt`
        if (jsonObj.getAsJsonObject("checking_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("checking_amt"));
        }
        if (jsonObj.get("clcn_basic_type") != null && !jsonObj.get("clcn_basic_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `clcn_basic_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("clcn_basic_type").toString()));
        }
        if (jsonObj.get("clcn_method") != null && !jsonObj.get("clcn_method").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `clcn_method` to be a primitive type in the JSON string but got `%s`", jsonObj.get("clcn_method").toString()));
        }
        // validate the optional field `freeze_amt`
        if (jsonObj.getAsJsonObject("freeze_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("freeze_amt"));
        }
        if (jsonObj.get("gmt_create") != null && !jsonObj.get("gmt_create").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `gmt_create` to be a primitive type in the JSON string but got `%s`", jsonObj.get("gmt_create").toString()));
        }
        if (jsonObj.get("gmt_modified") != null && !jsonObj.get("gmt_modified").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `gmt_modified` to be a primitive type in the JSON string but got `%s`", jsonObj.get("gmt_modified").toString()));
        }
        if (jsonObj.get("gmt_pay") != null && !jsonObj.get("gmt_pay").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `gmt_pay` to be a primitive type in the JSON string but got `%s`", jsonObj.get("gmt_pay").toString()));
        }
        if (jsonObj.get("inst_id") != null && !jsonObj.get("inst_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `inst_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("inst_id").toString()));
        }
        // validate the optional field `invoice_amt`
        if (jsonObj.getAsJsonObject("invoice_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("invoice_amt"));
        }
        // validate the optional field `invoiced_amt`
        if (jsonObj.getAsJsonObject("invoiced_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("invoiced_amt"));
        }
        if (jsonObj.get("ip_id") != null && !jsonObj.get("ip_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ip_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ip_id").toString()));
        }
        if (jsonObj.get("ip_name") != null && !jsonObj.get("ip_name").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ip_name` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ip_name").toString()));
        }
        if (jsonObj.get("ip_role_id") != null && !jsonObj.get("ip_role_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `ip_role_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ip_role_id").toString()));
        }
        if (jsonObj.get("last_moder") != null && !jsonObj.get("last_moder").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `last_moder` to be a primitive type in the JSON string but got `%s`", jsonObj.get("last_moder").toString()));
        }
        // validate the optional field `link_invoice_amt`
        if (jsonObj.getAsJsonObject("link_invoice_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("link_invoice_amt"));
        }
        if (jsonObj.get("pay_original") != null && !jsonObj.get("pay_original").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `pay_original` to be a primitive type in the JSON string but got `%s`", jsonObj.get("pay_original").toString()));
        }
        if (jsonObj.get("pay_status") != null && !jsonObj.get("pay_status").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `pay_status` to be a primitive type in the JSON string but got `%s`", jsonObj.get("pay_status").toString()));
        }
        if (jsonObj.get("pay_way") != null && !jsonObj.get("pay_way").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `pay_way` to be a primitive type in the JSON string but got `%s`", jsonObj.get("pay_way").toString()));
        }
        if (jsonObj.get("payee_account") != null && !jsonObj.get("payee_account").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payee_account` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payee_account").toString()));
        }
        if (jsonObj.get("payer_account") != null && !jsonObj.get("payer_account").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payer_account` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payer_account").toString()));
        }
        if (jsonObj.get("payer_ip_role_id") != null && !jsonObj.get("payer_ip_role_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `payer_ip_role_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("payer_ip_role_id").toString()));
        }
        if (jsonObj.get("prod_code") != null && !jsonObj.get("prod_code").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `prod_code` to be a primitive type in the JSON string but got `%s`", jsonObj.get("prod_code").toString()));
        }
        // validate the optional field `received_amt`
        if (jsonObj.getAsJsonObject("received_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("received_amt"));
        }
        if (jsonObj.get("record_id") != null && !jsonObj.get("record_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `record_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("record_id").toString()));
        }
        // validate the optional field `service_amt`
        if (jsonObj.getAsJsonObject("service_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("service_amt"));
        }
        if (jsonObj.get("settle_type") != null && !jsonObj.get("settle_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `settle_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("settle_type").toString()));
        }
        if (jsonObj.get("sign_ip_id") != null && !jsonObj.get("sign_ip_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `sign_ip_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("sign_ip_id").toString()));
        }
        if (jsonObj.get("sign_ip_role_id") != null && !jsonObj.get("sign_ip_role_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `sign_ip_role_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("sign_ip_role_id").toString()));
        }
        if (jsonObj.get("stl_ip_role_id") != null && !jsonObj.get("stl_ip_role_id").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `stl_ip_role_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("stl_ip_role_id").toString()));
        }
        // validate the optional field `tax_amt`
        if (jsonObj.getAsJsonObject("tax_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("tax_amt"));
        }
        if (jsonObj.get("tax_type") != null && !jsonObj.get("tax_type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `tax_type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("tax_type").toString()));
        }
        if (jsonObj.get("type") != null && !jsonObj.get("type").isJsonPrimitive()) {
          throw new IllegalArgumentException(String.format("Expected the field `type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("type").toString()));
        }
        // validate the optional field `writingoff_amt`
        if (jsonObj.getAsJsonObject("writingoff_amt") != null) {
          MultiCurrencyMoneyOpenApi.validateJsonObject(jsonObj.getAsJsonObject("writingoff_amt"));
        }
    }
  
    public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
      @SuppressWarnings("unchecked")
      @Override
      public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
         if (!ArMonthlyBillDTO.class.isAssignableFrom(type.getRawType())) {
           return null; // this class only serializes 'ArMonthlyBillDTO' and its subtypes
         }
         final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
         final TypeAdapter<ArMonthlyBillDTO> thisAdapter
                          = gson.getDelegateAdapter(this, TypeToken.get(ArMonthlyBillDTO.class));
  
         return (TypeAdapter<T>) new TypeAdapter<ArMonthlyBillDTO>() {
             @Override
             public void write(JsonWriter out, ArMonthlyBillDTO 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 ArMonthlyBillDTO read(JsonReader in) throws IOException {
               JsonObject jsonObj = elementAdapter.read(in).getAsJsonObject();
               validateJsonObject(jsonObj);
               // store additional fields in the deserialized instance
               ArMonthlyBillDTO 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 ArMonthlyBillDTO given an JSON string
    *
    * @param jsonString JSON string
    * @return An instance of ArMonthlyBillDTO
    * @throws IOException if the JSON string is invalid with respect to ArMonthlyBillDTO
    */
    public static ArMonthlyBillDTO fromJson(String jsonString) throws IOException {
      return JSON.getGson().fromJson(jsonString, ArMonthlyBillDTO.class);
    }
  
   /**
    * Convert an instance of ArMonthlyBillDTO to an JSON string
    *
    * @return JSON string
    */
    public String toJson() {
      return JSON.getGson().toJson(this);
    }
  }
  
  