package com.rjconsultores.ventaboletos.service;

import java.util.Date;
import java.util.List;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.exception.ComissaoException;
import com.rjconsultores.ventaboletos.vo.comissao.HistoricoComissao;
import com.rjconsultores.ventaboletos.vo.comissao.RegistroCalculo;

public interface CalculoComissaoService {

	public RegistroCalculo relatorioCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo) throws ComissaoException, BusinessException;

	public void registrarCalculoComissao(PuntoVenta puntoVenta, Empresa empresa, Date periodo, boolean ignorarComissaoGerada, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo) throws ComissaoException;

	public void cancelarCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo) throws ComissaoException, BusinessException;

	/**
	 * Relatorio Analitico da comissao
	 * @param empresaId
	 * @param competencia - Informe o competencia se o calculo da comissão for por mês
	 * @param dataInicial - Informe a data inicial se o calculo da comissao for por periodo
	 * @param dataFinal - Informe a data final se o calculo da comissao for por periodo
	 * @param usuarioId
	 * @param isRetencaoDiaria
	 * @param isRefazerCalculo
	 * @return
	 * @throws ComissaoException
	 * @throws BusinessException
	 */
	public List<RegistroCalculo> relatorioCalculoComissao(Integer empresaId, Date competencia, Date dataInicial, Date dataFinal, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo) throws ComissaoException, BusinessException;
	
	public void registrarCalculoComissao(Empresa empresa, Date periodo, boolean ignorarComissaoGerada, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo) throws ComissaoException;

	public void cancelarCalculoComissao(Integer empresaId, Date periodo) throws ComissaoException, BusinessException;
	
	public List<HistoricoComissao> relatorioReciboComissao(Integer puntoVentaId, Integer empresaId, String competencia) throws ComissaoException;

	public boolean enviarEmailReciboComissao(HistoricoComissao historicoComissao, byte[] recibo);

	public void registrarCalculoComissao(PuntoVenta puntoVenta, Empresa empresa, Date dataInicial, Date dataFinal, Integer usuarioId) throws ComissaoException, BusinessException;
	
	public void retencaoAutomaticaComissao(Date dataRetencao);
	
	public RegistroCalculo realizarCalculoComissao(Integer puntoVentaId, Integer empresaId, Date periodo, Boolean isRetencaoDiaria, Integer usuarioId, Boolean isRefazerCalculo) throws ComissaoException, BusinessException;

	/**
	 * Relatorio de comissão por data inicial e data final
	 * @param puntoVentaId
	 * @param empresaId
	 * @param usuarioId
	 * @param isRetencaoDiaria
	 * @param isRefazerCalculo
	 * @param dataInicial
	 * @param dataFinal
	 * @return
	 * @throws ComissaoException
	 * @throws BusinessException
	 */
	public RegistroCalculo relatorioCalculoComissao(Integer puntoVentaId, Integer empresaId, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo, Date dataInicial, Date dataFinal) throws ComissaoException, BusinessException;

	/**
	 * Registra a comissão por periodo
	 * @param puntoVenta
	 * @param empresa
	 * @param ignorarComissaoGerada
	 * @param usuarioId
	 * @param isRetencaoDiaria
	 * @param isRefazerCalculo
	 * @param dataInicial
	 * @param dataFinal
	 * @throws ComissaoException
	 */
	public void registrarCalculoComissaoPeriodo(PuntoVenta puntoVenta, Empresa empresa, boolean ignorarComissaoGerada, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo, Date dataInicial, Date dataFinal) throws ComissaoException;
	
	/**
	 * Registra a comissão por periodo para todos os pontos de venda
	 * @param puntoVenta
	 * @param empresa
	 * @param ignorarComissaoGerada
	 * @param usuarioId
	 * @param isRetencaoDiaria
	 * @param isRefazerCalculo
	 * @param dataInicial
	 * @param dataFinal
	 * @throws ComissaoException
	 */
	public void registrarCalculoComissaoPeriodo(Empresa empresa, boolean ignorarComissaoGerada, Integer usuarioId, Boolean isRetencaoDiaria, Boolean isRefazerCalculo, Date dataInicial, Date dataFinal) throws ComissaoException;
	
	/**
	 * Cancela o calculo de comissao por periodo
	 * @param puntoVentaId
	 * @param empresaId
	 * @param dataInicial
	 * @param dataFinal
	 * @throws ComissaoException
	 * @throws BusinessException 
	 */
	public void cancelarCalculoComissaoPeriodo(Integer puntoVentaId, Integer empresaId, Date dataInicial, Date dataFinal) throws ComissaoException, BusinessException;
	
	/**
	 * Cancela o calculo de comissao por periodo para todas as agencas
	 * @param empresaId
	 * @param dataInicial
	 * @param dataFinal
	 * @throws ComissaoException
	 * @throws BusinessException 
	 */
	public void cancelarCalculoComissaoPeriodo(Integer empresaId, Date dataInicial, Date dataFinal) throws ComissaoException, BusinessException;

	/**
	 * Recupera o historico de comissão por periodo
	 * @param puntoVentaId
	 * @param empresaId
	 * @param dataInicial
	 * @param dataFinal
	 * @return
	 * @throws ComissaoException
	 */
	public List<HistoricoComissao> relatorioReciboComissao(Integer puntoVentaId, Integer empresaId, Date dataInicial, Date dataFinal) throws ComissaoException;
	
}
