feat: introduce service-based availability filtering for collaborator schedules and overrides

This commit is contained in:
2026-07-19 23:36:18 -03:00
parent f017f7e9aa
commit b01149a19e
10 changed files with 493 additions and 31 deletions
@@ -10,8 +10,8 @@ import { useAlert } from "@store/Alert.Store";
import { useConfirmStore } from "@store/Confirm.Store";
import { useEffect, useState } from "react";
import MaterialAlert from "@mui/material/Alert";
import { ScheduleItem } from "@core/Models/Collaborators.model";
import { createSchedulesOverrides } from "../../../Collaborators.Service";
import { CollaboratorServiceItems, ScheduleItem } from "@core/Models/Collaborators.model";
import { createSchedulesOverrides, findCollaboratorsServices } from "../../../Collaborators.Service";
import { Grid2 } from "@mui/material";
import TextTime from "@core/app/components/TextTime/TextTime";
import TextDate from "@core/app/components/TextDate/TextDate";
@@ -51,11 +51,24 @@ export default function OverridesCreate() {
const [from, setFrom] = useState<dayjs.Dayjs>(dayjs(new Date()).hour(8).minute(0));
const [to, setTo] = useState<dayjs.Dayjs>(dayjs(new Date()).hour(12).minute(0));
const [schedules, setSchedules] = useState<Array<SchedulesDateItem>>([]);
const [services, setServices] = useState<CollaboratorServiceItems[]>([]);
useEffect(() => {
eventHandler.setEventType(EVENT_TYPES.NEED_SAVE);
}, []);
useEffect(() => {
findCollaboratorsServices({
companyId: id,
employeeId: cid,
sessionUser: SessionInfo.userId,
})
.then((collaboratorServices) => {
setServices(collaboratorServices?.services.filter((service) => service.active) || []);
})
.catch((error) => alert.showError(error.format()));
}, [id, cid, SessionInfo.userId]);
useEffect(() => {
location.clear();
@@ -109,6 +122,8 @@ export default function OverridesCreate() {
from: schedule.from.format("HH:mm"),
to: schedule.to.format("HH:mm"),
disabled: schedule.data.disabled || false,
serviceScope: schedule.data.serviceScope || "all",
serviceIds: schedule.data.serviceScope === "specific" ? schedule.data.serviceIds || [] : [],
};
});
};
@@ -121,6 +136,8 @@ export default function OverridesCreate() {
from: from.format("HH:mm"),
to: to.format("HH:mm"),
disabled: false,
serviceScope: "all",
serviceIds: [],
},
};
@@ -174,6 +191,30 @@ export default function OverridesCreate() {
eventHandler.setEventType(EVENT_TYPES.NEED_SAVE);
};
const serviceScopeChangeHandler = (
from: string,
serviceScope: "all" | "specific",
serviceIds: string[]
) => {
setSchedules(
schedules.map((schedule) => {
if (schedule.data.from == from) {
return {
...schedule,
data: {
...schedule.data,
serviceScope,
serviceIds,
},
};
}
return schedule;
})
);
eventHandler.setEventType(EVENT_TYPES.NEED_SAVE);
};
return (
<>
<Location />
@@ -225,7 +266,11 @@ export default function OverridesCreate() {
from={schedule.data.from}
to={schedule.data.to}
disabled={schedule.data.disabled}
serviceScope={schedule.data.serviceScope}
serviceIds={schedule.data.serviceIds}
serviceOptions={services}
onCheckChange={checkChangeHandler}
onServiceScopeChange={serviceScopeChangeHandler}
onDelete={deleteScheduleHandler}
/>
))}
@@ -10,8 +10,9 @@ import { useAlert } from "@store/Alert.Store";
import { useConfirmStore } from "@store/Confirm.Store";
import { useEffect, useState } from "react";
import MaterialAlert from "@mui/material/Alert";
import { CollaboratorSchedulesView, ScheduleItem } from "@core/Models/Collaborators.model";
import { CollaboratorSchedulesView, CollaboratorServiceItems, ScheduleItem } from "@core/Models/Collaborators.model";
import {
findCollaboratorsServices,
findCollaboratorsSchedules,
updateCollaboratorsSchedules,
} from "../../Collaborators.Service";
@@ -51,6 +52,7 @@ export default function CollaboratorSchedules() {
const [from, setFrom] = useState<dayjs.Dayjs>(dayjs(new Date()).hour(8).minute(0));
const [to, setTo] = useState<dayjs.Dayjs>(dayjs(new Date()).hour(12).minute(0));
const [schedules, setSchedules] = useState<Array<SchedulesDateItem>>([]);
const [services, setServices] = useState<CollaboratorServiceItems[]>([]);
useEffect(() => {
eventHandler.setEventType(EVENT_TYPES.SLEEP);
@@ -86,6 +88,18 @@ export default function CollaboratorSchedules() {
loadCollaboratorSchedules();
}, [weekDay]);
useEffect(() => {
findCollaboratorsServices({
companyId: id,
employeeId: cid,
sessionUser: SessionInfo.userId,
})
.then((collaboratorServices) => {
setServices(collaboratorServices?.services.filter((service) => service.active) || []);
})
.catch((error) => alert.showError(error.format()));
}, [id, cid, SessionInfo.userId]);
useEffect(() => {
if (eventHandler.eventType === EVENT_TYPES.SAVE) {
updateCollaboratorsSchedules({
@@ -158,6 +172,8 @@ export default function CollaboratorSchedules() {
from: schedule.from.format("HH:mm"),
to: schedule.to.format("HH:mm"),
disabled: schedule.data.disabled || false,
serviceScope: schedule.data.serviceScope || "all",
serviceIds: schedule.data.serviceScope === "specific" ? schedule.data.serviceIds || [] : [],
};
});
};
@@ -170,6 +186,8 @@ export default function CollaboratorSchedules() {
from: from.format("HH:mm"),
to: to.format("HH:mm"),
disabled: false,
serviceScope: "all",
serviceIds: [],
},
};
@@ -248,6 +266,30 @@ export default function CollaboratorSchedules() {
};
const serviceScopeChangeHandler = (
from: string,
serviceScope: "all" | "specific",
serviceIds: string[]
) => {
setSchedules(
schedules.map((schedule) => {
if (schedule.data.from == from) {
return {
...schedule,
data: {
...schedule.data,
serviceScope,
serviceIds,
},
};
}
return schedule;
})
);
eventHandler.setEventType(EVENT_TYPES.NEED_SAVE);
};
return (
@@ -291,7 +333,11 @@ export default function CollaboratorSchedules() {
from={schedule.data.from}
to={schedule.data.to}
disabled={schedule.data.disabled}
serviceScope={schedule.data.serviceScope}
serviceIds={schedule.data.serviceIds}
serviceOptions={services}
onCheckChange={checkChangeHandler}
onServiceScopeChange={serviceScopeChangeHandler}
onDelete={deleteScheduleHandler}
/>
))}