public CarteiraDTO GetCarteiraAtivaByUsuario(long usuarioId)
        {
            Carteira carteira = _carteiraRepository.GetCarteiraAtivaByUsuario(usuarioId);
            var      config   = new MapperConfiguration(cfg => cfg.CreateMap <Carteira, CarteiraDTO>());
            var      mapper   = config.CreateMapper();

            CarteiraDTO carteiraDto = mapper.Map <CarteiraDTO>(carteira);

            // carteiraDto.Status = STATUS[carteiraDto.StatusId];
            return(carteiraDto);
        }
        /*
         * @TODO
         * Aplicar regras de negócio para o cancelamento
         */
        public void cancelarCarteira(CarteiraDTO carteiraDto)
        {
            Carteira           carteira = _carteiraRepository.GetCarteira(carteiraDto.Id);
            List <DespesaFixa> despesas = _despesaFixaRepository.getListaCarteiraAtiva(carteira.Id);

            if ((carteira.StatusId == (int)STATUS.FINALIZADO || carteira.StatusId == (int)STATUS.ABERTO) && despesas.Count > 0)
            {
                throw new VerificationException("Carteira já possui despesas vinculadas");
            }
            carteira.StatusId = (int)STATUS.CANCELADO;
            _carteiraRepository.Update(carteira);
        }
 public ActionResult cancelarCarteira([FromBody] CarteiraDTO carteiraDto)
 {
     try
     {
         throw new NotSupportedException("Função não permitida");
         // _carteiraService.cancelarCarteira(carteiraDto);
         // return NoContent();
     }
     catch (Exception e)
     {
         return(BadRequest(e.Message));
     }
 }
        public ActionResult reativarCarteira([FromRoute] long id)
        {
            CarteiraDTO carteiraDto = new CarteiraDTO();

            carteiraDto.Id = id;
            try
            {
                Carteira carteira = _carteiraService.reativarCarteira(carteiraDto);
                return(Ok(carteira));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public ActionResult finalizarCarteira([FromRoute] long id)
        {
            CarteiraDTO carteiraDto = new CarteiraDTO();

            carteiraDto.Id = id;
            try
            {
                _carteiraService.finalizarCarteira(carteiraDto);
                return(NoContent());
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public ActionResult <CarteiraDTO> GetCarteira([FromRoute] long usuarioId)
        {
            CarteiraDTO carteiraDto = new CarteiraDTO();

            carteiraDto.usuarioId = usuarioId;
            try
            {
                CarteiraDTO carteira = _carteiraService.GetCarteiraAtivaByUsuario(carteiraDto.usuarioId);
                return(Ok(carteira));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public ActionResult <Carteira> nova([FromRoute] long usuarioId)
        {
            CarteiraDTO carteiraDto = new CarteiraDTO();

            carteiraDto.usuarioId = usuarioId;
            try
            {
                Carteira carteiraSalva = _carteiraService.Salvar(carteiraDto);
                return(Ok(carteiraSalva));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public ActionResult <IEnumerable <Carteira> > GetCarteiraDoUsuarioById([FromRoute] long usuarioId)
        {
            CarteiraDTO carteiraDto = new CarteiraDTO();

            carteiraDto.usuarioId = usuarioId;
            try
            {
                ICollection <Carteira> carteiras = _carteiraService.getCarteirasByUsuario(carteiraDto.usuarioId);
                return(Ok(carteiras));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
        public Carteira Salvar(CarteiraDTO carteiraDTO)
        {
            if (_carteiraRepository.hasCarteiraAtiva(carteiraDTO.usuarioId))
            {
                throw new DuplicateWaitObjectException("Já existe uma carteira aberta");
            }

            var config = new MapperConfiguration(cfg => cfg.CreateMap <CarteiraDTO, Carteira>());
            var mapper = config.CreateMapper();

            Usuario  usuario  = _usuarioRepository.Get(carteiraDTO.usuarioId);
            Carteira carteira = mapper.Map <Carteira>(carteiraDTO);

            carteira.Renda = usuario.Renda;

            _carteiraRepository.Add(carteira);

            return(carteira);
        }
        public Carteira reativarCarteira(CarteiraDTO carteiraDto)
        {
            Carteira ultimaCarteira = _carteiraRepository.getUltimaCarteira();

            if (carteiraDto.Id == ultimaCarteira.Id &&
                (ultimaCarteira.StatusId == (int)STATUS.CANCELADO ||
                 ultimaCarteira.StatusId == (int)STATUS.FINALIZADO))
            {
                DateTime now = DateTime.Now;

                if (ultimaCarteira.CriadoEm?.Month == now.Month &&
                    ultimaCarteira.CriadoEm?.Year == now.Year)
                {
                    ultimaCarteira.StatusId = (int)STATUS.ABERTO;
                    _carteiraRepository.Update(ultimaCarteira);
                    return(ultimaCarteira);
                }
                throw new ArgumentException(paramName: "Carteira", message: "A carteira precisa ser do mesmo mês e ano da data de reativação");
            }
            throw new ArgumentException(paramName: "Carteira", message: "A carteira enviada não foi a última criada ou não foi finalizada");
        }
        public void finalizarCarteira(CarteiraDTO carteiraDto)
        {
            Carteira carteira = _carteiraRepository.GetCarteira(carteiraDto.Id);

            if (carteira.StatusId != (int)STATUS.ABERTO)
            {
                throw new VerificationException("Carteira não está aberta");
            }

            List <DespesaFixa> despesas = _despesaFixaRepository.getDespesaFixaContinuaPorCarteira(carteira.Id);

            foreach (var despesa in despesas)
            {
                if (despesa.StatusId == (int)STATUS.ABERTO)
                {
                    throw new VerificationException("Carteira possui despesa(s) contínua(s) sem finalizar com valor final");
                }
            }

            carteira.StatusId = (int)STATUS.FINALIZADO;
            _carteiraRepository.Update(carteira);
        }