This repository has been archived on 2024-10-18. You can view files and clone it, but cannot push or open issues or pull requests.
ftc_patient_app/lib/controllers/rota/book_holiday_screen_control...

137 lines
4.2 KiB
Dart

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<ScaffoldState> screenKey = GlobalKey<ScaffoldState>();
final targetDateTime = DateTime.now().obs;
final agreeToRules = false.obs;
final holidayStartDate = DateTime.now().obs;
final holidayEndDate = Rx<DateTime>(DateTime.now());
final holidayDays = 0.obs;
final holidayHours = 0.obs;
final myWorkLoads = Rx<StaffWorkLoads?>(null);
final _controller = Get.put(RotaDashboardScreenController());
Rx<EventList<Event>> get markedDatesMap => _controller.markedDatesMap;
@override
void onInit() {
_calculateDaysAndHours();
super.onInit();
}
@override
void onReady() {
fetchRecords();
super.onReady();
}
onRangeSelect(
DateTime rangeStart, DateTime? rangeEnd, List<String> 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<void> 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<bool> 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<BookHolidayScreenController>();
super.dispose();
}
}