iClinic Developers

Công thức

Đánh dấu lịch hẹn “Đã đến” / “Đã huỷ”

  1. Lấy lượt khám gần đây với status=all để có cả lượt đã huỷ.
  2. Ghép theo số điện thoại và visitDate trong vòng ±5 ngày so với ngày hẹn. Bỏ qua lượt khám có phone = null.
  3. Có ít nhất một lượt không phải CANCELLED → Đã đến. Chỉ có lượt CANCELLED → Đã huỷ. Không có lượt nào → giữ nguyên.

Danh sách gọi chăm sóc sau khám (ngày 0 / 3 / 6 / 30)

  1. Lấy status=FINISHED với from = hôm nay − 30 ngày (đúng 31 ngày, đủ cho mốc ngày 30).
  2. Tính ngày gọi = visitDate + 0, 3, 6, 30 ngày; lấy các lượt có ngày gọi trùng hôm nay.
  3. Hiển thị patientName, phone, diagnosis. patientType = NEW là khách mới; OLD và RE_EXAMINATION là tái khám.
Đố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,
    })),
  );
}