mirror of
https://github.com/Iconica-Development/flutter_availability.git
synced 2025-05-19 13:13:44 +02:00
feat: add availability template deviation calculation logic
This commit is contained in:
parent
baad9204c2
commit
2edd540f51
3 changed files with 181 additions and 0 deletions
|
@ -0,0 +1,34 @@
|
|||
import "package:flutter_availability/src/util/utils.dart";
|
||||
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
|
||||
|
||||
/// Determines if the availability is deviated from the template that it is
|
||||
/// based on
|
||||
bool isTemplateDeviated(
|
||||
AvailabilityModel availability,
|
||||
AvailabilityTemplateModel template,
|
||||
) {
|
||||
var dayOfWeek = availability.startDate.weekday;
|
||||
DateTime? templateStartDate;
|
||||
DateTime? templateEndDate;
|
||||
|
||||
if (template.templateType == AvailabilityTemplateType.week) {
|
||||
templateStartDate = (template.templateData as WeekTemplateData)
|
||||
.data[WeekDay.values[dayOfWeek - 1]]
|
||||
?.startTime;
|
||||
templateEndDate = (template.templateData as WeekTemplateData)
|
||||
.data[WeekDay.values[dayOfWeek - 1]]
|
||||
?.endTime;
|
||||
} else {
|
||||
templateStartDate = (template.templateData as DayTemplateData).startTime;
|
||||
templateEndDate = (template.templateData as DayTemplateData).endTime;
|
||||
}
|
||||
|
||||
if (templateStartDate == null || templateEndDate == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
var templateIsDeviated =
|
||||
!isAtSameTime(availability.startDate, templateStartDate) ||
|
||||
!isAtSameTime(availability.endDate, templateEndDate);
|
||||
return templateIsDeviated;
|
||||
}
|
4
packages/flutter_availability/lib/src/util/utils.dart
Normal file
4
packages/flutter_availability/lib/src/util/utils.dart
Normal file
|
@ -0,0 +1,4 @@
|
|||
/// method to return if 2 dates are at the same time of the day
|
||||
/// ignoring the date
|
||||
bool isAtSameTime(DateTime date1, DateTime date2) =>
|
||||
date1.hour == date2.hour && date1.minute == date2.minute;
|
|
@ -0,0 +1,143 @@
|
|||
import "package:flutter_availability/src/util/availability_deviation.dart";
|
||||
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
|
||||
import "package:flutter_test/flutter_test.dart";
|
||||
|
||||
void main() {
|
||||
group("isTemplateDeviated", () {
|
||||
group("day templates", () {
|
||||
test("returns false when availability matches the day template", () {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 9, 9, 0),
|
||||
endDate: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
);
|
||||
var template = AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Day Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.day,
|
||||
templateData: DayTemplateData(
|
||||
startTime: DateTime(2023, 7, 9, 9, 0),
|
||||
endTime: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isFalse);
|
||||
});
|
||||
|
||||
test("returns true when availability does not match the day template",
|
||||
() {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 9, 10, 0),
|
||||
endDate: DateTime(2023, 7, 9, 18, 0),
|
||||
breaks: [],
|
||||
);
|
||||
var template = AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Day Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.day,
|
||||
templateData: DayTemplateData(
|
||||
startTime: DateTime(2023, 7, 9, 9, 0),
|
||||
endTime: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isTrue);
|
||||
});
|
||||
});
|
||||
|
||||
group("week templates", () {
|
||||
test("returns false when availability matches the week template", () {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 9, 9, 0),
|
||||
endDate: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
);
|
||||
var template = AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Week Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.week,
|
||||
templateData: WeekTemplateData.forDays(
|
||||
sunday: DayTemplateData(
|
||||
startTime: DateTime(2023, 7, 9, 9, 0),
|
||||
endTime: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
),
|
||||
),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isFalse);
|
||||
});
|
||||
|
||||
test("returns true when availability does not match the week template",
|
||||
() {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 9, 10, 0), // sunday
|
||||
endDate: DateTime(2023, 7, 9, 18, 0), // sunday
|
||||
breaks: [],
|
||||
);
|
||||
var template = AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Week Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.week,
|
||||
templateData: WeekTemplateData.forDays(
|
||||
sunday: DayTemplateData(
|
||||
startTime: DateTime(2023, 7, 9, 9, 0),
|
||||
endTime: DateTime(2023, 7, 9, 17, 0),
|
||||
breaks: [],
|
||||
),
|
||||
),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isTrue);
|
||||
});
|
||||
|
||||
test(
|
||||
"returns true when the template is missing the "
|
||||
"day of the availability", () {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 10, 10, 0), // monday
|
||||
endDate: DateTime(2023, 7, 10, 18, 0), // monday
|
||||
breaks: [],
|
||||
);
|
||||
var template = const AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Week Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.week,
|
||||
templateData: WeekTemplateData(data: {}),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isTrue);
|
||||
});
|
||||
|
||||
test("returns true when the template is fully null", () {
|
||||
var availability = AvailabilityModel(
|
||||
userId: "user1",
|
||||
startDate: DateTime(2023, 7, 10, 10, 0),
|
||||
endDate: DateTime(2023, 7, 10, 18, 0),
|
||||
breaks: [],
|
||||
);
|
||||
var template = const AvailabilityTemplateModel(
|
||||
userId: "user1",
|
||||
name: "Week Template",
|
||||
color: 0,
|
||||
templateType: AvailabilityTemplateType.week,
|
||||
templateData: WeekTemplateData(data: {}),
|
||||
);
|
||||
var result = isTemplateDeviated(availability, template);
|
||||
expect(result, isTrue);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue