br.com.hslife.orcamento.service.ItemDespensaService.java Source code

Java tutorial

Introduction

Here is the source code for br.com.hslife.orcamento.service.ItemDespensaService.java

Source

/***
      
 Copyright (c) 2012 - 2020 Hrcules S. S. Jos
    
Este arquivo  parte do programa Oramento Domstico.
    
    
Oramento Domstico  um software livre; voc pode redistribui-lo e/ou 
    
modific-lo dentro dos termos da Licena Pblica Geral Menor GNU como 
    
publicada pela Fundao do Software Livre (FSF); na verso 2.1 da 
    
Licena.
    
    
Este programa  distribudo na esperana que possa ser til, 
    
mas SEM NENHUMA GARANTIA; sem uma garantia implcita de ADEQUAO a 
    
qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica 
    
Geral Menor GNU em portugus para maiores detalhes.
    
    
Voc deve ter recebido uma cpia da Licena Pblica Geral Menor GNU sob o 
    
nome de "LICENSE.TXT" junto com este programa, se no, acesse o site do
    
projeto no endereco https://github.com/herculeshssj/orcamento ou escreva 
    
para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, 
    
Boston, MA  02110-1301, USA.
    
    
Para mais informaes sobre o programa Oramento Domstico e seu autor entre  
    
em contato pelo e-mail herculeshssj@outlook.com, ou ainda escreva para 
    
Hrcules S. S. Jos, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, 
    
Marco II - Nova Iguau, RJ, Brasil.
      
***/

package br.com.hslife.orcamento.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.hslife.orcamento.component.OpcaoSistemaComponent;
import br.com.hslife.orcamento.component.UsuarioComponent;
import br.com.hslife.orcamento.entity.Despensa;
import br.com.hslife.orcamento.entity.ItemDespensa;
import br.com.hslife.orcamento.entity.MovimentoItemDespensa;
import br.com.hslife.orcamento.entity.Usuario;
import br.com.hslife.orcamento.enumeration.OperacaoDespensa;
import br.com.hslife.orcamento.exception.BusinessException;
import br.com.hslife.orcamento.facade.IItemDespensa;
import br.com.hslife.orcamento.repository.ItemDespensaRepository;

@Service("itemDespensaService")
public class ItemDespensaService extends AbstractCRUDService<ItemDespensa> implements IItemDespensa {

    @Autowired
    private ItemDespensaRepository repository;

    @Autowired
    private UsuarioComponent usuarioComponent;

    @Autowired
    public OpcaoSistemaComponent opcaoSistemaComponent;

    public ItemDespensaRepository getRepository() {
        this.repository.setSessionFactory(this.sessionFactory);
        return repository;
    }

    public UsuarioComponent getUsuarioComponent() {
        return usuarioComponent;
    }

    public OpcaoSistemaComponent getOpcaoSistemaComponent() {
        return opcaoSistemaComponent;
    }

    @Override
    public void registrarCompraConsumo(ItemDespensa entity, MovimentoItemDespensa movimentoItemDespensa) {
        if (movimentoItemDespensa.getOperacaoDespensa().equals(OperacaoDespensa.CONSUMO)
                && (entity.getQuantidadeAtual() - movimentoItemDespensa.getQuantidade()) < 0) {
            throw new BusinessException("Quantidade informada ultrapassa estoque disponvel!");
        }
        entity.getMovimentacao().add(movimentoItemDespensa);
        entity.setQuantidadeAtual(0);
        for (MovimentoItemDespensa mid : entity.getMovimentacao()) {
            if (mid.getOperacaoDespensa().equals(OperacaoDespensa.COMPRA)) {
                entity.setQuantidadeAtual(entity.getQuantidadeAtual() + mid.getQuantidade());
            } else {
                entity.setQuantidadeAtual(entity.getQuantidadeAtual() - mid.getQuantidade());
            }
        }
        getRepository().update(entity);
    }

    @Override
    public void desfazerRegistroCompraConsumo(ItemDespensa entity) {
        if (entity.getMovimentacao() != null && entity.getMovimentacao().size() > 0) {
            Collections.reverse(entity.getMovimentacao());
        } else {
            throw new BusinessException("Impossvel desfazer! Item de despensa sem movimentao!");
        }
        MovimentoItemDespensa movimentoItemDespensa = entity.getMovimentacao().get(0);
        if (movimentoItemDespensa.getOperacaoDespensa().equals(OperacaoDespensa.COMPRA)
                && (entity.getQuantidadeAtual() - movimentoItemDespensa.getQuantidade()) < 0) {
            throw new BusinessException(
                    "Impossvel desfazer! Quantidade informada ultrapassa estoque disponvel!");
        }
        entity.getMovimentacao().remove(movimentoItemDespensa);
        entity.setQuantidadeAtual(0);
        for (MovimentoItemDespensa mid : entity.getMovimentacao()) {
            if (mid.getOperacaoDespensa().equals(OperacaoDespensa.COMPRA)) {
                entity.setQuantidadeAtual(entity.getQuantidadeAtual() + mid.getQuantidade());
            } else {
                entity.setQuantidadeAtual(entity.getQuantidadeAtual() - mid.getQuantidade());
            }
        }
        getRepository().update(entity);
    }

    @Override
    public void arquivarItemDespensa(ItemDespensa entity) {
        if (!entity.isArquivado()) {
            entity.setArquivado(true);
            getRepository().update(entity);
        }
    }

    @Override
    public void desarquivarItemDespensa(ItemDespensa entity) {
        if (entity.isArquivado()) {
            entity.setArquivado(false);
            getRepository().update(entity);
        }
    }

    @Override
    public List<ItemDespensa> gerarListaCompras(Usuario usuario) {
        List<ItemDespensa> listaDespensas = new ArrayList<ItemDespensa>();
        for (ItemDespensa item : getRepository().findByUsuarioAndArquivado(usuario, false)) {
            if (item.getQuantidadeAtual() <= item.getQuantidadeVermelho()) {
                item.setQuantidadeAtual(item.getQuantidadeVerde() - item.getQuantidadeAtual());
                item.setValor(item.getValor() * (item.getQuantidadeVerde() - item.getQuantidadeAtual()));
                listaDespensas.add(item);
            } else if (item.getValidade() != null && item.getValidade().before(new Date())) {
                item.setQuantidadeAtual(item.getQuantidadeVerde());
                item.setValor(item.getValor() * item.getQuantidadeVerde());
                listaDespensas.add(item);
            }
        }
        return listaDespensas;
    }

    @Override
    public List<ItemDespensa> buscarPorDespensaUsuarioEArquivado(Despensa despensa, Usuario usuario,
            boolean arquivado) {
        return getRepository().findByDespensaUsuarioAndArquivado(despensa, usuario, arquivado);
    }

    @Override
    public List<ItemDespensa> buscarPorUsuarioEArquivado(Usuario usuario, boolean arquivado) {
        return getRepository().findByUsuarioAndArquivado(usuario, arquivado);
    }

    public void apagarHistorico(ItemDespensa entity) {
        entity.getMovimentacao().clear();
        entity.setQuantidadeAtual(0);
        entity.setValidade(null);
        entity.setValor(0);
        getRepository().update(entity);
    }

    @Override
    public List<ItemDespensa> buscarItensDespesaVencidos() {
        // Retorna todos os itens de despensa do usurio que so perecveis e no esto arquivados
        List<ItemDespensa> itens = getRepository()
                .findAllPerecivelByUsuario(getUsuarioComponent().getUsuarioLogado());

        // Se a opo de estoque estiver ativada, verifica se o item j venceu pela data de validade
        if (getOpcaoSistemaComponent().getControlarEstoqueItemDespensa()) {

            List<ItemDespensa> itensVencidos = new ArrayList<>();

            for (ItemDespensa item : itens) {
                if (item.getValidade() != null && item.getValidade().before(new Date())) {
                    itensVencidos.add(item);
                }
            }
            return itensVencidos;
        }

        return new ArrayList<>();
    }
}