/**
 * 
 */
package com.ejie.ad74a.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.ejie.ad74a.model.Periodo;
import com.ejie.ad74a.model.Solicitante;
import com.ejie.ad74a.util.constantes.ConstantesBatch.LiqValMapKey;

/**
 * Interfaz capa de servicio para los procesos de copago de beneficiarios
 * 
 * @author BICUGUAL
 *
 */
public interface CopagoBeneficiarioService {

	/**
	 * Obtiene la lista de solicitantes con sus respectivos copagos
	 * 
	 * @param idProvincia
	 * @param mensualidad
	 * @return
	 */
	List<Solicitante> getLstSolicitantes(String idProvincia, Periodo mensualidad);

	/**
	 * Procesamiento de solicitantes en batch para la generacion de mensualidades
	 * 
	 * @param lstSolicitantes
	 * @param mensualidad
	 * @param idEjecucion
	 * @param modoPrueba      Si está activado, los registros se generan sin
	 *                        id_mensualidad final ya que no van a volcarse a las
	 *                        tablas finales.
	 */
	void generateMensualidadesEspejo(List<Solicitante> lstSolicitantes, Periodo mensualidad, String idEjecucion,
			boolean modoPrueba);

	/**
	 * Vuelca los registros de mensualidad de una ejecucion, de la tabla espejo a la
	 * tabla final.
	 * 
	 * @param idEjecucion
	 */
	void volcarMensualidadesEspejoAFinales(String idEjecucion);

	/**
	 * Recupera la lista de solicitantes con su idMensualidad para generar
	 * liquidaciones. Los importes no se calculan, estan informados en mensualidad
	 * 
	 * @param idEjecucion
	 * @param mensualidad
	 * @return
	 */
	List<Solicitante> getSolicitantesConMensualidadEspejo(String idEjecucion, Periodo mensualidad);

	/**
	 * Recupera la lista de solicitantes con liquidaciones pendientes de pago
	 * 
	 * @param idProvincia
	 * @return
	 */
	List<Solicitante> getLstSolicitantesConLiquidacionPendiente(String idProvincia);

	/**
	 * Recupera la lista de solicitantes con liquidaciones pendientes de pago para
	 * una lista de mensualidades
	 * 
	 * @param idEjecucion
	 * @return
	 */
	List<Solicitante> getLstSolicitantesConLiquidacionPendientePorMensualidades(String idEjecucion);

	/**
	 * Realiza las comprobaciones de que las mensualidades generadas (en la tabla
	 * espejo) en esta ejecución, no tienen fallos (registros duplicados, null,
	 * ...).
	 * 
	 * @param idEjecucion
	 * @return Lista de errores y avisos que puede devolver la comprobacion
	 */
	Map<LiqValMapKey, Collection<String>> comprobarMensualidadesGeneradas(String idEjecucion);

}
