package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import br.com.centralit.citcorpore.bean.CategoriaProdutoDTO;
import br.com.centralit.citcorpore.bean.ColetaPrecoDTO;
import br.com.centralit.citcorpore.bean.CotacaoDTO;
import br.com.centralit.citcorpore.bean.CriterioCotacaoCategoriaDTO;
import br.com.centralit.citcorpore.bean.CriterioItemCotacaoDTO;
import br.com.centralit.citcorpore.bean.ItemCotacaoDTO;
import br.com.centralit.citcorpore.bean.ItemRequisicaoProdutoDTO;
import br.com.centralit.citcorpore.bean.MensagemRegraNegocioDTO;
import br.com.centralit.citcorpore.bean.RequisicaoProdutoDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.integracao.CategoriaProdutoDao;
import br.com.centralit.citcorpore.integracao.ColetaPrecoDao;
import br.com.centralit.citcorpore.integracao.CotacaoDao;
import br.com.centralit.citcorpore.integracao.CriterioCotacaoCategoriaDao;
import br.com.centralit.citcorpore.integracao.CriterioItemCotacaoDao;
import br.com.centralit.citcorpore.integracao.ItemCotacaoDao;
import br.com.centralit.citcorpore.integracao.ItemRequisicaoProdutoDao;
import br.com.centralit.citcorpore.integracao.RequisicaoProdutoDao;
import br.com.centralit.citcorpore.util.Enumerados.AcaoItemRequisicaoProduto;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.ResultadoValidacao;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoCotacao;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
public class ItemCotacaoServiceEjb extends CrudServiceImpl implements ItemCotacaoService {
private ItemCotacaoDao dao;
@Override
protected ItemCotacaoDao getDao() {
if (dao == null) {
dao = new ItemCotacaoDao();
}
return dao;
}
@Override
protected void validaDelete(final Object arg0) throws Exception {
final ItemCotacaoDTO itemCotacaoDto = (ItemCotacaoDTO) this.restore((ItemCotacaoDTO) arg0);
CotacaoDTO cotacaoDto = new CotacaoDTO();
cotacaoDto.setIdCotacao(itemCotacaoDto.getIdCotacao());
cotacaoDto = (CotacaoDTO) new CotacaoDao().restore(cotacaoDto);
if (!cotacaoDto.getSituacao().equals(SituacaoCotacao.EmAndamento.name())) {
throw new LogicException("A situa��o da cota��o n�o permite a exclus�o do item.");
}
final Collection colItens = new ColetaPrecoDao().findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao());
if (colItens != null && !colItens.isEmpty()) {
throw new LogicException("Exclus�o n�o permitida. Existe pelo menos uma coleta de pre�os associada ao item de cota��o.");
}
}
@Override
public Collection findByIdCotacao(final Integer parm) throws Exception {
try {
final Collection<ItemCotacaoDTO> itensCotacao = this.getDao().findByIdCotacao(parm);
if (itensCotacao != null) {
final ItemRequisicaoProdutoDao itemRequisicaoDao = new ItemRequisicaoProdutoDao();
for (final ItemCotacaoDTO itemCotacaoDto : itensCotacao) {
itemCotacaoDto.getMensagensFmtHTML(); // S� para atualizar o atributo
itemCotacaoDto.getImagem(); // S� para atualizar o atributo
String solicitacoes = "";
final Collection<ItemRequisicaoProdutoDTO> itensRequisicao = itemRequisicaoDao.findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao());
if (itensRequisicao != null) {
final HashMap<String, String> mapSolicitacoes = new HashMap();
for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : itensRequisicao) {
if (mapSolicitacoes.get("" + itemRequisicaoDto.getIdSolicitacaoServico()) == null) {
if (!solicitacoes.equals("")) {
solicitacoes += ", ";
}
solicitacoes += "" + itemRequisicaoDto.getIdSolicitacaoServico();
mapSolicitacoes.put("" + itemRequisicaoDto.getIdSolicitacaoServico(), "" + itemRequisicaoDto.getIdSolicitacaoServico());
}
}
}
itemCotacaoDto.setSolicitacoesAtendidas(solicitacoes);
}
}
return itensCotacao;
} catch (final Exception e) {
throw new ServiceException(e);
}
}
@Override
public void deleteByIdCotacao(final Integer parm) throws Exception {
try {
this.getDao().deleteByIdCotacao(parm);
} catch (final Exception e) {
throw new ServiceException(e);
}
}
@Override
public Collection findByIdItemRequisicaoProduto(final Integer parm) throws Exception {
try {
return this.getDao().findByIdItemRequisicaoProduto(parm);
} catch (final Exception e) {
throw new ServiceException(e);
}
}
@Override
public void deleteByIdItemRequisicaoProduto(final Integer parm) throws Exception {
try {
this.getDao().deleteByIdItemRequisicaoProduto(parm);
} catch (final Exception e) {
throw new ServiceException(e);
}
}
public ItemCotacaoDTO create(final UsuarioDTO usuario, ItemCotacaoDTO itemCotacaoDto, final List<ItemRequisicaoProdutoDTO> itensRequisicao, final TransactionControler tc)
throws Exception {
if (itemCotacaoDto.getIdCategoriaProduto() == null) {
throw new Exception("Categoria do produto n�o foi informada");
}
String exigeFornecedorQualificado = "N";
if (itensRequisicao != null) {
final RequisicaoProdutoDao requisicaoProdutoDao = new RequisicaoProdutoDao();
requisicaoProdutoDao.setTransactionControler(tc);
for (final ItemRequisicaoProdutoDTO itemRequisicaoDto : itensRequisicao) {
RequisicaoProdutoDTO requisicaoDto = new RequisicaoProdutoDTO();
requisicaoDto.setIdSolicitacaoServico(itemRequisicaoDto.getIdSolicitacaoServico());
requisicaoDto = (RequisicaoProdutoDTO) requisicaoProdutoDao.restore(requisicaoDto);
if (requisicaoDto.getFinalidade().equalsIgnoreCase("C")) {
exigeFornecedorQualificado = "S";
break;
}
}
}
final CategoriaProdutoDao categoriaProdutoDao = new CategoriaProdutoDao();
CategoriaProdutoDTO categoriaProdutoDto = new CategoriaProdutoDTO();
categoriaProdutoDto.setIdCategoria(itemCotacaoDto.getIdCategoriaProduto());
categoriaProdutoDto = (CategoriaProdutoDTO) categoriaProdutoDao.restore(categoriaProdutoDto);
itemCotacaoDto.setPesoPrazoEntrega(categoriaProdutoDto.getPesoCotacaoPrazoEntrega());
itemCotacaoDto.setPesoPrazoGarantia(categoriaProdutoDto.getPesoCotacaoPrazoGarantia());
itemCotacaoDto.setPesoPrazoPagto(categoriaProdutoDto.getPesoCotacaoPrazoPagto());
itemCotacaoDto.setPesoPreco(categoriaProdutoDto.getPesoCotacaoPreco());
itemCotacaoDto.setPesoTaxaJuros(categoriaProdutoDto.getPesoCotacaoTaxaJuros());
String pesoPadrao = null;
if (itemCotacaoDto.getPesoPreco() == null) {
pesoPadrao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COTACAO_PESO_PRECO, null);
if (pesoPadrao != null && pesoPadrao.trim().length() > 0) {
itemCotacaoDto.setPesoPreco(new Integer(pesoPadrao));
}
}
if (itemCotacaoDto.getPesoPrazoEntrega() == null) {
pesoPadrao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COTACAO_PESO_PRAZO_ENTREGA, null);
if (pesoPadrao != null && pesoPadrao.trim().length() > 0) {
itemCotacaoDto.setPesoPrazoEntrega(new Integer(pesoPadrao));
}
}
if (itemCotacaoDto.getPesoPrazoGarantia() == null) {
pesoPadrao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COTACAO_PESO_GARANTIA, null);
if (pesoPadrao != null && pesoPadrao.trim().length() > 0) {
itemCotacaoDto.setPesoPrazoGarantia(new Integer(pesoPadrao));
}
}
if (itemCotacaoDto.getPesoTaxaJuros() == null) {
pesoPadrao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COTACAO_PESO_JUROS, null);
if (pesoPadrao != null && pesoPadrao.trim().length() > 0) {
itemCotacaoDto.setPesoTaxaJuros(new Integer(pesoPadrao));
}
}
if (itemCotacaoDto.getPesoPrazoPagto() == null) {
pesoPadrao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COTACAO_PESO_PRAZO_PAGTO, null);
if (pesoPadrao != null && pesoPadrao.trim().length() > 0) {
itemCotacaoDto.setPesoPrazoPagto(new Integer(pesoPadrao));
}
}
final ItemCotacaoDao itemCotacaoDao = new ItemCotacaoDao();
itemCotacaoDao.setTransactionControler(tc);
itemCotacaoDto.setExigeFornecedorQualificado(exigeFornecedorQualificado);
itemCotacaoDto = (ItemCotacaoDTO) itemCotacaoDao.create(itemCotacaoDto);
final Collection<CriterioCotacaoCategoriaDTO> colCriterios = new CriterioCotacaoCategoriaDao().findByIdCategoria(categoriaProdutoDto.getIdCategoria());
if (colCriterios != null) {
final CriterioItemCotacaoDao criterioItemCotacaoDao = new CriterioItemCotacaoDao();
criterioItemCotacaoDao.setTransactionControler(tc);
for (final CriterioCotacaoCategoriaDTO criterioCotacaoCategoriaDto : colCriterios) {
final CriterioItemCotacaoDTO criterioItemCotacaoDto = new CriterioItemCotacaoDTO();
criterioItemCotacaoDto.setIdItemCotacao(itemCotacaoDto.getIdItemCotacao());
criterioItemCotacaoDto.setIdCriterio(criterioCotacaoCategoriaDto.getIdCriterio());
criterioItemCotacaoDto.setPeso(criterioCotacaoCategoriaDto.getPesoCotacao());
criterioItemCotacaoDao.create(criterioItemCotacaoDto);
}
}
if (itensRequisicao != null) {
final ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb();
for (final ItemRequisicaoProdutoDTO itemRequisicaoProdutoDto : itensRequisicao) {
itemRequisicaoService.atualizaIdItemCotacao(usuario, itemRequisicaoProdutoDto, itemCotacaoDto, tc);
}
}
return itemCotacaoDto;
}
@Override
public void delete(final IDto model) throws ServiceException, LogicException {
ItemCotacaoDTO itemCotacaoDto = (ItemCotacaoDTO) model;
final UsuarioDTO usuarioDto = itemCotacaoDto.getUsuarioDto();
itemCotacaoDto = (ItemCotacaoDTO) this.restore(itemCotacaoDto);
itemCotacaoDto.setUsuarioDto(usuarioDto);
final CriterioItemCotacaoDao criterioItemCotacaoDao = new CriterioItemCotacaoDao();
final ItemCotacaoDao itemCotacaoDao = new ItemCotacaoDao();
final TransactionControler tc = new TransactionControlerImpl(itemCotacaoDao.getAliasDB());
try {
this.validaDelete(model);
itemCotacaoDao.setTransactionControler(tc);
criterioItemCotacaoDao.setTransactionControler(tc);
tc.start();
final ItemRequisicaoProdutoServiceEjb itemRequisicaoService = new ItemRequisicaoProdutoServiceEjb();
itemRequisicaoService.desassociaItemCotacao(itemCotacaoDto.getUsuarioDto(), itemCotacaoDto, AcaoItemRequisicaoProduto.ExclusaoItemCotacao, tc);
criterioItemCotacaoDao.deleteByIdItemCotacao(itemCotacaoDto.getIdItemCotacao());
itemCotacaoDao.delete(itemCotacaoDto);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public void valida(final TransactionControler tc, final ItemCotacaoDTO itemCotacaoDto) throws Exception {
final ColetaPrecoDao coletaPrecoDao = new ColetaPrecoDao();
if (tc != null) {
coletaPrecoDao.setTransactionControler(tc);
}
final Collection<ColetaPrecoDTO> colColetas = coletaPrecoDao.findByIdItemCotacao(itemCotacaoDto.getIdItemCotacao());
final Collection<MensagemRegraNegocioDTO> colMensagens = new ArrayList<>();
ResultadoValidacao resultado = ResultadoValidacao.V;
try {
if (colColetas == null || colColetas.isEmpty()) {
colMensagens.add(new MensagemRegraNegocioDTO(MensagemRegraNegocioDTO.ERRO, "Nenhuma coleta de pre�os cadastrada"));
resultado = ResultadoValidacao.E;
return;
}
double qtde = 0;
boolean bEmpate = false;
for (final ColetaPrecoDTO coletaPrecoDto : colColetas) {
if (coletaPrecoDto.getResultadoFinal() == null) {
continue;
}
if (!bEmpate) {
bEmpate = coletaPrecoDto.getResultadoFinal().equals(ColetaPrecoDTO.RESULT_EMPATE);
}
if (coletaPrecoDto.getResultadoFinal().equals(ColetaPrecoDTO.RESULT_MELHOR_COTACAO)) {
qtde += coletaPrecoDto.getQuantidadeCompra().doubleValue();
}
}
if (bEmpate) {
colMensagens.add(new MensagemRegraNegocioDTO(MensagemRegraNegocioDTO.ERRO, "Existe(m) empate(s)"));
resultado = ResultadoValidacao.E;
}
if (qtde > itemCotacaoDto.getQuantidade().doubleValue()) {
colMensagens.add(new MensagemRegraNegocioDTO(MensagemRegraNegocioDTO.ERRO, "Quantidade para compra � maior que a quantidade solicitada"));
resultado = ResultadoValidacao.E;
}
if (!bEmpate && qtde < itemCotacaoDto.getQuantidade().doubleValue()) {
colMensagens.add(new MensagemRegraNegocioDTO(MensagemRegraNegocioDTO.AVISO, "Quantidade para compra � menor que a quantidade solicitada"));
if (resultado.equals(ResultadoValidacao.V)) {
resultado = ResultadoValidacao.A;
}
}
} finally {
itemCotacaoDto.setColMensagensValidacao(colMensagens);
itemCotacaoDto.setResultadoValidacao(resultado.name());
}
}
public void validaEAtualiza(final TransactionControler tc, final Integer idItemCotacao) throws Exception {
final ItemCotacaoDao itemCotacaoDao = new ItemCotacaoDao();
itemCotacaoDao.setTransactionControler(tc);
ItemCotacaoDTO itemCotacaoDto = new ItemCotacaoDTO();
itemCotacaoDto.setIdItemCotacao(idItemCotacao);
itemCotacaoDto = (ItemCotacaoDTO) itemCotacaoDao.restore(itemCotacaoDto);
this.valida(tc, itemCotacaoDto);
itemCotacaoDao.update(itemCotacaoDto);
}
}