48 lines
1.4 KiB
Kotlin
48 lines
1.4 KiB
Kotlin
package space.luminic.finance.models
|
|
|
|
import org.springframework.data.annotation.CreatedBy
|
|
import org.springframework.data.annotation.CreatedDate
|
|
import org.springframework.data.annotation.LastModifiedBy
|
|
import org.springframework.data.annotation.LastModifiedDate
|
|
import java.math.BigDecimal
|
|
import java.time.Instant
|
|
import java.time.LocalDate
|
|
|
|
data class Goal(
|
|
var id: Int? = null,
|
|
val space: Space? = null,
|
|
val type: GoalType,
|
|
val name: String,
|
|
val description: String? = null,
|
|
val amount: BigDecimal,
|
|
val components: List<GoalComponent> = emptyList(),
|
|
val transactions: List<Transaction> = emptyList(),
|
|
val untilDate: LocalDate,
|
|
@CreatedBy var createdBy: User? = null,
|
|
|
|
@CreatedDate var createdAt: Instant? = null,
|
|
@LastModifiedBy var updatedBy: User? = null,
|
|
|
|
@LastModifiedDate var updatedAt: Instant? = null,
|
|
) {
|
|
|
|
var currentAmount: BigDecimal = {
|
|
this.transactions.sumOf { it.amount }
|
|
} as BigDecimal
|
|
|
|
|
|
data class GoalComponent(
|
|
val id: Int? = null,
|
|
val name: String,
|
|
val amount: BigDecimal,
|
|
val isDone: Boolean = false,
|
|
val date: LocalDate = LocalDate.now(),
|
|
)
|
|
|
|
enum class GoalType(val displayName: String, val icon: String) {
|
|
AUTO("Авто", "🏎️"),
|
|
VACATION("Отпуск", "🏖️"),
|
|
GOODS("Покупка", "🛍️"),
|
|
OTHER("Прочее", "💸")
|
|
}
|
|
} |