All Downloads are FREE. Search and download functionalities are using the official Maven repository.

money.rave.common.backend.entity.order.Order.kt Maven / Gradle / Ivy

package money.rave.common.backend.entity.order

import money.rave.common.backend.entity.rule.Rule
import money.rave.common.backend.entity.ticker.Ticker
import money.rave.common.backend.enumeration.OrderState
import money.rave.common.backend.enumeration.OrderType
import java.math.BigDecimal
import java.time.ZonedDateTime
import javax.persistence.*

typealias OrderId = Long

@Entity
@Table(name = "order")
class Order(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: OrderId,

    @Column(name = "type", nullable = false)
    @Enumerated(EnumType.STRING)
    val type: OrderType,

    @Column(name = "description", nullable = true, columnDefinition = "TEXT")
    val description: String?,

    @ManyToOne
    @JoinColumns(
        JoinColumn(
            name = "ticker_id_from_market",
            referencedColumnName = "id_from_market",
            nullable = false,
            insertable = false,
            updatable = false,
        ),
        JoinColumn(
            name = "market",
            referencedColumnName = "market",
            nullable = false,
            insertable = false,
            updatable = false,
        )
    )
    val ticker: Ticker,

    @ManyToOne
    @JoinColumn(name = "rule_id", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)
    val rule: Rule,

    baseAssetVolume: BigDecimal?,
    quoteAssetVolume: BigDecimal?,
    price: BigDecimal?,

    @OneToMany
    val orderShares: List,

    @OneToMany
    val executions: List,

    @Column(name = "state", nullable = false)
    @Enumerated(EnumType.STRING)
    val state: OrderState,

    @Column(name = "created_at", nullable = false)
    val createdAt: ZonedDateTime,
) {

    private val _baseAssetVolume: BigDecimal? = baseAssetVolume
    @get:Column(name = "base_asset_volume", nullable = true, precision = 40, scale = 8)
    val baseAssetVolume: BigDecimal
        get() = _baseAssetVolume ?: _quoteAssetVolume?.divide(_price) ?: throw Exception()

    private val _quoteAssetVolume: BigDecimal? = quoteAssetVolume
    @get:Column(name = "quote_asset_volume", nullable = true, precision = 40, scale = 8)
    val quoteAssetVolume: BigDecimal
        get() = _quoteAssetVolume ?: _baseAssetVolume?.multiply(_price) ?: throw Exception()

    private val _price: BigDecimal? = price
    @get:Column(name = "price", nullable = true, precision = 40, scale = 8)
    val price: BigDecimal
        get() = _price ?: _baseAssetVolume?.divide(_quoteAssetVolume) ?: throw Exception()

    val executedQuoteAssetVolume: BigDecimal?
        get() = if (executions.isEmpty()) {
            null
        } else {
            executions.sumOf { it.quoteAssetVolume }
        }

    val executedBaseAssetVolume: BigDecimal?
        get() = if (executions.isEmpty()) {
            null
        } else {
            executions.sumOf { it.baseAssetVolume }
        }

    val executedAveragePrice: BigDecimal?
        get() = executedBaseAssetVolume?.divide(executedQuoteAssetVolume)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy