Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.idea/
*.class
*.log
25 changes: 18 additions & 7 deletions scripts/timesheet.sc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import scala.annotation.tailrec
import scala.io.StdIn
import scala.util.Random

val Version = 1

Expand All @@ -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)

Expand All @@ -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] = {
Expand All @@ -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
Expand All @@ -57,20 +65,23 @@ 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")
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:")
Expand Down