public void Working_Days_In_31_Days_Month() { var days = new MonthlyWorkingDay("2020-10").CalculatedMonthlyWorkingDays(); Assert.Equal(22, days); }
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); } }
public void February_Working_Days_In_Leap_Year() { var days = new MonthlyWorkingDay("2020-02").CalculatedMonthlyWorkingDays(); Assert.Equal(20, days); }