(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['ApiClient', 'models/AddressVo', 'models/AuditInfoVo'], factory);
  } else if (typeof module === 'object' && module.exports) {
    // CommonJS-like environments that support module.exports, like Node.
    module.exports = factory(require('../ApiClient'), require('./AddressVo'), require('./AuditInfoVo'));
  } else {
    // Browser globals (root is window)
    if (!root.OrbipayPaymentsapiClient) {
      root.OrbipayPaymentsapiClient = {};
    }
    root.OrbipayPaymentsapiClient.CustomerAccountResponse = factory(root.OrbipayPaymentsapiClient.ApiClient, root.OrbipayPaymentsapiClient.AddressVo, root.OrbipayPaymentsapiClient.AuditInfoVo);
  }
}(this, function(ApiClient, AddressVo, AuditInfoVo) {
  'use strict';




  /**
   * The CustomerAccountResponse model module.
   * @module models/CustomerAccountResponse
   */

  /**
   * <h3 style="color:red"> This class subject to change without prior notice, Please dont use this class directly. </h3>

   * Constructs a new <code>CustomerAccountResponse</code>.
   * @alias module:models/CustomerAccountResponse
   * @class
   * @param account_holder_name {String} The name as specified on the account.
   * @param account_number {String} The number or reference that a customer uses to identify the customer's account.
   * @param status {module:models/CustomerAccountResponse.StatusEnum} The status of the customer's account in EBPP. 
   */
  var exports = function(account_holder_name, account_number, status) {
    var _this = this;

    _this['account_holder_name'] = account_holder_name;



    _this['account_number'] = account_number;








    _this['status'] = status;



  };

  /**
   * Constructs a <code>CustomerAccountResponse</code> from a plain JavaScript object, optionally creating a new instance.
   * Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
   * @param {Object} data The plain JavaScript object bearing properties of interest.
   * @param {module:models/CustomerAccountResponse} obj Optional instance to populate.
   * @return {module:models/CustomerAccountResponse} The populated <code>CustomerAccountResponse</code> instance.
   */
  exports.constructFromObject = function(data, obj) {
    if (data) {
      obj = obj || new exports();

      if (data.hasOwnProperty('account_holder_name')) {
        obj['account_holder_name'] = ApiClient.convertToType(data['account_holder_name'], 'String');
      }
      if (data.hasOwnProperty('nickname')) {
        obj['nickname'] = ApiClient.convertToType(data['nickname'], 'String');
      }
      if (data.hasOwnProperty('address')) {
        obj['address'] = AddressVo.constructFromObject(data['address']);
      }
      if (data.hasOwnProperty('customer_account_reference')) {
        obj['customer_account_reference'] = ApiClient.convertToType(data['customer_account_reference'], 'String');
      }
      if (data.hasOwnProperty('account_number')) {
        obj['account_number'] = ApiClient.convertToType(data['account_number'], 'String');
      }
      if (data.hasOwnProperty('current_balance')) {
        obj['current_balance'] = ApiClient.convertToType(data['current_balance'], 'String');
      }
      if (data.hasOwnProperty('current_statement_balance')) {
        obj['current_statement_balance'] = ApiClient.convertToType(data['current_statement_balance'], 'String');
      }
      if (data.hasOwnProperty('minimum_payment_due')) {
        obj['minimum_payment_due'] = ApiClient.convertToType(data['minimum_payment_due'], 'String');
      }
      if (data.hasOwnProperty('past_amount_due')) {
        obj['past_amount_due'] = ApiClient.convertToType(data['past_amount_due'], 'String');
      }
      if (data.hasOwnProperty('payment_due_date')) {
        obj['payment_due_date'] = ApiClient.convertToType(data['payment_due_date'], 'String');
      }
      if (data.hasOwnProperty('statement_date')) {
        obj['statement_date'] = ApiClient.convertToType(data['statement_date'], 'String');
      }
      if (data.hasOwnProperty('id')) {
        obj['id'] = ApiClient.convertToType(data['id'], 'String');
      }
      if (data.hasOwnProperty('url')) {
        obj['url'] = ApiClient.convertToType(data['url'], 'String');
      }
      if (data.hasOwnProperty('status')) {
        obj['status'] = ApiClient.convertToType(data['status'], 'String');
      }
      if (data.hasOwnProperty('custom_fields')) {
        obj['custom_fields'] = ApiClient.convertToType(data['custom_fields'], {'String': 'String'});
      }
      if (data.hasOwnProperty('comments')) {
        obj['comments'] = ApiClient.convertToType(data['comments'], 'String');
      }
      if (data.hasOwnProperty('audit_info')) {
        obj['audit_info'] = AuditInfoVo.constructFromObject(data['audit_info']);
      }
    }
    return obj;
  };

  /**
   * The name as specified on the account.
   * @member {String} account_holder_name
   */
  exports.prototype['account_holder_name'] = undefined;
  /**
   * The nickname by which a customer might want to identify the account.
   * @member {String} nickname
   */
  exports.prototype['nickname'] = undefined;
  /**
   * @member {module:models/AddressVo} address
   */
  exports.prototype['address'] = undefined;
  /**
   * The unique identifier in the client system for the customer account.
   * @member {String} customer_account_reference
   */
  exports.prototype['customer_account_reference'] = undefined;
  /**
   * The number or reference that a customer uses to identify the customer's account.
   * @member {String} account_number
   */
  exports.prototype['account_number'] = undefined;
  /**
   * The current balance on the customer's account with the biller.
   * @member {String} current_balance
   */
  exports.prototype['current_balance'] = undefined;
  /**
   * The balance on the customer’s account with the biller as reported on the last statement.
   * @member {String} current_statement_balance
   */
  exports.prototype['current_statement_balance'] = undefined;
  /**
   * The minimum payment amount, as specified by the biller, that needs to be made against the customer’s account.
   * @member {String} minimum_payment_due
   */
  exports.prototype['minimum_payment_due'] = undefined;
  /**
   * The amount that is due from the past bills/statements on the customer’s account with the biller.
   * @member {String} past_amount_due
   */
  exports.prototype['past_amount_due'] = undefined;
  /**
   * The date by which the customer needs to clear the dues against the customer's account with the biller. It must be in ISO8601 full-date format, namely, YYYY-MM-DD.
   * @member {String} payment_due_date
   */
  exports.prototype['payment_due_date'] = undefined;
  /**
   * The date on which the biller generates the statement for the customer's account. It must be in ISO8601 full-date format, namely, YYYY-MM-DD.
   * @member {String} statement_date
   */
  exports.prototype['statement_date'] = undefined;
  /**
   * Id is a unique identifier assigned to the customer account in EBPP.
   * @member {String} id
   */
  exports.prototype['id'] = undefined;
  /**
   * This URL fetches the Account details.
   * @member {String} url
   */
  exports.prototype['url'] = undefined;
  /**
   * The status of the customer's account in EBPP. 
   * @member {module:models/CustomerAccountResponse.StatusEnum} status
   */
  exports.prototype['status'] = undefined;
  /**
   * The additional information or meta-information that EBPP can accept, maintain and transmit back to the client. The custom fields need to be configured with EBPP before they can be accepted. EBPP would reject custom fields that are not pre-configured. Please contact <a href = \"mailto: support@billerpayments.com\">support@billerpayments.com</a> for more information on configuring and using custom fields. Only the custom fields enabled for the client, in EBPP, would be accepted in the requests.
   * @member {Object.<String, String>} custom_fields
   */
  exports.prototype['custom_fields'] = undefined;
  /**
   * Comments that can be used to recollect the operation performed on the resource object. API clients need to ensure that no sensitive information is passed in the memo. Alacriti (EBPP) is not responsible for the security of any sensitive information that may be passed as part of the memo.
   * @member {String} comments
   */
  exports.prototype['comments'] = undefined;
  /**
   * @member {module:models/AuditInfoVo} audit_info
   */
  exports.prototype['audit_info'] = undefined;


  /**
   * Allowed values for the <code>status</code> property.
   * @enum {String}
   * @readonly
   */
  exports.StatusEnum = {
    /**
     * value: "active"
     * @const
     */
    "active": "active",
    /**
     * value: "inactive"
     * @const
     */
    "inactive": "inactive",
    /**
     * value: "incollections"
     * @const
     */
    "incollections": "incollections",
    /**
     * value: "inbankruptcy"
     * @const
     */
    "inbankruptcy": "inbankruptcy"  };


  return exports;
}));