Exemplo n.º 1
0
        public Fatura Processar(Aluguel aluguel, Veiculo veiculo, decimal valorHoraBaseAluguel,
                                decimal valorHoraBaseOpcionais, ICalculadoraImpostos calculadoraImpostos)
        {
            Fatura fatura = new Fatura(aluguel.NumeroControle, aluguel.ClienteId);

            if (!aluguel.EstaEncerrado)
            {
                throw new DomainServiceException($"O Aluguel {aluguel.NumeroControle} não pôde ser faturado pois ainda não foi encerrado.");
            }

            var horasUtilizadas = aluguel.HorasUtilizadas();
            var multiplicador   = veiculo.ModeloVeiculo.Grupo.MultiplicadorHoraBase;

            Cobranca cobranca = new Cobranca(TipoCobranca.Aluguel, horasUtilizadas);

            cobranca.Processar(valorHoraBaseAluguel, multiplicador);
            fatura.AdicionarCobranca(cobranca);

            if (aluguel.PossuiOpcionais)
            {
                foreach (var opcional in aluguel.Opcionais)
                {
                    Cobranca cobrancaOpcional = new Cobranca(TipoCobranca.OpcionalAluguel, horasUtilizadas);
                    cobrancaOpcional.Processar(valorHoraBaseOpcionais, null);
                    fatura.AdicionarCobranca(cobrancaOpcional);
                }
            }

            fatura.Calcular(calculadoraImpostos);
            fatura.Emitir();

            return(fatura);
        }