Files
backend/src/modules/investments/instruments/bonds/presentation/bond.dto.ts
T
codex-bot 07cfd08df9
Backend verify / commits (push) Skipped
Backend verify / security (push) Successful in 1m6s
Backend verify / verify (push) Failing after 6m44s
refactor: replace deep imports with native node aliases (WealthLedger/backend#165) (#193)
2026-11-04 23:22:46 +03:00

278 lines
9.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { ApiProperty } from '@nestjs/swagger';
import { MoneyDto } from '#src/common/money.dto';
import { InvestmentResourceMetaDto } from '#src/modules/investments/investment-resource.dto';
import {
StockCandlesDto,
StockCandlesQueryDto,
StockPositionDto,
StockSearchQueryDto,
StockTickerParamsDto,
} from '../../stocks/presentation/stock.dto';
export class BondSearchQueryDto extends StockSearchQueryDto {}
export class BondTickerParamsDto extends StockTickerParamsDto {}
export class BondCandlesQueryDto extends StockCandlesQueryDto {}
export class BondCandlesDto extends StockCandlesDto {}
export class BondPositionDto extends StockPositionDto {}
export class BondDto {
@ApiProperty({ format: 'uuid' }) declare instrumentUid: string;
@ApiProperty({
description: 'Unambiguous ticker URL segment, or the exact instrument UID.',
})
declare slug: string;
@ApiProperty() declare name: string;
@ApiProperty({ type: String, nullable: true }) declare isin: null | string;
@ApiProperty({ type: String, nullable: true }) declare classCode:
null | string;
@ApiProperty({ type: String, nullable: true }) declare realExchange:
null | string;
@ApiProperty({ type: Boolean, nullable: true }) declare apiTradeAvailable:
boolean | null;
@ApiProperty({ type: String, nullable: true }) declare ticker: null | string;
@ApiProperty({ type: String, nullable: true }) declare logoName:
null | string;
@ApiProperty({ type: String, nullable: true }) declare currency:
null | string;
@ApiProperty({ type: String, nullable: true }) declare sector: null | string;
@ApiProperty({ type: Number, nullable: true }) declare lot: null | number;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare historyFrom: null | string;
@ApiProperty({ type: MoneyDto, nullable: true })
declare nominal: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare initialNominal: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true }) declare aci: MoneyDto | null;
@ApiProperty({ type: String, nullable: true }) declare maturityDate:
null | string;
@ApiProperty({ type: String, nullable: true }) declare callDate:
null | string;
@ApiProperty({ type: String, nullable: true }) declare bondType:
null | string;
@ApiProperty({ type: String, nullable: true }) declare riskLevel:
null | string;
@ApiProperty({ type: Number, nullable: true }) declare couponQuantityPerYear:
null | number;
@ApiProperty({ type: Boolean, nullable: true }) declare floatingCoupon:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare perpetual:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare amortization:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare subordinated:
boolean | null;
}
export class BondSearchResultDto extends BondDto {
@ApiProperty({
type: String,
nullable: true,
description: 'Clean price in percent of nominal, not money.',
})
declare pricePercent: null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare priceAt: null | string;
}
export class BondQuoteDto {
@ApiProperty({ type: String, nullable: true }) declare pricePercent:
null | string;
@ApiProperty({
type: MoneyDto,
nullable: true,
description:
'Indicative clean value at the current nominal; no FX conversion.',
})
declare cleanPrice: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true }) declare aci: MoneyDto | null;
@ApiProperty({
type: MoneyDto,
nullable: true,
description:
'Indicative clean value plus current accrued interest, excluding fees.',
})
declare dirtyPrice: MoneyDto | null;
@ApiProperty({ type: String, nullable: true })
declare changePercentagePoints: null | string;
@ApiProperty({ type: String, nullable: true }) declare previousCloseDate:
null | string;
@ApiProperty({ type: String, nullable: true }) declare tradingStatus:
null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare priceAt: null | string;
@ApiProperty({ type: String, isArray: true }) declare unavailable: string[];
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
}
export class BondCouponDto {
@ApiProperty({ type: String, nullable: true }) declare number: null | string;
@ApiProperty({ type: String, nullable: true }) declare paymentDate:
null | string;
@ApiProperty({ type: String, nullable: true }) declare recordDate:
null | string;
@ApiProperty({ type: String, nullable: true }) declare couponType:
null | string;
@ApiProperty({ type: Number, nullable: true }) declare periodDays:
null | number;
@ApiProperty({ type: MoneyDto, nullable: true })
declare perBond: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare estimatedAmount: MoneyDto | null;
@ApiProperty({ enum: ['upcoming', 'past', 'undated'] }) declare timing:
'past' | 'undated' | 'upcoming';
}
export class BondCouponsDto {
@ApiProperty({ type: BondCouponDto, isArray: true }) declare coupons: BondCouponDto[];
@ApiProperty() declare from: string;
@ApiProperty() declare to: string;
@ApiProperty() declare observedAt: string;
@ApiProperty({ type: String, nullable: true }) declare positionAt:
null | string;
@ApiProperty() declare estimateUnavailable: boolean;
@ApiProperty() declare positionIsStale: boolean;
}
export class BondYieldDto {
@ApiProperty({ description: 'MOEX effective annual yield in percent.' })
declare value: string;
@ApiProperty() declare pricePercent: string;
@ApiProperty({ format: 'date' }) declare date: string;
@ApiProperty({
type: String,
nullable: true,
description: 'MOEX yield target, e.g. MATDATE or OFFERDATE.',
})
declare dateType: null | string;
@ApiProperty({ format: 'date-time' }) declare tradeAt: string;
}
export class BondCreditRatingDto {
@ApiProperty({ enum: ['NCR'] }) declare agency: 'NCR';
@ApiProperty({ type: String, nullable: true }) declare value: null | string;
@ApiProperty({ enum: ['active', 'withdrawn'] }) declare status:
'active' | 'withdrawn';
@ApiProperty({ format: 'date' }) declare date: string;
@ApiProperty({ format: 'uri' }) declare sourceUrl: string;
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
}
export class BondMetricsDto {
@ApiProperty({ type: BondCreditRatingDto, nullable: true })
declare creditRating: BondCreditRatingDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare coupon: MoneyDto | null;
@ApiProperty({ type: String, nullable: true, format: 'date' })
declare couponDate: null | string;
@ApiProperty({ type: String, nullable: true }) declare couponType:
null | string;
@ApiProperty({ type: Number, nullable: true }) declare couponPeriodDays:
null | number;
@ApiProperty({
type: String,
nullable: true,
description:
'Next coupon × 365 / period days / indicative clean price × 100. Not yield to maturity.',
})
declare couponYieldPercent: null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare couponYieldPriceAt: null | string;
@ApiProperty({ type: BondYieldDto, nullable: true })
declare effectiveYield: BondYieldDto | null;
@ApiProperty({ type: String, isArray: true }) declare unavailable: string[];
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
}
export class BondPositionResourceDto {
@ApiProperty({ type: BondPositionDto, nullable: true })
declare data: BondPositionDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondSearchResourceDto {
// eslint-disable-next-line @darraghor/nestjs-typed/api-property-returning-array-should-set-array -- Nullable array union requires isArray in the explicit wire schema.
@ApiProperty({ type: BondSearchResultDto, isArray: true, nullable: true })
declare data: BondSearchResultDto[] | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondResourceDto {
@ApiProperty({ type: BondDto, nullable: true }) declare data: BondDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondQuoteResourceDto {
@ApiProperty({ type: BondQuoteDto, nullable: true })
declare data: BondQuoteDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondMetricsResourceDto {
@ApiProperty({ type: BondMetricsDto, nullable: true })
declare data: BondMetricsDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondCandlesResourceDto {
@ApiProperty({ type: BondCandlesDto, nullable: true })
declare data: BondCandlesDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondCouponsResourceDto {
@ApiProperty({ type: BondCouponsDto, nullable: true })
declare data: BondCouponsDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}