Esempio n. 1
0
        public async Task <Result <SaveSalaryConfigResponse> > Handle(SaveSalaryConfigRequest request, CancellationToken cancellationToken)
        {
            var currency = new Currency(request.SalarySetting.Currency);
            var result   = await _salaryConfigRepository.SaveAsync(new SalaryConfig
                                                                   (
                                                                       id : request.SalarySetting.Id,
                                                                       commonMinimumWage : new Money(request.SalarySetting.CommonMinimumWage, currency),
                                                                       regionalMinimumWage : new Money(request.SalarySetting.RegionalMinimumWage, currency),
                                                                       coefficientSocialCare : request.SalarySetting.CoefficientSocialCare,
                                                                       employerSocialInsuranceRate : request.SalarySetting.EmployerSocialInsuranceRate,
                                                                       employeeSocialInsuranceRate : request.SalarySetting.EmployeeSocialInsuranceRate,
                                                                       healthCareInsuranceEmployerRate : request.SalarySetting.EmployerHealthCareInsuranceRate,
                                                                       healthCareInsuranceEmployeeRate : request.SalarySetting.EmployeeHealthCareInsuranceRate,
                                                                       unemploymentInsuranceEmployerRate : request.SalarySetting.EmployerUnemploymentInsuranceRate,
                                                                       unemploymentInsuranceEmployeeRate : request.SalarySetting.EmployeeUnemploymentInsuranceRate,
                                                                       foreignEmployerSocialInsuranceRate : request.SalarySetting.ForeignEmployerSocialInsuranceRate,
                                                                       foreignEmployeeSocialInsuranceRate : request.SalarySetting.ForeignEmployeeSocialInsuranceRate,
                                                                       foreignHealthCareInsuranceEmployeeRate : request.SalarySetting.ForeignEmployeeHealthCareInsuranceRate,
                                                                       foreignHealthCareInsuranceEmployerRate : request.SalarySetting.ForeignEmployerHealthCareInsuranceRate,
                                                                       foreignUnemploymentInsuranceEmployeeRate : request.SalarySetting.ForeignEmployeeUnemploymentInsuranceRate,
                                                                       foreignUnemploymentInsuranceEmployerRate : request.SalarySetting.ForeignEmployerUnemploymentInsuranceRate,
                                                                       minimumNonWorkingDay : request.SalarySetting.MinimumNonWorkingDay,
                                                                       employeeUnionFeeRate : request.SalarySetting.EmployeeUnionFeeRate,
                                                                       employerUnionFeeRate : request.SalarySetting.EmployerUnionFeeRate,
                                                                       maximumUnionFeeRate : request.SalarySetting.MaximumUnionFeeRate,
                                                                       personalDeduction : new Money(request.SalarySetting.PersonalDeduction, currency),
                                                                       dependantDeduction : new Money(request.SalarySetting.DependantDeduction, currency),
                                                                       defaultProbationTaxRate : request.SalarySetting.DefaultProbationTaxRate,
                                                                       isInsurancePaidFullSalary : request.SalarySetting.IsInsurancePaidFullSalary,
                                                                       insurancePaidAmount : new Money(request.SalarySetting.InsurancePaidAmount, currency),
                                                                       progressiveTaxRateLookUpTable : new ProgressiveTaxRateLookUpTable(
                                                                           request.ProgressiveTaxRates.Select(
                                                                               x => new ProgressiveTaxRate
                                                                               (
                                                                                   lowerBound : new Money(x.LowerBound, currency),
                                                                                   upperBound : new Money(x.UpperBound, currency),
                                                                                   rate : x.Rate,
                                                                                   progressiveTaxRateLevel : x.TaxRateLevel
                                                                               )).ToArray()
                                                                           )
                                                                   )
                                                                   );

            var markResult = await _empMonthlySalaryRepo.MarkNotLatestAsync(request.YearMonth);

            return(result.Map(() => markResult).Map(x => new SaveSalaryConfigResponse()));
        }
Esempio n. 2
0
        public async Task Consume(ConsumeContext <EmployeeProfileChangedEvent> context)
        {
            try
            {
                _logger.LogInformation("Start EmployeeProfileChangedConsumer");
                var profileChangedEvent = context?.Message;

                if (profileChangedEvent == null)
                {
                    _logger.LogInformation("profileChangedEvent is null");
                    _logger.LogInformation("End EmployeeProfileChangedConsumer");
                    return;
                }

                var sendDate = profileChangedEvent.SendDate.ToDateTime();

                var profile = await _profileRepo.SaveAsync(new EmployeeProfile(
                                                               email : profileChangedEvent.Email,
                                                               fullname : profileChangedEvent.Fullname,
                                                               employeeType : profileChangedEvent.EmployeeType,
                                                               position : profileChangedEvent.Position,
                                                               dependantEndDates : profileChangedEvent.DependantEndDates.ToDateTimeArray(),
                                                               inUnion : profileChangedEvent.InUnion,
                                                               terminatedDate : profileChangedEvent.TerminationDate.ToDateTimeOrNull(),
                                                               isForeigner : profileChangedEvent.IsForeigner),
                                                           sendDate);

                var yearMonth = sendDate.ToString("yyyy-MM");
                var result    = await profile.MapAsync(x => _salaryRepo.MarkNotLatestAsync(yearMonth));

                if (result.Failure)
                {
                    _logger.LogError(result.Error.Message);
                }

                _logger.LogInformation("End EmployeeProfileChangedConsumer");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
                _logger.LogInformation("End EmployeeProfileChangedConsumer");
            }
        }
Esempio n. 3
0
        public async Task Consume(ConsumeContext <EmployeeProfileDeletedEvent> context)
        {
            _logger.LogInformation("Start EmployeeProfileDeletedConsumer");
            var profileDeletedEvent = context.Message;
            var start = new DateTime(1970, 1, 1, 0, 0, 0, 0);

            var deletedProfile = await _profileRepo.DeleteAsync(profileDeletedEvent.Email,
                                                                start.AddMilliseconds(profileDeletedEvent.SendDate));

            if (deletedProfile.Failure)
            {
                _logger.LogError(deletedProfile.Error.Message);
            }

            var yearMonth = start.AddMilliseconds(profileDeletedEvent.SendDate).ToString("yyyy-MM");
            var mark      = await _salaryRepo.MarkNotLatestAsync(yearMonth);

            if (mark.Failure)
            {
                _logger.LogError(mark.Error.Message);
            }
            _logger.LogInformation("End EmployeeProfileDeletedConsumer");
        }
Esempio n. 4
0
        public async Task <Result <SaveEmpMonthlyEnteredRecordResponse> > Handle(
            SaveEmpMonthlyEnteredRecordRequest request,
            CancellationToken cancellationToken)
        {
            var record = request.Records.Count == 0
                                ? await _empMonthlyEnteredRecordRepo.DeleteAsync(request.Key, request.YearMonth)
                                : await _empMonthlyEnteredRecordRepo.SaveAsync(records : request.Records.Select(x =>
            {
                var currency = new Currency(x.Currency);
                return(new EmployeeMonthlyEnteredRecord(
                           fullname: x.Fullname,
                           email: x.Email,
                           grossContractSalary: new GrossContractedSalary(new Money(x.GrossContractSalary, currency)),
                           probationGrossContractSalary: new GrossContractedSalary(new Money(x.ProbationGrossContractSalary, currency)),
                           actualWorkingDays: x.ActualWorkingDays,
                           probationWorkingDays: x.ProbationWorkingDays,
                           taxableAnnualLeave: new TaxableAllowance(name: Constants.TAXABLE_ANNUAL_LEAVE,
                                                                    amount: new Money(x.TaxableAnnualLeave, currency)),
                           taxable13MonthSalary: new TaxableAllowance(name: Constants.TAXABLE_13MONTH_SALARY,
                                                                      amount: new Money(x.Taxable13MonthSalary, currency)),
                           taxableOthers: new TaxableAllowance(name: Constants.TAXABLE_OTHERS,
                                                               amount: new Money(x.TaxableOthers, currency)),
                           nonTaxableAllowances: new NonTaxableAllowance[] { new NonTaxableAllowance(
                                                                                 amount: new Money(x.NonTaxableAllowance, currency),
                                                                                 name: Constants.NON_TAXABLE_ALLOWANCE) },
                           paymentAdvance: new PaymentAdvance(new Money(x.PaymentAdvance, currency)),
                           adjustmentAdditions: new AdjustmentAddition[] { new AdjustmentAddition(
                                                                               amount: new Money(x.AdjustmentAddition, currency)) },
                           adjustmentDeductions: new AdjustmentDeduction[] { new AdjustmentDeduction(
                                                                                 amount: new Money(x.AdjustmentDeduction, currency)) }
                           ));
            }).ToList(), yearMonth : request.YearMonth, key : request.Key, request.StandardWorkingDays);

            var markResult = await _empMonthlySalaryRepo.MarkNotLatestAsync(request.YearMonth);

            return(record.Map(() => markResult).Map(x => new SaveEmpMonthlyEnteredRecordResponse()));
        }