QRコードからスマホで注文するシステムの要件定義をRDRA使ってやってみる-その３

https://qiita.com/s3imamura/items/bdc516e2234744855d20
の続き

## 現状のモデルを見直し

ERD を描く段階で色々と更新箇所が出てきたので、いったんお客様へ確認する用として現状の各モデルをお清書する。

---

### システムコンテキスト図

```markdown
【目的】
システムに関わる人（役割）・外部システムを洗い出し、関係者間で合意すること。

【主要な確認事項】
システムの目的は過不足ないか？
モデル上に記載される用語は、普段業務の中で用いている用語と合っているか？
システムを利用するにも関わらず、モデル上に記載されていない役割の人はいないか？
システムを利用しないにも関わらず、モデル上に記載されている役割の人はいないか？
システムと連携するにも関わらず、モデル上に記載されていない外部システムはないか？
システムを連携しないにも関わらず、モデル上に記載されている外部システムはないか？

【確認を怠った場合に懸念されるリスク】
実際にシステムを利用するにも関わらずモデルに描画されていない役割の人が存在する場合、その役割からの「要求」や関わる「業務」が今後の検討から漏れる可能性があります。その場合、システムが完成して実際に使い始めてから「使いづらい」「システム化の意味がない」という声をいただくことになる可能性が高いです。
実際にシステムと連携するにも関わらずモデルに描画されていない外部システムが存在する場合、その外部システムとの連携の検討が遅れてしまい、当初のスケジュール通りに連携を実現できない可能性があります。
```

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

left to right direction

file porpose [
【システム化の目的】

・注文業務を自動化することで、
  店員の負担を減らし業務効率化すること
・注文情報をデジタルデータとして蓄積・分析し
  店舗経営の指針とすること
]


storage "システム利用者" #line.dotted {
    actor "客" as customer

    actor "店員" as store_user
    actor "調理スタッフ" as store_chef
    actor "ホールスタッフ" as store_waiter
    actor "店長" as store_manager

    store_manager --|> store_user
    store_chef --|> store_user
    store_waiter --|> store_user
}

component "QRコード注文システム" as system {
    component "QR注文サイト" as qr_order_system
    component "店舗サイト" as store_system
    database "メニュー\n注文データ" as store_database
    qr_order_system -- store_database
    store_system -- store_database
}
storage "外部システム"  as outer_system #line.dotted{
    component QRコード印刷機 as qr_printer
}

' 関連
system -[hidden] porpose
customer -- qr_order_system
store_user -- store_system
store_system --- qr_printer

@enduml
```

---

### ビジネスコンテキスト／ビジネスユースケース図

```markdown
【目的】
システムがどういった業務環境下で使われるのか、システム化対象となる業務を明示すること。

【主要な確認事項】
業務とアクター、システムの関連は適切か？
全体としていくつの業務があるのか明確になっているか？
業務ごとの粒度感は適切か？
価値を提供する単位に分割できているか？（ビジネスユースケース）

【確認を怠った場合に懸念されるリスク】
システムが利用される環境となる業務が漏れている場合、業務上の条件やバリエーションを十分に洗い出せない可能性があります。特に例外的なパターンへの対応などは、システムが利用される環境を十分に整理できていないと見逃されてしまい、「融通の効かないシステム」となる可能性が高いです。
```

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

left to right direction

' アクター
actor 客
node 店舗 #line.dotted {
    actor 店長
    actor 店員
}

' 業務
storage 店舗情報設定
storage メニュー表作成
storage 料理注文
storage 料理提供
storage 食事
storage 会計

' もの
entity 店舗情報
entity メニュー
entity 料理注文履歴
entity 料理

' 関連
店舗情報 -- 店舗情報設定
店舗情報設定 -- 店長
メニュー表作成 -- 店長
メニュー -- メニュー表作成

料理注文 -- メニュー
客 -- 料理注文

料理注文履歴 -- 料理提供
料理提供 -- 店員
料理 -- 料理提供

客 -- 食事
食事 -- 料理

料理注文 -- 料理注文履歴
' 料理注文履歴 -- 会計
客 -- 会計
会計 -- 店員

@enduml
```

---

### 情報モデル／用語集

```markdown
【目的】
システム化対象となる業務に関連している用語・概念を構造化し、関係者間で合意すること。
用語の意味を定義し、プロジェクト関係者間での認識齟齬を防ぐこと。

【主要な確認事項】
現場で使われているが、モデルに記載されていない用語はないか？網羅されているか？
同義語、類義語がないか？
業務の中で用いられる語彙で言い換えられないか？
用語の説明は過不足ないか？（用語集）
用語の英語名は正しいか？（用語集）

【確認を怠った場合に懸念されるリスク】
プロジェクト関係者間同士の認識齟齬がほぼ必ず発生し、その対応のための手戻りでプロジェクトが遅延します。
同義語（英語）がプロジェクト間のコミュニケーションおよびソースコード内に頻発し、保守性が低下、バグ混入率が上昇します。
```

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

card 店舗
card 営業時間
card 最終注文時刻
card テーブル
card QRコード
card 客
card 料理注文
card 食事
card QRコード発行
card 注文伝票
card 注文履歴
card 食事料金合計
card メニュー
card メニュー表
card 料金
card カテゴリー

' 関連
店舗 -- テーブル
店舗 -- 営業時間
店舗 -- 最終注文時刻
QRコード発行 -- QRコード
客 -- QRコード
テーブル -- 食事
客 -- 食事
食事 -- 料理注文
テーブル -- QRコード発行
店舗 -- メニュー表
メニュー表 -- カテゴリー
カテゴリー -- メニュー
食事 -- 注文伝票
メニュー -- 料金
メニュー -- 料理注文
料理注文 -- 注文履歴
食事料金合計 -- 注文履歴

@enduml
```

---

### ユースケース／関連図

```markdown
【目的】
構築対象のシステムにおいて、利用者および外部システムができること／できないことを明示すること。
また、システムの利用ケース各々が、業務上の流れ、起点となる画面および情報に不整合性がないかを確認すること。

【主要な確認事項】
ユースケースの粒度は揃っているか？
業務の流れとユースケースに不整合はないか？
画面とユースケースに不整合はないか？
情報とユースケースに不整合はないか？

【確認を怠った場合に懸念されるリスク】
システムの機能実現を妨げる要因の発見が遅れ、プロジェクトが遅延します。
関係者同士で機能の背景認識齟齬が発生し、想定と異なる成果物が作成される可能性が高くなります。
```

#### ユースケース一覧

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 店員 as store_user
storage store_usecase #line.dotted [
    - ログインする
    - ログアウトする
    - 営業時間を参照する
    - 営業時間を更新する
    - 最終注文時刻を参照する
    - 最終注文時刻を更新する
    - テーブルを登録する
    - テーブルを参照する
    - テーブルを更新する
    - テーブルを削除する
    - カテゴリーを登録する
    - カテゴリーを参照する
    - カテゴリーを更新する
    - カテゴリーを削除する
    - メニューを登録する
    - メニューを参照する
    - メニューを更新する
    - メニューを削除する
    - トークンを発行する
    - QR コードを印刷する
    - QR コードを再印刷する
    - メニュー一覧を見る
    - 料理を注文カートに追加する
    - 料理を注文カートから削除する
    - 料理注文を確定する
    - 料理の注文状況を見る
    - メニューを売り切れにする
    - 料理注文を取消する
    - 料理を提供済みにする
    - テーブルの注文履歴を見る
    - テーブルの注文金額合計を見る
    - テーブルの食事を終了する
]
store_user -- store_usecase

actor "客" as customer
storage end_usecase #line.dotted [
    - メニュー一覧を見る
    - 料理を注文カートに追加する
    - 料理を注文カートから削除する
    - 料理注文を確定する
    - 料理の注文履歴を見る
    - テーブルの注文金額合計を見る
    - テーブルの食事を終了する
]
customer -- end_usecase

actor "システム（cron）" as cron_user
storage cron_usecase #line.dotted [
    - オーダーストップする
]
cron_user -- cron_usecase

@enduml
```

#### 業務フロー・ユースケース関連

##### マスター情報設定

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 店長

店長 --> 店長: 店舗情報設定
note right
    - 営業時間を参照する
    - 営業時間を更新する
    - 最終注文時刻を参照する
    - 最終注文時刻を更新する
    - テーブルを登録する
    - テーブルを参照する
    - テーブルを更新する
    - テーブルを削除する
end note

店長 --> 店長: メニュー表作成
note right
    - カテゴリーを登録する
    - カテゴリーを参照する
    - カテゴリーを更新する
    - カテゴリーを削除する
    - メニューを登録する
    - メニューを参照する
    - メニューを更新する
    - メニューを削除する
end note
@enduml
```

##### 注文～食事～会計

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 客
actor 店員

店員 --> 店員: テーブルの用意をする
note right
    - トークンを発行する
    - QR コードを印刷する
end note

客 --> 店員: 来店する
客 <-- 店員: テーブルに案内する
客 --> 客: QRコードを読み取る

loop
    loop
        客 --> 客: 料理を選ぶ
        note left
    - メニュー一覧を見る
    - 料理を注文カートに追加する
    - 料理を注文カートから削除する
        end note
    end

    客 --> 店員: 料理を注文する
    note left
    - 料理注文を確定する
    end note

    店員 --> 店員: 食材確認する
    note right
    - 料理の注文状況を見る
    - メニューを売り切れにする
    end note

    店員 --> 店員: 調理する

    客 <-- 店員: 料理を提供する
    note right
    - 料理を提供済みにする
    end note

    客 --> 客: 料理を食べる
end


客 --> 客: 注文履歴を確認する
note left
    - テーブルの注文履歴を見る
    - テーブルの注文金額合計を見る
end note

客 --> 店員: 会計する
note left
    - テーブルの食事を終了する
end note

note right
    - テーブルの注文履歴を見る
    - テーブルの注文金額合計を見る
end note

店員 --> 店員: テーブルを片付ける

@enduml
```

##### 注文代行

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 客
actor 店員

客 --> 客: メニューを選ぶ
客 --> 店員: メニューを直接口頭で注文する

店員 --> 店員: 料理注文のシステム入力を代行する
note right
    - メニュー一覧を見る
    - 料理を注文カートに追加する
    - 料理を注文カートから削除する
    - 料理注文を確定する
end note
店員 --> 店員: 調理する
客 <-- 店員: 料理を提供する
客 --> 客: 料理を食べる


@enduml
```

##### QR コード再印刷

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 客
actor 店員

客 --> 店員: QRコードの印刷を依頼する

店員 --> 店員: QRコードを再印刷する
note right
    - QR コードを再印刷する
end note
店員 --> 客: QRコードを渡す



@enduml
```

##### ラストオーダー

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 客
actor 店員
actor システム

客 <-- 店員: ラストオーダー時刻を伝える

システム --> システム: オーダーストップする
activate システム
note right
- オーダーストップする
end note

@enduml
```

##### 注文取消

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

actor 客
actor 店員

客 --> 客: 料理を選ぶ
客 --> 店員: 料理を注文する
客 --> 店員: 注文した料理の取消依頼をする

店員 --> 店員: 料理の注文を取消する
note right
    - 料理注文を取消する
end note

@enduml
```

---

#### 画面・ユースケース関連

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

left to right direction


storage "QR注文サイト" {
    rectangle "メニュー表\n（ホーム）" as customer_home
    rectangle "メニュー詳細\n（注文伝票追加）" as customer_order
    rectangle 注文カート as customer_order_cart
    rectangle 料理注文完了 as customer_order_complete
    rectangle 注文履歴 as customer_order_history
    rectangle 食事終了 as customer_stop
    customer_home -- customer_order
    customer_home -- customer_order_cart
    customer_order -- customer_order_cart
    customer_order_cart -- customer_order_complete

    customer_home -- customer_order_history
    customer_order_history -- customer_stop

    usecase メニュー一覧を見る
    usecase 料理を注文カートに追加する
    usecase 料理を注文カートから削除する
    usecase 料理注文を確定する
    usecase 料理の注文履歴を見る
    usecase 食事の合計金額を見る
    usecase テーブルの食事を終了する

    customer_home ... メニュー一覧を見る
    customer_order .. 料理を注文カートに追加する
    customer_order_cart .. 料理を注文カートから削除する
    customer_order_cart .. 料理注文を確定する
    customer_order_complete .. 料理注文を確定する
    customer_order_history .. 料理の注文履歴を見る
    customer_order_history .. 食事の合計金額を見る
    customer_order_history .. テーブルの食事を終了する
    customer_stop .. テーブルの食事を終了する
}
@enduml
```

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

left to right direction

storage "店舗サイト" {
    rectangle ログイン

    usecase UC_ログイン関連 [
        - ログインする
        - ログアウトする
    ]
    ログイン . UC_ログイン関連

    storage "来店～会計" #line.dotted {
        ' 画面
        rectangle "ダッシュボード\n（各テーブルの状況）" as dashboard
        rectangle "料理注文状況\n（店舗全体の注文一覧）" as order_list
        rectangle "売り切れ設定" as sold_out_setting
        rectangle "テーブル詳細\n（注文履歴一覧）" as table_detail
        rectangle "テーブル詳細\n（メニュー表）"  as table_detail_menu_list
        rectangle "テーブル詳細\n（メニュー詳細）" as table_detail_menu_detail
        rectangle "テーブル詳細\n（注文カート）" as table_detail_order_cart
        rectangle "テーブル詳細\n（注文完了）" as table_detail_order_complete

        dashboard -- table_detail
        table_detail -- table_detail_menu_list
        table_detail -- table_detail_order_cart
        table_detail_menu_list -- table_detail_menu_detail
        table_detail_menu_detail -- table_detail_order_cart
        table_detail_order_cart -- table_detail_order_complete

        ' ユースケース
        usecase トークンを発行する
        usecase UC_QRコード  [
            - QR コードを発行する
            - QR コードを再発行する
        ]
        usecase 料理を注文カートに追加する
        usecase 料理を注文カートから削除する
        usecase 料理注文を確定する
        usecase 料理注文を取消する
        usecase 料理の注文状況を見る
        usecase 料理を提供済みにする
        usecase メニューを売り切れにする
        usecase テーブルの注文履歴を見る
        usecase 食事の合計金額を見る
        usecase テーブルの食事を終了する

        ' 画面 - ユースケース関連
        dashboard .. トークンを発行する
        table_detail . トークンを発行する
        dashboard .. UC_QRコード
        table_detail . UC_QRコード
        table_detail_menu_detail .. 料理を注文カートに追加する
        table_detail_order_cart .. 料理を注文カートから削除する
        table_detail_order_cart .. 料理注文を確定する
        table_detail_order_complete .. 料理注文を確定する
        table_detail .. 料理注文を取消する

        order_list .. 料理注文を取消する
        order_list .. 料理の注文状況を見る
        order_list .. 料理を提供済みにする
        sold_out_setting .. メニューを売り切れにする
        table_detail .. テーブルの注文履歴を見る
        table_detail .. 食事の合計金額を見る
        table_detail .. テーブルの食事を終了する
    }

    storage "マスターデータ設定" #line.dotted {
        ' 画面
        rectangle 店舗設定
        rectangle テーブル管理
        rectangle カテゴリー一覧
        rectangle メニュー一覧
        rectangle メニュー詳細
        rectangle メニュー新規登録

        メニュー一覧 -- メニュー詳細
        メニュー一覧 -- メニュー新規登録

        ' ユースケース
        usecase UC_店舗情報 [
            - 営業時間を参照する
            - 営業時間を更新する
            - 最終注文時刻を参照する
            - 最終注文時刻を更新する
        ]
        usecase UC_テーブル情報 [
            - テーブルを登録する
            - テーブルを参照する
            - テーブルを更新する
            - テーブルを削除する
        ]
        usecase UC_カテゴリー情報 [
            - カテゴリーを登録する
            - カテゴリーを参照する
            - カテゴリーを更新する
            - カテゴリーを削除する
        ]
        usecase UC_メニュー情報 [
            - メニューを削除する
            - メニューを参照する
        ]

        usecase メニューを登録する
        usecase メニューを更新する

        ' 画面 - ユースケース関連
        店舗設定 ... UC_店舗情報
        テーブル管理 ... UC_テーブル情報
        カテゴリー一覧 ... UC_カテゴリー情報
        メニュー一覧 ... UC_メニュー情報
        メニュー新規登録 .. メニューを登録する
        メニュー詳細 .. メニューを更新する
    }
}
@enduml
```

---

### 状態モデル

#### 状態モデル一覧

| 情報           | ステータス |
| -------------- | ---------- |
| 食事ステータス | 食事中     |
|                | 食事終了   |

| 情報               | ステータス       |
| ------------------ | ---------------- |
| メニューステータス | 注文可能         |
|                    | 売り切れ         |
|                    | オーダーストップ |

| 情報                 | ステータス |
| -------------------- | ---------- |
| 注文カートステータス | 空         |
|                      | 未注文     |

| 情報               | ステータス |
| ------------------ | ---------- |
| 料理注文ステータス | 注文済み   |
|                    | 提供済み   |
|                    | 取消済み   |

#### 状態モデル図

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam shadowing false
hide footbox

storage "食事ステータス" as meal_status #line.dotted {
    ' 開始-終了
    circle 開始 as meal_status_start
    circle 終了 as meal_status_end #black
    ' ステータス
    storage 食事中 as meal_while
    storage 食事終了 as meal_end
    ' ユースケース
    usecase 料理を注文する as order_food
    usecase 食事を終了する as finish_meal


    meal_status_start --> order_food
    order_food --> meal_while

    meal_while -> finish_meal
    finish_meal --> meal_end
    meal_end --> meal_status_end
}

storage "メニューステータス" as menu_status #line.dotted {

    ' 開始-終了
    circle 開始 as menu_status_start
    circle 終了 as menu_status_end #black
    ' ステータス
    storage 注文可能 as menu_orderable
    storage 注文不可 as menu_unorderable {
        storage 売り切れ as menu_soldout
        storage オーダーストップ as menu_order_stop
    }
    ' ユースケース
    usecase メニューを売り切れにする
    usecase オーダーストップする

    menu_status_start --> menu_orderable

    menu_orderable -> メニューを売り切れにする
    メニューを売り切れにする --> menu_soldout
    menu_soldout --> menu_status_end

    menu_orderable --> オーダーストップする
    オーダーストップする --> menu_order_stop
    menu_order_stop --> menu_status_end
}

storage "注文カートステータス" as order_cart_status #line.dotted {
    ' 開始-終了
    circle 開始 as order_cart_status_start
    circle 終了 as order_cart_status_end #black
    ' ステータス
    storage 空 as order_cart_empty
    storage 未注文 as order_cart_contain_unorderd
    ' ユースケース
    usecase 料理を注文カートに追加する
    usecase 料理を注文カートから削除する
    usecase 注文を確定する

    order_cart_status_start --> order_cart_empty
    order_cart_empty -> 料理を注文カートに追加する
    料理を注文カートに追加する --> order_cart_contain_unorderd
    料理を注文カートに追加する <-- order_cart_contain_unorderd

    order_cart_contain_unorderd --> 注文を確定する
    order_cart_empty <-- 注文を確定する
    order_cart_contain_unorderd --> 料理を注文カートから削除する
    order_cart_empty <-- 料理を注文カートから削除する
    order_cart_empty --> order_cart_status_end
}

storage "料理注文ステータス" as food_order_status #line.dotted {
    ' 開始-終了
    circle 開始 as food_order_status_start
    circle 終了 as food_order_status_end #black
    ' ステータス
    storage 注文済み as food_ordered
    storage 提供済み as food_served
    storage 取消済み as food_order_canceled
    ' ユースケース
    usecase 料理を注文する
    usecase 料理を提供済みにする
    usecase 料理注文を取消する

    food_order_status_start --> 料理を注文する
    料理を注文する --> food_ordered

    food_ordered -> 料理を提供済みにする
    料理を提供済みにする --> food_served
    food_served --> food_order_status_end

    food_ordered --> 料理注文を取消する
    料理注文を取消する --> food_order_canceled
    food_order_canceled --> food_order_status_end
}

' レイアウト
meal_status -----[hidden]- order_cart_status
meal_status -----[hidden]- food_order_status

@enduml
```

---

### 論理 ERD／ユースケース対応表

（※お客様にモデル自体を確認してもらうというよりは、適宜こちらから懸念点を聞いていくスタイルで進める）

```markdown
【目的】
構築対象のシステムで管理されるべきデータとその構造について、ビジネス上の妥当性を確認すること。

【主要な確認事項】
管理対象データに過不足はないか？
エンティティ同士の関係性は、業務上の関係性と一致するか？
各ユースケースを実現できるか？

【確認を怠った場合に懸念されるリスク】
システムの機能実現を妨げる要因の発見が遅れ、プロジェクトが遅延します。
```

```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentBorderColor #000000
skinparam linetype ortho
skinparam shadowing false
hide footbox
hide circle

entity ログインアカウント {
  アカウントID
  --
  パスワード
}

entity 営業時間 {
  営業時間ID
  --
  営業開始時刻
  営業終了時刻
  最終注文時刻
}

entity カテゴリー {
  カテゴリーID
  --
  カテゴリー名
}

entity メニュー {
  メニューID
  --
  カテゴリーID <<FK>>
  メニュー名
  メニュー料金
  写真URL
  メニューステータス
}

entity テーブル {
  テーブルID
  --
  テーブル名
  テーブルステータス
}

entity トークン発行 {
  トークン発行ID
  --
  テーブルID<<FK>>
  トークン
  発行日時
  有効期限
  トークンステータス
}

entity 食事 {
  食事ID
  --
  トークン発行ID<<FK>>
  （テーブルID）<<FK>>
  食事ステータス
  合計金額
}

entity 料理注文 {
  料理注文ID
  --
  食事ID <<FK>>
  メニューID <<FK>>
  数量
  注文日時
  料理注文ステータス
  （テーブルID） <<FK>>
}

カテゴリー ||--o{ メニュー

テーブル ||--o{ 食事
トークン発行 ||..o| 食事
テーブル ||..o{ トークン発行

食事 ||--o{ 料理注文
メニュー ||--o{ 料理注文

@enduml
```

---

### ユースケース・データ対応マトリクス

|                              | ログインアカウント | 営業時間 | カテゴリー | メニュー | テーブル | トークン発行 | 食事 | 料理注文 |
| :--------------------------- | :----------------- | :------- | :--------- | :------- | :------- | :----------- | :--- | :------- |
| ログインする                 | R                  | -        | -          | -        | -        | -            | -    | -        |
| ログアウトする               | -                  | -        | -          | -        | -        | -            | -    | -        |
| 営業時間を参照する           | -                  | R        | -          | -        | -        | -            | -    | -        |
| 営業時間を更新する           | -                  | CUD      | -          | -        | -        | -            | -    | -        |
| 最終注文時刻を参照する       | -                  | R        | -          | -        | -        | -            | -    | -        |
| 最終注文時刻を更新する       | -                  | CUD      | -          | -        | -        | -            | -    | -        |
| テーブルを登録する           | -                  | -        | -          | -        | C        | -            | -    | -        |
| テーブルを参照する           | -                  | -        | -          | -        | R        | -            | -    | -        |
| テーブルを更新する           | -                  | -        | -          | -        | U        | -            | -    | -        |
| テーブルを削除する           | -                  | -        | -          | -        | D        | -            | -    | -        |
| カテゴリーを登録する         | -                  | -        | C          | -        | -        | -            | -    | -        |
| カテゴリーを参照する         | -                  | -        | R          | -        | -        | -            | -    | -        |
| カテゴリーを更新する         | -                  | -        | U          | -        | -        | -            | -    | -        |
| カテゴリーを削除する         | -                  | -        | D          | -        | -        | -            | -    | -        |
| メニューを登録する           | -                  | -        | -          | C        | -        | -            | -    | -        |
| メニューを参照する           | -                  | -        | -          | R        | -        | -            | -    | -        |
| メニューを更新する           | -                  | -        | -          | U        | -        | -            | -    | -        |
| メニューを削除する           | -                  | -        | -          | D        | -        | -            | -    | -        |
| トークンを発行する           | -                  | -        | -          | -        | R        | RUC          | -    | -        |
| QR コードを印刷する          | -                  | -        | -          | -        | R        | R            | -    | -        |
| QR コードを再印刷する        | -                  | -        | -          | -        | R        | R            | -    | -        |
| メニュー一覧を見る           | -                  | -        | R          | R        | -        | -            | -    | -        |
| 料理を注文カートに追加する   | -                  | R        | R          | R        | -        | -            | -    | -        |
| 料理を注文カートから削除する | -                  | R        | R          | R        | -        | -            | -    | -        |
| 料理注文を確定する           | -                  | R        | R          | R        | R        | R            | RUC  | C        |
| 料理の注文状況を見る         | -                  | -        | R          | R        | R        | R            | R    | R        |
| メニューを売り切れにする     | -                  | -        | -          | U        | -        | -            | -    | -        |
| 料理注文を取消する           | -                  | -        | -          | R        | R        | R            | R    | U        |
| 料理を提供済みにする         | -                  | -        | -          | -        | R        | R            | R    | U        |
| テーブルの注文履歴を見る     | -                  | -        | R          | R        | R        | R            | R    | R        |
| 食事の合計金額を見る         | -                  | -        | R          | R        | R        | R            | R    | -        |
| テーブルの食事を終了する     | -                  | -        | -          | -        | R        | U            | U    | R        |

---

### 主要な確認事項

#### メニューのバリエーション

- 店舗で現在実際に提供しているメニュー表を共有いただけるか？
  - （単純にカテゴリー／メニューというデータ形式で表現しきれるのかどうかを懸念して）
  - （ソースやご飯の種類を選択できるなどのバリエーションはあるか？）
  - （セットメニュー／コースメニューはあるか？）

#### アカウント管理

- 店舗サイトへのアクセスは、店舗が個別に用意する端末からのみを想定しているか？もしくは店員のプライベート端末からもアクセスされる想定か？
- 店舗サイトは ID とパスワードによる認証を設ける想定だが問題ないか？
- パスワードを忘れた場合の救済については、運用上で賄う想定だが問題ないか？アプリケーション上に設ける必要があるか？
- マスター操作等は店長のみが実施できるような制約が必要か？それはなぜか？ その他アクセスするアカウントによって表示内容や操作権限を調整する必要があるか？

#### 注文カート

- 料理をまとめて注文するために、一時的にストックしておくための場所を、モデル上ではひとまず「注文カート」としているが、店舗でよく利用する言葉が存在するのであれば置き換えたい。そういった言葉はあるか？

- 複数人が同時に各々のスマホ端末で、注文操作（注文カートへストック → 注文確定）を行うケースも想定する。
  - このとき「注文カート」を共通データとしてサーバ側で管理し各端末へ共有する仕組みにすると、自端末の操作中に、他端末の操作でカート中の料理が注文されるケースも発生し得る。
  - その結果、お客さんが気づかずに重複した注文を行ったり、その対応として店員が手動で取消を実施するなどの、オペレーションを発生させる恐れがある。
  - そのため、以前の要望では「注文カート」は各端末で独立して保持する（端末を超えて共有しない）方式として問題ないか？

#### 注文提供、注文取消

- 料理をお客さんへ提供する度に、店員（ホールスタッフ）がスマホ or タブレット端末からデータを更新（提供済みへとステータス更新）操作する想定だが、オペレーションとして問題ないか？

- 注文の取消は、店員（ホールスタッフ）がスマホ or タブレット端末からデータを更新（取消済みへとステータス更新）操作する想定だが、オペレーションとして問題ないか？

- 注文取消のタイミングとしては、「注文を受けて料理を作り始める前」から「注文を受けて料理を作りお客さんへのテーブルに提供後」のどのタイミングも有り得る想定であり、とくに制約を設けていないが問題ないか。

#### 売り切れ対応

- 売り切れ設定については、店員（調理スタッフ or ホールスタッフ）が食材の残量を確認してメニューごとに個別でスマホやタブレット端末から操作する想定だが、オペレーションとして問題ないか？
- 売り切れ設定したメニューを、元に戻すケースはあるか？

#### その他機能要望

- 注文履歴から再注文する機能
- 店員呼び出し機能
- 税率設定機能
- 決済機能（クレカ）
- POS レジ連携機能
- 売上の日次、月次レポート等の表示、csv 出力機能

---

**モデルのイマイチな点**

- 用語「料理注文」や「トークン発行」が一般的な用語ではない
- 用語「注文履歴」が ERD にない
- テーブルの状態遷移周りが怪しい
  - 食事終了してから、次のお客さんが着席して食事を注文するまでのフローを明確にする必要がある

---

整理したモデルとその他確認事項をもってお客様との打ち合わせに臨む。
※情報モデル／システムコンテキストに対応する、用語集（用語＋分類＋説明）や画面一覧表も併せて作成・共有しておく、画面の UI とかはもうちょいあとで作成する

続き
https://qiita.com/s3imamura/items/0885148a78c3920dfebb