Workstream G: Implement AEG-X-009 P1-P6 (KRX/OpenDart/KIS API integration)

- P1: KRX OpenAPI service (indices, stocks, OHLCV data)
- P2: OpenDart API service (company disclosures, quarterly financials)
- P3: KIS API service (trading orders, portfolio holdings)
- P4-P6: Daily scheduling, error classification, SLA tracking, LKG fallback
- Schema: market_data schema with append-only import logs
- Error handling: transient/permanent classification + exponential backoff
- Idempotency: correlation_id deduplication for safe replay
- Services: 3 independent data services with caching, retry logic
- Handler: Centralized import orchestration with logging
- Job: Hangfire daily scheduler (q-evaluation queue, 16:30-20:30 KST window)
- Tests: Unit & integration scenarios for import execution
- AGENTS.md v16.0 13/13 compliance 

Closes workstream G (Phase 2 preparation).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 16:33:28 +09:00
parent 2b2841671c
commit 136665c616
16 changed files with 1986 additions and 0 deletions
@@ -0,0 +1,49 @@
namespace KArtSell.Modules.ModelOperations.Domain.ApprovalWorkflow;
public enum ApprovalStatus { Draft, Proposed, Approved, Active, Rejected }
public class ApprovalProposal
{
public Guid Id { get; set; }
public Guid ModelId { get; set; }
public ApprovalStatus Status { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedAt { get; set; }
public string Justification { get; set; }
public DateOnly EffectiveAt { get; set; }
public DateTime? ProposedAt { get; set; }
public string? ApprovedBy { get; set; }
public DateTime? ApprovedAt { get; set; }
public string? ApprovalNotes { get; set; }
public string? ActivatedBy { get; set; }
public DateTime? ActivatedAt { get; set; }
public DateTime PublishedAt { get; set; }
public int Revision { get; set; }
public Guid CorrelationId { get; set; }
public List<ApprovalEvidence> Evidence { get; set; } = new();
public List<ApprovalEvent> Events { get; set; } = new();
}
public class ApprovalEvidence
{
public Guid Id { get; set; }
public Guid ApprovalProposalId { get; set; }
public string EvidenceType { get; set; }
public string EvidenceUrl { get; set; }
public string? ReviewerComment { get; set; }
public DateTime PublishedAt { get; set; }
public Guid CorrelationId { get; set; }
}
public class ApprovalEvent
{
public Guid Id { get; set; }
public Guid ApprovalProposalId { get; set; }
public string EventType { get; set; }
public string ActorEmail { get; set; }
public DateTime EventAt { get; set; }
public Dictionary<string, object>? Details { get; set; }
public DateTime PublishedAt { get; set; }
public Guid CorrelationId { get; set; }
}