using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Domain.Entities.Stocks;
///
/// T+1 일별 마감 시세 (금융위 주식시세 API) — (StockID, TradingDate) UNIQUE.
/// 수정주가 보정 없음 (액면분할 등 미반영 — 차트는 TradingView 위임).
///
public class StockDailyPrice
{
[ForeignKey(nameof(StockID))]
public virtual Stock? Stock { get; private set; }
[Key]
public long ID { get; private set; }
public int StockID { get; private set; }
/// 거래일 (basDt)
public DateOnly TradingDate { get; private set; }
/// 시가
public int Open { get; private set; }
/// 고가
public int High { get; private set; }
/// 저가
public int Low { get; private set; }
/// 종가
public int Close { get; private set; }
/// 거래량 (주)
public long Volume { get; private set; }
/// 거래대금 (원)
public long TradingValue { get; private set; }
/// 전일 대비 (원)
public int ChangeAmount { get; private set; }
/// 등락률 %
public decimal ChangeRate { get; private set; }
/// 시가총액 (원)
public long? MarketCap { get; private set; }
/// 상장주식수
public long? ListedShares { get; private set; }
public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
private StockDailyPrice() { }
public static StockDailyPrice Create(
int stockID,
DateOnly tradingDate,
int open,
int high,
int low,
int close,
long volume,
long tradingValue,
int changeAmount,
decimal changeRate,
long? marketCap = null,
long? listedShares = null
) {
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(stockID);
return new StockDailyPrice
{
StockID = stockID,
TradingDate = tradingDate,
Open = open,
High = high,
Low = low,
Close = close,
Volume = volume,
TradingValue = tradingValue,
ChangeAmount = changeAmount,
ChangeRate = changeRate,
MarketCap = marketCap,
ListedShares = listedShares
};
}
/// 동일 (StockID, TradingDate) 재수집 시 값 갱신 (upsert)
public void Update(
int open,
int high,
int low,
int close,
long volume,
long tradingValue,
int changeAmount,
decimal changeRate,
long? marketCap = null,
long? listedShares = null
) {
Open = open;
High = high;
Low = low;
Close = close;
Volume = volume;
TradingValue = tradingValue;
ChangeAmount = changeAmount;
ChangeRate = changeRate;
MarketCap = marketCap;
ListedShares = listedShares;
}
}