mirror of
https://github.com/Iconica-Development/flutter_availability.git
synced 2025-05-19 05:03: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