(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. This is applicable only for recurring payment setup, in which case it is mandatory.
   * @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. This cannot be specified for autopay setups.
   * @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. In the case of a recurring payment setup, the payment amount can be specified by the customer. In that case, the payment_amount_type should not be sent as it would default to 'other'. In the case of an autopay setup, the payment amount type is mandatory and it cannot be specified as 'other'. In this case, the payment amount should not be sent.
   * @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. This is mandatory for recurring payment setup. This cannot be specified for autopay setups.
   * @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. This cannot be specified for autopay setups.
   * @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. Any amount above the limit will not be paid automatically as part of recurring payments and autopay.
   * @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. By default an autopay payment is drafted on the bill due date.
   * @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: "discounted_amount"
     * @const
     */
    "discounted_amount": "discounted_amount",
    /**
     * value: "penalty_amount"
     * @const
     */
    "penalty_amount": "penalty_amount",
    /**
     * value: "other"
     * @const
     */
    "other": "other"  };


  return exports;
}));