Exemplo n.º 1
0
        public async Task <(int status, string description)> CreateConta(ContaTransfer transfer)
        {
            //Validate data.
            if (transfer.Vencimento == DateTime.MinValue)
            {
                return(400, "A data de vencimento deve ser uma data válida.");
            }

            if (transfer.Pagamento == DateTime.MinValue)
            {
                return(400, "A data de pagamento deve ser uma data válida.");
            }

            if (transfer.Valor < 0.01m)
            {
                return(400, "O valor da conta a pagar deve ser maior que R$ 0,00.");
            }

            if ((await _contaRepository.GetContas()).Any(a => a.Nome == transfer.Nome))
            {
                return(400, "Já existe uma conta a pagar com o mesmo nome.");
            }

            var conta = new Conta
            {
                Nome         = transfer.Nome,
                Valor        = transfer.Valor,
                Vencimento   = transfer.Vencimento,
                Pagamento    = transfer.Pagamento,
                DiasDeAtraso = (int)(transfer.Pagamento - transfer.Vencimento).TotalDays
            };

            //Calculate ruleset.
            var regras = await _regraRepository.GetRegras();

            var regra = regras.OrderBy(o => o.Dias).ThenBy(t => !t.Superior).LastOrDefault(l => l.Superior ? (conta.DiasDeAtraso > l.Dias) : conta.DiasDeAtraso <= l.Dias);

            conta.ValorAjustado = regra == null ? conta.Valor : conta.Valor + (conta.Valor * regra.Multa) + (conta.Valor * regra.JurosAoDia * (conta.DiasDeAtraso ?? 0));

            await _contaRepository.CreateConta(conta);

            return(200, "Ok");
        }
Exemplo n.º 2
0
        public async Task <IActionResult> Create([FromBody] ContaTransfer request)
        {
            var(status, description) = await _contaService.CreateConta(request);

            return(StatusCode(status, new { Description = description }));
        }