Sổ hẹn — Phòng khám tiền sản
BẢN THỬ — dữ liệu chỉ nằm trong trình duyệt máy này, chưa nối cơ sở dữ liệu

Sổ hẹn

Bản thử — dữ liệu lưu trong trình duyệt này, chưa nối Supabase

Vùng tô vàng nhạt là khung giờ bệnh nhân muốn (khung vàng). Vùng gạch chéo là ngoài giờ bán. Bấm chỗ trống để lấy giờ, bấm ca để đổi trạng thái.

Nên in tự động cuối mỗi buổi.

Thời lượng từng loại siêu âm

Sửa ở đây chỉ đổi mặc định cho ca đặt từ giờ trở đi. Ca đã hẹn giữ nguyên số phút lúc đặt.

Buổi làm việc và trần ca

Giờ làm là lúc phòng khám còn hoạt động. Giờ bán là khung bệnh nhân chịu nhận hẹn — hẹn sau giờ bán thì họ từ chối, nên đừng chào bán. Chênh lệch giữa hai khung chính là phần tràn mỗi tối.
Giữ vãng laigiữ cho Acuity là số chỗ không ai được đặt trước, thay cho các ô rỗng hiện nay. Khi bỏ Acuity thì đặt số đó về 0.

Ngày khoá và ngày lễ

Ngày lễ không tự khoá. Phòng khám mở buổi tối và sáng Chủ nhật — ngày lễ rơi vào ngày thường có khi lại đông hơn vì bệnh nhân được nghỉ. Xem đề xuất rồi tự quyết từng ngày.

Ca bị từ chối

create table buoi_lam (         -- khai 1 lần, sửa khi đổi giờ
  thu           smallint primary key,   -- 0=CN … 6=T7
  gio_lam_bd    time, gio_lam_kt   time,
  gio_ban_bd    time, gio_ban_kt   time,   -- khung bệnh nhân chịu nhận
  tran_vu       int,  tran_bs2     int,
  giu_vang_lai  int  default 0,
  giu_acuity    int  default 0,
  nghi          boolean default false
);

create table hen (
  id              bigserial primary key,
  ngay            date not null,
  gio             time not null,
  thoi_luong_phut int  not null,          -- chép cứng lúc đặt
  bs_thuc_hien    text,                   -- null = chưa gán
  chi_dinh_bs     boolean not null default false,   -- (yc)
  sdt_chuan       text, ho_ten text not null, ma_bn text,
  loai_dv         text not null, so_thai smallint not null default 1,
  nguon           text not null,          -- dt|fb|quay|link|acuity|vanglai
  trang_thai      text not null default 'cho',
                  -- cho|den|dang|xong|khong_den|huy|doi
  hen_goc_id      bigint references hen(id),
  hen_moi_id      bigint references hen(id),
  so_lan_doi      smallint not null default 0,
  doi_luc         timestamptz,
  kham_queue_id   bigint,
  gio_den timestamptz, gio_bat_dau timestamptz, gio_xong timestamptz,
  ghi_de boolean not null default false, ly_do_ghi_de text,
  ghi_chu text, tao_boi text, tao_luc timestamptz not null default now()
);
create index hen_ngay_bs on hen (ngay, bs_thuc_hien);
create index hen_sdt     on hen (sdt_chuan);

-- chặn trùng giờ ở tầng dữ liệu, không phụ thuộc giao diện
create extension if not exists btree_gist;
alter table hen add constraint hen_khong_trung
  exclude using gist (
    bs_thuc_hien with =,
    tsrange(ngay + gio, ngay + gio + (thoi_luong_phut||' min')::interval) with &&
  ) where (trang_thai in ('cho','den','dang') and not ghi_de);

create table tu_choi (          -- mỗi lần nói "hết chỗ rồi chị"
  id bigserial primary key,
  ngay date not null,           -- ngày bệnh nhân muốn
  chi_dinh_bs boolean not null default false,
  ly_do text,                   -- het_tran | het_khung_vang | khac
  tao_luc timestamptz not null default now()
);