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




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

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

   * Constructs a new <code>PaymentScheduleVo</code>.
   * The schedule for the payments that are created as part of a payment setup like recurring payment or autopay.
   * @alias module:models/PaymentScheduleVo
   * @class
   */
  var exports = function() {
    var _this = this;









  };

  /**
   * Constructs a <code>PaymentScheduleVo</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/PaymentScheduleVo} obj Optional instance to populate.
   * @return {module:models/PaymentScheduleVo} The populated <code>PaymentScheduleVo</code> instance.
   */
  exports.constructFromObject = function(data, obj) {
    if (data) {
      obj = obj || new exports();

      if (data.hasOwnProperty('payment_recurring_type')) {
        obj['payment_recurring_type'] = ApiClient.convertToType(data['payment_recurring_type'], 'String');
      }
      if (data.hasOwnProperty('payment_recurring_count')) {
        obj['payment_recurring_count'] = ApiClient.convertToType(data['payment_recurring_count'], 'String');
      }
      if (data.hasOwnProperty('payment_amount_type')) {
        obj['payment_amount_type'] = ApiClient.convertToType(data['payment_amount_type'], 'String');
      }
      if (data.hasOwnProperty('payment_start_date')) {
        obj['payment_start_date'] = ApiClient.convertToType(data['payment_start_date'], 'String');
      }
      if (data.hasOwnProperty('payment_end_date')) {
        obj['payment_end_date'] = ApiClient.convertToType(data['payment_end_date'], 'String');
      }
      if (data.hasOwnProperty('payment_limit_amount')) {
        obj['payment_limit_amount'] = ApiClient.convertToType(data['payment_limit_amount'], 'String');
      }
      if (data.hasOwnProperty('payment_plan_id')) {
        obj['payment_plan_id'] = ApiClient.convertToType(data['payment_plan_id'], 'String');
      }
      if (data.hasOwnProperty('payment_defer_days')) {
        obj['payment_defer_days'] = ApiClient.convertToType(data['payment_defer_days'], 'String');
      }
    }
    return obj;
  };

  /**
   * The frequency of the payments created as part of a payment setup.
   * @member {module:models/PaymentScheduleVo.PaymentRecurringTypeEnum} payment_recurring_type
   */
  exports.prototype['payment_recurring_type'] = undefined;
  /**
   * The maximum number of payments that can be created as part of a recurring payment setup.
   * @member {String} payment_recurring_count
   */
  exports.prototype['payment_recurring_count'] = undefined;
  /**
   * The amount type that is used to set the amount for payments created as part of a recurring payment or autopay setup. 
   * @member {module:models/PaymentScheduleVo.PaymentAmountTypeEnum} payment_amount_type
   */
  exports.prototype['payment_amount_type'] = undefined;
  /**
   * The date on which the first payment will be drafted as part of a recurring payment setup. This is to be specified in the ISO8601 full-date format, namely, YYYY-MM-DD.
   * @member {String} payment_start_date
   */
  exports.prototype['payment_start_date'] = undefined;
  /**
   * The date by which the last payment will be drafted as part of a recurring payment setup. This is to be specified in the ISO8601 full-date format, namely, YYYY-MM-DD.
   * @member {String} payment_end_date
   */
  exports.prototype['payment_end_date'] = undefined;
  /**
   * The upper limit for the payment amount in the case of recurring or autopay payments.
   * @member {String} payment_limit_amount
   */
  exports.prototype['payment_limit_amount'] = undefined;
  /**
   * The reference to the payment plan, offered by the biller, that is used to set up the recurring payment. The list of payment plans offered is published as part of the biller set-up.
   * @member {String} payment_plan_id
   */
  exports.prototype['payment_plan_id'] = undefined;
  /**
   * The number of days from the bill due date that the customer wishes to delay the autopay payment by.
   * @member {String} payment_defer_days
   */
  exports.prototype['payment_defer_days'] = undefined;


  /**
   * Allowed values for the <code>payment_recurring_type</code> property.
   * @enum {String}
   * @readonly
   */
  exports.PaymentRecurringTypeEnum = {
    /**
     * value: "daily"
     * @const
     */
    "daily": "daily",
    /**
     * value: "weekly"
     * @const
     */
    "weekly": "weekly",
    /**
     * value: "monthly"
     * @const
     */
    "monthly": "monthly",
    /**
     * value: "semi_monthly"
     * @const
     */
    "semi_monthly": "semi_monthly",
    /**
     * value: "bi_weekly"
     * @const
     */
    "bi_weekly": "bi_weekly",
    /**
     * value: "quarterly"
     * @const
     */
    "quarterly": "quarterly",
    /**
     * value: "half_yearly"
     * @const
     */
    "half_yearly": "half_yearly",
    /**
     * value: "annual"
     * @const
     */
    "annual": "annual"  };

  /**
   * Allowed values for the <code>payment_amount_type</code> property.
   * @enum {String}
   * @readonly
   */
  exports.PaymentAmountTypeEnum = {
    /**
     * value: "current_balance"
     * @const
     */
    "current_balance": "current_balance",
    /**
     * value: "minimum_payment_due"
     * @const
     */
    "minimum_payment_due": "minimum_payment_due",
    /**
     * value: "past_payment_due"
     * @const
     */
    "past_payment_due": "past_payment_due",
    /**
     * value: "statement_balance"
     * @const
     */
    "statement_balance": "statement_balance",
    /**
     * value: "other"
     * @const
     */
    "other": "other"  };


  return exports;
}));