cyberhybridhub/lib/admin/models/question_audit_asset.dart
2026-05-31 11:17:12 -05:00

120 lines
3.5 KiB
Dart

class QuestionAuditBarSlot {
const QuestionAuditBarSlot({
required this.asOf,
required this.avgPrice,
required this.volume,
this.open,
this.high,
this.low,
this.close,
});
final DateTime asOf;
final num? open;
final num? high;
final num? low;
final num? close;
final num avgPrice;
final num volume;
factory QuestionAuditBarSlot.fromJson(Map<String, dynamic> json) {
return QuestionAuditBarSlot(
asOf: DateTime.parse(json['asOf']! as String).toUtc(),
open: json['open'] as num?,
high: json['high'] as num?,
low: json['low'] as num?,
close: json['close'] as num?,
avgPrice: json['avgPrice'] as num,
volume: json['volume'] as num,
);
}
}
class QuestionAuditAsset {
const QuestionAuditAsset({
required this.symbol,
required this.priceDelta,
required this.volumeDelta,
required this.olderSlot,
required this.newerSlot,
});
final String symbol;
final num priceDelta;
final num volumeDelta;
final QuestionAuditBarSlot olderSlot;
final QuestionAuditBarSlot newerSlot;
factory QuestionAuditAsset.fromJson(Map<String, dynamic> json) {
return QuestionAuditAsset(
symbol: json['symbol']! as String,
priceDelta: json['priceDelta'] as num,
volumeDelta: json['volumeDelta'] as num,
olderSlot: QuestionAuditBarSlot.fromJson(
json['olderSlot']! as Map<String, dynamic>,
),
newerSlot: QuestionAuditBarSlot.fromJson(
json['newerSlot']! as Map<String, dynamic>,
),
);
}
}
class QuestionAuditReport {
const QuestionAuditReport({
required this.compareUntil,
required this.newerSlotStart,
required this.olderSlotStart,
required this.windowDays,
required this.assets,
required this.canStepOlder,
required this.canStepNewer,
this.stepOlderCompareUntil,
this.stepNewerCompareUntil,
});
final DateTime compareUntil;
final DateTime newerSlotStart;
final DateTime olderSlotStart;
final int windowDays;
final List<QuestionAuditAsset> assets;
final bool canStepOlder;
final bool canStepNewer;
final DateTime? stepOlderCompareUntil;
final DateTime? stepNewerCompareUntil;
factory QuestionAuditReport.fromJson(Map<String, dynamic> json) {
final List<dynamic> raw = json['assets'] as List<dynamic>? ?? <dynamic>[];
final DateTime compareUntil = DateTime.parse(
(json['compareUntil'] ?? json['asOf'])! as String,
).toUtc();
return QuestionAuditReport(
compareUntil: compareUntil,
newerSlotStart: json['newerSlotStart'] == null
? compareUntil.subtract(const Duration(hours: 4))
: DateTime.parse(json['newerSlotStart']! as String).toUtc(),
olderSlotStart: json['olderSlotStart'] == null
? compareUntil.subtract(const Duration(hours: 8))
: DateTime.parse(json['olderSlotStart']! as String).toUtc(),
windowDays: (json['windowDays'] as num).toInt(),
canStepOlder: json['canStepOlder'] as bool? ?? false,
canStepNewer: json['canStepNewer'] as bool? ?? false,
stepOlderCompareUntil: _parseOptionalUtc(json['stepOlderCompareUntil']),
stepNewerCompareUntil: _parseOptionalUtc(json['stepNewerCompareUntil']),
assets: raw
.map(
(dynamic item) =>
QuestionAuditAsset.fromJson(item as Map<String, dynamic>),
)
.toList(growable: false),
);
}
}
DateTime? _parseOptionalUtc(dynamic raw) {
if (raw == null) {
return null;
}
return DateTime.parse(raw as String).toUtc();
}