Skip to content

Commit

Permalink
Правка бизнес-логики. Добавил дополнительные поля для работников (имя…
Browse files Browse the repository at this point in the history
…, фамилия, дата начала и окончания работы)
  • Loading branch information
Alexey Trofimov authored and Alexey Trofimov committed Apr 9, 2017
1 parent db8df6e commit ba6a82c
Show file tree
Hide file tree
Showing 9 changed files with 226 additions and 179 deletions.
172 changes: 104 additions & 68 deletions src/com/app/Main.kt
Original file line number Diff line number Diff line change
@@ -1,68 +1,104 @@
//package com.app
//
//import com.app.model.*
//
///**
// * Created by IntelliJ IDEA.<br>
// * User: Alexey<br>
// * Date: 25.03.2017<br>
// * Time: 1:10<br>
// * Версия с консольным интерфейсом
// */
//object Main {
//
// /**
// * Точка входа в программу
// */
// @JvmStatic
// fun main(args: Array<String>) {
// testWorker(SalaryType.Hour);
// testWorker(SalaryType.Salary);
// testWorker(SalaryType.Wage);
// }
//
// /**
// * Сообщения о начале тестирования для каждого типа работников
// */
// private val greets = mapOf(
// SalaryType.Hour to "Тестирование работника с почасовой ставкой.",
// SalaryType.Salary to "Тестирование работника с окладом.",
// SalaryType.Wage to "Тестирование работника со ставкой."
// )
//
// /**
// * Запросы значений для каждого типа работников
// */
// private val prompts = mapOf(
// SalaryType.Hour to "Введите почасовую ставку: ",
// SalaryType.Salary to "Введите оклад: ",
// SalaryType.Wage to "Введите ставку: "
// )
//
// /**
// * Чтение double с клавиатуры
// */
// private fun readDouble(prompt: String): Double {
// println(prompt)
// var result: Double? = null
// while (result == null)
// try {
// result = readLine()!!.toDouble()
// } catch (e: Exception) {
// println("Неправильный ввод!")
// println(prompt)
// }
// return result
// }
//
// /**
// * тест расчетов
// */
// private fun testWorker(type: SalaryType) {
// println(greets[type])
// val value = readDouble(prompts[type] as String)
// val interval = readDouble("Введите интервал для начисления зарплаты: ")
// val worker = WorkerFactory.create(type, value, interval)
// println("Зарплата: ${worker.getSalary()}")
// }
//}
package com.app

import com.app.model.*
import java.time.*
import java.util.concurrent.*

/**
* Created by IntelliJ IDEA.<br>
* User: Alexey<br>
* Date: 25.03.2017<br>
* Time: 1:10<br>
* Версия с консольным интерфейсом
*/
object Main {

/**
* Точка входа в программу
*/
@JvmStatic
fun main(args: Array<String>) {
testWorker(SalaryType.Hour);
testWorker(SalaryType.Wage);
}

/**
* Сообщения о начале тестирования для каждого типа работников
*/
private val greets = mapOf(
SalaryType.Hour to "Тестирование работника с почасовой ставкой.",
SalaryType.Wage to "Тестирование работника с окладом."
)

/**
* Запросы значений для каждого типа работников
*/
private val ratePrompts = mapOf(
SalaryType.Hour to "Введите почасовую ставку: ",
SalaryType.Wage to "Введите оклад: "
)

/**
* Тестовые имена работников мужского пола
*/
private val testMaleNames = listOf("Александр", "Сергей", "Алексей", "Дмитрий", "Андрей")

/**
* Тестовые имена работников женского пола
*/
private val testFemaleNames = listOf("Елена", "Ольга", "Анна", "Ирина", "Мария")

/**
* Тестовые фамилии
*/
private val testSurnames = listOf("Иванов", "Смирнов", "Кузнецов", "Попов", "Соколов")

/**
* Чтение double с клавиатуры
*/
private fun readDouble(prompt: String): Double {
println(prompt)
var result: Double? = null
while (result == null)
try {
result = readLine()!!.toDouble()
} catch (e: Exception) {
println("Неправильный ввод!")
println(prompt)
}
return result
}

/**
* тест расчетов
*/
private fun testWorker(type: SalaryType) {
println(greets[type])
val rate = readDouble(ratePrompts[type] as String)
val workTime = readDouble("Введите количество отработанных часов: ")
var workTimeNorm = .0
if (type == SalaryType.Wage) {
workTimeNorm = readDouble("Введите норму рабочего времени: ")
}
val beginDate = LocalDate.of(2017, 1, 9)

val rnd = ThreadLocalRandom.current()
var name = ""
var surname = testSurnames[rnd.nextInt(4)]


if (rnd.nextBoolean()) {
name = testMaleNames[rnd.nextInt(4)]
} else {
name = testFemaleNames[rnd.nextInt(4)]
surname += "а"
}
try {
val worker = WorkerFactory.create(type, name, surname, beginDate, null, rate, workTime, workTimeNorm)
println("Зарплата: ${worker.getSalary()}")
} catch (ex: Exception) {
println(ex.message)
}

}
}
50 changes: 27 additions & 23 deletions src/com/app/model/AbstractWorker.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.app.model

import com.google.common.base.*
import java.time.*

/**
* Created by IntelliJ IDEA.<br>
Expand All @@ -9,47 +10,50 @@ import com.google.common.base.*
* Time: 1:30<br>
* Абстрактный работник
*/
abstract class AbstractWorker {
abstract class AbstractWorker
(
/**
* Имя работника
*/
var name: String,
/**
* Фамилия работника
*/
var surname: String,

/**
* Дата начала работы
*/
var beginDate: LocalDate) {

/**
* Интервал времени для расчета
* дата окончания работы (
*/
var effortInterval: Double = .0
var endDate: LocalDate? = null
set(value) {
validateNonNegative(value)
field = value
if (value != null && value.isBefore(beginDate) as Boolean) {
throw Exception("Дата окончания работы не может быть раньше даты начала")
}
}

/**
* Получение способа начисления зарплаты
*/
abstract fun getSalaryType() : SalaryType
abstract fun getSalaryType(): SalaryType

/**
* Расчет зарплаты за заданный интервал времени
*/
abstract fun getSalaryInternal(duration: Double) : Double

/**
* Коэффициент зарплаты
*/
abstract fun getRate() : Double

/**
* Расчет зарплаты за заданный интервал времени
*/
fun getSalary(duration: Double = effortInterval): Double {
validateIsPositive(duration)
return getSalaryInternal(duration)
}
abstract fun getSalary(): Double

override fun equals(other: Any?): Boolean {
if (other !is AbstractWorker || !this.javaClass.equals(other.javaClass)) {
if (other !is AbstractWorker || this.javaClass != other.javaClass) {
return false
}
return effortInterval.equals(other.effortInterval)
return name == other.name && surname == other.surname && beginDate == other.beginDate && endDate == other.endDate
}

override fun hashCode(): Int {
return Objects.hashCode(effortInterval)
return Objects.hashCode(name, surname, beginDate, endDate)
}
}
36 changes: 25 additions & 11 deletions src/com/app/model/HourWorker.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.app.model

import com.google.common.base.*
import java.time.*

/**
* Created by IntelliJ IDEA.<br>
Expand All @@ -9,11 +10,13 @@ import com.google.common.base.*
* Time: 1:48<br>
* Работник с почасовой ставкой
*/
class HourWorker() : AbstractWorker() {
constructor(hourRate: Double) : this() {
class HourWorker(name: String, surname: String, beginDate: LocalDate) :
AbstractWorker(name, surname, beginDate) {

constructor(name: String, surname: String, beginDate: LocalDate, hourRate: Double, workTime: Double) : this(name, surname, beginDate) {
this.hourRate = hourRate
this.workTime = workTime
}

/**
* Почасовая ставка
*/
Expand All @@ -23,24 +26,35 @@ class HourWorker() : AbstractWorker() {
field = value
}

/**
* Количество отработанных часов
*/
var workTime: Double = .0
set(value) {
validateWorkTime(value)
field = value
}

override fun getSalaryType(): SalaryType {
return SalaryType.Hour
}

override fun getSalaryInternal(duration: Double): Double {
return duration.times(hourRate)
}

override fun getRate(): Double = hourRate
override fun getSalary(): Double = Math.floor(100 * hourRate * workTime) / 100
//
// override fun getSalaryInternal(duration: Double): Double {
// return duration.times(hourRate)
// }
//
// override fun getRate(): Double = hourRate

override fun equals(other: Any?): Boolean {
if (other !is HourWorker || !this.javaClass.equals(other.javaClass)) {
if (other !is HourWorker || this.javaClass != other.javaClass) {
return false
}
return super.equals(other) && hourRate.equals(other.hourRate)
return super.equals(other) && hourRate == other.hourRate&& workTime == other.workTime
}

override fun hashCode(): Int {
return Objects.hashCode(effortInterval, hourRate)
return Objects.hashCode(name, surname, beginDate, hourRate, workTime)
}
}
10 changes: 2 additions & 8 deletions src/com/app/model/SalaryType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,10 @@ enum class SalaryType(private val type: String) {
*/
Hour("Почасовая"),

/**
* Оклад
*/
Salary("Оклад"),

/**
* Ставка
*/
Wage("Ставка");
Wage("Оклад");

companion object {
/**
Expand All @@ -31,8 +26,7 @@ enum class SalaryType(private val type: String) {
fun toEnum(type: String) =
when (type) {
"Почасовая" -> Hour
"Оклад" -> Salary
"Ставка" -> Wage
"Оклад" -> Wage
else -> null
}
}
Expand Down
Loading

0 comments on commit ba6a82c

Please sign in to comment.