import 'package:flutter/material.dart'; import 'package:flutter_calendar_carousel/classes/event.dart'; import 'package:flutter_calendar_carousel/classes/event_list.dart'; import 'package:ftc_mobile_app/models/requests/HolidayRequestData.dart'; import 'package:ftc_mobile_app/models/staffWorkload/StaffWorkloadResponse.dart'; import 'package:ftc_mobile_app/utilities/extensions/custom_extensions.dart'; import 'package:get/get.dart'; import '../../ftc_mobile_app.dart'; class BookHolidayScreenController extends GetxController { final GlobalKey screenKey = GlobalKey(); final targetDateTime = DateTime.now().obs; final agreeToRules = false.obs; final holidayStartDate = DateTime.now().obs; final holidayEndDate = Rx(DateTime.now()); final holidayDays = 0.obs; final holidayHours = 0.obs; final myWorkLoads = Rx(null); final _controller = Get.put(RotaDashboardScreenController()); Rx> get markedDatesMap => _controller.markedDatesMap; @override void onInit() { _calculateDaysAndHours(); super.onInit(); } @override void onReady() { fetchRecords(); super.onReady(); } onRangeSelect( DateTime rangeStart, DateTime? rangeEnd, List selectedDates) { print( "rangeStart: ${rangeStart.toString()}\nrangeEnd: ${rangeEnd.toString()}"); holidayStartDate.value = rangeStart; holidayEndDate.value = rangeEnd ?? (rangeStart); _calculateDaysAndHours(); } _calculateDaysAndHours() { holidayDays.value = holidayEndDate().difference(holidayStartDate()).inDays; if (DateFormatter.dateFormatter.format(holidayStartDate()) != DateFormatter.dateFormatter.format(holidayEndDate())) { holidayDays.value += 1; } else { holidayDays.value = 1; } //Filtering out shifts that fall between the holiday ranges final shifts = _controller.myShiftsList.where((shift) { final dateNotNull = shift.shiftDateTime != null; final isWithinHolidayRange = shift.shiftDateTime!.isAfter(holidayStartDate()) && shift.shiftDateTime!.isBefore(holidayEndDate()); final onHolidayStartDate = DateFormatter.dateFormatter.format(shift.shiftDateTime!) == DateFormatter.dateFormatter.format(holidayStartDate()); final onHolidayEndDate = DateFormatter.dateFormatter.format(shift.shiftDateTime!) == DateFormatter.dateFormatter.format(holidayEndDate()); return (dateNotNull && (onHolidayStartDate || isWithinHolidayRange || onHolidayEndDate)); }).toList(); holidayHours.value = shifts.fold( 0, (previousValue, shift) => (shift.workHrs ?? 0) + previousValue); // holidayHours.value = // holidayEndDate().difference(holidayStartDate()).inHours; } void removeFocus() { FocusScope.of(screenKey.currentContext!).unfocus(); } Future fetchRecords() async { var response = await RotaService().getStaffWorkload().showLoader(); if (response is StaffWorkloadResponse) { final workLoads = response.data?.staffWorkLoads ?? []; if (workLoads.isNotEmpty) { myWorkLoads.value = workLoads.first; } } else if (response is String && response.isNotEmpty) { FrequentFunctions.showToast(message: response); } } Future requestHoliday() async { if (agreeToRules.isFalse) { FrequentFunctions.showToast( message: "Please select agree to booking rules first"); return false; } var response = await RotaService() .requestHoliday( request: HolidayRequestData( hldRqStartDate: holidayStartDate().toUtc().millisecondsSinceEpoch, hldRqEndDate: holidayEndDate().toUtc().millisecondsSinceEpoch, hldRqTotalDays: holidayDays(), hldRqTotalHours: holidayHours(), hldRqStatus: "pending", hldRequestType: "holiday", ), ) .showLoader(); if (response is ResponseModel) { return true; } else if (response is String && response.isNotEmpty) { FrequentFunctions.showToast(message: response); } return false; } @override void dispose() { Get.delete(); super.dispose(); } }