MIF_E31231313/Android/flutter_app/lib/models/child_detail_model.dart

139 lines
4.4 KiB
Dart

import 'measurement_history_model.dart';
import 'zscore_result_model.dart';
class LatestMeasurementModel {
const LatestMeasurementModel({
required this.measurementId,
required this.measurementDate,
required this.ageAtMeasurement,
required this.weightKg,
required this.heightCm,
required this.position,
});
final int measurementId;
final String measurementDate;
final String ageAtMeasurement;
final double weightKg;
final double heightCm;
final String position;
factory LatestMeasurementModel.fromJson(Map<String, dynamic> json) {
return LatestMeasurementModel(
measurementId: _int(json['measurement_id']),
measurementDate: _string(json['measurement_date'], fallback: '-'),
ageAtMeasurement: _string(json['age_at_measurement'], fallback: '-'),
weightKg: _double(json['weight_kg']),
heightCm: _double(json['height_cm']),
position: _string(json['position'], fallback: '-'),
);
}
Map<String, dynamic> toJson() => {
'measurement_id': measurementId,
'measurement_date': measurementDate,
'age_at_measurement': ageAtMeasurement,
'weight_kg': weightKg,
'height_cm': heightCm,
'position': position,
};
}
class ChildDetailModel {
const ChildDetailModel({
required this.id,
required this.name,
required this.ageText,
required this.gender,
required this.birthDate,
required this.parentName,
required this.parentPhone,
required this.riskStatus,
required this.latestMeasurement,
required this.zscoreResult,
required this.interpretation,
required this.shortHistories,
required this.hasConsultation,
this.consultationId,
});
final int id;
final String name;
final String ageText;
final String gender;
final String birthDate;
final String parentName;
final String parentPhone;
final String riskStatus;
final LatestMeasurementModel latestMeasurement;
final ZScoreResultModel zscoreResult;
final String interpretation;
final List<MeasurementHistoryModel> shortHistories;
final bool hasConsultation;
final int? consultationId;
factory ChildDetailModel.fromJson(Map<String, dynamic> json) {
final latest = json['latest_measurement'] is Map<String, dynamic>
? json['latest_measurement'] as Map<String, dynamic>
: const <String, dynamic>{};
final zscore = json['zscore_result'] is Map<String, dynamic>
? json['zscore_result'] as Map<String, dynamic>
: const <String, dynamic>{};
return ChildDetailModel(
id: _int(json['id']),
name: _string(json['name'], fallback: 'Anak'),
ageText: _string(json['age_text'], fallback: '-'),
gender: _string(json['gender'], fallback: '-'),
birthDate: _string(json['birth_date'], fallback: '-'),
parentName: _string(json['parent_name'], fallback: '-'),
parentPhone: _string(json['parent_phone'], fallback: '-'),
riskStatus: _string(json['risk_status'], fallback: 'Normal'),
latestMeasurement: LatestMeasurementModel.fromJson(latest),
zscoreResult: ZScoreResultModel.fromJson(zscore),
interpretation: _string(json['interpretation'], fallback: '-'),
shortHistories: (json['short_histories'] as List<dynamic>? ?? const [])
.whereType<Map<String, dynamic>>()
.map(MeasurementHistoryModel.fromJson)
.toList(),
hasConsultation: json['has_consultation'] == true,
consultationId: json['consultation_id'] is num
? (json['consultation_id'] as num).toInt()
: null,
);
}
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'age_text': ageText,
'gender': gender,
'birth_date': birthDate,
'parent_name': parentName,
'parent_phone': parentPhone,
'risk_status': riskStatus,
'latest_measurement': latestMeasurement.toJson(),
'zscore_result': zscoreResult.toJson(),
'interpretation': interpretation,
'short_histories': shortHistories.map((item) => item.toJson()).toList(),
'has_consultation': hasConsultation,
'consultation_id': consultationId,
};
}
String _string(dynamic value, {String fallback = ''}) {
if (value is String && value.trim().isNotEmpty) return value.trim();
return fallback;
}
int _int(dynamic value) {
if (value is num) return value.toInt();
if (value is String) return int.tryParse(value) ?? 0;
return 0;
}
double _double(dynamic value) {
if (value is num) return value.toDouble();
if (value is String) return double.tryParse(value) ?? 0;
return 0;
}