コード例 #1
0
ファイル: Program.cs プロジェクト: TiffanyHoang/payslip-kata
        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!");
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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",)
        }
コード例 #7
0
        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));
            }
        }
コード例 #8
0
        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);
        }