package com.ejie.m62fb.dao.registroVPP;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.ejie.m62fb.model.ContratoAlquiler;
import com.ejie.m62fb.model.ContratoAlquilerActMasiva;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ContratoAlquilerDao generated by UDA, 20-oct-2015 12:04:30.
 * 
XXXX
 */

public interface ContratoAlquilerDao {

	/**
	 * Inserts a single row in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return ContratoAlquiler
	 */
	ContratoAlquiler add(ContratoAlquiler contratoAlquiler);

	/**
	 * Updates a single row in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return ContratoAlquiler
	 */
	ContratoAlquiler update(ContratoAlquiler contratoAlquiler);

	/**
	 * Finds a single row in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return ContratoAlquiler
	 */
	ContratoAlquiler find(ContratoAlquiler contratoAlquiler);

	/**
	 * Finds a single row in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return ContratoAlquiler
	 */
	ContratoAlquiler findForUpdate(ContratoAlquiler contratoAlquiler);

	/**
	 * Removes a single row in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 */
	void remove(ContratoAlquiler contratoAlquiler);

	/**
	 * Finds a List of rows in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List
	 */
	List<ContratoAlquiler> findAll(ContratoAlquiler contratoAlquiler,
			JQGridRequestDto jqGridRequestDto);

	/**
	 * Finds a List of rows in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquilerActMasiva
	 *            ContratoAlquilerActMasiva
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List
	 */
	List<ContratoAlquilerActMasiva> findAllActMasiva(ContratoAlquilerActMasiva contratoAlquilerActMasiva,
			JQGridRequestDto jqGridRequestDto);
	/**
	 * Finds rows in the ContratoAlquiler table using like.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List
	 */
	List<ContratoAlquiler> findAllLike(ContratoAlquiler contratoAlquiler,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the ContratoAlquiler table using like.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	Long findAllLikeCount(ContratoAlquiler contratoAlquiler, Boolean startsWith);

	/**
	 * Counts rows in the ContratoAlquiler table.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return Long
	 */
	Long findAllCount(ContratoAlquiler contratoAlquiler);

	/**
	 * Reorder selection.
	 * 
	 * @param filterContratoAlquiler
	 *            ContratoAlquiler
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<ContratoAlquiler>>
	 */
	List<TableRowDto<ContratoAlquiler>> reorderSelection(
			ContratoAlquiler filterContratoAlquiler,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/**
	 * Funcion que calcula la fecha fin prorroga forzosa teniendo en cuenta la
	 * fecha inicio, fecha fin y fecha entrada.
	 * 
	 * @param fecInicio
	 *            Date
	 * @param fecFin
	 *            Date
	 * @param fecEntrada
	 *            Date
	 * @return Date
	 */
	Date calcFecFinProrForzosa(Date fecInicio, Date fecFin, Date fecEntrada);

	/**
	 * Máximo NUM_INQUILINO que hay para una vivienda en la tabla
	 * CONTRATO_ALQUILER e incrementandolo en 1.
	 * 
	 * @param numVivienda
	 *            BigDecimal
	 * @return BigDecimal
	 */
	public BigDecimal findNumInquilinoMaxMasUno(BigDecimal numVivienda);

	/**
	 * Funcion que valida la coherencia entre las fechas inicio y fin. Consulta
	 * si estamos en el ultimo contrato. Si estamos en el ultimo contrato, la
	 * fecha inicio debe ser mayor que la fecha inicio del resto de contratos.
	 * Si no estamos en el ultimo contrato, hay que comprobar el rango de fechas
	 * inicio/fin.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return String
	 */
	public String validarFechasIniFin(ContratoAlquiler contratoAlquiler);

	/**
	 * Si estamos modificando el ultimo contrato de la vivienda, se valida si
	 * debemos modificar la fecha fin del contrato anterior, bien porque este
	 * sea nulo o sea superior a la fecha inicio de nuestro contrato, con el día
	 * anterior a la fecha de inicio de nuestro contrato.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @return Integer
	 */
	public Integer validarFechaFinContrato(ContratoAlquiler contratoAlquiler);

	/**
	 * Modificación del contrato anterior. Se actualiza la Fecha Fin, restando
	 * un día a la Fecha Inicio del contrato que estamos modificando.
	 * 
	 * @param contratoAlquiler
	 *            ContratoAlquiler
	 * @param idContrato
	 *            Integer
	 * @return ContratoAlquiler
	 */
	public ContratoAlquiler updateFecFinContratoAnterior(
			ContratoAlquiler contratoAlquiler, Integer idContrato);
}
