Đối chiếu lịch hẹn
const DAY = 86_400_000;
const dayOf = (date) => Date.parse(`${date}T00:00:00Z`);
// appointment: { phone, date: 'YYYY-MM-DD' }; encounters: từ status=all
export function appointmentOutcome(appointment, encounters) {
const near = encounters.filter(
(e) =>
e.phone &&
e.phone === appointment.phone &&
Math.abs(dayOf(e.visitDate) - dayOf(appointment.date)) <= 5 * DAY,
);
if (near.length === 0) return null; // giữ nguyên
return near.some((e) => e.status !== 'CANCELLED') ? 'Đã đến' : 'Đã huỷ';
}
Danh sách gọi
const OFFSETS = [0, 3, 6, 30];
const addDays = (date, n) =>
new Date(Date.parse(`${date}T00:00:00Z`) + n * 86_400_000).toISOString().slice(0, 10);
// encounters: status=FINISHED, from = today - 30 ngày
export function callsDueOn(today, encounters) {
return encounters.flatMap((e) =>
OFFSETS.filter((n) => addDays(e.visitDate, n) === today).map((n) => ({
day: n,
uuid: e.encounterUuid,
name: e.patientName,
phone: e.phone,
kind: e.patientType === 'NEW' ? 'Khách mới' : 'Tái khám',
diagnosis: e.diagnosis,
})),
);
}