/*
 * Copyright 2017 The Mifos Initiative.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.mifos.deposit.service.internal.repository;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "shed_terms")
public class TermEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Long id;
  @OneToOne
  @JoinColumn(name = "product_definition_id", nullable = false, unique = true)
  private ProductDefinitionEntity productDefinition;
  @Column(name = "period", nullable = false)
  private Integer period;
  @Column(name = "time_unit", nullable = false)
  private String timeUnit;
  @Column(name = "interest_payable", nullable = false)
  private String interestPayable;

  public TermEntity() {
    super();
  }

  public Long getId() {
    return this.id;
  }

  public ProductDefinitionEntity getProductDefinition() {
    return this.productDefinition;
  }

  public void setProductDefinition(final ProductDefinitionEntity productDefinition) {
    this.productDefinition = productDefinition;
  }

  public void setId(final Long id) {
    this.id = id;
  }

  public Integer getPeriod() {
    return this.period;
  }

  public void setPeriod(final Integer period) {
    this.period = period;
  }

  public String getTimeUnit() {
    return this.timeUnit;
  }

  public void setTimeUnit(final String timeUnit) {
    this.timeUnit = timeUnit;
  }

  public String getInterestPayable() {
    return this.interestPayable;
  }

  public void setInterestPayable(final String interestPayable) {
    this.interestPayable = interestPayable;
  }
}
