43 lines
1.5 KiB
Dart
43 lines
1.5 KiB
Dart
import 'package:equatable/equatable.dart';
|
|
|
|
/// Typed mirror of the fields the admin UI needs from
|
|
/// `FinlyticCore.Dtos.TechnicalAnalysis.StrategyResultDto`, as returned by
|
|
/// `GET /api/v1/admin/evaluations/watchlist/{isin}/history` — the last N
|
|
/// technical-analysis setups computed for one ISIN, most recent first, so the
|
|
/// score trend (improving/worsening, and whether it ever cleared the engine's
|
|
/// top-pick bar) is visible even for setups too weak to ever reach the engine.
|
|
class RecentSetupModel extends Equatable {
|
|
final String strategyName;
|
|
final double qualityScore;
|
|
final bool isTopPick;
|
|
final String rating;
|
|
final DateTime createdAt;
|
|
|
|
const RecentSetupModel({
|
|
required this.strategyName,
|
|
required this.qualityScore,
|
|
required this.isTopPick,
|
|
required this.rating,
|
|
required this.createdAt,
|
|
});
|
|
|
|
factory RecentSetupModel.fromJson(Map<String, dynamic> json) {
|
|
double parseDbl(dynamic val) {
|
|
if (val == null) return 0.0;
|
|
if (val is num) return val.toDouble();
|
|
return double.tryParse(val.toString()) ?? 0.0;
|
|
}
|
|
|
|
return RecentSetupModel(
|
|
strategyName: json['strategyName']?.toString() ?? '',
|
|
qualityScore: parseDbl(json['qualityScore']),
|
|
isTopPick: json['isTopPick'] == true,
|
|
rating: json['rating']?.toString() ?? '',
|
|
createdAt: DateTime.tryParse(json['createdAt']?.toString() ?? '')?.toUtc() ?? DateTime.fromMillisecondsSinceEpoch(0, isUtc: true),
|
|
);
|
|
}
|
|
|
|
@override
|
|
List<Object?> get props => [strategyName, qualityScore, isTopPick, rating, createdAt];
|
|
}
|