data.dart 56 KB

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