Beispiel #1
0
        public async Task <bool> Handle(AplicarVoucherPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }

            var pedido = await _IPedidoRepository.ObterPedidoRascunhoPorClienteId(message.ClienteId);

            if (pedido == null)
            {
                await _IMediateHandler.PublicarNotificacao(new DomainNotification("pedido", "Pedido não encontrado"));

                return(false);
            }

            var voucher = await _IPedidoRepository.ObterVoucherPorCodigo(message.CodigoVoucher);

            if (voucher == null)
            {
                await _IMediateHandler.PublicarNotificacao(new DomainNotification("voucher", "Voucher não encontrado"));

                return(false);
            }

            // esse método quem manipula se o voucher é aplicavel ou não é minha classe agreagteRoot que no caso é a classe de Pedido
            var voucherAplicavelValidation = pedido.AplicarVoucher(voucher);

            if (!voucherAplicavelValidation.IsValid)
            {
                foreach (var errorVoucher in voucherAplicavelValidation.Errors)
                {
                    await _IMediateHandler.PublicarNotificacao(new DomainNotification(message.MessageType, errorVoucher.ErrorMessage));
                }

                return(false);
            }

            pedido.AdicionarEvento(new PedidoAtualizadoEvent(message.ClienteId, pedido.Id, pedido.ValorTotal));
            pedido.AdicionarEvento(new VoucherAplicadoPedidoEvent(message.ClienteId, pedido.Id, voucher.Id));

            _IPedidoRepository.Atualizar(pedido);

            //Cenário real teria que debitar o quantidade de voucher utilizado
            //voucher.DebitarQuantidadeVoucherUtilizado();

            //_IPedidoRepository.AtualizarVoucher(voucher);
            return(await _IPedidoRepository.IUnitOfWork.Commit());
        }
        public async Task <bool> Handle(AplicarVoucherPedidoCommand message, CancellationToken cancellationToken)
        {
            if (!ValidarComando(message))
            {
                return(false);
            }

            var pedido = await _pedidoRepository.ObterPedidoRascunhoPorClienteId(message.ClienteId);

            if (pedido == null)
            {
                await _mediatorHandler.PublicarNotificacao(new DomainNotification(message.MessageType, "Pedido não encontrado"));

                return(false);
            }

            var voucher = await _pedidoRepository.ObterVoucherPorCodigo(message.CodigoVoucher);

            if (voucher == null)
            {
                await _mediatorHandler.PublicarNotificacao(new DomainNotification(message.MessageType, "Voucher não encontrado!"));

                return(false);
            }

            var voucherAplicacaoValidation = pedido.AplicarVoucher(voucher);

            if (!voucherAplicacaoValidation.IsValid)
            {
                foreach (var error in voucherAplicacaoValidation.Errors)
                {
                    await _mediatorHandler.PublicarNotificacao(new DomainNotification(error.ErrorCode, error.ErrorMessage));
                }

                return(false);
            }

            pedido.AdicionarEvento(new PedidoAtualizadoEvent(pedido.ClienteId, pedido.Id, pedido.ValorTotal));

            pedido.AdicionarEvento(new VoucherAplicadoPedidoEvent(message.ClienteId, pedido.Id, voucher.Id));

            _pedidoRepository.Atualizar(pedido);

            return(await _pedidoRepository.UnitOfWork.Commit());
        }
 public async Task <bool> Handle(AplicarVoucherPedidoCommand request, CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }