コード例 #1
0
        public void Working_Days_In_31_Days_Month()
        {
            var days = new MonthlyWorkingDay("2020-10").CalculatedMonthlyWorkingDays();

            Assert.Equal(22, days);
        }
コード例 #2
0
                                    int standardWorkingDays)> > GetAsync(string yearMonth, string key)
        {
            try
            {
                if (YearMonth.TryParse(yearMonth, out YearMonth selectedYearMonth) is false)
                {
                    _logger.LogError(Errors.EmpMonthlyEnteredRecord.GetRecordYearMonthInvalidError.Message);
                    return(Errors.EmpMonthlyEnteredRecord.GetRecordYearMonthInvalidError);
                }

                if ((await _dbContext.EncryptedEmpMonthlyEnteredRecords.AnyAsync()) is false)
                {
                    return(Result <(List <EmployeeMonthlyEnteredRecord>, int standardWorkingDays)> .Ok(
                               (new List <EmployeeMonthlyEnteredRecord>(),
                                new MonthlyWorkingDay(yearMonth).CalculatedMonthlyWorkingDays())));
                }

                var existingRecord = await _dbContext.EncryptedEmpMonthlyEnteredRecords
                                     .FirstOrDefaultAsync(x => x.EncryptedYearMonth == yearMonth);

                var newYearMonth = false;
                if (existingRecord == null)
                {
                    var closestMonthRecord = await _dbContext.EncryptedEmpMonthlyEnteredRecords
                                             .OrderByDescending(x => x.CreatedDate).FirstOrDefaultAsync();

                    if (closestMonthRecord == null)
                    {
                        _logger.LogError(Errors.EmpMonthlyEnteredRecord.GetRecordNotFoundError.Message);
                        return(Errors.EmpMonthlyEnteredRecord.GetRecordNotFoundError);
                    }

                    //if user selects previous year-month, then check if the closetYearMonth is after or before selectedYearMonth
                    var closestYearMonth = new YearMonth(closestMonthRecord.EncryptedYearMonth);


                    // return empty if it is after, means that previous year-month havent's any record.
                    if (closestYearMonth > selectedYearMonth)
                    {
                        return(Result <(List <EmployeeMonthlyEnteredRecord>, int standardWorkingDays)> .Ok(
                                   (new List <EmployeeMonthlyEnteredRecord>(),
                                    new MonthlyWorkingDay(yearMonth).CalculatedMonthlyWorkingDays())));
                    }

                    // use closest monthly salary record for current monthly salary month record
                    existingRecord = closestMonthRecord;
                    newYearMonth   = true;
                }

                var decruptedJson    = _dataProtectionProvider.CreateProtector(key).Unprotect(existingRecord.EncryptedRecord);
                var decryptedRecords = JsonSerializer.Deserialize <List <DecryptedEmpMonthlyEnteredRecord> >(
                    decruptedJson
                    );

                var newMonthlyWorkingDays = new MonthlyWorkingDay(yearMonth).CalculatedMonthlyWorkingDays();
                var result = newYearMonth switch
                {
                    true => (decryptedRecords.Select(x =>
                    {
                        var currency = new Currency(x.Currency);
                        return(new EmployeeMonthlyEnteredRecord(
                                   fullname: x.Fullname,
                                   email: x.Email,
                                   grossContractSalary: new GrossContractedSalary(new Money(value: x.GrossContractSalary, currency)),
                                   probationGrossContractSalary: new GrossContractedSalary(new Money(value: x.ProbationGrossContractSalary, currency)),
                                   actualWorkingDays: newMonthlyWorkingDays,
                                   probationWorkingDays: 0,
                                   taxableAnnualLeave: new TaxableAllowance(name: x.TaxableAnnualLeave.Name,
                                                                            amount: new Money(0, currency)),
                                   taxable13MonthSalary: new TaxableAllowance(name: x.Taxable13MonthSalary.Name,
                                                                              amount: new Money(0, currency)),
                                   taxableOthers: new TaxableAllowance(name: x.TaxableOthers.Name,
                                                                       amount: new Money(0, currency)),
                                   nonTaxableAllowances: x.NonTaxableAllowances.Select(y =>
                                                                                       new NonTaxableAllowance(amount: new Money(0, currency), name: y.Name)).ToArray(),
                                   paymentAdvance: new PaymentAdvance(new Money(0, currency)),
                                   adjustmentAdditions: x.AdjustmentAdditions.Select(y => new AdjustmentAddition(new Money(0, currency))).ToArray(),
                                   adjustmentDeductions: x.AdjustmentDeductions.Select(y => new AdjustmentDeduction(new Money(0, currency))).ToArray()
                                   ));
                    }).ToList(), newMonthlyWorkingDays),
                    _ => (decryptedRecords.Select(x =>
                    {
                        var currency = new Currency(x.Currency);
                        return(new EmployeeMonthlyEnteredRecord(
                                   fullname: x.Fullname,
                                   email: x.Email,
                                   grossContractSalary: new GrossContractedSalary(new Money(value: x.GrossContractSalary, currency)),
                                   probationGrossContractSalary: new GrossContractedSalary(new Money(value: x.ProbationGrossContractSalary, currency)),
                                   actualWorkingDays: x.ActualWorkingDays,
                                   probationWorkingDays: x.ProbationWorkingDays,
                                   taxableAnnualLeave: new TaxableAllowance(name: x.TaxableAnnualLeave.Name,
                                                                            amount: new Money(x.TaxableAnnualLeave.Amount, currency)),
                                   taxable13MonthSalary: new TaxableAllowance(name: x.Taxable13MonthSalary.Name,
                                                                              amount: new Money(x.Taxable13MonthSalary.Amount, currency)),
                                   taxableOthers: new TaxableAllowance(name: x.TaxableOthers.Name,
                                                                       amount: new Money(x.TaxableOthers.Amount, currency)),
                                   nonTaxableAllowances: x.NonTaxableAllowances.Select(y =>
                                                                                       new NonTaxableAllowance(amount: new Money(y.Amount, currency), name: y.Name)).ToArray(),
                                   paymentAdvance: new PaymentAdvance(new Money(x.PaymentAdvance, currency)),
                                   adjustmentAdditions: x.AdjustmentAdditions.Select(y => new AdjustmentAddition(new Money(y, currency))).ToArray(),
                                   adjustmentDeductions: x.AdjustmentDeductions.Select(y => new AdjustmentDeduction(new Money(y, currency))).ToArray()
                                   ));
                    }).ToList(), existingRecord.StandardWorkingDays)
                };

                return(Result <(List <EmployeeMonthlyEnteredRecord>, int standardWorkingDays)> .Ok(result));
            }
            catch (CryptographicException ex)
            {
                _logger.LogError(ex, Errors.EmpMonthlyEnteredRecord.GetRecordKeyInvalidError.Message);
                return(Errors.EmpMonthlyEnteredRecord.GetRecordKeyInvalidError);
            }
            catch (SqlException ex)
            {
                _logger.LogError(ex, Errors.EmpMonthlyEnteredRecord.GetRecordDatabaseError.Message);
                return(Errors.EmpMonthlyEnteredRecord.GetRecordDatabaseError);
            }
        }
コード例 #3
0
        public void February_Working_Days_In_Leap_Year()
        {
            var days = new MonthlyWorkingDay("2020-02").CalculatedMonthlyWorkingDays();

            Assert.Equal(20, days);
        }