diff --git a/.gitignore b/.gitignore index 9c07d4a..812e1c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +.idea/ *.class *.log diff --git a/scripts/timesheet.sc b/scripts/timesheet.sc index 5f8e63c..324d2e9 100644 --- a/scripts/timesheet.sc +++ b/scripts/timesheet.sc @@ -12,6 +12,7 @@ import scala.annotation.tailrec import scala.io.StdIn +import scala.util.Random val Version = 1 @@ -23,12 +24,19 @@ object Defaults { val Precision = 1 } +class asInt(b: Boolean) { + def toInt = if(b) 1 else 0 +} + +implicit def convertBooleanToInt(b: Boolean): asInt = new asInt(b) + def random(lowerBound: Double, upperBound: Double): Double = lowerBound + Math.random() * (upperBound - lowerBound) -def round(number: Double): Double = - BigDecimal(number).setScale(Defaults.Precision, BigDecimal.RoundingMode.HALF_UP).toDouble +def round(number: Double, precision: Int): Double = + BigDecimal(number).setScale(precision, BigDecimal.RoundingMode.HALF_UP).toDouble + def log(text: String): Unit = println(text) @@ -39,7 +47,7 @@ def input(prompt: String, default: Option[String] = None): String = { } def generateNumbers(count: Int, lowerBound: Double, - upperBound: Double, sum: Double): Seq[Double] = { + upperBound: Double, sum: Double, precision: Int): Seq[Double] = { @tailrec def impl(aggr: Seq[Double], nLowerBound: Double, nUpperBound: Double, nSum: Double): Seq[Double] = { @@ -48,7 +56,7 @@ def generateNumbers(count: Int, lowerBound: Double, val restUpperBound = nUpperBound * rest val nextLowerBound = Math.max(nLowerBound, nSum - restUpperBound) val nextUpperBound = Math.min(nUpperBound, nSum - restLowerBound) - val next = round(random(nextLowerBound, nextUpperBound)) + val next = round(random(nextLowerBound, nextUpperBound), precision) if (aggr.size == count) { aggr @@ -57,7 +65,7 @@ def generateNumbers(count: Int, lowerBound: Double, } } - scala.util.Random.shuffle(impl(Seq.empty, lowerBound, upperBound, sum)) + Random.shuffle(impl(Seq.empty, lowerBound, upperBound, sum)) } log(s"Welcome to the Timesheet generator v$Version") @@ -65,12 +73,15 @@ val count = input("Please enter total number of working days").toInt val deviation = input( s"Please enter max deviation from default hours per MD (${Defaults.HoursPerMd})", Some(Defaults.MaxDeviation.toString)).toDouble +val onlyHours = !input( + s"Do you want rounded to hours? (yes/no)", + Some("no")).contains("yes") val sum = count * Defaults.HoursPerMd val lowerBound = Defaults.HoursPerMd - deviation val upperBound = Defaults.HoursPerMd + deviation -val results = generateNumbers(count, lowerBound, upperBound, sum) -val resultsSum = round(results.sum) +val results = generateNumbers(count, lowerBound, upperBound, sum, onlyHours.toInt) +val resultsSum = round(results.sum, onlyHours.toInt) assert(resultsSum == sum, s"Resulting sum '$resultsSum' did not equal to '$sum'") log("Generated results are below:")