public async Task <Unit> Handle(UpdateMovimentacaoPrevistaCommand request, CancellationToken cancellationToken)
        {
            MovimentacaoPrevista movimentacaoPrevista = mapper.Map <MovimentacaoPrevista>(request);

            var validate = new MovimentacaoPrevistaValidation().Validate(movimentacaoPrevista);

            if (!validate.IsValid)
            {
                throw new ValidationException(validate.Errors);
            }

            Movimentacao movimentacao = movimentacaoDomainService.GetByKey(movimentacaoPrevista.IdItemMovimentacao,
                                                                           movimentacaoPrevista.DataReferencia);

            if (movimentacao.MovimentacoesRealizadas.Count == 0 && movimentacaoPrevista.Status.Equals(StatusMovimentacaoPrevista.Q) ||
                movimentacao.MovimentacoesRealizadas.Count > 0 && !movimentacaoPrevista.Status.Equals(StatusMovimentacaoPrevista.Q))
            {
                throw new StatusMovimentacaoInvalidoException(movimentacao.ItemMovimentacao.Descricao,
                                                              movimentacao.DataReferencia,
                                                              StatusMovimentacaoPrevista.Q);
            }

            movimentacaoPrevistaDomainService.Update(movimentacaoPrevista);
            await mediator.Publish(new MovimentacaoPrevistaNotification
            {
                MovimentacaoPrevista = movimentacaoPrevista,
                Action = ActionNotification.Atualizar
            });

            return(Unit.Value);
        }
        public async Task <Unit> Handle(CreateMovimentacaoPrevistaCommand request, CancellationToken cancellationToken)
        {
            if (request.QtdeParcelas <= 0)
            {
                throw new TotalParcelasMovimentacaoInvalidoException(0);
            }

            if (request.TipoRecorrencia != TipoRecorrenciaMovimentacaoPrevista.M.ToString() &&
                request.TipoRecorrencia != TipoRecorrenciaMovimentacaoPrevista.N.ToString() &&
                request.TipoRecorrencia != TipoRecorrenciaMovimentacaoPrevista.P.ToString())
            {
                throw new TipoRecorrenciaMovimentacaoInvalidoException();
            }

            MovimentacaoPrevista movimentacaoPrevista = mapper.Map <MovimentacaoPrevista>(request);

            var validate = new MovimentacaoPrevistaValidation().Validate(movimentacaoPrevista);

            if (!validate.IsValid)
            {
                throw new ValidationException(validate.Errors);
            }
            List <MovimentacaoPrevista> movimentacoesPrevistas = ConvertList(movimentacaoPrevista, request.TipoRecorrencia, request.QtdeParcelas);

            movimentacaoPrevistaDomainService.Add(movimentacoesPrevistas);

            await mediator.Publish(new MovimentacaoPrevistaNotification
            {
                MovimentacoesPrevistas = movimentacoesPrevistas,
                Action = ActionNotification.Criar
            });

            return(Unit.Value);
        }
        private MovimentacaoPrevistaDTO Convert(MovimentacaoPrevista movimentacaoPrevista)
        {
            MovimentacaoPrevistaDTO movimentacaoPrevistaDTO = mapper.Map <MovimentacaoPrevistaDTO>(movimentacaoPrevista);

            movimentacaoPrevistaDTO.FormaPagamento   = formaPagamentoCaching.GetId(movimentacaoPrevista.IdFormaPagamento);
            movimentacaoPrevistaDTO.ItemMovimentacao = itemMovimentacaoCaching.GetId(movimentacaoPrevista.IdItemMovimentacao);
            return(movimentacaoPrevistaDTO);
        }
        public async Task <Unit> Handle(DeleteMovimentacaoPrevistaCommand request, CancellationToken cancellationToken)
        {
            MovimentacaoPrevista movimentacaoPrevista = movimentacaoPrevistaDomainService.GetByKey(request.IdItemMovimentacao, request.DataReferencia);

            ;           movimentacaoPrevistaDomainService.Delete(movimentacaoPrevista);

            await mediator.Publish(new MovimentacaoPrevistaNotification
            {
                MovimentacaoPrevista = movimentacaoPrevista,
                Action = ActionNotification.Excluir
            });


            return(Unit.Value);
        }
        private List <MovimentacaoPrevista> ConvertList(MovimentacaoPrevista obj, string tipoRecorrencia, int qtdeParcelas)
        {
            if (tipoRecorrencia.Equals(TipoRecorrenciaMovimentacaoPrevista.M.ToString()))
            {
                qtdeParcelas = (13 - obj.DataReferencia.Month) == 0? 13 : 13 - obj.DataReferencia.Month;
            }
            else if (tipoRecorrencia.Equals(TipoRecorrenciaMovimentacaoPrevista.N.ToString()))
            {
                qtdeParcelas = 1;
            }

            List <MovimentacaoPrevista> lista = new List <MovimentacaoPrevista>();

            for (int i = 1; i <= qtdeParcelas; i++)
            {
                MovimentacaoPrevista mov = new MovimentacaoPrevista
                {
                    Movimentacao = new Movimentacao
                    {
                        DataReferencia          = obj.Movimentacao.DataReferencia.AddMonths(i - 1),
                        IdItemMovimentacao      = obj.Movimentacao.IdItemMovimentacao,
                        ItemMovimentacao        = obj.Movimentacao.ItemMovimentacao,
                        MovimentacaoPrevista    = obj.Movimentacao.MovimentacaoPrevista,
                        MovimentacoesRealizadas = obj.Movimentacao.MovimentacoesRealizadas,
                        Observacao     = obj.Movimentacao.Observacao,
                        TipoPrioridade = obj.Movimentacao.TipoPrioridade
                    },
                    DataReferencia     = obj.DataReferencia.AddMonths(i - 1),
                    DataVencimento     = obj.DataVencimento.AddMonths(i - 1),
                    FormaPagamento     = obj.FormaPagamento,
                    IdFormaPagamento   = obj.IdFormaPagamento,
                    IdItemMovimentacao = obj.IdItemMovimentacao,
                    Status             = obj.Status,
                    Valor          = obj.Valor,
                    NrParcela      = tipoRecorrencia.Equals(TipoRecorrenciaMovimentacaoPrevista.M.ToString()) ? 1 : i,
                    NrParcelaTotal = tipoRecorrencia.Equals(TipoRecorrenciaMovimentacaoPrevista.M.ToString()) ? 1 : qtdeParcelas
                };
                lista.Add(mov);
            }
            return(lista);
        }