public async Task <TaxpayerResponse> CreateAsync(Taxpayer taxpayer)
        {
            var existingTaxpayerByCPF = await _taxpayerRepository.GetByCPFAsync(taxpayer.CPF);

            if (existingTaxpayerByCPF != null)
            {
                return(TaxpayerResponse.CreateFail("Já existe um usuário na base com o CPF especificado."));
            }

            try
            {
                await _taxpayerRepository.AddAsync(taxpayer);

                await _unitOfWork.CompleteAsync();

                var basicWage = await _basicWageService.GetBasicWageDataAsync();

                PopulateTaxData(taxpayer, basicWage);

                return(TaxpayerResponse.CreateSuccess(taxpayer));
            }
            catch (Exception ex)
            {
                return(TaxpayerResponse.CreateFail(ex.Message));
            }
        }
        public async Task <TaxpayerResponse> UpdateAsync(int id, Taxpayer taxpayer)
        {
            try
            {
                var existingTaxpayer = await _taxpayerRepository.GetByIdAsync(id);

                if (existingTaxpayer == null)
                {
                    return(TaxpayerResponse.CreateFail("Contribuinte não encontrado na base de dados para atualização."));
                }

                existingTaxpayer.Name = taxpayer.Name;
                existingTaxpayer.CPF  = taxpayer.CPF;
                existingTaxpayer.MonthlyGrossIncome = taxpayer.MonthlyGrossIncome;
                existingTaxpayer.NumberOfDependents = taxpayer.NumberOfDependents;

                _taxpayerRepository.Update(existingTaxpayer);
                await _unitOfWork.CompleteAsync();

                var basicWage = await _basicWageService.GetBasicWageDataAsync();

                PopulateTaxData(existingTaxpayer, basicWage);

                return(TaxpayerResponse.CreateSuccess(existingTaxpayer));
            }
            catch (Exception ex)
            {
                return(TaxpayerResponse.CreateFail(ex.Message));
            }
        }
        public async Task <TaxpayerResponse> DeleteAsync(int id)
        {
            var existingTaxpayer = await _taxpayerRepository.GetByIdAsync(id);

            if (existingTaxpayer == null)
            {
                return(TaxpayerResponse.CreateFail("Contribuinte não encontrado na base de dados para exclusão."));
            }

            try
            {
                _taxpayerRepository.Delete(existingTaxpayer);
                await _unitOfWork.CompleteAsync();

                var basicWage = await _basicWageService.GetBasicWageDataAsync();

                PopulateTaxData(existingTaxpayer, basicWage);

                return(TaxpayerResponse.CreateSuccess(existingTaxpayer));
            }
            catch (Exception ex)
            {
                return(TaxpayerResponse.CreateFail(ex.Message));
            }
        }