---
# System prepended metadata

title: WEB予約API

---

# 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 | 電話番号が違います（※廃止 ２０１と統合） |
| 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を使っている部分です。)








