data copy.dart.bak 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539
  1. // ignore_for_file: non_constant_identifier_names
  2. import 'dart:async';
  3. import 'dart:convert';
  4. import 'dart:io';
  5. import 'package:collection/collection.dart';
  6. import 'package:flutter/foundation.dart';
  7. import 'package:flutter_riverpod/flutter_riverpod.dart';
  8. import 'package:jiffy/jiffy.dart';
  9. //import 'package:supabase_flutter/supabase_flutter.dart';
  10. import "package:tp5/core/utils.dart";
  11. import "package:tp5/csv/csv_data.dart";
  12. class CrewFilter {
  13. String? college;
  14. String? ac;
  15. String? tlc;
  16. String? fname;
  17. String? lname;
  18. String? searchname;
  19. CrewFilter({
  20. this.college,
  21. this.ac,
  22. this.tlc,
  23. this.fname,
  24. this.lname,
  25. this.searchname,
  26. });
  27. CrewFilter copyWith({
  28. ValueGetter<String?>? college,
  29. ValueGetter<String?>? ac,
  30. ValueGetter<String?>? tlc,
  31. ValueGetter<String?>? fname,
  32. ValueGetter<String?>? lname,
  33. ValueGetter<String?>? searchname,
  34. }) {
  35. return CrewFilter(
  36. college: college != null ? college() : this.college,
  37. ac: ac != null ? ac() : this.ac,
  38. tlc: tlc != null ? tlc() : this.tlc,
  39. fname: fname != null ? fname() : this.fname,
  40. lname: lname != null ? lname() : this.lname,
  41. searchname: searchname != null ? searchname() : this.searchname,
  42. );
  43. }
  44. Map<String, dynamic> toMap() {
  45. return {
  46. 'college': college,
  47. 'ac': ac,
  48. 'tlc': tlc,
  49. 'fname': fname,
  50. 'lname': lname,
  51. 'searchname': searchname,
  52. };
  53. }
  54. factory CrewFilter.fromMap(Map<String, dynamic> map) {
  55. return CrewFilter(
  56. college: map['college'],
  57. ac: map['ac'],
  58. tlc: map['tlc'],
  59. fname: map['fname'],
  60. lname: map['lname'],
  61. searchname: map['searchname'],
  62. );
  63. }
  64. String toJson() => json.encode(toMap());
  65. factory CrewFilter.fromJson(String source) =>
  66. CrewFilter.fromMap(json.decode(source));
  67. @override
  68. String toString() {
  69. return 'CrewFilter(college: $college, ac: $ac, tlc: $tlc, fname: $fname, lname: $lname, searchname: $searchname)';
  70. }
  71. @override
  72. bool operator ==(Object other) {
  73. if (identical(this, other)) return true;
  74. return other is CrewFilter &&
  75. other.college == college &&
  76. other.ac == ac &&
  77. other.tlc == tlc &&
  78. other.fname == fname &&
  79. other.lname == lname &&
  80. other.searchname == searchname;
  81. }
  82. @override
  83. int get hashCode {
  84. return college.hashCode ^
  85. ac.hashCode ^
  86. tlc.hashCode ^
  87. fname.hashCode ^
  88. lname.hashCode ^
  89. searchname.hashCode;
  90. }
  91. }
  92. class FlightFilter {
  93. String? al;
  94. String? fnum;
  95. String? date;
  96. String? dep;
  97. String? arr;
  98. Jiffy? jdep;
  99. Jiffy? jarr;
  100. String? tlc;
  101. String? reg;
  102. FlightFilter(
  103. {this.al,
  104. this.fnum,
  105. this.date,
  106. this.dep,
  107. this.arr,
  108. this.jdep,
  109. this.jarr,
  110. this.tlc,
  111. this.reg});
  112. @override
  113. bool operator ==(Object other) {
  114. if (identical(this, other)) return true;
  115. return other is FlightFilter &&
  116. other.al == al &&
  117. other.fnum == fnum &&
  118. other.date == date &&
  119. other.dep == dep &&
  120. other.arr == arr &&
  121. other.jdep == jdep &&
  122. other.jarr == jarr &&
  123. other.tlc == tlc &&
  124. other.reg == reg;
  125. }
  126. FlightFilter copyWith({
  127. ValueGetter<String?>? al,
  128. ValueGetter<String?>? fnum,
  129. ValueGetter<String?>? date,
  130. ValueGetter<String?>? dep,
  131. ValueGetter<String?>? arr,
  132. ValueGetter<Jiffy?>? jdep,
  133. ValueGetter<Jiffy?>? jarr,
  134. ValueGetter<String?>? tlc,
  135. ValueGetter<String?>? reg,
  136. }) {
  137. return FlightFilter(
  138. al: al != null ? al() : this.al,
  139. fnum: fnum != null ? fnum() : this.fnum,
  140. date: date != null ? date() : this.date,
  141. dep: dep != null ? dep() : this.dep,
  142. arr: arr != null ? arr() : this.arr,
  143. jdep: jdep != null ? jdep() : this.jdep,
  144. jarr: jarr != null ? jarr() : this.jarr,
  145. tlc: tlc != null ? tlc() : this.tlc,
  146. reg: reg != null ? reg() : this.reg,
  147. );
  148. }
  149. Map<String, dynamic> toMap() {
  150. return {
  151. 'al': al,
  152. 'fnum': fnum,
  153. 'date': date,
  154. 'dep': dep,
  155. 'arr': arr,
  156. 'jdep': jdep?.toString(),
  157. 'jarr': jarr?.toString(),
  158. 'tlc': tlc,
  159. 'reg': reg,
  160. };
  161. }
  162. factory FlightFilter.fromMap(Map<String, dynamic> map) {
  163. return FlightFilter(
  164. al: map['al'],
  165. fnum: map['fnum'],
  166. date: map['date'],
  167. dep: map['dep'],
  168. arr: map['arr'],
  169. jdep: map['jdep'] != null ? Jiffy.parse(map['jdep']) : null,
  170. jarr: map['jarr'] != null ? Jiffy.parse(map['jarr']) : null,
  171. tlc: map['tlc'],
  172. reg: map['reg'],
  173. );
  174. }
  175. String toJson() => json.encode(toMap());
  176. factory FlightFilter.fromJson(String source) =>
  177. FlightFilter.fromMap(json.decode(source));
  178. @override
  179. String toString() {
  180. return 'FlightFilter(al: $al, fnum: $fnum, date: $date, dep: $dep, arr: $arr, jdep: $jdep, jarr: $jarr, tlc: $tlc, reg: $reg)';
  181. }
  182. @override
  183. int get hashCode {
  184. return al.hashCode ^
  185. fnum.hashCode ^
  186. date.hashCode ^
  187. dep.hashCode ^
  188. arr.hashCode ^
  189. jdep.hashCode ^
  190. jarr.hashCode ^
  191. tlc.hashCode ^
  192. reg.hashCode;
  193. }
  194. }
  195. final pnlegByTlcProvider =
  196. Provider. /*autoDispose.*/ family<List<Pnleg>, String>((ref, tlc) => ref
  197. .watch(dataProvider)
  198. .pnleg
  199. .where((leg) => leg.tlc == tlc)
  200. .sortedBy((e) =>
  201. e.jdep?.dateTime ??
  202. Jiffy.parse(e.depdate ?? "01/01/2001",
  203. pattern: "dd/MM/yyyy", isUtc: true)
  204. .dateTime)
  205. .toList());
  206. final pnlegProvider = Provider.autoDispose.family<List<Pnleg>, FlightFilter>(
  207. (ref, flightFilter) => ref
  208. .watch(dataProvider)
  209. .pnleg
  210. .where((leg) =>
  211. (leg.al == (flightFilter.al ?? leg.al)) &&
  212. (leg.fnum == (flightFilter.fnum ?? leg.fnum)) &&
  213. // (leg.jdep?.yMd ==
  214. // (flightFilter.date ?? leg.jdep?.yMd)) && //format yyyy-MM-dd
  215. (leg.dep == (flightFilter.dep ?? leg.dep)) &&
  216. (leg.arr == (flightFilter.arr ?? leg.arr)) &&
  217. (flightFilter.jdep == null ||
  218. (leg.jdep != null &&
  219. flightFilter.jdep != null &&
  220. flightFilter.jdep!.isBetween(leg.jdep!.subtract(hours: 5),
  221. leg.jdep!.add(hours: 5)))) &&
  222. (flightFilter.jarr == null ||
  223. (leg.jarr != null &&
  224. flightFilter.jarr != null &&
  225. flightFilter.jarr!.isBetween(leg.jarr!.subtract(hours: 5),
  226. leg.jarr!.add(hours: 5)))) &&
  227. (leg.tlc == (flightFilter.tlc ?? leg.tlc)))
  228. .toList());
  229. /*
  230. final pnlegInterval = Provider((ref) {
  231. final pnleg = ref.watch(dataProvider).pnleg;
  232. return pnleg.where((leg) => leg.jdep != null && leg.jarr != null).toList();
  233. });
  234. final pnlegDates = Provider((ref) {
  235. final pnleg = ref.watch(dataProvider).pnleg;
  236. return pnleg.fold(
  237. <Jiffy?>{},
  238. (t, e) => [...t, e.jdep?.startOf(Unit.day)]
  239. .whereNotNull()
  240. .sortedBy((k) => k.millisecondsSinceEpoch.toString())
  241. .toSet());
  242. });
  243. final pnlegTlcs = Provider((ref) {
  244. final data = ref.watch(dataProvider);
  245. final pnleg = data.pnleg;
  246. final qualif = data.qualif;
  247. return pnleg.fold(<String?>{}, (t, e) => {...t, e.tlc}).sortedBy((k) =>
  248. qualif.firstWhereOrNull((q) => q.tlc == k)?.lname ?? "zzzzzzzzzzzzz");
  249. });
  250. */
  251. class PnlegMeta {
  252. PnlegMeta({required this.tlcs, required this.dates});
  253. final List<String> tlcs;
  254. final List<Jiffy> dates;
  255. }
  256. final pnlegMeta = Provider((ref) {
  257. print("data: start analyzing pnleg");
  258. final now = Jiffy.now();
  259. final pnlegs = ref.watch(dataProvider).pnleg;
  260. final qualif = ref.watch(dataProvider).qualif;
  261. Set<String> tlcs = {};
  262. Set<Jiffy> dates = {};
  263. for (Pnleg pnleg in pnlegs) {
  264. tlcs.add(pnleg.tlc ?? "");
  265. dates.add(pnleg.jdep?.startOf(Unit.day) ??
  266. Jiffy.parse(pnleg.date ?? "01/01/1970",
  267. pattern: "dd/MM/yyyy", isUtc: true));
  268. }
  269. final restlcs = tlcs.sortedBy((k) =>
  270. qualif.firstWhereOrNull((q) => q.tlc == k)?.lname ?? "zzzzzzzzzzzzz");
  271. final resdates = dates.sortedBy((k) => k.millisecondsSinceEpoch.toString());
  272. print(
  273. "data: end analyzing pnleg ${Duration(milliseconds: Jiffy.now().millisecondsSinceEpoch - now.millisecondsSinceEpoch).inSeconds} sec");
  274. return PnlegMeta(tlcs: restlcs, dates: resdates);
  275. });
  276. final aclegProvider = Provider.autoDispose.family<List<Acleg>, FlightFilter>(
  277. (ref, flightFilter) => ref
  278. .watch(dataProvider)
  279. .acleg
  280. .where((leg) =>
  281. (leg.FN_CARRIER == (flightFilter.al ?? leg.FN_CARRIER)) &&
  282. (leg.FN_NUMBER == (flightFilter.fnum ?? leg.FN_NUMBER)) &&
  283. // (leg.jdep?.yMd ==
  284. // (flightFilter.date ?? leg.jdep?.yMd)) && //format yyyy-MM-dd
  285. (leg.DEP_AP_ACTUAL == (flightFilter.dep ?? leg.DEP_AP_ACTUAL)) &&
  286. (leg.DEP_AP_SCHED == (flightFilter.dep ?? leg.DEP_AP_SCHED)) &&
  287. (leg.ARR_AP_ACTUAL == (flightFilter.arr ?? leg.ARR_AP_ACTUAL)) &&
  288. (leg.ARR_AP_SCHED == (flightFilter.arr ?? leg.ARR_AP_SCHED)) &&
  289. (flightFilter.jdep == null ||
  290. (leg.jdep != null &&
  291. flightFilter.jdep != null &&
  292. flightFilter.jdep!.isBetween(leg.jdep!.subtract(hours: 5),
  293. leg.jdep!.add(hours: 5)))) &&
  294. (flightFilter.jarr == null ||
  295. (leg.jarr != null &&
  296. flightFilter.jarr != null &&
  297. flightFilter.jarr!.isBetween(leg.jarr!.subtract(hours: 5),
  298. leg.jarr!.add(hours: 5)))) &&
  299. (leg.AC_REGISTRATION == (flightFilter.reg ?? leg.AC_REGISTRATION)))
  300. .toList());
  301. final qualifProvider = Provider.family<List<Qualif>, CrewFilter>(
  302. (ref, crewFilter) => ref
  303. .watch(dataProvider)
  304. .qualif
  305. .where((x) => (((crewFilter.tlc ?? x.tlc) == x.tlc &&
  306. (crewFilter.college ?? x.college) == x.college &&
  307. (crewFilter.ac ?? x.ac) == x.ac &&
  308. (crewFilter.lname ?? x.lname ?? "").capitalize() ==
  309. (x.lname ?? "").capitalize() &&
  310. (crewFilter.fname ?? x.fname ?? "").capitalize() ==
  311. (x.fname ?? "").capitalize() &&
  312. //search like
  313. (crewFilter.searchname == null ||
  314. (x.fname ?? "")
  315. .capitalize()
  316. .contains(crewFilter.searchname!.capitalize())) &&
  317. (crewFilter.searchname == null ||
  318. (x.lname ?? "")
  319. .capitalize()
  320. .contains(crewFilter.searchname!.capitalize())))))
  321. .toList());
  322. final dataProvider = StateNotifierProvider<DataNotifier, DataState>((ref) {
  323. return DataNotifier();
  324. });
  325. class DataState {
  326. List<Qualif> qualif;
  327. List<Pnleg> pnleg;
  328. List<Acleg> acleg;
  329. Jiffy? qualifupdate;
  330. Jiffy? pnlegupdate;
  331. Jiffy? aclegupdate;
  332. DataState({
  333. this.qualif = const [],
  334. this.pnleg = const [],
  335. this.acleg = const [],
  336. this.qualifupdate,
  337. this.pnlegupdate,
  338. this.aclegupdate,
  339. });
  340. DataState copyWith({
  341. List<Qualif>? qualif,
  342. List<Pnleg>? pnleg,
  343. List<Acleg>? acleg,
  344. Jiffy? qualifupdate,
  345. Jiffy? pnlegupdate,
  346. Jiffy? aclegupdate,
  347. }) {
  348. return DataState(
  349. qualif: qualif ?? this.qualif,
  350. pnleg: pnleg ?? this.pnleg,
  351. acleg: acleg ?? this.acleg,
  352. qualifupdate: qualifupdate ?? this.qualifupdate,
  353. pnlegupdate: pnlegupdate ?? this.pnlegupdate,
  354. aclegupdate: aclegupdate ?? this.aclegupdate,
  355. );
  356. }
  357. @override
  358. String toString() {
  359. return 'DataState(qualif: $qualif, pnleg: $pnleg, acleg: $acleg, qualifupdate: $qualifupdate, pnlegupdate: $pnlegupdate, aclegupdate: $aclegupdate)';
  360. }
  361. @override
  362. bool operator ==(Object other) {
  363. if (identical(this, other)) return true;
  364. return other is DataState &&
  365. listEquals(other.qualif, qualif) &&
  366. listEquals(other.pnleg, pnleg) &&
  367. listEquals(other.acleg, acleg) &&
  368. other.qualifupdate == qualifupdate &&
  369. other.pnlegupdate == pnlegupdate &&
  370. other.aclegupdate == aclegupdate;
  371. }
  372. @override
  373. int get hashCode {
  374. return qualif.hashCode ^
  375. pnleg.hashCode ^
  376. acleg.hashCode ^
  377. qualifupdate.hashCode ^
  378. pnlegupdate.hashCode ^
  379. aclegupdate.hashCode;
  380. }
  381. }
  382. class DataNotifier extends StateNotifier<DataState> {
  383. DataNotifier() : super(DataState()) {
  384. loadAll();
  385. _timer = Timer.periodic(const Duration(seconds: 10), (timer) async {
  386. //update file and load
  387. // final response = await Supabase.instance.client.storage.from('your_bucket_name').;
  388. print("data: timer tick, check csv files");
  389. // print(acleg.where((x) => x.pad_booked != null).map((x) => x.pad_booked));
  390. await loadAll();
  391. });
  392. }
  393. @override
  394. void dispose() {
  395. _timer.cancel();
  396. super.dispose();
  397. }
  398. loadAll() async {
  399. if (pnlegmoistime != pnlegmoisupdate) await loadPnlegsmois();
  400. if (aclegtime != aclegupdate) await loadAclegs();
  401. if (pnleg3time != pnleg3update) await loadPnlegs3();
  402. if (qualiftime != qualifupdate) await loadQualif();
  403. }
  404. late Timer _timer;
  405. Jiffy? qualifupdate;
  406. String get qualiffile => PathTo().csvFile("exportlicence.txt");
  407. Jiffy? get qualiftime => File(qualiffile).existsSync()
  408. ? Jiffy.parseFromDateTime(
  409. File(PathTo().csvFile("exportlicence.txt")).lastModifiedSync())
  410. : null;
  411. List<Qualif> qualif = [];
  412. loadQualif() async {
  413. print("data: qualif update ${qualiftime?.dateTime}");
  414. final txt = await File(qualiffile).readAsString();
  415. qualif = CsvData.csv2list(txt).map((e) => Qualif.fromList(e)).toList();
  416. qualifupdate = qualiftime;
  417. state = state.copyWith(qualifupdate: qualifupdate, qualif: qualif);
  418. }
  419. Jiffy? aclegupdate;
  420. String get aclegfile => PathTo().csvFile("secondprgtype.zip");
  421. Jiffy? get aclegtime => File(aclegfile).existsSync()
  422. ? Jiffy.parseFromDateTime(
  423. File(PathTo().csvFile("secondprgtype.zip")).lastModifiedSync())
  424. : null;
  425. List<Acleg> acleg = [];
  426. loadAclegs() async {
  427. print("data: acleg update ${aclegtime?.dateTime}");
  428. final txt =
  429. await CsvData.extractTextFileFromZip(aclegfile, "secondprgtype.txt");
  430. acleg = CsvData.csv2list(txt)
  431. .map((e) => Acleg.fromList(e))
  432. .where((leg) =>
  433. //only flights of Tunisair
  434. (leg.EMPLOYER_CABIN == "TU" ||
  435. leg.EMPLOYER_COCKPIT == "TU" ||
  436. leg.AC_OWNER == "TU"))
  437. .sortedBy((e) => e.jdep!.dateTime)
  438. .toList();
  439. aclegupdate = aclegtime;
  440. state = state.copyWith(aclegupdate: aclegupdate, acleg: acleg);
  441. //print(acleg);
  442. }
  443. List<Pnleg> get pnleg {
  444. if (pnlegmoistime != null &&
  445. pnleg3time != null &&
  446. pnlegmoistime!.isSameOrBefore(pnleg3time!)) {
  447. return pnlegmois;
  448. } else if (pnlegmoistime != null &&
  449. pnleg3time != null &&
  450. pnlegmoistime!.isAfter(pnleg3time!)) {
  451. final dates3tlc3 = pnleg3.fold(
  452. [],
  453. (p, e) => p.contains([e.date, e.tlc]) ? p : p
  454. ..add([e.date, e.tlc]));
  455. return pnlegmois
  456. .where((x) => !dates3tlc3.contains([x.date, x.tlc]))
  457. .toList()
  458. ..addAll(pnleg3); //pnleg3 dabord
  459. } else if (pnlegmoistime == null && pnleg3time != null) {
  460. return pnleg3;
  461. } else if (pnlegmoistime != null && pnleg3time == null) {
  462. return pnlegmois;
  463. } else {
  464. return <Pnleg>[];
  465. }
  466. }
  467. Jiffy? pnlegmoisupdate;
  468. String get pnlegmoisfile => PathTo().csvFile("ExportPGRGPNmois.zip");
  469. Jiffy? get pnlegmoistime => File(pnlegmoisfile).existsSync()
  470. ? Jiffy.parseFromDateTime(
  471. File(PathTo().csvFile("ExportPGRGPNmois.zip")).lastModifiedSync())
  472. : null;
  473. List<Pnleg> pnlegmois = [];
  474. loadPnlegsmois() async {
  475. print("data: pnlegmois update ${pnlegmoistime?.dateTime}");
  476. final txt = await CsvData.extractTextFileFromZip(
  477. pnlegmoisfile, "ExportPGRGPNmois.txt");
  478. pnlegmois = CsvData.csv2list(txt).map((e) => Pnleg.fromList(e)).toList();
  479. pnlegmoisupdate = pnlegmoistime;
  480. state = state.copyWith(pnlegupdate: pnlegmoisupdate, pnleg: pnleg);
  481. //print(pnlegmois);
  482. }
  483. Jiffy? pnleg3update;
  484. String get pnleg3file => PathTo().csvFile("exportPGRGPN.zip");
  485. Jiffy? get pnleg3time => File(pnleg3file).existsSync()
  486. ? Jiffy.parseFromDateTime(
  487. File(PathTo().csvFile("ExportPGRGPNmois.zip")).lastModifiedSync())
  488. : null;
  489. List<Pnleg> pnleg3 = [];
  490. loadPnlegs3() async {
  491. print("data: pnleg3 update ${pnleg3time?.dateTime}");
  492. final txt =
  493. await CsvData.extractTextFileFromZip(pnleg3file, "exportPGRGPN.txt");
  494. pnleg3 = CsvData.csv2list(txt).map((e) => Pnleg.fromList(e)).toList();
  495. pnleg3update = pnleg3time;
  496. state = state.copyWith(pnlegupdate: pnleg3update, pnleg: pnleg);
  497. //print(pnleg3);
  498. }
  499. }
  500. class Qualif {
  501. String? tlc;
  502. String? lname;
  503. String? mname;
  504. String? fname;
  505. String? date;
  506. String? ac;
  507. String? college;
  508. String? base;
  509. Qualif({
  510. this.tlc,
  511. this.lname,
  512. this.mname,
  513. this.fname,
  514. this.date,
  515. this.ac,
  516. this.college,
  517. this.base,
  518. });
  519. Qualif copyWith({
  520. String? tlc,
  521. String? lname,
  522. String? mname,
  523. String? fname,
  524. String? date,
  525. String? ac,
  526. String? college,
  527. String? base,
  528. }) {
  529. return Qualif(
  530. tlc: tlc ?? this.tlc,
  531. lname: lname ?? this.lname,
  532. mname: mname ?? this.mname,
  533. fname: fname ?? this.fname,
  534. date: date ?? this.date,
  535. ac: ac ?? this.ac,
  536. college: college ?? this.college,
  537. base: base ?? this.base,
  538. );
  539. }
  540. Map<String, dynamic> toMap() {
  541. return <String, dynamic>{
  542. 'tlc': tlc,
  543. 'lname': lname,
  544. 'mname': mname,
  545. 'fname': fname,
  546. 'date': date,
  547. 'ac': ac,
  548. 'college': college,
  549. 'base': base,
  550. };
  551. }
  552. factory Qualif.fromList(List datalist) {
  553. return Qualif(
  554. tlc: datalist[0],
  555. lname: datalist[1],
  556. mname: datalist[2],
  557. fname: datalist[3],
  558. date: datalist[4],
  559. ac: datalist[5],
  560. college: datalist[6],
  561. base: datalist[7]);
  562. }
  563. factory Qualif.fromMap(Map<String, dynamic> map) {
  564. return Qualif(
  565. tlc: map['tlc'] != null ? map['tlc'] as String : null,
  566. lname: map['lname'] != null ? map['lname'] as String : null,
  567. mname: map['mname'] != null ? map['mname'] as String : null,
  568. fname: map['fname'] != null ? map['fname'] as String : null,
  569. date: map['date'] != null ? map['date'] as String : null,
  570. ac: map['ac'] != null ? map['ac'] as String : null,
  571. college: map['college'] != null ? map['college'] as String : null,
  572. base: map['base'] != null ? map['base'] as String : null,
  573. );
  574. }
  575. String toJson() => json.encode(toMap());
  576. factory Qualif.fromJson(String source) =>
  577. Qualif.fromMap(json.decode(source) as Map<String, dynamic>);
  578. @override
  579. String toString() {
  580. return 'Qualif(tlc: $tlc, lname: $lname, mname: $mname, fname: $fname, date: $date, ac: $ac, college: $college, base: $base)';
  581. }
  582. @override
  583. bool operator ==(covariant Qualif other) {
  584. if (identical(this, other)) return true;
  585. return other.tlc == tlc &&
  586. other.lname == lname &&
  587. other.mname == mname &&
  588. other.fname == fname &&
  589. other.date == date &&
  590. other.ac == ac &&
  591. other.college == college &&
  592. other.base == base;
  593. }
  594. @override
  595. int get hashCode {
  596. return tlc.hashCode ^
  597. lname.hashCode ^
  598. mname.hashCode ^
  599. fname.hashCode ^
  600. date.hashCode ^
  601. ac.hashCode ^
  602. college.hashCode ^
  603. base.hashCode;
  604. }
  605. }
  606. class Pnleg {
  607. String? date;
  608. Jiffy? get jdate => date != null
  609. ? Jiffy.parse(date ?? "01/01/1970", pattern: "dd/MM/yyyy", isUtc: true)
  610. : null;
  611. String? tlc;
  612. String? actype;
  613. String? al;
  614. String? fnum;
  615. String? depdate;
  616. String? deptime;
  617. String? arrdate;
  618. String? arrtime;
  619. String? dep;
  620. String? arr;
  621. String? label;
  622. String? type;
  623. Jiffy? get jdep =>
  624. deptime != null ? "$depdate $deptime".parseddmmyyyyhhmm() : null;
  625. Jiffy? get jarr =>
  626. arrtime != null ? "$arrdate $arrtime".parseddmmyyyyhhmm() : null;
  627. Pnleg({
  628. this.date,
  629. this.tlc,
  630. this.actype,
  631. this.al,
  632. this.fnum,
  633. this.depdate,
  634. this.deptime,
  635. this.arrdate,
  636. this.arrtime,
  637. this.dep,
  638. this.arr,
  639. this.label,
  640. this.type,
  641. });
  642. Pnleg copyWith({
  643. String? date,
  644. String? tlc,
  645. String? actype,
  646. String? al,
  647. String? fnum,
  648. String? depdate,
  649. String? deptime,
  650. String? arrdate,
  651. String? arrtime,
  652. String? dep,
  653. String? arr,
  654. String? label,
  655. String? type,
  656. }) {
  657. return Pnleg(
  658. date: date ?? this.date,
  659. tlc: tlc ?? this.tlc,
  660. actype: actype ?? this.actype,
  661. al: al ?? this.al,
  662. fnum: fnum ?? this.fnum,
  663. depdate: depdate ?? this.depdate,
  664. deptime: deptime ?? this.deptime,
  665. arrdate: arrdate ?? this.arrdate,
  666. arrtime: arrtime ?? this.arrtime,
  667. dep: dep ?? this.dep,
  668. arr: arr ?? this.arr,
  669. label: label ?? this.label,
  670. type: type ?? this.type,
  671. );
  672. }
  673. Map<String, dynamic> toMap() {
  674. return <String, dynamic>{
  675. 'date': date,
  676. 'tlc': tlc,
  677. 'actype': actype,
  678. 'al': al,
  679. 'fnum': fnum,
  680. 'depdate': depdate,
  681. 'deptime': deptime,
  682. 'arrdate': arrdate,
  683. 'arrtime': arrtime,
  684. 'dep': dep,
  685. 'arr': arr,
  686. 'label': label,
  687. 'type': type,
  688. };
  689. }
  690. factory Pnleg.fromList(List datalist) {
  691. return Pnleg(
  692. date: datalist[0],
  693. tlc: datalist[1],
  694. actype: datalist[2],
  695. al: datalist[3],
  696. fnum: datalist[4],
  697. depdate: datalist[5],
  698. deptime: datalist[6],
  699. arrdate: datalist[7],
  700. arrtime: datalist[8],
  701. dep: datalist[9],
  702. arr: datalist[10],
  703. label: datalist[11],
  704. type: datalist[12]);
  705. }
  706. factory Pnleg.fromMap(Map<String, dynamic> map) {
  707. return Pnleg(
  708. date: map['date'] != null ? map['date'] as String : null,
  709. tlc: map['tlc'] != null ? map['tlc'] as String : null,
  710. actype: map['actype'] != null ? map['actype'] as String : null,
  711. al: map['al'] != null ? map['al'] as String : null,
  712. fnum: map['fnum'] != null ? map['fnum'] as String : null,
  713. depdate: map['depdate'] != null ? map['depdate'] as String : null,
  714. deptime: map['deptime'] != null ? map['deptime'] as String : null,
  715. arrdate: map['arrdate'] != null ? map['arrdate'] as String : null,
  716. arrtime: map['arrtime'] != null ? map['arrtime'] as String : null,
  717. dep: map['dep'] != null ? map['dep'] as String : null,
  718. arr: map['arr'] != null ? map['arr'] as String : null,
  719. label: map['label'] != null ? map['label'] as String : null,
  720. type: map['type'] != null ? map['type'] as String : null,
  721. );
  722. }
  723. String toJson() => json.encode(toMap());
  724. factory Pnleg.fromJson(String source) =>
  725. Pnleg.fromMap(json.decode(source) as Map<String, dynamic>);
  726. @override
  727. String toString() {
  728. return 'Pnleg(date: $date, tlc: $tlc, actype: $actype, al: $al, fnum: $fnum, depdate: $depdate, deptime: $deptime, arrdate: $arrdate, arrtime: $arrtime, dep: $dep, arr: $arr, label: $label, type: $type)';
  729. }
  730. @override
  731. bool operator ==(covariant Pnleg other) {
  732. if (identical(this, other)) return true;
  733. return other.date == date &&
  734. other.tlc == tlc &&
  735. other.actype == actype &&
  736. other.al == al &&
  737. other.fnum == fnum &&
  738. other.depdate == depdate &&
  739. other.deptime == deptime &&
  740. other.arrdate == arrdate &&
  741. other.arrtime == arrtime &&
  742. other.dep == dep &&
  743. other.arr == arr &&
  744. other.label == label &&
  745. other.type == type;
  746. }
  747. @override
  748. int get hashCode {
  749. return date.hashCode ^
  750. tlc.hashCode ^
  751. actype.hashCode ^
  752. al.hashCode ^
  753. fnum.hashCode ^
  754. depdate.hashCode ^
  755. deptime.hashCode ^
  756. arrdate.hashCode ^
  757. arrtime.hashCode ^
  758. dep.hashCode ^
  759. arr.hashCode ^
  760. label.hashCode ^
  761. type.hashCode;
  762. }
  763. }
  764. //enum flt_status { sched, delayed, taxiout, enroute, landed, arrived }
  765. class Acleg {
  766. String? LEG_NO;
  767. String? FN_CARRIER;
  768. String? FN_NUMBER;
  769. String? FN_SUFFIX;
  770. String? DAY_OF_ORIGIN;
  771. String? AC_OWNER;
  772. String? AC_SUBTYPE;
  773. String? AC_VERSION;
  774. String? AC_REGISTRATION;
  775. String? DEP_AP_ACTUAL;
  776. String? DEP_AP_SCHED;
  777. String? DEP_DT_EST;
  778. Jiffy? get jdepest =>
  779. (DEP_DT_EST == null) ? null : DEP_DT_EST!.parseyyyymmddhhmm();
  780. String? DEP_SCHED_DT;
  781. Jiffy? get jdepsched =>
  782. (DEP_SCHED_DT == null) ? null : DEP_SCHED_DT!.parseyyyymmddhhmm();
  783. String? ARR_AP_ACTUAL;
  784. String? ARR_AP_SCHED;
  785. String? ARR_DT_EST;
  786. Jiffy? get jarrest =>
  787. (ARR_DT_EST == null) ? null : ARR_DT_EST!.parseyyyymmddhhmm();
  788. String? ARR_SCHED_DT;
  789. Jiffy? get jarrsched =>
  790. (ARR_SCHED_DT == null) ? null : ARR_SCHED_DT!.parseyyyymmddhhmm();
  791. String? SLOT_TIME_ACTUAL;
  792. Jiffy? get slot =>
  793. (SLOT_TIME_ACTUAL == null) ? null : SLOT_TIME_ACTUAL!.parseyyyymmddhhmm();
  794. String? LEG_TYPE;
  795. String? STATUS;
  796. String? EMPLOYER_COCKPIT;
  797. String? EMPLOYER_CABIN;
  798. String? CYCLES;
  799. String? DELAY_CODE_01;
  800. String? DELAY_CODE_02;
  801. String? DELAY_CODE_03;
  802. String? DELAY_CODE_04;
  803. String? DELAY_TIME_01;
  804. String? DELAY_TIME_02;
  805. String? DELAY_TIME_03;
  806. String? DELAY_TIME_04;
  807. String? SUBDELAY_CODE_01;
  808. String? SUBDELAY_CODE_02;
  809. String? SUBDELAY_CODE_03;
  810. String? SUBDELAY_CODE_04;
  811. List<String> get delaycode => [
  812. DELAY_CODE_01,
  813. DELAY_CODE_02,
  814. DELAY_CODE_03,
  815. DELAY_CODE_04
  816. ].whereNotNull().toList();
  817. List<String> get delaysubcode => [
  818. SUBDELAY_CODE_01,
  819. SUBDELAY_CODE_02,
  820. SUBDELAY_CODE_03,
  821. SUBDELAY_CODE_04
  822. ].whereNotNull().toList();
  823. List<Duration?> get delaytime => [
  824. DELAY_TIME_01 == null
  825. ? null
  826. : Duration(minutes: int.parse(DELAY_TIME_01!)),
  827. DELAY_TIME_02 == null
  828. ? null
  829. : Duration(minutes: int.parse(DELAY_TIME_02!)),
  830. DELAY_TIME_03 == null
  831. ? null
  832. : Duration(minutes: int.parse(DELAY_TIME_03!)),
  833. DELAY_TIME_04 == null
  834. ? null
  835. : Duration(minutes: int.parse(DELAY_TIME_04!))
  836. ].whereNotNull().toList();
  837. String? PAX_BOOKED_C;
  838. String? PAX_BOOKED_Y;
  839. String? get pax_booked => (PAX_BOOKED_C != null || PAX_BOOKED_Y != null)
  840. ? "C${PAX_BOOKED_C ?? 0}/Y${PAX_BOOKED_Y ?? 0}"
  841. : null;
  842. String? PAX_BOOKED_TRS_C;
  843. String? PAX_BOOKED_TRS_Y;
  844. String? get pax_trs => (PAX_BOOKED_TRS_C != null || PAX_BOOKED_TRS_Y != null)
  845. ? "C${PAX_BOOKED_TRS_C ?? 0}/Y${PAX_BOOKED_TRS_Y ?? 0}"
  846. : null;
  847. String? PAD_BOOKED_C;
  848. String? PAD_BOOKED_Y;
  849. String? get pad_booked => (PAD_BOOKED_C != null || PAD_BOOKED_Y != null)
  850. ? "C${PAD_BOOKED_C ?? 0}/Y${PAD_BOOKED_Y ?? 0}"
  851. : null;
  852. String? OFFBLOCK_DT_A;
  853. String? AIRBORNE_DT_A;
  854. String? LANDING_DT_A;
  855. String? ONBLOCK_DT_A;
  856. List<Jiffy?> get blocks_a => [
  857. (OFFBLOCK_DT_A ?? "").parseyyyymmddhhmm(),
  858. (AIRBORNE_DT_A ?? "").parseyyyymmddhhmm(),
  859. (LANDING_DT_A ?? "").parseyyyymmddhhmm(),
  860. (ONBLOCK_DT_A ?? "").parseyyyymmddhhmm()
  861. ];
  862. String get flt_status {
  863. if (blocks[3] != null) {
  864. return "Arrived";
  865. } else if (blocks[2] != null) {
  866. return "Landed";
  867. } else if (blocks[1] != null) {
  868. return "Inflight";
  869. } else if (blocks[0] != null) {
  870. return "Taxiout";
  871. } else if (jdepest != null &&
  872. jarrsched != null &&
  873. jdepest!.isAfter(jdepsched!)) {
  874. return "Delayed";
  875. } else {
  876. return "Sched";
  877. }
  878. }
  879. String? OFFBLOCK_DT_F;
  880. String? AIRBORNE_DT_F;
  881. String? LANDING_DT_F;
  882. String? ONBLOCK_DT_F;
  883. List<Jiffy?> get blocks_f => [
  884. (OFFBLOCK_DT_F ?? "").parseyyyymmddhhmm(),
  885. (AIRBORNE_DT_F ?? "").parseyyyymmddhhmm(),
  886. (LANDING_DT_F ?? "").parseyyyymmddhhmm(),
  887. (ONBLOCK_DT_F ?? "").parseyyyymmddhhmm()
  888. ];
  889. String? OFFBLOCK_DT_M;
  890. String? AIRBORNE_DT_M;
  891. String? LANDING_DT_M;
  892. String? ONBLOCK_DT_M;
  893. List<Jiffy?> get blocks_m => [
  894. (OFFBLOCK_DT_M ?? "").parseyyyymmddhhmm(),
  895. (AIRBORNE_DT_M ?? "").parseyyyymmddhhmm(),
  896. (LANDING_DT_M ?? "").parseyyyymmddhhmm(),
  897. (ONBLOCK_DT_M ?? "").parseyyyymmddhhmm()
  898. ];
  899. List<Jiffy?> get blocks => [
  900. blocks_m[0] ?? blocks_a[0] ?? blocks_f[0],
  901. blocks_m[1] ?? blocks_a[1] ?? blocks_f[1],
  902. blocks_m[2] ?? blocks_a[2] ?? blocks_f[2],
  903. blocks_m[3] ?? blocks_a[3] ?? blocks_f[3]
  904. ];
  905. Jiffy? get jdep => blocks[0] ?? jdepest ?? jdepsched;
  906. Jiffy? get jarr =>
  907. blocks[3] ??
  908. blocks[2]?.add(minutes: 5) ??
  909. (eet == null ? null : blocks[1]?.addDuration(eet!).add(minutes: 8)) ??
  910. (eet == null
  911. ? null
  912. : blocks[0]?.add(minutes: 5).addDuration(eet!).add(minutes: 8)) ??
  913. (eet == null
  914. ? null
  915. : jdep?.addDuration(eet!).add(minutes: 8).add(minutes: 5)) ??
  916. jarrest ??
  917. jarrsched;
  918. String? EET;
  919. Duration? get eet => EET == null ? null : Duration(minutes: int.parse(EET!));
  920. Acleg({
  921. this.LEG_NO,
  922. this.FN_CARRIER,
  923. this.FN_NUMBER,
  924. this.FN_SUFFIX,
  925. this.DAY_OF_ORIGIN,
  926. this.AC_OWNER,
  927. this.AC_SUBTYPE,
  928. this.AC_VERSION,
  929. this.AC_REGISTRATION,
  930. this.DEP_AP_ACTUAL,
  931. this.DEP_AP_SCHED,
  932. this.DEP_DT_EST,
  933. this.DEP_SCHED_DT,
  934. this.ARR_AP_ACTUAL,
  935. this.ARR_AP_SCHED,
  936. this.ARR_DT_EST,
  937. this.ARR_SCHED_DT,
  938. this.SLOT_TIME_ACTUAL,
  939. this.LEG_TYPE,
  940. this.STATUS,
  941. this.EMPLOYER_COCKPIT,
  942. this.EMPLOYER_CABIN,
  943. this.CYCLES,
  944. this.DELAY_CODE_01,
  945. this.DELAY_CODE_02,
  946. this.DELAY_CODE_03,
  947. this.DELAY_CODE_04,
  948. this.DELAY_TIME_01,
  949. this.DELAY_TIME_02,
  950. this.DELAY_TIME_03,
  951. this.DELAY_TIME_04,
  952. this.SUBDELAY_CODE_01,
  953. this.SUBDELAY_CODE_02,
  954. this.SUBDELAY_CODE_03,
  955. this.SUBDELAY_CODE_04,
  956. this.PAX_BOOKED_C,
  957. this.PAX_BOOKED_Y,
  958. this.PAX_BOOKED_TRS_C,
  959. this.PAX_BOOKED_TRS_Y,
  960. this.PAD_BOOKED_C,
  961. this.PAD_BOOKED_Y,
  962. this.OFFBLOCK_DT_A,
  963. this.AIRBORNE_DT_A,
  964. this.LANDING_DT_A,
  965. this.ONBLOCK_DT_A,
  966. this.OFFBLOCK_DT_F,
  967. this.AIRBORNE_DT_F,
  968. this.LANDING_DT_F,
  969. this.ONBLOCK_DT_F,
  970. this.OFFBLOCK_DT_M,
  971. this.AIRBORNE_DT_M,
  972. this.LANDING_DT_M,
  973. this.ONBLOCK_DT_M,
  974. this.EET,
  975. });
  976. Acleg copyWith({
  977. String? LEG_NO,
  978. String? FN_CARRIER,
  979. String? FN_NUMBER,
  980. String? FN_SUFFIX,
  981. String? DAY_OF_ORIGIN,
  982. String? AC_OWNER,
  983. String? AC_SUBTYPE,
  984. String? AC_VERSION,
  985. String? AC_REGISTRATION,
  986. String? DEP_AP_ACTUAL,
  987. String? DEP_AP_SCHED,
  988. String? DEP_DT_EST,
  989. String? DEP_SCHED_DT,
  990. String? ARR_AP_ACTUAL,
  991. String? ARR_AP_SCHED,
  992. String? ARR_DT_EST,
  993. String? ARR_SCHED_DT,
  994. String? SLOT_TIME_ACTUAL,
  995. String? LEG_TYPE,
  996. String? STATUS,
  997. String? EMPLOYER_COCKPIT,
  998. String? EMPLOYER_CABIN,
  999. String? CYCLES,
  1000. String? DELAY_CODE_01,
  1001. String? DELAY_CODE_02,
  1002. String? DELAY_CODE_03,
  1003. String? DELAY_CODE_04,
  1004. String? DELAY_TIME_01,
  1005. String? DELAY_TIME_02,
  1006. String? DELAY_TIME_03,
  1007. String? DELAY_TIME_04,
  1008. String? SUBDELAY_CODE_01,
  1009. String? SUBDELAY_CODE_02,
  1010. String? SUBDELAY_CODE_03,
  1011. String? SUBDELAY_CODE_04,
  1012. String? PAX_BOOKED_C,
  1013. String? PAX_BOOKED_Y,
  1014. String? PAX_BOOKED_TRS_C,
  1015. String? PAX_BOOKED_TRS_Y,
  1016. String? PAD_BOOKED_C,
  1017. String? PAD_BOOKED_Y,
  1018. String? OFFBLOCK_DT_A,
  1019. String? AIRBORNE_DT_A,
  1020. String? LANDING_DT_A,
  1021. String? ONBLOCK_DT_A,
  1022. String? OFFBLOCK_DT_F,
  1023. String? AIRBORNE_DT_F,
  1024. String? LANDING_DT_F,
  1025. String? ONBLOCK_DT_F,
  1026. String? OFFBLOCK_DT_M,
  1027. String? AIRBORNE_DT_M,
  1028. String? LANDING_DT_M,
  1029. String? ONBLOCK_DT_M,
  1030. String? EET,
  1031. }) {
  1032. return Acleg(
  1033. LEG_NO: LEG_NO ?? this.LEG_NO,
  1034. FN_CARRIER: FN_CARRIER ?? this.FN_CARRIER,
  1035. FN_NUMBER: FN_NUMBER ?? this.FN_NUMBER,
  1036. FN_SUFFIX: FN_SUFFIX ?? this.FN_SUFFIX,
  1037. DAY_OF_ORIGIN: DAY_OF_ORIGIN ?? this.DAY_OF_ORIGIN,
  1038. AC_OWNER: AC_OWNER ?? this.AC_OWNER,
  1039. AC_SUBTYPE: AC_SUBTYPE ?? this.AC_SUBTYPE,
  1040. AC_VERSION: AC_VERSION ?? this.AC_VERSION,
  1041. AC_REGISTRATION: AC_REGISTRATION ?? this.AC_REGISTRATION,
  1042. DEP_AP_ACTUAL: DEP_AP_ACTUAL ?? this.DEP_AP_ACTUAL,
  1043. DEP_AP_SCHED: DEP_AP_SCHED ?? this.DEP_AP_SCHED,
  1044. DEP_DT_EST: DEP_DT_EST ?? this.DEP_DT_EST,
  1045. DEP_SCHED_DT: DEP_SCHED_DT ?? this.DEP_SCHED_DT,
  1046. ARR_AP_ACTUAL: ARR_AP_ACTUAL ?? this.ARR_AP_ACTUAL,
  1047. ARR_AP_SCHED: ARR_AP_SCHED ?? this.ARR_AP_SCHED,
  1048. ARR_DT_EST: ARR_DT_EST ?? this.ARR_DT_EST,
  1049. ARR_SCHED_DT: ARR_SCHED_DT ?? this.ARR_SCHED_DT,
  1050. SLOT_TIME_ACTUAL: SLOT_TIME_ACTUAL ?? this.SLOT_TIME_ACTUAL,
  1051. LEG_TYPE: LEG_TYPE ?? this.LEG_TYPE,
  1052. STATUS: STATUS ?? this.STATUS,
  1053. EMPLOYER_COCKPIT: EMPLOYER_COCKPIT ?? this.EMPLOYER_COCKPIT,
  1054. EMPLOYER_CABIN: EMPLOYER_CABIN ?? this.EMPLOYER_CABIN,
  1055. CYCLES: CYCLES ?? this.CYCLES,
  1056. DELAY_CODE_01: DELAY_CODE_01 ?? this.DELAY_CODE_01,
  1057. DELAY_CODE_02: DELAY_CODE_02 ?? this.DELAY_CODE_02,
  1058. DELAY_CODE_03: DELAY_CODE_03 ?? this.DELAY_CODE_03,
  1059. DELAY_CODE_04: DELAY_CODE_04 ?? this.DELAY_CODE_04,
  1060. DELAY_TIME_01: DELAY_TIME_01 ?? this.DELAY_TIME_01,
  1061. DELAY_TIME_02: DELAY_TIME_02 ?? this.DELAY_TIME_02,
  1062. DELAY_TIME_03: DELAY_TIME_03 ?? this.DELAY_TIME_03,
  1063. DELAY_TIME_04: DELAY_TIME_04 ?? this.DELAY_TIME_04,
  1064. SUBDELAY_CODE_01: SUBDELAY_CODE_01 ?? this.SUBDELAY_CODE_01,
  1065. SUBDELAY_CODE_02: SUBDELAY_CODE_02 ?? this.SUBDELAY_CODE_02,
  1066. SUBDELAY_CODE_03: SUBDELAY_CODE_03 ?? this.SUBDELAY_CODE_03,
  1067. SUBDELAY_CODE_04: SUBDELAY_CODE_04 ?? this.SUBDELAY_CODE_04,
  1068. PAX_BOOKED_C: PAX_BOOKED_C ?? this.PAX_BOOKED_C,
  1069. PAX_BOOKED_Y: PAX_BOOKED_Y ?? this.PAX_BOOKED_Y,
  1070. PAX_BOOKED_TRS_C: PAX_BOOKED_TRS_C ?? this.PAX_BOOKED_TRS_C,
  1071. PAX_BOOKED_TRS_Y: PAX_BOOKED_TRS_Y ?? this.PAX_BOOKED_TRS_Y,
  1072. PAD_BOOKED_C: PAD_BOOKED_C ?? this.PAD_BOOKED_C,
  1073. PAD_BOOKED_Y: PAD_BOOKED_Y ?? this.PAD_BOOKED_Y,
  1074. OFFBLOCK_DT_A: OFFBLOCK_DT_A ?? this.OFFBLOCK_DT_A,
  1075. AIRBORNE_DT_A: AIRBORNE_DT_A ?? this.AIRBORNE_DT_A,
  1076. LANDING_DT_A: LANDING_DT_A ?? this.LANDING_DT_A,
  1077. ONBLOCK_DT_A: ONBLOCK_DT_A ?? this.ONBLOCK_DT_A,
  1078. OFFBLOCK_DT_F: OFFBLOCK_DT_F ?? this.OFFBLOCK_DT_F,
  1079. AIRBORNE_DT_F: AIRBORNE_DT_F ?? this.AIRBORNE_DT_F,
  1080. LANDING_DT_F: LANDING_DT_F ?? this.LANDING_DT_F,
  1081. ONBLOCK_DT_F: ONBLOCK_DT_F ?? this.ONBLOCK_DT_F,
  1082. OFFBLOCK_DT_M: OFFBLOCK_DT_M ?? this.OFFBLOCK_DT_M,
  1083. AIRBORNE_DT_M: AIRBORNE_DT_M ?? this.AIRBORNE_DT_M,
  1084. LANDING_DT_M: LANDING_DT_M ?? this.LANDING_DT_M,
  1085. ONBLOCK_DT_M: ONBLOCK_DT_M ?? this.ONBLOCK_DT_M,
  1086. EET: EET ?? this.EET,
  1087. );
  1088. }
  1089. Map<String, dynamic> toMap() {
  1090. return <String, dynamic>{
  1091. 'LEG_NO': LEG_NO,
  1092. 'FN_CARRIER': FN_CARRIER,
  1093. 'FN_NUMBER': FN_NUMBER,
  1094. 'FN_SUFFIX': FN_SUFFIX,
  1095. 'DAY_OF_ORIGIN': DAY_OF_ORIGIN,
  1096. 'AC_OWNER': AC_OWNER,
  1097. 'AC_SUBTYPE': AC_SUBTYPE,
  1098. 'AC_VERSION': AC_VERSION,
  1099. 'AC_REGISTRATION': AC_REGISTRATION,
  1100. 'DEP_AP_ACTUAL': DEP_AP_ACTUAL,
  1101. 'DEP_AP_SCHED': DEP_AP_SCHED,
  1102. 'DEP_DT_EST': DEP_DT_EST,
  1103. 'DEP_SCHED_DT': DEP_SCHED_DT,
  1104. 'ARR_AP_ACTUAL': ARR_AP_ACTUAL,
  1105. 'ARR_AP_SCHED': ARR_AP_SCHED,
  1106. 'ARR_DT_EST': ARR_DT_EST,
  1107. 'ARR_SCHED_DT': ARR_SCHED_DT,
  1108. 'SLOT_TIME_ACTUAL': SLOT_TIME_ACTUAL,
  1109. 'LEG_TYPE': LEG_TYPE,
  1110. 'STATUS': STATUS,
  1111. 'EMPLOYER_COCKPIT': EMPLOYER_COCKPIT,
  1112. 'EMPLOYER_CABIN': EMPLOYER_CABIN,
  1113. 'CYCLES': CYCLES,
  1114. 'DELAY_CODE_01': DELAY_CODE_01,
  1115. 'DELAY_CODE_02': DELAY_CODE_02,
  1116. 'DELAY_CODE_03': DELAY_CODE_03,
  1117. 'DELAY_CODE_04': DELAY_CODE_04,
  1118. 'DELAY_TIME_01': DELAY_TIME_01,
  1119. 'DELAY_TIME_02': DELAY_TIME_02,
  1120. 'DELAY_TIME_03': DELAY_TIME_03,
  1121. 'DELAY_TIME_04': DELAY_TIME_04,
  1122. 'SUBDELAY_CODE_01': SUBDELAY_CODE_01,
  1123. 'SUBDELAY_CODE_02': SUBDELAY_CODE_02,
  1124. 'SUBDELAY_CODE_03': SUBDELAY_CODE_03,
  1125. 'SUBDELAY_CODE_04': SUBDELAY_CODE_04,
  1126. 'PAX_BOOKED_C': PAX_BOOKED_C,
  1127. 'PAX_BOOKED_Y': PAX_BOOKED_Y,
  1128. 'PAX_BOOKED_TRS_C': PAX_BOOKED_TRS_C,
  1129. 'PAX_BOOKED_TRS_Y': PAX_BOOKED_TRS_Y,
  1130. 'PAD_BOOKED_C': PAD_BOOKED_C,
  1131. 'PAD_BOOKED_Y': PAD_BOOKED_Y,
  1132. 'OFFBLOCK_DT_A': OFFBLOCK_DT_A,
  1133. 'AIRBORNE_DT_A': AIRBORNE_DT_A,
  1134. 'LANDING_DT_A': LANDING_DT_A,
  1135. 'ONBLOCK_DT_A': ONBLOCK_DT_A,
  1136. 'OFFBLOCK_DT_F': OFFBLOCK_DT_F,
  1137. 'AIRBORNE_DT_F': AIRBORNE_DT_F,
  1138. 'LANDING_DT_F': LANDING_DT_F,
  1139. 'ONBLOCK_DT_F': ONBLOCK_DT_F,
  1140. 'OFFBLOCK_DT_M': OFFBLOCK_DT_M,
  1141. 'AIRBORNE_DT_M': AIRBORNE_DT_M,
  1142. 'LANDING_DT_M': LANDING_DT_M,
  1143. 'ONBLOCK_DT_M': ONBLOCK_DT_M,
  1144. 'EET': EET,
  1145. };
  1146. }
  1147. factory Acleg.fromList(List datalist) {
  1148. //print(datalist);
  1149. if (datalist.length >= 54) {
  1150. return Acleg(
  1151. LEG_NO: datalist[0],
  1152. FN_CARRIER: datalist[1],
  1153. FN_NUMBER: datalist[2],
  1154. FN_SUFFIX: datalist[3],
  1155. DAY_OF_ORIGIN: datalist[4],
  1156. AC_OWNER: datalist[5],
  1157. AC_SUBTYPE: datalist[6],
  1158. AC_VERSION: datalist[7],
  1159. AC_REGISTRATION: datalist[8],
  1160. DEP_AP_ACTUAL: datalist[9],
  1161. DEP_AP_SCHED: datalist[10],
  1162. DEP_DT_EST: datalist[11],
  1163. DEP_SCHED_DT: datalist[12],
  1164. ARR_AP_ACTUAL: datalist[13],
  1165. ARR_AP_SCHED: datalist[14],
  1166. ARR_DT_EST: datalist[15],
  1167. ARR_SCHED_DT: datalist[16],
  1168. SLOT_TIME_ACTUAL: datalist[17],
  1169. LEG_TYPE: datalist[18],
  1170. STATUS: datalist[19],
  1171. EMPLOYER_COCKPIT: datalist[20],
  1172. EMPLOYER_CABIN: datalist[21],
  1173. CYCLES: datalist[22],
  1174. DELAY_CODE_01: datalist[23],
  1175. DELAY_CODE_02: datalist[24],
  1176. DELAY_CODE_03: datalist[25],
  1177. DELAY_CODE_04: datalist[26],
  1178. DELAY_TIME_01: datalist[27],
  1179. DELAY_TIME_02: datalist[28],
  1180. DELAY_TIME_03: datalist[29],
  1181. DELAY_TIME_04: datalist[30],
  1182. SUBDELAY_CODE_01: datalist[31],
  1183. SUBDELAY_CODE_02: datalist[32],
  1184. SUBDELAY_CODE_03: datalist[33],
  1185. SUBDELAY_CODE_04: datalist[34],
  1186. PAX_BOOKED_C: datalist[35],
  1187. PAX_BOOKED_Y: datalist[36],
  1188. PAX_BOOKED_TRS_C: datalist[37],
  1189. PAX_BOOKED_TRS_Y: datalist[38],
  1190. PAD_BOOKED_C: datalist[39],
  1191. PAD_BOOKED_Y: datalist[40],
  1192. OFFBLOCK_DT_A: datalist[41],
  1193. AIRBORNE_DT_A: datalist[42],
  1194. LANDING_DT_A: datalist[43],
  1195. ONBLOCK_DT_A: datalist[44],
  1196. OFFBLOCK_DT_F: datalist[45],
  1197. AIRBORNE_DT_F: datalist[46],
  1198. LANDING_DT_F: datalist[47],
  1199. ONBLOCK_DT_F: datalist[48],
  1200. OFFBLOCK_DT_M: datalist[49],
  1201. AIRBORNE_DT_M: datalist[50],
  1202. LANDING_DT_M: datalist[51],
  1203. ONBLOCK_DT_M: datalist[52],
  1204. EET: datalist[53]);
  1205. } else {
  1206. return Acleg();
  1207. }
  1208. }
  1209. factory Acleg.fromMap(Map<String, dynamic> map) {
  1210. return Acleg(
  1211. LEG_NO: map['LEG_NO'] != null ? map['LEG_NO'] as String : null,
  1212. FN_CARRIER:
  1213. map['FN_CARRIER'] != null ? map['FN_CARRIER'] as String : null,
  1214. FN_NUMBER: map['FN_NUMBER'] != null ? map['FN_NUMBER'] as String : null,
  1215. FN_SUFFIX: map['FN_SUFFIX'] != null ? map['FN_SUFFIX'] as String : null,
  1216. DAY_OF_ORIGIN:
  1217. map['DAY_OF_ORIGIN'] != null ? map['DAY_OF_ORIGIN'] as String : null,
  1218. AC_OWNER: map['AC_OWNER'] != null ? map['AC_OWNER'] as String : null,
  1219. AC_SUBTYPE:
  1220. map['AC_SUBTYPE'] != null ? map['AC_SUBTYPE'] as String : null,
  1221. AC_VERSION:
  1222. map['AC_VERSION'] != null ? map['AC_VERSION'] as String : null,
  1223. AC_REGISTRATION: map['AC_REGISTRATION'] != null
  1224. ? map['AC_REGISTRATION'] as String
  1225. : null,
  1226. DEP_AP_ACTUAL:
  1227. map['DEP_AP_ACTUAL'] != null ? map['DEP_AP_ACTUAL'] as String : null,
  1228. DEP_AP_SCHED:
  1229. map['DEP_AP_SCHED'] != null ? map['DEP_AP_SCHED'] as String : null,
  1230. DEP_DT_EST:
  1231. map['DEP_DT_EST'] != null ? map['DEP_DT_EST'] as String : null,
  1232. DEP_SCHED_DT:
  1233. map['DEP_SCHED_DT'] != null ? map['DEP_SCHED_DT'] as String : null,
  1234. ARR_AP_ACTUAL:
  1235. map['ARR_AP_ACTUAL'] != null ? map['ARR_AP_ACTUAL'] as String : null,
  1236. ARR_AP_SCHED:
  1237. map['ARR_AP_SCHED'] != null ? map['ARR_AP_SCHED'] as String : null,
  1238. ARR_DT_EST:
  1239. map['ARR_DT_EST'] != null ? map['ARR_DT_EST'] as String : null,
  1240. ARR_SCHED_DT:
  1241. map['ARR_SCHED_DT'] != null ? map['ARR_SCHED_DT'] as String : null,
  1242. SLOT_TIME_ACTUAL: map['SLOT_TIME_ACTUAL'] != null
  1243. ? map['SLOT_TIME_ACTUAL'] as String
  1244. : null,
  1245. LEG_TYPE: map['LEG_TYPE'] != null ? map['LEG_TYPE'] as String : null,
  1246. EMPLOYER_COCKPIT: map['EMPLOYER_COCKPIT'] != null
  1247. ? map['EMPLOYER_COCKPIT'] as String
  1248. : null,
  1249. EMPLOYER_CABIN: map['EMPLOYER_CABIN'] != null
  1250. ? map['EMPLOYER_CABIN'] as String
  1251. : null,
  1252. // CYCLES: map['CYCLES'] != null ? map['CYCLES'] as String : null,
  1253. DELAY_CODE_01:
  1254. map['DELAY_CODE_01'] != null ? map['DELAY_CODE_01'] as String : null,
  1255. DELAY_CODE_02:
  1256. map['DELAY_CODE_02'] != null ? map['DELAY_CODE_02'] as String : null,
  1257. DELAY_CODE_03:
  1258. map['DELAY_CODE_03'] != null ? map['DELAY_CODE_03'] as String : null,
  1259. DELAY_CODE_04:
  1260. map['DELAY_CODE_04'] != null ? map['DELAY_CODE_04'] as String : null,
  1261. DELAY_TIME_01:
  1262. map['DELAY_TIME_01'] != null ? map['DELAY_TIME_01'] as String : null,
  1263. DELAY_TIME_02:
  1264. map['DELAY_TIME_02'] != null ? map['DELAY_TIME_02'] as String : null,
  1265. DELAY_TIME_03:
  1266. map['DELAY_TIME_03'] != null ? map['DELAY_TIME_03'] as String : null,
  1267. DELAY_TIME_04:
  1268. map['DELAY_TIME_04'] != null ? map['DELAY_TIME_04'] as String : null,
  1269. SUBDELAY_CODE_01: map['SUBDELAY_CODE_01'] != null
  1270. ? map['SUBDELAY_CODE_01'] as String
  1271. : null,
  1272. SUBDELAY_CODE_02: map['SUBDELAY_CODE_02'] != null
  1273. ? map['SUBDELAY_CODE_02'] as String
  1274. : null,
  1275. SUBDELAY_CODE_03: map['SUBDELAY_CODE_03'] != null
  1276. ? map['SUBDELAY_CODE_03'] as String
  1277. : null,
  1278. SUBDELAY_CODE_04: map['SUBDELAY_CODE_04'] != null
  1279. ? map['SUBDELAY_CODE_04'] as String
  1280. : null,
  1281. PAX_BOOKED_C:
  1282. map['PAX_BOOKED_C'] != null ? map['PAX_BOOKED_C'] as String : null,
  1283. PAX_BOOKED_Y:
  1284. map['PAX_BOOKED_Y'] != null ? map['PAX_BOOKED_Y'] as String : null,
  1285. PAX_BOOKED_TRS_C: map['PAX_BOOKED_TRS_C'] != null
  1286. ? map['PAX_BOOKED_TRS_C'] as String
  1287. : null,
  1288. PAX_BOOKED_TRS_Y: map['PAX_BOOKED_TRS_Y'] != null
  1289. ? map['PAX_BOOKED_TRS_Y'] as String
  1290. : null,
  1291. PAD_BOOKED_C:
  1292. map['PAD_BOOKED_C'] != null ? map['PAD_BOOKED_C'] as String : null,
  1293. PAD_BOOKED_Y:
  1294. map['PAD_BOOKED_Y'] != null ? map['PAD_BOOKED_Y'] as String : null,
  1295. OFFBLOCK_DT_A:
  1296. map['OFFBLOCK_DT_A'] != null ? map['OFFBLOCK_DT_A'] as String : null,
  1297. AIRBORNE_DT_A:
  1298. map['AIRBORNE_DT_A'] != null ? map['AIRBORNE_DT_A'] as String : null,
  1299. LANDING_DT_A:
  1300. map['LANDING_DT_A'] != null ? map['LANDING_DT_A'] as String : null,
  1301. ONBLOCK_DT_A:
  1302. map['ONBLOCK_DT_A'] != null ? map['ONBLOCK_DT_A'] as String : null,
  1303. OFFBLOCK_DT_F:
  1304. map['OFFBLOCK_DT_F'] != null ? map['OFFBLOCK_DT_F'] as String : null,
  1305. AIRBORNE_DT_F:
  1306. map['AIRBORNE_DT_F'] != null ? map['AIRBORNE_DT_F'] as String : null,
  1307. LANDING_DT_F:
  1308. map['LANDING_DT_F'] != null ? map['LANDING_DT_F'] as String : null,
  1309. ONBLOCK_DT_F:
  1310. map['ONBLOCK_DT_F'] != null ? map['ONBLOCK_DT_F'] as String : null,
  1311. OFFBLOCK_DT_M:
  1312. map['OFFBLOCK_DT_M'] != null ? map['OFFBLOCK_DT_M'] as String : null,
  1313. AIRBORNE_DT_M:
  1314. map['AIRBORNE_DT_M'] != null ? map['AIRBORNE_DT_M'] as String : null,
  1315. LANDING_DT_M:
  1316. map['LANDING_DT_M'] != null ? map['LANDING_DT_M'] as String : null,
  1317. ONBLOCK_DT_M:
  1318. map['ONBLOCK_DT_M'] != null ? map['ONBLOCK_DT_M'] as String : null,
  1319. EET: map['EET'] != null ? map['EET'] as String : null,
  1320. );
  1321. }
  1322. String toJson() => json.encode(toMap());
  1323. factory Acleg.fromJson(String source) =>
  1324. Acleg.fromMap(json.decode(source) as Map<String, dynamic>);
  1325. @override
  1326. String toString() {
  1327. return 'Acleg(LEG_NO: $LEG_NO, FN_CARRIER: $FN_CARRIER, FN_NUMBER: $FN_NUMBER, FN_SUFFIX: $FN_SUFFIX, DAY_OF_ORIGIN: $DAY_OF_ORIGIN, AC_OWNER: $AC_OWNER, AC_SUBTYPE: $AC_SUBTYPE, AC_VERSION: $AC_VERSION, AC_REGISTRATION: $AC_REGISTRATION, DEP_AP_ACTUAL: $DEP_AP_ACTUAL, DEP_AP_SCHED: $DEP_AP_SCHED, DEP_DT_EST: $DEP_DT_EST, DEP_SCHED_DT: $DEP_SCHED_DT, ARR_AP_ACTUAL: $ARR_AP_ACTUAL, ARR_AP_SCHED: $ARR_AP_SCHED, ARR_DT_EST: $ARR_DT_EST, ARR_SCHED_DT: $ARR_SCHED_DT, SLOT_TIME_ACTUAL: $SLOT_TIME_ACTUAL, LEG_TYPE: $LEG_TYPE, EMPLOYER_COCKPIT: $EMPLOYER_COCKPIT, EMPLOYER_CABIN: $EMPLOYER_CABIN, CYCLES: $CYCLES, DELAY_CODE_01: $DELAY_CODE_01, DELAY_CODE_02: $DELAY_CODE_02, DELAY_CODE_03: $DELAY_CODE_03, DELAY_CODE_04: $DELAY_CODE_04, DELAY_TIME_01: $DELAY_TIME_01, DELAY_TIME_02: $DELAY_TIME_02, DELAY_TIME_03: $DELAY_TIME_03, DELAY_TIME_04: $DELAY_TIME_04, SUBDELAY_CODE_01: $SUBDELAY_CODE_01, SUBDELAY_CODE_02: $SUBDELAY_CODE_02, SUBDELAY_CODE_03: $SUBDELAY_CODE_03, SUBDELAY_CODE_04: $SUBDELAY_CODE_04, PAX_BOOKED_C: $PAX_BOOKED_C, PAX_BOOKED_Y: $PAX_BOOKED_Y, PAX_BOOKED_TRS_C: $PAX_BOOKED_TRS_C, PAX_BOOKED_TRS_Y: $PAX_BOOKED_TRS_Y, PAD_BOOKED_C: $PAD_BOOKED_C, PAD_BOOKED_Y: $PAD_BOOKED_Y, OFFBLOCK_DT_A: $OFFBLOCK_DT_A, AIRBORNE_DT_A: $AIRBORNE_DT_A, LANDING_DT_A: $LANDING_DT_A, ONBLOCK_DT_A: $ONBLOCK_DT_A, OFFBLOCK_DT_F: $OFFBLOCK_DT_F, AIRBORNE_DT_F: $AIRBORNE_DT_F, LANDING_DT_F: $LANDING_DT_F, ONBLOCK_DT_F: $ONBLOCK_DT_F, OFFBLOCK_DT_M: $OFFBLOCK_DT_M, AIRBORNE_DT_M: $AIRBORNE_DT_M, LANDING_DT_M: $LANDING_DT_M, ONBLOCK_DT_M: $ONBLOCK_DT_M, EET: $EET)';
  1328. }
  1329. @override
  1330. bool operator ==(covariant Acleg other) {
  1331. if (identical(this, other)) return true;
  1332. return other.LEG_NO == LEG_NO &&
  1333. other.FN_CARRIER == FN_CARRIER &&
  1334. other.FN_NUMBER == FN_NUMBER &&
  1335. other.FN_SUFFIX == FN_SUFFIX &&
  1336. other.DAY_OF_ORIGIN == DAY_OF_ORIGIN &&
  1337. other.AC_OWNER == AC_OWNER &&
  1338. other.AC_SUBTYPE == AC_SUBTYPE &&
  1339. other.AC_VERSION == AC_VERSION &&
  1340. other.AC_REGISTRATION == AC_REGISTRATION &&
  1341. other.DEP_AP_ACTUAL == DEP_AP_ACTUAL &&
  1342. other.DEP_AP_SCHED == DEP_AP_SCHED &&
  1343. other.DEP_DT_EST == DEP_DT_EST &&
  1344. other.DEP_SCHED_DT == DEP_SCHED_DT &&
  1345. other.ARR_AP_ACTUAL == ARR_AP_ACTUAL &&
  1346. other.ARR_AP_SCHED == ARR_AP_SCHED &&
  1347. other.ARR_DT_EST == ARR_DT_EST &&
  1348. other.ARR_SCHED_DT == ARR_SCHED_DT &&
  1349. other.SLOT_TIME_ACTUAL == SLOT_TIME_ACTUAL &&
  1350. other.LEG_TYPE == LEG_TYPE &&
  1351. other.EMPLOYER_COCKPIT == EMPLOYER_COCKPIT &&
  1352. other.EMPLOYER_CABIN == EMPLOYER_CABIN &&
  1353. other.CYCLES == CYCLES &&
  1354. other.DELAY_CODE_01 == DELAY_CODE_01 &&
  1355. other.DELAY_CODE_02 == DELAY_CODE_02 &&
  1356. other.DELAY_CODE_03 == DELAY_CODE_03 &&
  1357. other.DELAY_CODE_04 == DELAY_CODE_04 &&
  1358. other.DELAY_TIME_01 == DELAY_TIME_01 &&
  1359. other.DELAY_TIME_02 == DELAY_TIME_02 &&
  1360. other.DELAY_TIME_03 == DELAY_TIME_03 &&
  1361. other.DELAY_TIME_04 == DELAY_TIME_04 &&
  1362. other.SUBDELAY_CODE_01 == SUBDELAY_CODE_01 &&
  1363. other.SUBDELAY_CODE_02 == SUBDELAY_CODE_02 &&
  1364. other.SUBDELAY_CODE_03 == SUBDELAY_CODE_03 &&
  1365. other.SUBDELAY_CODE_04 == SUBDELAY_CODE_04 &&
  1366. other.PAX_BOOKED_C == PAX_BOOKED_C &&
  1367. other.PAX_BOOKED_Y == PAX_BOOKED_Y &&
  1368. other.PAX_BOOKED_TRS_C == PAX_BOOKED_TRS_C &&
  1369. other.PAX_BOOKED_TRS_Y == PAX_BOOKED_TRS_Y &&
  1370. other.PAD_BOOKED_C == PAD_BOOKED_C &&
  1371. other.PAD_BOOKED_Y == PAD_BOOKED_Y &&
  1372. other.OFFBLOCK_DT_A == OFFBLOCK_DT_A &&
  1373. other.AIRBORNE_DT_A == AIRBORNE_DT_A &&
  1374. other.LANDING_DT_A == LANDING_DT_A &&
  1375. other.ONBLOCK_DT_A == ONBLOCK_DT_A &&
  1376. other.OFFBLOCK_DT_F == OFFBLOCK_DT_F &&
  1377. other.AIRBORNE_DT_F == AIRBORNE_DT_F &&
  1378. other.LANDING_DT_F == LANDING_DT_F &&
  1379. other.ONBLOCK_DT_F == ONBLOCK_DT_F &&
  1380. other.OFFBLOCK_DT_M == OFFBLOCK_DT_M &&
  1381. other.AIRBORNE_DT_M == AIRBORNE_DT_M &&
  1382. other.LANDING_DT_M == LANDING_DT_M &&
  1383. other.ONBLOCK_DT_M == ONBLOCK_DT_M &&
  1384. other.EET == EET;
  1385. }
  1386. @override
  1387. int get hashCode {
  1388. return LEG_NO.hashCode ^
  1389. FN_CARRIER.hashCode ^
  1390. FN_NUMBER.hashCode ^
  1391. FN_SUFFIX.hashCode ^
  1392. DAY_OF_ORIGIN.hashCode ^
  1393. AC_OWNER.hashCode ^
  1394. AC_SUBTYPE.hashCode ^
  1395. AC_VERSION.hashCode ^
  1396. AC_REGISTRATION.hashCode ^
  1397. DEP_AP_ACTUAL.hashCode ^
  1398. DEP_AP_SCHED.hashCode ^
  1399. DEP_DT_EST.hashCode ^
  1400. DEP_SCHED_DT.hashCode ^
  1401. ARR_AP_ACTUAL.hashCode ^
  1402. ARR_AP_SCHED.hashCode ^
  1403. ARR_DT_EST.hashCode ^
  1404. ARR_SCHED_DT.hashCode ^
  1405. SLOT_TIME_ACTUAL.hashCode ^
  1406. LEG_TYPE.hashCode ^
  1407. EMPLOYER_COCKPIT.hashCode ^
  1408. EMPLOYER_CABIN.hashCode ^
  1409. CYCLES.hashCode ^
  1410. DELAY_CODE_01.hashCode ^
  1411. DELAY_CODE_02.hashCode ^
  1412. DELAY_CODE_03.hashCode ^
  1413. DELAY_CODE_04.hashCode ^
  1414. DELAY_TIME_01.hashCode ^
  1415. DELAY_TIME_02.hashCode ^
  1416. DELAY_TIME_03.hashCode ^
  1417. DELAY_TIME_04.hashCode ^
  1418. SUBDELAY_CODE_01.hashCode ^
  1419. SUBDELAY_CODE_02.hashCode ^
  1420. SUBDELAY_CODE_03.hashCode ^
  1421. SUBDELAY_CODE_04.hashCode ^
  1422. PAX_BOOKED_C.hashCode ^
  1423. PAX_BOOKED_Y.hashCode ^
  1424. PAX_BOOKED_TRS_C.hashCode ^
  1425. PAX_BOOKED_TRS_Y.hashCode ^
  1426. PAD_BOOKED_C.hashCode ^
  1427. PAD_BOOKED_Y.hashCode ^
  1428. OFFBLOCK_DT_A.hashCode ^
  1429. AIRBORNE_DT_A.hashCode ^
  1430. LANDING_DT_A.hashCode ^
  1431. ONBLOCK_DT_A.hashCode ^
  1432. OFFBLOCK_DT_F.hashCode ^
  1433. AIRBORNE_DT_F.hashCode ^
  1434. LANDING_DT_F.hashCode ^
  1435. ONBLOCK_DT_F.hashCode ^
  1436. OFFBLOCK_DT_M.hashCode ^
  1437. AIRBORNE_DT_M.hashCode ^
  1438. LANDING_DT_M.hashCode ^
  1439. ONBLOCK_DT_M.hashCode ^
  1440. EET.hashCode;
  1441. }
  1442. }