mirror of
https://github.com/corda/corda.git
synced 2024-12-18 20:47:57 +00:00
Eliminate generated Kt
classes
* Move CP_PROGRAM_ID into companion object * Move COMMODITY_PROGRAM_ID into companion object * Remove unused convenience function from FinanceTypes before we end up committing to maintaining it indefinitely. * Move calculateDaysBetween into BusinessCalendar to eliminate FinanceTypesKt
This commit is contained in:
parent
7e3dd4c12c
commit
2a794d9523
@ -40,10 +40,11 @@ import java.util.*
|
|||||||
* which may need to be tracked. That, in turn, requires validation logic (there is a bean validator that knows how
|
* which may need to be tracked. That, in turn, requires validation logic (there is a bean validator that knows how
|
||||||
* to do this in the Apache BVal project).
|
* to do this in the Apache BVal project).
|
||||||
*/
|
*/
|
||||||
val CP_PROGRAM_ID = CommercialPaper()
|
|
||||||
|
|
||||||
// TODO: Generalise the notion of an owned instrument into a superclass/supercontract. Consider composition vs inheritance.
|
// TODO: Generalise the notion of an owned instrument into a superclass/supercontract. Consider composition vs inheritance.
|
||||||
class CommercialPaper : Contract {
|
class CommercialPaper : Contract {
|
||||||
|
companion object {
|
||||||
|
val CP_PROGRAM_ID = CommercialPaper()
|
||||||
|
}
|
||||||
data class State(
|
data class State(
|
||||||
val issuance: PartyAndReference,
|
val issuance: PartyAndReference,
|
||||||
override val owner: AbstractParty,
|
override val owner: AbstractParty,
|
||||||
|
@ -83,7 +83,7 @@ data class Tenor(val name: String) {
|
|||||||
}
|
}
|
||||||
// Move date to the closest business day when it falls on a weekend/holiday
|
// Move date to the closest business day when it falls on a weekend/holiday
|
||||||
val adjustedMaturityDate = calendar.applyRollConvention(maturityDate, DateRollConvention.ModifiedFollowing)
|
val adjustedMaturityDate = calendar.applyRollConvention(maturityDate, DateRollConvention.ModifiedFollowing)
|
||||||
val daysToMaturity = calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual)
|
val daysToMaturity = BusinessCalendar.calculateDaysBetween(startDate, adjustedMaturityDate, DayCountBasisYear.Y360, DayCountBasisDay.DActual)
|
||||||
|
|
||||||
return daysToMaturity
|
return daysToMaturity
|
||||||
}
|
}
|
||||||
@ -190,10 +190,6 @@ enum class Frequency(val annualCompoundCount: Int, val offset: LocalDate.(Long)
|
|||||||
Daily(365, { plusDays(1 * it) });
|
Daily(365, { plusDays(1 * it) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Suppress("unused") // This utility may be useful in future. TODO: Review before API stability guarantees in place.
|
|
||||||
fun LocalDate.isWorkingDay(accordingToCalendar: BusinessCalendar): Boolean = accordingToCalendar.isWorkingDay(this)
|
|
||||||
|
|
||||||
// TODO: Make Calendar data come from an oracle
|
// TODO: Make Calendar data come from an oracle
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -213,10 +209,26 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
|
|||||||
it to BusinessCalendar::class.java.getResourceAsStream("${it}HolidayCalendar.txt").bufferedReader().readText()
|
it to BusinessCalendar::class.java.getResourceAsStream("${it}HolidayCalendar.txt").bufferedReader().readText()
|
||||||
}.toMap()
|
}.toMap()
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun calculateDaysBetween(startDate: LocalDate,
|
||||||
|
endDate: LocalDate,
|
||||||
|
dcbYear: DayCountBasisYear,
|
||||||
|
dcbDay: DayCountBasisDay): Int {
|
||||||
|
// Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later.
|
||||||
|
// TODO: The rest.
|
||||||
|
return when {
|
||||||
|
dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt()
|
||||||
|
dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt()
|
||||||
|
else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Parses a date of the form YYYY-MM-DD, like 2016-01-10 for 10th Jan. */
|
/** Parses a date of the form YYYY-MM-DD, like 2016-01-10 for 10th Jan. */
|
||||||
|
@JvmStatic
|
||||||
fun parseDateFromString(it: String): LocalDate = LocalDate.parse(it, DateTimeFormatter.ISO_LOCAL_DATE)
|
fun parseDateFromString(it: String): LocalDate = LocalDate.parse(it, DateTimeFormatter.ISO_LOCAL_DATE)
|
||||||
|
|
||||||
/** Returns a business calendar that combines all the named holiday calendars into one list of holiday dates. */
|
/** Returns a business calendar that combines all the named holiday calendars into one list of holiday dates. */
|
||||||
|
@JvmStatic
|
||||||
fun getInstance(vararg calname: String) = BusinessCalendar(
|
fun getInstance(vararg calname: String) = BusinessCalendar(
|
||||||
calname.flatMap { (TEST_CALENDAR_DATA[it] ?: throw UnknownCalendar(it)).split(",") }.
|
calname.flatMap { (TEST_CALENDAR_DATA[it] ?: throw UnknownCalendar(it)).split(",") }.
|
||||||
toSet().
|
toSet().
|
||||||
@ -225,6 +237,7 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
/** Calculates an event schedule that moves events around to ensure they fall on working days. */
|
/** Calculates an event schedule that moves events around to ensure they fall on working days. */
|
||||||
|
@JvmStatic
|
||||||
fun createGenericSchedule(startDate: LocalDate,
|
fun createGenericSchedule(startDate: LocalDate,
|
||||||
period: Frequency,
|
period: Frequency,
|
||||||
calendar: BusinessCalendar = getInstance(),
|
calendar: BusinessCalendar = getInstance(),
|
||||||
@ -248,9 +261,11 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Calculates the date from @startDate moving forward @steps of time size @period. Does not apply calendar
|
/**
|
||||||
|
* Calculates the date from @startDate moving forward 'steps' of time size 'period'. Does not apply calendar
|
||||||
* logic / roll conventions.
|
* logic / roll conventions.
|
||||||
*/
|
*/
|
||||||
|
@JvmStatic
|
||||||
fun getOffsetDate(startDate: LocalDate, period: Frequency, steps: Int = 1): LocalDate {
|
fun getOffsetDate(startDate: LocalDate, period: Frequency, steps: Int = 1): LocalDate {
|
||||||
if (steps == 0) return startDate
|
if (steps == 0) return startDate
|
||||||
return period.offset(startDate, steps.toLong())
|
return period.offset(startDate, steps.toLong())
|
||||||
@ -316,19 +331,6 @@ open class BusinessCalendar (val holidayDates: List<LocalDate>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun calculateDaysBetween(startDate: LocalDate,
|
|
||||||
endDate: LocalDate,
|
|
||||||
dcbYear: DayCountBasisYear,
|
|
||||||
dcbDay: DayCountBasisDay): Int {
|
|
||||||
// Right now we are only considering Actual/360 and 30/360 .. We'll do the rest later.
|
|
||||||
// TODO: The rest.
|
|
||||||
return when {
|
|
||||||
dcbDay == DayCountBasisDay.DActual -> (endDate.toEpochDay() - startDate.toEpochDay()).toInt()
|
|
||||||
dcbDay == DayCountBasisDay.D30 && dcbYear == DayCountBasisYear.Y360 -> ((endDate.year - startDate.year) * 360.0 + (endDate.monthValue - startDate.monthValue) * 30.0 + endDate.dayOfMonth - startDate.dayOfMonth).toInt()
|
|
||||||
else -> TODO("Can't calculate days using convention $dcbDay / $dcbYear")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** A common netting command for contracts whose states can be netted. */
|
/** A common netting command for contracts whose states can be netted. */
|
||||||
interface NetCommand : CommandData {
|
interface NetCommand : CommandData {
|
||||||
/** The type of netting to apply, see [NetType] for options. */
|
/** The type of netting to apply, see [NetType] for options. */
|
||||||
|
@ -19,9 +19,6 @@ import java.util.*
|
|||||||
// Commodity
|
// Commodity
|
||||||
//
|
//
|
||||||
|
|
||||||
// Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode.
|
|
||||||
val COMMODITY_PROGRAM_ID = CommodityContract()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A commodity contract represents an amount of some commodity, tracked on a distributed ledger. The design of this
|
* A commodity contract represents an amount of some commodity, tracked on a distributed ledger. The design of this
|
||||||
* contract is intentionally similar to the [Cash] contract, and the same commands (issue, move, exit) apply, the
|
* contract is intentionally similar to the [Cash] contract, and the same commands (issue, move, exit) apply, the
|
||||||
@ -34,6 +31,11 @@ val COMMODITY_PROGRAM_ID = CommodityContract()
|
|||||||
*/
|
*/
|
||||||
// TODO: Need to think about expiry of commodities, how to require payment of storage costs, etc.
|
// TODO: Need to think about expiry of commodities, how to require payment of storage costs, etc.
|
||||||
class CommodityContract : OnLedgerAsset<Commodity, CommodityContract.Commands, CommodityContract.State>() {
|
class CommodityContract : OnLedgerAsset<Commodity, CommodityContract.Commands, CommodityContract.State>() {
|
||||||
|
companion object {
|
||||||
|
// Just a fake program identifier for now. In a real system it could be, for instance, the hash of the program bytecode.
|
||||||
|
val COMMODITY_PROGRAM_ID = CommodityContract()
|
||||||
|
}
|
||||||
|
|
||||||
/** A state representing a commodity claim against some party */
|
/** A state representing a commodity claim against some party */
|
||||||
data class State(
|
data class State(
|
||||||
override val amount: Amount<Issued<Commodity>>,
|
override val amount: Amount<Issued<Commodity>>,
|
||||||
|
@ -2,7 +2,6 @@ package net.corda.irs.contract
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
|
||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.crypto.containsAny
|
|
||||||
import net.corda.core.flows.FlowLogicRefFactory
|
import net.corda.core.flows.FlowLogicRefFactory
|
||||||
import net.corda.core.identity.AbstractParty
|
import net.corda.core.identity.AbstractParty
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
@ -18,7 +17,6 @@ import org.apache.commons.jexl3.JexlBuilder
|
|||||||
import org.apache.commons.jexl3.MapContext
|
import org.apache.commons.jexl3.MapContext
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
import java.math.RoundingMode
|
import java.math.RoundingMode
|
||||||
import java.security.PublicKey
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -76,7 +74,7 @@ abstract class RatePaymentEvent(date: LocalDate,
|
|||||||
|
|
||||||
abstract val flow: Amount<Currency>
|
abstract val flow: Amount<Currency>
|
||||||
|
|
||||||
val days: Int get() = calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay)
|
val days: Int get() = BusinessCalendar.calculateDaysBetween(accrualStartDate, accrualEndDate, dayCountBasisYear, dayCountBasisDay)
|
||||||
|
|
||||||
// TODO : Fix below (use daycount convention for division, not hardcoded 360 etc)
|
// TODO : Fix below (use daycount convention for division, not hardcoded 360 etc)
|
||||||
val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP)
|
val dayCountFactor: BigDecimal get() = (BigDecimal(days).divide(BigDecimal(360.0), 8, RoundingMode.HALF_UP)).setScale(4, RoundingMode.HALF_UP)
|
||||||
|
Loading…
Reference in New Issue
Block a user