/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.fineract.cn.deposit.service.internal.mapper;

import org.apache.fineract.cn.deposit.api.v1.definition.domain.Term;
import org.apache.fineract.cn.deposit.service.internal.repository.TermEntity;

public class TermMapper {

  private TermMapper() {
    super();
  }

  public static TermEntity map(final Term term) {
    final TermEntity termEntity = new TermEntity();
    termEntity.setPeriod(term.getPeriod());
    termEntity.setTimeUnit(term.getTimeUnit());
    termEntity.setInterestPayable(term.getInterestPayable());

    return termEntity;
  }

  public static Term map(final TermEntity termEntity) {
    final Term term = new Term();
    term.setPeriod(termEntity.getPeriod());
    if (termEntity.getTimeUnit() != null) {
      term.setTimeUnit(termEntity.getTimeUnit());
    }
    term.setInterestPayable(termEntity.getInterestPayable());

    return term;
  }
}
