From ba6a82c8444ed843ce4e0013e02d5d609df52c28 Mon Sep 17 00:00:00 2001 From: Alexey Trofimov Date: Sun, 9 Apr 2017 17:30:18 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B7=D0=BD=D0=B5=D1=81-=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20(=D0=B8=D0=BC=D1=8F,=20=D1=84=D0=B0=D0=BC=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D1=8F,=20=D0=B4=D0=B0=D1=82=D0=B0=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D0=B8=20=D0=BE=D0=BA=D0=BE=D0=BD=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/app/Main.kt | 172 +++++++++++++--------- src/com/app/model/AbstractWorker.kt | 50 ++++--- src/com/app/model/HourWorker.kt | 36 +++-- src/com/app/model/SalaryType.kt | 10 +- src/com/app/model/SalaryWorker.kt | 46 ------ src/com/app/model/WageWorker.kt | 44 ++++-- src/com/app/model/WorkerFactory.kt | 31 ++-- src/com/app/model/WorkersListWrapper.java | 2 - src/com/app/model/utils.kt | 14 ++ 9 files changed, 226 insertions(+), 179 deletions(-) delete mode 100644 src/com/app/model/SalaryWorker.kt diff --git a/src/com/app/Main.kt b/src/com/app/Main.kt index 4168a5f..b1973ed 100644 --- a/src/com/app/Main.kt +++ b/src/com/app/Main.kt @@ -1,68 +1,104 @@ -//package com.app -// -//import com.app.model.* -// -///** -// * Created by IntelliJ IDEA.
-// * User: Alexey
-// * Date: 25.03.2017
-// * Time: 1:10
-// * Версия с консольным интерфейсом -// */ -//object Main { -// -// /** -// * Точка входа в программу -// */ -// @JvmStatic -// fun main(args: Array) { -// 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()}") -// } -//} \ No newline at end of file +package com.app + +import com.app.model.* +import java.time.* +import java.util.concurrent.* + +/** + * Created by IntelliJ IDEA.
+ * User: Alexey
+ * Date: 25.03.2017
+ * Time: 1:10
+ * Версия с консольным интерфейсом + */ +object Main { + + /** + * Точка входа в программу + */ + @JvmStatic + fun main(args: Array) { + 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) + } + + } +} \ No newline at end of file diff --git a/src/com/app/model/AbstractWorker.kt b/src/com/app/model/AbstractWorker.kt index 8872742..14966b7 100644 --- a/src/com/app/model/AbstractWorker.kt +++ b/src/com/app/model/AbstractWorker.kt @@ -1,6 +1,7 @@ package com.app.model import com.google.common.base.* +import java.time.* /** * Created by IntelliJ IDEA.
@@ -9,47 +10,50 @@ import com.google.common.base.* * Time: 1:30
* Абстрактный работник */ -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) } } \ No newline at end of file diff --git a/src/com/app/model/HourWorker.kt b/src/com/app/model/HourWorker.kt index 402aab8..66236a3 100644 --- a/src/com/app/model/HourWorker.kt +++ b/src/com/app/model/HourWorker.kt @@ -1,6 +1,7 @@ package com.app.model import com.google.common.base.* +import java.time.* /** * Created by IntelliJ IDEA.
@@ -9,11 +10,13 @@ import com.google.common.base.* * Time: 1:48
* Работник с почасовой ставкой */ -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 } - /** * Почасовая ставка */ @@ -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) } } \ No newline at end of file diff --git a/src/com/app/model/SalaryType.kt b/src/com/app/model/SalaryType.kt index 13e07d2..32dc4b7 100644 --- a/src/com/app/model/SalaryType.kt +++ b/src/com/app/model/SalaryType.kt @@ -14,15 +14,10 @@ enum class SalaryType(private val type: String) { */ Hour("Почасовая"), - /** - * Оклад - */ - Salary("Оклад"), - /** * Ставка */ - Wage("Ставка"); + Wage("Оклад"); companion object { /** @@ -31,8 +26,7 @@ enum class SalaryType(private val type: String) { fun toEnum(type: String) = when (type) { "Почасовая" -> Hour - "Оклад" -> Salary - "Ставка" -> Wage + "Оклад" -> Wage else -> null } } diff --git a/src/com/app/model/SalaryWorker.kt b/src/com/app/model/SalaryWorker.kt deleted file mode 100644 index 6c080d7..0000000 --- a/src/com/app/model/SalaryWorker.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.app.model - -import com.google.common.base.* - -/** - * Created by IntelliJ IDEA.
- * User: Alexey
- * Date: 25.03.2017
- * Time: 1:51
- * Работник с окладом - */ -class SalaryWorker() : AbstractWorker() { - constructor(salary: Double) : this() { - this.salary = salary - } - - /** - * Оклад - */ - var salary: Double = .0 - set(value) { - validateIsPositive(value) - field = value - } - - override fun getSalaryType(): SalaryType { - return SalaryType.Salary - } - - override fun getSalaryInternal(duration: Double): Double { - return duration.times(salary) - } - - override fun getRate(): Double = salary - - override fun equals(other: Any?): Boolean { - if (other !is SalaryWorker || !this.javaClass.equals(other.javaClass)) { - return false - } - return super.equals(other) && salary.equals(other.salary) - } - - override fun hashCode(): Int { - return Objects.hashCode(effortInterval, salary) - } -} \ No newline at end of file diff --git a/src/com/app/model/WageWorker.kt b/src/com/app/model/WageWorker.kt index 06ad2ae..ab740c1 100644 --- a/src/com/app/model/WageWorker.kt +++ b/src/com/app/model/WageWorker.kt @@ -1,6 +1,7 @@ package com.app.model import com.google.common.base.* +import java.time.* /** * Created by IntelliJ IDEA.
@@ -9,13 +10,36 @@ import com.google.common.base.* * Time: 1:53
* Работник со ставкой */ -class WageWorker() : AbstractWorker() { - constructor(wage: Double) : this() { +class WageWorker(name: String, surname: String, beginDate: LocalDate) : + AbstractWorker(name, surname, beginDate) { + + constructor(name: String, surname: String, beginDate: LocalDate, wage: Double, workTime: Double, workTimeNorm: Double) : + this(name, surname, beginDate) { this.wage = wage + this.workTime = workTime + this.workTimeNorm = workTimeNorm } /** - * Ставка + * Норма рабочего времени в текущем месяце + */ + var workTimeNorm = .0 + set(value) { + validateWorkTimeNorm(value) + field = value + } + + /** + * Количество отработанных часов в месяц + */ + var workTime = .0 + set(value) { + validateWorkTime(value) + field = value + } + + /** + * Оклад */ var wage: Double = .0 set(value) { @@ -23,24 +47,20 @@ class WageWorker() : AbstractWorker() { field = value } + override fun getSalary(): Double = Math.floor(100 * wage * workTime / workTimeNorm) / 100 + override fun getSalaryType(): SalaryType { return SalaryType.Wage } - override fun getSalaryInternal(duration: Double): Double { - return duration.times(wage) - } - - override fun getRate(): Double = wage - override fun equals(other: Any?): Boolean { - if (other !is WageWorker || !this.javaClass.equals(other.javaClass)) { + if (other !is WageWorker || this.javaClass != other.javaClass) { return false } - return super.equals(other) && wage.equals(other.wage) + return super.equals(other) && workTimeNorm == other.workTimeNorm && workTime == other.workTime && wage == other.wage } override fun hashCode(): Int { - return Objects.hashCode(effortInterval, wage) + return Objects.hashCode(workTimeNorm, workTime, wage) } } \ No newline at end of file diff --git a/src/com/app/model/WorkerFactory.kt b/src/com/app/model/WorkerFactory.kt index d5a0477..12ceede 100644 --- a/src/com/app/model/WorkerFactory.kt +++ b/src/com/app/model/WorkerFactory.kt @@ -1,5 +1,7 @@ package com.app.model +import java.time.* + /** * Created by IntelliJ IDEA.
* User: Alexey
@@ -11,20 +13,31 @@ object WorkerFactory { /** * Создаёт экземпляр работника * @type Тип зарплаты - * @rate Коэффициент зарплаты - * @effortInterval Интервал времени (опционально) + * @name Имя рабонтика + * @surname Фамилия работника + * @beginDate дата начала работы + * @endDate дата окончания работы + * @rate ставка или почасовая ставка + * @workTime количество отработанных часов + * @workTimeNorm норма часов в месяц * @return AbstractWorker */ - fun create(type: SalaryType, rate: Double, effortInterval: Double = -.1): AbstractWorker { + fun create( + type: SalaryType, + name: String, + surname: String, + beginDate: LocalDate, + endDate: LocalDate? = null, + rate: Double, + workTime: Double, + WorkTimeNorm: + Double? = null): AbstractWorker { val worker: AbstractWorker when (type) { - SalaryType.Hour -> worker = HourWorker(rate) - SalaryType.Salary -> worker = SalaryWorker(rate) - SalaryType.Wage -> worker = WageWorker(rate) - } - if (effortInterval >= 0) { - worker.effortInterval = effortInterval + SalaryType.Hour -> worker = HourWorker(name, surname, beginDate, rate, workTime) + SalaryType.Wage -> worker = WageWorker(name, surname, beginDate, rate, workTime, WorkTimeNorm!!) } + worker.endDate = endDate return worker } } \ No newline at end of file diff --git a/src/com/app/model/WorkersListWrapper.java b/src/com/app/model/WorkersListWrapper.java index 41d1391..2e75691 100644 --- a/src/com/app/model/WorkersListWrapper.java +++ b/src/com/app/model/WorkersListWrapper.java @@ -22,12 +22,10 @@ public class WorkersListWrapper { * @return workers * @see AbstractWorker * @see HourWorker - * @see SalaryWorker * @see WageWorker */ @XmlElements({ @XmlElement(name = "hourWorker", type = HourWorker.class), - @XmlElement(name = "salaryWorker", type = SalaryWorker.class), @XmlElement(name = "wageWorker", type = WageWorker.class) }) public List getWorkers() { diff --git a/src/com/app/model/utils.kt b/src/com/app/model/utils.kt index 90cf53a..987b109 100644 --- a/src/com/app/model/utils.kt +++ b/src/com/app/model/utils.kt @@ -25,3 +25,17 @@ fun validateIsPositive(value: Double, errorMes: String = "Значение до throw IllegalArgumentException(errorMes) } } + +fun validateWorkTime(value: Double, errorMes: String = "Величина отработанного времени не должна быть больше 250") { + validateIsPositive(value) + if (value > 250) { + throw IllegalArgumentException(errorMes) + } +} + +fun validateWorkTimeNorm(value: Double, errorMes: String = "Величина нормы рабочего времени не должна быть больше 192") { + validateIsPositive(value) + if (value > 192) { + throw IllegalArgumentException(errorMes) + } +}