package com.rjconsultores.ventaboletos.service;

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

import com.rjconsultores.ventaboletos.entidad.Conferencia;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.LogConferencia;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.IndStatusBoleto;
import com.rjconsultores.ventaboletos.enums.comissao.BoletoStatusComissao;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao;
import com.rjconsultores.ventaboletos.vo.comissao.ConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.vo.comissao.DiaConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.vo.comissao.EtiquetaMalote;
import com.rjconsultores.ventaboletos.vo.comissao.EventosFinanceirosVO;
import com.rjconsultores.ventaboletos.vo.comissao.LogConferenciaVO;
import com.rjconsultores.ventaboletos.vo.comissao.OcdVO;
import com.rjconsultores.ventaboletos.vo.comissao.ResumoComissao;

public interface ConferenciaComissaoService extends GenericService<Conferencia, Long> {

	public Conferencia suscribirOrActualizacion(Conferencia entidad);

	public List<ConferenciaComissaoVO> carregarConferenciaComissao(String competencia, Empresa empresa, PuntoVenta puntoVenta, Date dataMovimento, boolean isDesconsideraPtVendaFechados) throws BusinessException;

	public List<ConferenciaComissaoVO> carregarConferenciaComissao(Date dataInicial, Date dataFinal, Empresa empresa, PuntoVenta puntoVenta, Date dataMovimento, boolean isDesconsideraPtVendaFechados) throws BusinessException;

	public Conferencia confirmarChegadaMalote(Conferencia conferencia) throws BusinessException;

	public Conferencia cancelarChegadaMalote(Conferencia conferencia);

	public Conferencia encerrarMovimentoDiario(Conferencia conferencia) throws BusinessException;

	public List<EventosFinanceirosVO> carregarEventosFinanceiros(Conferencia conferencia) throws BusinessException;

	public List<LogConferenciaVO> carregarLogConferencia(Conferencia conferencia) throws BusinessException;

	public LogConferencia suscribirLogConferencia(LogConferencia logConferencia) throws BusinessException;

	public void borrarLogConferencia(LogConferencia logConferencia) throws BusinessException;

	public LogConferencia obtenerLogConferenciaID(Long logconferenciaId);

	public List<BoletoComissao> carregarBilhetesComissao(List<BoletoComissao> boletoComissaos, Conferencia conferencia, BoletoStatusComissao boletoStatusComissao, boolean carregarDadosFaltantes) throws BusinessException;

	public List<BoletoComissao> carregarBilhetesComissao(List<BoletoComissao> boletoComissaos, List<Conferencia> conferencias, BoletoStatusComissao boletoStatusComissao, boolean carregarDadosFaltantes) throws BusinessException;

	public List<OcdVO> carregarOcds(Conferencia conferencia) throws BusinessException;

	public Conferencia reabrirMovimentoDiario(Conferencia conferencia) throws BusinessException;

	public Conferencia obtenerConferenciaDataMovimento(Date datamovimento, Integer puntoventaId, Integer empresaId) throws BusinessException;

	public boolean isBilhetesSemConferencia(List<BoletoComissao> lsBoletoComissao) throws BusinessException;

	public boolean isEventosFinanceirosSemConferencia(List<EventosFinanceirosVO> lsEventosFinanceiros) throws BusinessException;

	public boolean isOcdSemConferencia(List<OcdVO> lsOcd) throws BusinessException;

	public BigDecimal totalizarBoletoComissao(List<BoletoComissao> lsBoletoComissao, IndStatusBoleto... statusBilhete) throws BusinessException;

	public BigDecimal totalizarEventosFinanceiros(List<EventosFinanceirosVO> lsEventosFinanceiros) throws BusinessException;

	public OcdVO totalizarOcd(List<OcdVO> lsOcd) throws BusinessException;

	public ResumoComissao gerarResumo(Conferencia conferencia, List<BoletoComissao> boletoComissaos, List<EventosFinanceirosVO> lsEventosFinanceiros, BigDecimal totalBilhetesManual, BigDecimal totalBilhetesVendidos, BigDecimal totalBilhetesCancelados,
			BigDecimal totalBilhetesDevolvidos, BigDecimal totalBilhetesGap, BigDecimal totalBilhetesGapCancelados, BigDecimal totalBilhetesGapDevolvidos,
			BigDecimal totalCreditosEventoFinanceiros, BigDecimal totalDebitosEventoFinanceiros, OcdVO totalOcd,
			BigDecimal totalBilhetesTrocados, BigDecimal totalBilhetesGapTrocados) throws BusinessException;

	public EtiquetaMalote decodificarEtiquetaMalote(String codigoBarras) throws BusinessException;

	public void confirmarChegadaMalote(EtiquetaMalote etiquetaMalote) throws BusinessException;

	public boolean isConferenciaCompetenciaEncerrada(String competencia, Empresa empresa, PuntoVenta puntoVenta, boolean isDesconsideraPtVendaFechados ) throws BusinessException;

	public Map<BoletoStatusComissao, BigDecimal> totalizarBoletoComissaoDevolvidosTrocaOcd(List<BoletoComissao> lsBoletoComissao) throws BusinessException;

	public DiaConferenciaComissaoVO carregarConferenciaRegistrada(Date datamovimento, Empresa empresa, PuntoVenta puntoVenta) throws BusinessException;

	public List<String> quantidadeECFPorPuntoVenta(Conferencia conferencia);

	public void enviarEmailIrregularidadeECF(String email, String msg, String assunto) throws Exception;

	public void generacionAutomaticaConferencia();

	public boolean isConferidoVenta(BoletoComissao boletoComissao);
	
	public void borrarLogConferenciaTransacaoId(Long transacaoId) throws BusinessException;
	
	public boolean isConferenciaCompetenciaEncerrada(Date dataInicial, Date dataFinal, Empresa empresa, PuntoVenta puntoVenta, boolean isDesconsideraPtVendaFechados) throws BusinessException;

	public BigDecimal getComissaoPuntoVenta(Integer puntoventaId, Integer empresaId, Date dataInicial, Date dataFinal) throws BusinessException;
}
