using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// 거시경제지표 시계열 (KOSIS 국가통계포털 OpenAPI 수집) — (Code, Period) UNIQUE. 개미투자 거시 대시보드용.
/// 여러 지표(고용률/실업률/취업자수/CPI/수출액/수입액 등)를 한 테이블에 담고 Code(내부 지표코드)로 구분한다.
/// KOSIS statisticsData.do 응답 필드 매핑:
/// - PRD_DE(수록시점) → Period. 주기(Cycle)에 따라 형식이 다르다: 월=YYYYMM(202401), 분기=YYYYQ(20241), 연=YYYY(2024).
/// - DT(수치) → Value. 빈값("")·"-" 등은 수집 시 skip (미고시 시점은 적재하지 않음).
/// - UNIT_NM(단위) → Unit. 지표별 config Name 은 Code 와 함께 표시용으로 별도 보관한다.
/// KOSIS 통계표는 하나의 tblId 안에 여러 분류(C1 시도별/지수별 등)가 섞여 오므로, 수집 배치가 config 의 분류 필터(C1)로
/// 원하는 한 계열(예: CPI 전국 총지수, 실업률 전국(계), 수출액 국가 총계)만 골라 upsert 한다.
///
public class MacroIndicator
{
[Key]
public long ID { get; private set; }
/// 지표 내부코드 (config Code) — 예: EMPLOYMENT_RATE, UNEMPLOYMENT_RATE, EMPLOYED_PERSONS, CPI, EXPORT_AMT, IMPORT_AMT (환율은 koreaexim 일별)
public string Code { get; private set; } = default!;
/// 지표 표시명 (config Name) — 예: 소비자물가지수
public string Name { get; private set; } = default!;
/// 수록 시점 (PRD_DE) — 월=YYYYMM, 분기=YYYYQ(예 20241), 연=YYYY
public string Period { get; private set; } = default!;
/// 수치 (DT)
public decimal Value { get; private set; }
/// 단위 (UNIT_NM) — 예: "2020=100", "%", "천명". 미제공 시 null
public string? Unit { get; private set; }
public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
private MacroIndicator() { }
public static MacroIndicator Create(string code, string name, string period, decimal value, string? unit)
{
if (string.IsNullOrWhiteSpace(code))
{
throw new ArgumentException("code required", nameof(code));
}
if (string.IsNullOrWhiteSpace(period))
{
throw new ArgumentException("period required", nameof(period));
}
return new MacroIndicator
{
Code = code.Trim(),
Name = (name ?? string.Empty).Trim(),
Period = period.Trim(),
Value = value,
Unit = string.IsNullOrWhiteSpace(unit) ? null : unit.Trim()
};
}
/// 동일 (Code, Period) 재수집 시 값·단위·표시명 갱신 (upsert)
public void Update(string name, decimal value, string? unit)
{
Name = (name ?? string.Empty).Trim();
Value = value;
Unit = string.IsNullOrWhiteSpace(unit) ? null : unit.Trim();
UpdatedAt = DateTime.UtcNow;
}
}