TIF_NGANJUK_E41212036/lib/domain/models/ticket_model.dart

159 lines
4.2 KiB
Dart

import 'package:cloud_firestore/cloud_firestore.dart';
class TicketModel {
final String id; // ID dokumen Firestore
final String from; // Contoh: "YIA - Yogyakarta"
final String to; // Contoh: "LOP - Lombok"
final DateTime leavingDate; // Tanggal berangkat
TicketModel({
required this.id,
required this.from,
required this.to,
required this.leavingDate,
});
factory TicketModel.fromDocument(DocumentSnapshot doc) {
final data = doc.data() as Map<String, dynamic>;
// print("TicketModel.fromDocument - Doc ID: ${doc.id}, data: $data");
return TicketModel(
id: doc.id,
from: data['from'] ?? '',
to: data['to'] ?? '',
leavingDate: (data['leavingDate'] as Timestamp).toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'from': from,
'to': to,
'leavingDate': Timestamp.fromDate(leavingDate),
};
}
}
class FlightModel {
final String id;
final String airLines;
final String flightClass;
final String code;
final String cityDeparture;
final String cityArrival;
final String codeDeparture;
final String codeArrival;
final DateTime departureTime;
final DateTime arrivalTime;
final String transitAirplane;
final String stop;
final int price;
final Map<String, SeatInfo> seat;
FlightModel({
required this.id,
required this.airLines,
required this.flightClass,
required this.code,
required this.cityDeparture,
required this.cityArrival,
required this.codeDeparture,
required this.codeArrival,
required this.departureTime,
required this.arrivalTime,
required this.transitAirplane,
required this.stop,
required this.price,
required this.seat,
});
factory FlightModel.fromDocument(DocumentSnapshot doc) {
final data = doc.data() as Map<String, dynamic>;
// Ambil field seat (Map) dari Firestore
final seatData = data['seat'] as Map<String, dynamic>? ?? {};
// Konversi setiap entry di seatData menjadi SeatInfo
final seatMap = seatData.map<String, SeatInfo>((key, value) {
return MapEntry(
key,
SeatInfo.fromMap(value as Map<String, dynamic>),
);
});
// print("FlightModel.fromDocument - Doc ID: ${doc.id}, data: $data");
return FlightModel(
id: doc.id,
airLines: data['airlines'] ?? '',
flightClass: data['seatClass'] ?? '',
code: data['code'] ?? '',
cityDeparture: data['cityDeparture'] ?? '',
cityArrival: data['cityArrival'] ?? '',
codeDeparture: data['codeDeparture'] ?? '',
codeArrival: data['codeArrival'] ?? '',
departureTime: (data['dateDeparture'] as Timestamp).toDate(),
arrivalTime: (data['dateArrival'] as Timestamp).toDate(),
transitAirplane: data['transitAirplane'] ?? '',
stop: data['stop'] ?? '',
price: data['price'] ?? 0,
seat: seatMap, // masukkan Map<String, SeatInfo>
);
}
Map<String, dynamic> toMap() {
return {
'airlines': airLines,
'seatClass': flightClass,
'code': code,
'cityDeparture': cityDeparture,
'cityArrival': cityArrival,
'codeDeparture': codeDeparture,
'codeArrival': codeArrival,
'dateDeparture': Timestamp.fromDate(departureTime),
'dateArrival': Timestamp.fromDate(arrivalTime),
'transitAirplane': transitAirplane,
'stop': stop,
'price': price,
// Konversi Map<String, SeatInfo> jadi Map<String, Map<String,dynamic>>
'seat': seat.map((key, value) => MapEntry(key, value.toMap())),
};
}
}
class SeatInfo {
final List<bool> isTaken;
final int totalSeat;
SeatInfo({
required this.isTaken,
required this.totalSeat,
});
factory SeatInfo.fromMap(Map<String, dynamic> map) {
final isTakenList = (map['isTaken'] as List<dynamic>? ?? []).map((item) => item as bool).toList();
return SeatInfo(
isTaken: isTakenList,
totalSeat: map['totalSeat'] ?? 0,
);
}
Map<String, dynamic> toMap() {
return {
'isTaken': isTaken,
'totalSeat': totalSeat,
};
}
}
class TicketFlightModel {
final TicketModel ticket;
final FlightModel flight;
TicketFlightModel({
required this.ticket,
required this.flight,
});
}