public void TestMoneyCanAddAndFormatAsTime(double worktime, double value, MoneyChargeRate chargeRate, double tax, string expected) { var wt = new Worktime(worktime, WorktimePrecision.Minutes); var money = Money.Get(wt, value, chargeRate); var taxValue = money.GetTax(tax); money = money.Add(taxValue); Assert.That(money.ToString(null, CultureInfo.InvariantCulture), Is.EqualTo(expected)); }
/// <summary> /// Calculates money based on the <see cref="Worktime"/> and the <see cref="MoneyChargeRate"/> /// </summary> /// <param name="worktime"></param> /// <param name="value"></param> /// <param name="chargeRate"></param> /// <returns></returns> public static Money Get(Worktime worktime, double value, MoneyChargeRate chargeRate) { var minuteWorktime = Worktime.ConvertValue(worktime.TimeWorked, worktime.Precision, WorktimePrecision.Minutes); double val; switch (chargeRate) { case MoneyChargeRate.PerMinute: val = minuteWorktime * value; break; case MoneyChargeRate.PerHour: val = (minuteWorktime / 60) * value; break; case MoneyChargeRate.PerQuarterHour: val = (minuteWorktime / 15) * value; break; case MoneyChargeRate.PerHalfHour: val = (minuteWorktime / 30) * value; break; case MoneyChargeRate.PerDay: val = (minuteWorktime / 1440) * value; break; case MoneyChargeRate.PerStartedHour: var hours = minuteWorktime / 60; var fraction = hours % 60; if (fraction != 0) { hours -= hours % 1; hours += 1; } val = hours * value; break; default: throw new ArgumentOutOfRangeException(nameof(chargeRate), chargeRate, null); } return(new Money(val)); }
public static Money GetMoney([SourceObject] Worktime worktime, double rate, MoneyChargeRate chargeRate) { return(Get(worktime, rate, chargeRate)); }