static void Main(string[] args) { Console.WriteLine("Welcome to the payslip generator!\n"); var payslipInput = new PayslipInput(); var name = payslipInput.PromptName(); var surname = payslipInput.PromptSurname(); var salary = payslipInput.PromptSalary(); var superRate = payslipInput.PromptSuperRate(); var startDate = payslipInput.PromptStartDate(); var endDate = payslipInput.PromptEndDate(); Employee employee = new Employee(name, surname, salary, superRate); TaxBracket[] taxBrackets = new TaxBracketParser().ParseCSV("/Users/Tom.vanDinther/Documents/payslip-kata/tax_brackets.csv"); //TODO: Use absolute path in Rider. Issue: Cannot run. PayslipFactory payslipFactory = PayslipFactory.GetInstance(); payslipFactory.SetTaxBrackets(taxBrackets); payslipFactory.SetStartDate(startDate); payslipFactory.SetEndDate(endDate); Payslip payslip = payslipFactory.GetPayslip(employee); Console.WriteLine("Your payslip has been generated:\n"); PrintPayslip(payslip); Console.WriteLine("\nThank you for using MYOB!"); }
bool IPayslipService.ValidateInputModel(PayslipInput input) { var shifts = input.Shifts; List <int> wageLevels = input.WageLevels.Select(wl => wl.Key).ToList(); foreach (var shift in shifts) { //validate datetime if (shift.EndedAt <= shift.StartedAt) { return(false); } if (shift.BreakStartedAt != null && shift.BreakDurationInMinutes != null) { var breakEndedAt = shift.BreakStartedAt.GetValueOrDefault().AddMinutes(shift.BreakDurationInMinutes.GetValueOrDefault()); if (shift.BreakStartedAt <= shift.StartedAt || breakEndedAt >= shift.EndedAt) { return(false); } } //check wage level exists if (!wageLevels.Contains(shift.WageLevel)) { return(false); } } return(true); }
public void Should_Check_ReadUserInput_Is_Numeric(string input, decimal expected) { //arrange IPayslipIO payslipIO = new StubPayslipIO().WithReadLine(input); var userInput = new PayslipInput(payslipIO); //act var result = userInput.ReadUserInput(); //assert Assert.Equal(expected, result); }
public void ProcessInputTest() { string input = "David,Rudd,60050,9%,01 March – 31 March"; var inputProcessor = new InputProcessor(); PayslipInput expected = inputProcessor.Process(input); Assert.AreEqual(expected.Employee.FullName, "David Rudd"); Assert.AreEqual(expected.PayPeriod, "01 March – 31 March"); Assert.AreEqual(expected.Salary, 60050m); Assert.AreEqual(expected.SuperRate, 0.09m); }
public static string GetPayslip(string input) { var inputProcessor = new InputProcessor(); var payslipGenerator = new PayslipCalculator(); var outputProcessor = new OutputProcessor(); //InputProcessor will split the required Input from string payslipInput = inputProcessor.Process(input); //Payslip Generator internally will calculate tax and create tax table to prepare payslip payslipInfo = payslipGenerator.Calculate(payslipInput); //OutputProcessor will join the output in string return(outputProcessor.Process(payslipInfo)); }
public void Should_Check_CheckDateFormat_Is_Date(string date, string expected) { // arrange IPayslipIO payslipIO = new StubPayslipIO().WithReadLine(date); var checkDate = new PayslipInput(payslipIO); //Console.WriteLine("Please enter date "); // need to input number // act var payslipDate = checkDate.ParseDateIntoString(); //bool test = Boolean.Parse(payslipDate);// not recognised as a valid Boolean; Convert.Boolean returns same error // assert Assert.Equal(expected, payslipDate); //DateTime.ParseExact(date, "dddd MMMM yyyy",) }
public IActionResult Process([FromBody] PayslipInput input) { try { //failed model will auto-send 400 badrequest by api bool isValidInput = _payslipService.ValidateInputModel(input); if (!isValidInput) { ErrorResponse errorResponse = new ErrorResponse("model is invalid or violate business rules, please change the input and try again.", ErrorTypes.BusinessRuleViolation); return(BadRequest(errorResponse)); } PayslipOutput payslipOutput = _payslipService.GeneratePayslip(input); return(Ok(payslipOutput)); } catch (ArgumentNullException ex) { ErrorResponse errorResponse = new ErrorResponse(ex.Message, ErrorTypes.BusinessRuleViolation); return(BadRequest(errorResponse)); } }
PayslipOutput IPayslipService.GeneratePayslip(PayslipInput input) { List <WageLevel> wageLevels = PayslipMapper.MapFromDictionaryToWageLevelModel(input.WageLevels); PayslipOutput payslipOutput = new PayslipOutput { EmployeeName = input.Employee?.Name, ShiftOutputs = new List <ShiftOutput>() }; foreach (var shift in input.Shifts) { var shiftOutput = ProcessShift(shift, wageLevels); payslipOutput.ShiftOutputs.Add(shiftOutput); } payslipOutput.TotalHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.TotalHoursWorked); payslipOutput.TotalNormalHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.NormalHoursWorked); payslipOutput.TotalOvertimeHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.OvertimeHoursWorked); payslipOutput.TotalEarning = payslipOutput.ShiftOutputs.Sum(so => so.Earning); //init response properties payslipOutput.Message = "payslip has been successfully generated"; payslipOutput.IsSuccessful = true; return(payslipOutput); }