# WEB予約API
## 概要
患者さんが利用するWEB予約から利用されるAPI
## 認証・認可
なし
ただし、以下の条件に合致する場合は、利用を制限する
- n秒間にm回以上のリクエスト?
## API一覧
| | メソッド | URI |
| :--- | :---: | :--- |
| 医院情報取得 | GET | /webr/clinic/clinic_info |
| 患者情報取得 | POST | /webr/patient/patients_info |
| 空き枠情報取得 | POST | /webr/reservation/find_reservable_time |
| 予約登録 | POST | /webr/reservation/entry_reservations |
| 予約情報取得 | GET | /webr/reservation/reservations_info |
| キャンセル待ち情報取得 | GET | /webr/reservation/waiting_list |
## 応答
| HTTPステータスコード | 内容 | |
| :---: | :--- | :--- |
| 200 | OK | |
| 400 | Bad Request | 必須パラメータ未指定、または、想定外パラメータ指定→Slackに通知 |
| 401 | Unauthorized | |
| 403 | Forbidden | |
| 404 | Not Found | |
| 405 | Method Not Allowed | |
| 408 | Request Timeout | |
## API詳細
### リクエスト共通
#### リクエスト・パラメータ
| 場所 | 必須/任意・デフォルト値 | 名称 | 内容 |
| :--- | :--- | :--- | :--- |
| クエリ | 必須 | url_code | 医院コード-医院ID |
| クエリ | 必須 | caller | 呼び出し元 |
| クエリ | 必須 | version | バージョン |
### レスポンス共通
#### レスポンス(HTTPステータスコード=200の場合)
| object | type | 説明 |
| :--- | :--- | :--- |
| status | 文字列 | 下表参照 |
| message | 文字列 | status≠0の場合 |
| data | オブジェクト | status=0の場合 |
#### status
| status | 説明 |
| :--: | :--- |
| 0 | 正常 |
| 1 | サーバーエラー |
| 101 | リクエスト・パラメータのurl_codeが不正値です |
| 102 | 医院マスタが存在しません |
| 103 | WEB予約設定が存在しません |
| 104 | WEB予約を利用しない設定になっています |
| 105 | WEB予約設定(新患)が存在しません |
| 106 | WEB予約設定(再診)が存在しません |
| 107 | 主訴マスタが存在しません |
| 201 | 患者マスタが存在しません |
| 202 | 電話番号が違います(※廃止 201と統合) |
| 301 | リクエスト・パラメータのyearが不正値です |
| 302 | リクエスト・パラメータのmonthが不正値です |
### 医院情報取得
#### 概要
歯科医院のWEB予約関連情報を取得する
#### 関連テーブル
m_clinic:歯科医院マスタ
wr_m_config:Web予約設定
wr_m_config_new_patient:Web予約設定(新患)
wr_m_config_repeated:Web予約設定(再診)
wr_m_config_screen:Web予約設定(画面ごとの設定)
m_complaint:主訴マスタ
wr_mx_complaint:主訴(WEB予約用)
#### エンドポイント
```
GET https://xxx.com/webr/clinic/clinic_info
```
#### リクエスト・パラメータ
共通のみ
##### 例
```
GET https://xxx.com/webr/clinic/clinic_info?url_code=123456-1
```
#### レスポンス(data)
| object | type | 説明 |
| :--- | :--- | :--- |
| clinic | オブジェクト | 基本設定情報 |
| screen_list | オブジェクト | 画面表示情報リスト |
| complaint_list_new_patient | オブジェクト | 新患用主訴情報リスト |
| complaint_list_repeated | オブジェクト | 再診用主訴情報リスト |
#### レスポンス(clinic)
| object | type | 説明 |
| :--- | :--- | :--- |
| clinic_name | 文字列 | 医院名 |
| tel | 文字列 | 電話番号 |
| mydental_dl_show | 数値 | 予約完了画面にてWEB予約後のアプリへの招待(0:表示しない 1:表示する) |
| default_col_mode | 数値 | 列表示モード(1:スタッフ 2:ユニット)※完了メッセージの振り分け、主訴必須判定 |
| color_r | 数値 | カラーコード(R) |
| color_g | 数値 | カラーコード(G) |
| color_b | 数値 | カラーコード(B) |
| header_title | 文字列 | HTML head title(未設定の場合、医院名) |
| conversion_reservation_url | 文字列 | コンバージョンURL |
| enable_new_patient | 数値 | 初診許可(0:許可しない 1:許可する) |
| enable_repeated | 数値 | 再診許可(0:許可しない 1:許可する) |
| enable_all_patient | 数値 | 日時未定なしの再診許可(0:許可しない 1:許可する) |
| new_enable_change_date | 数値 | 新患の日時変更許可(0:許可しない 1:許可する) |
| repeated_enable_change_date | 数値 | 再診の日時変更許可(0:許可しない 1:許可する) |
| new_enable_cancel | 数値 | 新患のキャンセル許可(0:許可しない 1:許可する) |
| repeated_enable_cancel | 数値 | 再診のキャンセル許可(0:許可しない 1:許可する) |
| enable_waiting_list | 数値 | 再診のキャンセル待ち許可(0:許可しない 1:許可する) |
| welcome_message | 文字列 | Welcomeメッセージ |
| logo_image | 文字列 | ロゴ画像URL |
#### レスポンス(complaint_list_new_patient)
| object | type | 説明 |
| :--- | :--- | :--- |
| complaint | オブジェクト | 主訴情報(id昇順) |
#### レスポンス(complaint_list_repeated)
| object | type | 説明 |
| :--- | :--- | :--- |
| complaint | オブジェクト | 主訴情報(id昇順) |
#### レスポンス(complaint)
| object | type | 説明 |
| :--- | :--- | :--- |
| complaint_id | 数値 | 主訴ID |
| complaint_name | 文字列 | 主訴名 |
| order | 数値 | 並び順 |
| cares | 文字列 | 診療内容 |
##### 例
```
{
"status": 0,
"data": {
"clinic": {
"clinic_name": "デンタライトクリニック",
"tel": "050-2018-0069",
"mydental_dl_show": 1,
"default_col_mode": 2,
"color_r": 128,
"color_g": 128,
"color_b": 128,
"header_title": "デンタライトクリニック",
"conversion_reservation_url": "https://google.com",
"enable_new_patient": 1,
"enable_repeated": 1,
"enable_all_patient": 1,
"new_enable_change_date": 1,
"repeated_enable_change_date": 1,
"new_enable_cancel": 1,
"repeated_enable_cancel": 1,
"enable_waiting_list": 1,
"welcome_message": "TOP画面のメッセージ",
"logo_image": "https://www.xxx.com/aaa/bbb/logo.png"
},
"complaint_list_new_patient": [
{
"complaint": {
"complaint_id": 2,
"complaint_name": "【初めて受診されるかた】歯ぐきが腫れた",
"order": 12,
"content": "【初めて受診されるかた】歯ぐきが腫れた",
"cares": null
}
},
{
"complaint": {
"complaint_id": 3,
"complaint_name": "【初めて受診されるかた】詰め物・かぶせ物が取れた",
"order": 13,
"content": "【初めて受診されるかた】詰め物・かぶせ物が取れた",
"cares": null
}
}
],
"complaint_list_repeated": [
{
"complaint": {
"complaint_id": 2674,
"complaint_name": "【再診】歯が痛い",
"order": 18,
"content": "【再診】歯が痛い",
"cares": null
}
}
]
}
}
```
### 患者情報取得
#### 概要
患者さんごとのWEB予約関連情報を取得する
#### 関連テーブル
m_clinic:歯科医院マスタ
wr_m_config:Web予約設定
wr_m_config_new_patient:Web予約設定(新患)
wr_m_config_repeated:Web予約設定(再診)
m_patient:患者マスタ
#### エンドポイント
```
POST https://xxx.com/webr/patient/patients_info
```
#### リクエスト・パラメータ
| 場所 | 必須/任意・デフォルト値 | 名称 | 内容 |
| :--- | :--- | :--- | :--- |
| クエリ | 必須 | patient_list | 患者情報リスト |
#### リクエスト・パラメータ(patient_list)
| 場所 | 必須/任意・デフォルト値 | 名称 | 内容 |
| :--- | :--- | :--- | :--- |
| クエリ | 必須 | type | 0:新患 1:再診 |
| クエリ | 任意 | name | 患者名(新患の場合必須) |
| クエリ | 任意 | karte | カルテNo.(再診の場合必須) |
| クエリ | 任意 | tel | 電話番号(再診の場合必須) |
##### 例
```
POST http://localhost:8000/webr/patient/patients_info
-H 'Content-Type: application/json'
--data-raw '{"url_code":"123456-1","patient_list":[{"type":0,"name":"山本哲夫"},{"type":1,"karte":12345,"tel":"090-3344-5555"}]}'
```
#### レスポンス(data)
| object | type | 説明 |
| :--- | :--- | :--- |
| all_authenticated | boolean | True:全て認証済み False:未認証あり |
| patient_list | オブジェクト | 患者情報リスト |
#### レスポンス(patient_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| patient | オブジェクト | 患者情報 |
#### レスポンス(patient)
| object | type | 説明 |
| :--- | :--- | :--- |
| type | 数値 | 0:新患 1:再診 |
| status | 文字列 | 上表参照 |
| message | 文字列 | status≠0の場合 |
| patient_id | 数値 | 患者ID |
| patient_name | 文字列 | 患者名 |
| enable_change_date | 数値 | 日時変更許可(0:許可しない 1:許可する) |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
| tel | 文字列 | 電話番号 |
カルテ番号も(重複チェック用)
change_delay tinyint 新患_日時変更_変更可能予約 ○日後以降の予約を対象
change_max_count tinyint 新患_日時変更_変更可能上限
enable_cancel tinyint 新患のキャンセル許可 null,0:許可しない 1:許可する
enable_all_patient tinyint 日時未定の予約がなくても再診を許可する nul,0:許可しない 1:許可する
stages nvarchar(450) 再診許可するステージ
enable_change_date tinyint 再診の日時変更を許可する null,0:許可しない 1:許可する
change_delay tinyint 日時変更_変更可能予約 ○日後以降の予約を対象 nullの場合は今日からOK
change_max_count tinyint 日時変更_変更可能上限
enable_cancel tinyint 再診のキャンセル許可 null,0:許可しない 1:許可する
enable_waiting_list tinyint 再診のキャンセル待ち登録許可 null,0:許可しない 1:許可する
| mydental_dl_show | 数値 | 予約完了画面にてWEB予約後のアプリへの招待(0:表示しない 1:表示する) |
| default_col_mode | 数値 | 列表示モード(1:スタッフ 2:ユニット)※完了メッセージの振り分け、主訴必須判定 |
| conversion_reservation_url | 文字列 | コンバージョンURL |
| enable_new_patient | 数値 | 初診許可(0:許可しない 1:許可する) |
| enable_repeated | 数値 | 再診許可(0:許可しない 1:許可する) |
#### レスポンス(screen_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| screen | オブジェクト | 画面表示情報(id昇順) |
#### レスポンス(complaint_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| complaint | オブジェクト | 主訴情報(id昇順) |
#### レスポンス(complaint)
| object | type | 説明 |
| :--- | :--- | :--- |
| complaint_id | 数値 | 主訴ID |
| complaint_name | 文字列 | 主訴名 |
| order | 数値 | 並び順 |
| content | 文字列 | |
| cares | 文字列 | |
##### 例
```
{
"status": 0,
"data": {
"clinic": {
"clinic_id": 1,
"clinic_name": "デン***********ック",
"tel": "092-610-7011",
"mydental_dl_show": 1,
"default_col_mode": 2,
"color_r": 128,
"color_g": 128,
"color_b": 128,
"conversion_reservation_url": "https://google.com",
"welcome_message": "医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。"
},
"complaint_list": [
{
"complaint": {
"complaint_id": 2,
"complaint_name": "【初めて受診されるかた】歯ぐきが腫れた",
"order": 12,
"content": "【初めて受診されるかた】歯ぐきが腫れた",
"cares": null
}
},
{
"complaint": {
"complaint_id": 2941,
"complaint_name": "【矯正】セカンドオピニオン",
"order": 7,
"content": "【矯正】セカンドオピニオン",
"cares": null
}
}
]
}
}
```
##### 仕様
- 以下の場合、HTTPステータスコード404を返す
- リクエスト・パラメータのurl_codeが不正値の場合
- m_clinicが存在しない場合(id)
- wr_m_configが存在しない場合(clinic_id, code)
- wr_m_config.enable_reservation≠1の場合
- wr_m_config_new_patientが存在しない場合(clinic_id, config_id)
- wr_m_config_repeatedが存在しない場合(clinic_id, config_id)
※既存患者が新患で予約を取ろうとしているのを防げないか!?
### 空き枠情報取得
#### 概要
患者さんごとの予約可能時刻情報を取得する
#### 関連テーブル
m_
m_clinic:歯科医院マスタ
wr_m_config:Web予約設定
wr_m_config_new_patient:Web予約設定(新患)
wr_m_config_repeated:Web予約設定(再診)
#### エンドポイント
```
POST https://xxx.com/webr/reservation/find_reservable_time
```
#### リクエスト・パラメータ
| 場所 | 必須/任意・デフォルト値 | 名称 | 内容 |
| :--- | :--- | :--- | :--- |
| クエリ | 必須 | year | 年 |
| クエリ | 必須 | month | 月 |
| クエリ | 必須 | patient_list | 患者情報リスト |
#### リクエスト・パラメータ(patient_list)
| 場所 | 必須/任意・デフォルト値 | 名称 | 内容 |
| :--- | :--- | :--- | :--- |
| クエリ | 必須 | type | 0:新患 1:再診 |
| クエリ | 任意 | complaint_id | 主訴ID(新患の場合必須、再診の場合もあり) |
| クエリ | 任意 | patient_id | 患者ID(再診の場合必須) |
##### 例
```
POST http://localhost:8000/webr/reservation/find_reservable_time
-H 'Content-Type: application/json'
--data-raw '{"url_code":"123456-1","year":2021,"month":6,patient_list":[{"type":0,"complaint_id":1},{"type":1,"patient_id":1002,"reservation_id":1000232}]}'
```
#### レスポンス(data)
| object | type | 説明 |
| :--- | :--- | :--- |
| patient_list | オブジェクト | 患者情報リスト |
#### レスポンス(patient_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| patient | オブジェクト | 患者情報 |
#### レスポンス(patient)
| object | type | 説明 |
| :--- | :--- | :--- |
| type | 数値 | 0:新患 1:再診 |
| status | 文字列 | 上表参照 |
| message | 文字列 | status≠0の場合 |
| patient_id | 数値 | 患者ID |
| patient_name | 文字列 | 患者名 |
| time_list | オブジェクト | 空き枠リスト |
#### レスポンス(time_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| time | オブジェクト | 空き枠情報 |
#### レスポンス(time)
| object | type | 説明 |
| :--- | :--- | :--- |
| day | 数値 | 日 |
| hour | 数値 | 時 |
| min | 数値 | 分 |
| u_list | オブジェクト | ユニットリスト |
| s_list | オブジェクト | スタッフリスト |
#### レスポンス(u_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| u | オブジェクト | ユニット情報 |
#### レスポンス(u)
| object | type | 説明 |
| :--- | :--- | :--- |
| u_id | 数値 | ユニットID |
| u_name | 文字列 | ユニット名 |
#### レスポンス(s_list)
| object | type | 説明 |
| :--- | :--- | :--- |
| s | オブジェクト | スタッフ情報 |
#### レスポンス(s)
| object | type | 説明 |
| :--- | :--- | :--- |
| s_id | 数値 | スタッフID |
| s_name | 数値 | スタッフ名 |
##### 例
```
{
"status": 0,
"data": {
"clinic": {
"clinic_id": 1,
"clinic_name": "デン***********ック",
"tel": "092-610-7011",
"mydental_dl_show": 1,
"default_col_mode": 2,
"color_r": 128,
"color_g": 128,
"color_b": 128,
"conversion_reservation_url": "https://google.com",
"welcome_message": "医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。医院からの任意のメッセージが入ります。"
},
"complaint_list": [
{
"complaint": {
"complaint_id": 2,
"complaint_name": "【初めて受診されるかた】歯ぐきが腫れた",
"order": 12,
"content": "【初めて受診されるかた】歯ぐきが腫れた",
"cares": null
}
},
{
"complaint": {
"complaint_id": 2941,
"complaint_name": "【矯正】セカンドオピニオン",
"order": 7,
"content": "【矯正】セカンドオピニオン",
"cares": null
}
}
]
}
}
```
##### 仕様
- 以下の場合、HTTPステータスコード404を返す
- リクエスト・パラメータのurl_codeが不正値の場合
- m_clinicが存在しない場合(id)
- wr_m_configが存在しない場合(clinic_id, code)
- wr_m_config.enable_reservation≠1の場合
- wr_m_config_new_patientが存在しない場合(clinic_id, config_id)
- wr_m_config_repeatedが存在しない場合(clinic_id, config_id)
##### 仕様(検討)
1. ベースとなる時間のテーブルを作成
- 事前に作成しておく。日付変更、設定変更をトリガーに作成し直す(SQLServerのtrigger? Azure Functionsの方がエラー時の通知楽?)
- clinic_idで全件削除
- 当日からWeb予約設定のreservation_periodまで(初診と最新の長い方。未設定時は3年)
- m_clinic, m_business_day, m_business_hours, m_business_exception, wr_m_configより登録する
| Column | Type | Example |
| :--- | :--: | :--- |
| clinic_id | int | 1 |
| wr_date_time | datetime | 2020-06-01 09:10:00 |
| wr_date | date | 2020-06-01 |
| wr_hour | int | 9 |
| wr_min | int | 10 |
1. 既存の予約、医院予定、主訴の設定情報をjoinし、絞り込んだ時間をselectする
1. 患者ごとに時間(親要素:時間、子要素:ユニット、スタッフ)の情報を作成する(python)
1. 複数患者の場合、作成された時間の情報の組み合わせ総当たりで、カレンダーの表示情報を作成する(ここのロジックは予約の登録でも使用する)
ローカルで試すときは、これを使ってください。
リモートは開発向けにAZDB_KITSUNE_DEVを作ってます。
使い方は、以下のソースを参照してください。
classes/api/genie/box/file.py
(batchを使っている部分です。)