1. ユースケース

1.1. 認証

Diagram

1.2. ユーザー管理

Diagram

1.3. マスタ管理

1.3.1. 部門

Diagram

1.3.2. 社員

Diagram

1.3.3. 商品

Diagram

1.3.4. 取引先

Diagram

1.3.5. コード

Diagram

1.4. 監査

Diagram

1.5. ダウンロード

Diagram

1.6. 販売

1.6.1. 受注

Diagram

1.6.2. 出荷/売上

Diagram

1.6.3. 請求

Diagram

2. 仕様

2.1. 認証

# language: ja

機能: ユーザー認証

  管理者として
  アプリケーションユーザーの認証をしたい
  なぜなら認証されたユーザーしか利用できないから

  背景:
    前提:UC001 ユーザーが登録されている

  シナリオ: 管理者を認証する
    もし:UC001 "管理者権限" でログインする
    ならば:UC001 "管理者" として認証される

  シナリオ: ユーザーを認証する
    もし:UC001 "利用者権限" でログインする
    ならば:UC001 "利用者" として認証される

2.2. ユーザー管理

# language: ja

機能: ユーザー管理

  管理者として
  アプリケーションユーザーの登録をしたい
  なぜなら登録されたユーザーしか利用できないから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC002 "管理者" である

  シナリオ: ユーザー一覧を取得する
    もし:UC002 "ユーザー一覧" を取得する
    ならば:UC002 "ユーザー一覧" を取得できる

  シナリオ: ユーザーを新規登録する
    もし:UC002 ユーザーID "U000005" パスワード "a234567Z" で新規登録する
    ならば:UC002 "ユーザーを登録しました" が表示される
    もし:UC002 ユーザーID "U000005" パスワード "a234567Z" で認証する
    ならば:UC002 ユーザーが認証される

  シナリオ: ユーザーを取得する
    もし:UC002 ユーザーID "U000005" パスワード "a234567Z" で新規登録する
    もし:UC002 ユーザーID "U000005" で検索する
    ならば:UC002 ユーザー "U000005" を取得できる

  シナリオ: 登録済みユーザーを更新登録する
    もし:UC002 ユーザーID "U000005" パスワード "a234567Z" で新規登録する
    かつ:UC002 ユーザーID "U000005" の情報を更新する
    ならば:UC002 "ユーザーを更新しました" が表示される
    もし:UC002 ユーザーID "U000005" パスワード "a234567X" で認証する
    ならば:UC002 ユーザーが認証される

  シナリオ: 登録済みユーザーを削除する
    もし:UC002 ユーザーID "U000005" パスワード "a234567Z" で新規登録する
    かつ:UC002 ユーザーID "U000005" を削除する
    ならば:UC002 "ユーザーを削除しました" が表示される

2.3. マスタ管理

2.3.1. 部門

# language: ja

機能: 部門マスタ管理

  管理者として
  部門の管理をしたい
  なぜならマスタデータが必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC003 "管理者" である
    前提:UC003 "部門データ" が登録されている

  シナリオ: 部門一覧を取得する
    もし:UC003 "部門一覧" を取得する
    ならば:UC003 "部門一覧" を取得できる

  シナリオ: 部門を新規登録する
    もし:UC003 部門コード "90000" 部門名 "営業部" で新規登録する
    ならば:UC003 "部門を登録しました" が表示される

  シナリオ: 部門を取得する
    もし:UC003 部門コード "90000" 部門名 "営業部" で新規登録する
    もし:UC003 部門コード "90000" で検索する
    ならば:UC003 "営業部" の部門が取得できる

  シナリオ: 登録済み部門を更新登録する
    もし:UC003 部門コード "90000" 部門名 "営業部" で新規登録する
    かつ:UC003 部門コード "90000" の情報を更新する (部門名 "マーケティング部")
    ならば:UC003 "部門を更新しました" が表示される
    もし:UC003 部門コード "90000" で検索する
    ならば:UC003 "マーケティング部" の部門が取得できる

  シナリオ: 登録済み部門を削除する
    もし:UC003 部門コード "90000" 部門名 "営業部" で新規登録する
    かつ:UC003 部門コード "90000" を削除する
    ならば:UC003 "部門を削除しました" が表示される

  シナリオ: 部門を検索する
    もし:UC003 開始期間を "2021-01-01T00:00:00+09:00" から "9999-12-31T00:00:00+09:00" で検索する
    ならば:UC003 検索結果一覧を取得できる

2.3.2. 社員

# language: ja

機能: 社員マスタ管理

  管理者として
  社員の管理をしたい
  なぜならマスタデータが必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC004 "管理者" である
    前提:UC004 "部門データ" が登録されている
    前提:UC004 "社員データ" が登録されている

  シナリオ: 社員一覧を取得する
    もし:UC004 "社員一覧" を取得する
    ならば:UC004 "社員一覧" を取得できる

  シナリオ: 社員を新規登録する
    もし:UC004 社員コード "EMP999" 社員名 "山田 太郎" 社員名カナ "ヤマダ タロウ" で新規登録する
    ならば:UC004 "社員を登録しました" が表示される

  シナリオ: 社員を取得する
    もし:UC004 社員コード "EMP999" 社員名 "山田 太郎" 社員名カナ "ヤマダ タロウ" で新規登録する
    もし:UC004 社員コード "EMP999" で検索する
    ならば:UC004 社員 "山田 太郎" を取得できる

  シナリオ: 登録済み社員を更新登録する
    もし:UC004 社員コード "EMP999" 社員名 "山田 太郎" 社員名カナ "ヤマダ タロウ" で新規登録する
    かつ:UC004 社員コード "EMP999" の情報を更新する (社員名 "山田 花子" 社員名カナ "ヤマダ ハナコ")
    ならば:UC004 "社員を更新しました" が表示される
    もし:UC004 社員コード "EMP999" で検索する
    ならば:UC004 社員 "山田 花子" を取得できる

  シナリオ: 登録済み社員を削除する
    もし:UC004 社員コード "EMP999" 社員名 "山田 太郎" 社員名カナ "ヤマダ タロウ" で新規登録する
    かつ:UC004 社員コード "EMP999" を削除する
    ならば:UC004 "社員を削除しました" が表示される

  シナリオ: 社員を検索する
    もし:UC004 社員コード "EMP999" 社員名 "山田 太郎" 社員名カナ "ヤマダ タロウ" で新規登録する
    もし:UC004 社員コード "EMP998" 社員名 "山田 ジロウ" 社員名カナ "ヤマダ ジロウ" で新規登録する
    もし:UC004 社員名 "山田" で検索する
    ならば:UC004 検索結果一覧を取得できる

2.3.3. 商品

# language: ja

機能: 商品マスタ管理

  管理者として
  商品の管理をしたい
  なぜならマスタデータが必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC005 "管理者" である
    前提:UC005 "商品データ" が登録されている

  シナリオ: 商品一覧を取得する
    もし:UC005 "商品一覧" を取得する
    ならば:UC005 "商品一覧" を取得できる

  シナリオ: 商品を新規登録する
    もし:UC005 商品コード "10101001" 商品名 "鶏ささみ" で新規登録する
    ならば:UC005 "商品を登録しました" が表示される

  シナリオ: 商品を取得する
    もし:UC005 商品コード "10101001" 商品名 "鶏ささみ" で新規登録する
    もし:UC005 商品コード "10101001" で検索する
    ならば:UC005 "鶏ささみ" の商品が取得できる

  シナリオ: 登録済み商品を更新登録する
    もし:UC005 商品コード "10101001" 商品名 "鶏ささみ" で新規登録する
    かつ:UC005 商品コード "10101001" の情報を更新する (商品名 "鶏レバー")
    ならば:UC005 "商品を更新しました" が表示される
    もし:UC005 商品コード "10101001" で検索する
    ならば:UC005 "鶏レバー" の商品が取得できる

  シナリオ: 登録済み商品を削除する
    もし:UC005 商品コード "10101001" 商品名 "鶏ささみ" で新規登録する
    かつ:UC005 商品コード "10101001" を削除する
    ならば:UC005 "商品を削除しました" が表示される

  シナリオ: 商品を検索する
    もし:UC005 商品区分 "その他" で検索する
    ならば:UC005 商品検索結果一覧を取得できる

  シナリオ: 商品分類一覧を取得する
    もし:UC005 "商品分類一覧" を取得する
    ならば:UC005 "商品分類一覧" を取得できる

  シナリオ: 商品分類を新規登録する
    もし:UC005 商品分類コード "00101000" 商品分類名 "食肉" で新規登録する
    ならば:UC005 "商品分類を登録しました" が表示される

  シナリオ: 商品分類を取得する
    もし:UC005 商品分類コード "00101000" 商品分類名 "食肉" で新規登録する
    もし:UC005 商品分離コード "00101000" で検索する
    ならば:UC005 "食肉" の商品分類が取得できる

  シナリオ: 登録済み商品分類を更新登録する
    もし:UC005 商品分類コード "00101000" 商品分類名 "食肉" で新規登録する
    かつ:UC005 商品分類コード "00101000" の情報を更新する (商品分類名 "鶏肉")
    ならば:UC005 "商品分類を更新しました" が表示される
    もし:UC005 商品分離コード "00101000" で検索する
    ならば:UC005 "鶏肉" の商品分類が取得できる

  シナリオ: 登録済み商品分類を削除する
    もし:UC005 商品分類コード "00101000" 商品分類名 "食肉" で新規登録する
    かつ:UC005 商品分類コード "00101000" を削除する
    ならば:UC005 "商品分類を削除しました" が表示される

  シナリオ: 商品分類を検索する
    もし:UC005 商品分類パス "カテゴリ1" で検索する
    ならば:UC005 商品分類検索結果一覧を取得できる

2.3.4. 取引先

# language: ja
機能: 取引先分類マスタ管理
  管理者として
  取引先分類の管理をしたい
  なぜならマスタデータが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC009 "管理者" である
    前提:UC009 "取引先分類データ" が登録されている

  シナリオ: 取引先分類一覧を取得する
    もし:UC009 "取引先分類一覧" を取得する
    ならば:UC009 "取引先分類一覧" を取得できる

  シナリオ: 取引先分類を新規登録する
    もし:UC009 取引先分類コード "9" 取引先分類名 "小売業" で新規登録する
    ならば:UC009 "取引先分類を登録しました" が表示される

  シナリオ: 取引先分類を取得する
    もし:UC009 取引先分類コード "9" 取引先分類名 "小売業" で新規登録する
    もし:UC009 取引先分類コード "9" で検索する
    ならば:UC009 "小売業" の取引先分類が取得できる

  シナリオ: 登録済み取引先分類を更新登録する
    もし:UC009 取引先分類コード "9" 取引先分類名 "小売業" で新規登録する
    かつ:UC009 取引先分類コード "9" の情報を更新する (取引先分類名 "卸売業")
    ならば:UC009 "取引先分類を更新しました" が表示される
    もし:UC009 取引先分類コード "9" で検索する
    ならば:UC009 "卸売業" の取引先分類が取得できる

  シナリオ: 登録済み取引先分類を削除する
    もし:UC009 取引先分類コード "9" 取引先分類名 "小売業" で新規登録する
    かつ:UC009 取引先分類コード "9" を削除する
    ならば:UC009 "取引先分類を削除しました" が表示される

  シナリオ: 取引先分類を検索する
    もし:UC009 取引先分類名 "取引先分類種別" で検索する
    ならば:UC009 取引先分類検索結果一覧を取得できる
# language: ja
機能: 取引先グループマスタ管理
  管理者として
  取引先グループの管理をしたい
  なぜならマスタデータが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC008 "管理者" である
    前提:UC008 "取引先グループデータ" が登録されている
  シナリオ: 取引先グループ一覧を取得する
    もし:UC008 "取引先グループ一覧" を取得する
    ならば:UC008 "取引先グループ一覧" を取得できる
  シナリオ: 取引先グループを新規登録する
    もし:UC008 取引先グループコード "0010" 取引先グループ名 "食品卸売業" で新規登録する
    ならば:UC008 "取引先グループを登録しました" が表示される
  シナリオ: 取引先グループを取得する
    もし:UC008 取引先グループコード "0010" 取引先グループ名 "食品卸売業" で新規登録する
    もし:UC008 取引先グループコード "0010" で検索する
    ならば:UC008 "食品卸売業" の取引先グループが取得できる
  シナリオ: 登録済み取引先グループを更新登録する
    もし:UC008 取引先グループコード "0010" 取引先グループ名 "食品卸売業" で新規登録する
    かつ:UC008 取引先グループコード "0010" の情報を更新する (取引先グループ名 "飲料卸売業")
    ならば:UC008 "取引先グループを更新しました" が表示される
    もし:UC008 取引先グループコード "0010" で検索する
    ならば:UC008 "飲料卸売業" の取引先グループが取得できる
  シナリオ: 登録済み取引先グループを削除する
    もし:UC008 取引先グループコード "0010" 取引先グループ名 "食品卸売業" で新規登録する
    かつ:UC008 取引先グループコード "0010" を削除する
    ならば:UC008 "取引先グループを削除しました" が表示される
  シナリオ: 取引先グループを検索する
    もし:UC008 取引先グループ名 "取引先グループ" で検索する
    ならば:UC008 取引先グループ検索結果一覧を取得できる
# language: ja
機能: 取引先マスタ管理
  管理者として
  取引先マスタの管理をしたい
  なぜなら業務運営のために取引先データが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC011 "管理者" である
    前提:UC011 "取引先データ" が登録されている

  シナリオ: 取引先一覧を取得する
    もし:UC011 "取引先一覧" を取得する
    ならば:UC011 "取引先一覧" を取得できる

  シナリオ: 新規取引先を登録する
    もし:UC011 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    ならば:UC011 "取引先を登録しました" が表示される

  シナリオ: 取引先情報を取得する
    もし:UC011 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    もし:UC011 取引先コード "009" で検索する
    ならば:UC011 "株式会社サンプル" の取引先が取得できる

  シナリオ: 登録済み取引先を更新登録する
    もし:UC011 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    かつ:UC011 取引先コード "009" の情報を更新する (名前 "株式会社アップデート")
    ならば:UC011 "取引先を更新しました" が表示される
    もし:UC011 取引先コード "009" で検索する
    ならば:UC011 "株式会社アップデート" を取得できる

  シナリオ: 登録済み取引先を削除する
    もし:UC011 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    かつ:UC011 取引先コード "009" を削除する
    ならば:UC011 "取引先を削除しました" が表示される
    もし:UC011 取引先コード "009" で検索する
    ならば:UC011 "該当する取引先が存在しません" が表示される

  シナリオ: 取引先を検索する
    もし:UC011 名前 "取引先" で検索する
    ならば:UC011 取引先検索結果一覧を取得できる
# language: ja
機能: 顧客マスタ管理
  管理者として
  顧客マスタの管理をしたい
  なぜなら業務運営のために顧客データが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC012 "管理者" である
    前提:UC012 "取引先データ" が登録されている
    前提:UC012 "顧客データ" が登録されている

  シナリオ: 顧客一覧を取得する
    もし:UC012 "顧客一覧" を取得する
    ならば:UC012 "顧客一覧" を取得できる

  シナリオ: 新規顧客を登録する
    もし:UC012 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    もし:UC012 顧客コード "009" 名前 "営業1課" で新規登録する
    ならば:UC012 "顧客を登録しました" が表示される

  シナリオ: 顧客情報を取得する
    もし:UC012 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    もし:UC012 顧客コード "009" 名前 "営業1課" で新規登録する
    もし:UC012 顧客コード "009" で検索する
    ならば:UC012 "営業1課" の顧客が取得できる

  シナリオ: 登録済み顧客を更新登録する
    もし:UC012 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    もし:UC012 顧客コード "009" 名前 "営業1課" で新規登録する
    かつ:UC012 顧客コード "009" の情報を更新する (名前 "営業3課")
    ならば:UC012 "顧客を更新しました" が表示される
    もし:UC012 顧客コード "009" で検索する
    ならば:UC012 "営業3課" を取得できる

  シナリオ: 登録済み顧客を削除する
    もし:UC012 取引先コード "009" 名前 "株式会社サンプル" で新規登録する
    もし:UC012 顧客コード "009" 名前 "営業1課" で新規登録する
    かつ:UC012 顧客コード "009" を削除する
    ならば:UC012 "顧客を削除しました" が表示される
    もし:UC012 顧客コード "009" で検索する
    ならば:UC012 "該当する顧客が存在しません" が表示される

  シナリオ: 顧客を検索する
    もし:UC012 名前 "山田" で検索する
    ならば:UC012 顧客検索結果一覧を取得できる
# language: ja
機能: 仕入先マスタ管理
  管理者として
  仕入先マスタの管理をしたい
  なぜなら業務運営のために仕入先データが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC013 "管理者" である
    前提:UC013 "取引先データ" が登録されている
    前提:UC013 "仕入先データ" が登録されている

  シナリオ: 仕入先一覧を取得する
    もし:UC013 "仕入先一覧" を取得する
    ならば:UC013 "仕入先一覧" を取得できる

  シナリオ: 新規仕入先を登録する
    もし:UC013 取引先コード "100" 名前 "株式会社仕入先A" で新規登録する
    もし:UC013 仕入先コード "100" 名前 "商品供給部門" で新規登録する
    ならば:UC013 "仕入先を登録しました" が表示される

  シナリオ: 仕入先情報を取得する
    もし:UC013 取引先コード "100" 名前 "株式会社仕入先A" で新規登録する
    もし:UC013 仕入先コード "100" 名前 "商品供給部門" で新規登録する
    もし:UC013 仕入先コード "100" で検索する
    ならば:UC013 "商品供給部門" の仕入先が取得できる

  シナリオ: 登録済み仕入先を更新登録する
    もし:UC013 取引先コード "100" 名前 "株式会社仕入先A" で新規登録する
    もし:UC013 仕入先コード "100" 名前 "商品供給部門" で新規登録する
    かつ:UC013 仕入先コード "100" の情報を更新する (名前 "新商品供給部門")
    ならば:UC013 "仕入先を更新しました" が表示される
    もし:UC013 仕入先コード "202" で検索する
    ならば:UC013 "新商品供給部門" を取得できる

  シナリオ: 登録済み仕入先を削除する
    もし:UC013 取引先コード "100" 名前 "株式会社仕入先A" で新規登録する
    もし:UC013 仕入先コード "100" 名前 "商品供給部門" で新規登録する
    かつ:UC013 仕入先コード "100" を削除する
    ならば:UC013 "仕入先を削除しました" が表示される
    もし:UC013 仕入先コード "202" で検索する
    ならば:UC013 "該当する仕入先が存在しません" が表示される

  シナリオ: 仕入先を検索する
    もし:UC013 名前 "仕入先" で検索する
    ならば:UC013 仕入先検索結果一覧を取得できる

2.3.5. コード

# language: ja
機能: 地域コードマスタ管理
  管理者として
  地域コードの管理をしたい
  なぜならマスタデータが必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC010 "管理者" である
    前提:UC010 "地域コードデータ" が登録されている
  シナリオ: 地域コード一覧を取得する
    もし:UC010 "地域コード一覧" を取得する
    ならば:UC010 "地域コード一覧" を取得できる
  シナリオ: 地域コードを新規登録する
    もし:UC010 地域コード "R009" 地域名 "北海道" で新規登録する
    ならば:UC010 "地域コードを登録しました" が表示される
  シナリオ: 地域コードを取得する
    もし:UC010 地域コード "R009" 地域名 "北海道" で新規登録する
    もし:UC010 地域コード "R009" で検索する
    ならば:UC010 "北海道" の地域コードが取得できる
  シナリオ: 登録済み地域コードを更新登録する
    もし:UC010 地域コード "R009" 地域名 "北海道" で新規登録する
    かつ:UC010 地域コード "R009" の情報を更新する (地域名 "東北")
    ならば:UC010 "地域コードを更新しました" が表示される
    もし:UC010 地域コード "R009" で検索する
    ならば:UC010 "東北" の地域コードが取得できる
  シナリオ: 登録済み地域コードを削除する
    もし:UC010 地域コード "R009" 地域名 "北海道" で新規登録する
    かつ:UC010 地域コード "R009" を削除する
    ならば:UC010 "地域コードを削除しました" が表示される
  シナリオ: 地域コードを検索する
    もし:UC010 地域名 "地域名" で検索する
    ならば:UC010 地域コード検索結果一覧を取得できる

2.4. 監査

# language: ja

機能: 監査

  管理者として
  アプリケーションの実行履歴を把握したい
  なぜならユーザーの操作履歴を監査する必要があるから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC006 "管理者" である
    前提:UC006 アプリケーションが実行されている

  シナリオ: 実行履歴一覧を取得する
    もし:UC006 "アプリケーション実行履歴" を取得する
    ならば:UC006 "アプリケーション実行履歴一覧" を取得できる

  シナリオ: 実行履歴を取得する
    もし:UC006 アプリケーション実行履歴を検索する
    ならば:UC006 アプリケーション実行履歴を取得できる

  シナリオ: 実行履歴を削除する
    もし:UC006 アプリケーション実行履歴を削除する
    ならば:UC006 "アプリケーション実行履歴を削除しました" が表示される

2.5. ダウンロード

# language: ja

機能: ダウンロード

  管理者として
  アプリケーションのダウンロードを実行したい
  なぜならデータを加工するために必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC007 "管理者" である
    前提:UC007 ダウンロードデータが存在する

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "部門" ダウンロード件数を取得する
    ならば:UC007 4件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "社員" ダウンロード件数を取得する
    ならば:UC007 4件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "商品分類" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "商品" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "取引先グループ" ダウンロード件数を取得する
    ならば:UC007 2件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "取引先" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "顧客" ダウンロード件数を取得する
    ならば:UC007 1件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "仕入先" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "受注" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "出荷" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "売上" ダウンロード件数を取得する
    ならば:UC007 4件のダウンロード件数を取得できる

  シナリオ: ダウンロード件数を取得する
    もし:UC007 "請求" ダウンロード件数を取得する
    ならば:UC007 3件のダウンロード件数を取得できる

2.6. 販売

2.6.1. 受注

# language: ja
機能: 受注管理
  管理者として
  受注業務を管理したい
  なぜなら受注データの一元管理が必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC014 "管理者" である
    前提:UC014 "顧客データ" が登録されている
    前提:UC014 "商品データ" が登録されている
    前提:UC014 "受注データ" が登録されている

  シナリオ: 受注一覧を取得する
    もし:UC014 "受注一覧" を取得する
    ならば:UC014 "受注一覧" を取得できる

  シナリオ: 受注を新規登録する
    もし:UC014 受注番号 "OD00000009" 受注日 "2024-11-01T00:00:00+09:00" 部門コード "10000" 顧客コード "009" 社員コード "EMP001" 希望納期 "2024-11-10T00:00:00+09:00" で新規登録する
    ならば:UC014 "受注を登録しました" が表示される

  シナリオ: 受注情報を取得する
    もし:UC014 受注番号 "OD00000009" 受注日 "2024-11-01T00:00:00+09:00" 部門コード "10000" 顧客コード "009" 社員コード "EMP001" 希望納期 "2024-11-10T00:00:00+09:00" で新規登録する
    もし:UC014 受注番号 "OD00000009" で検索する
    ならば:UC014 受注番号 "OD00000009" の受注情報を取得できる

  シナリオ: 登録済み受注を更新する
    もし:UC014 受注番号 "OD00000009" 受注日 "2024-11-01T00:00:00+09:00" 部門コード "10000" 顧客コード "009" 社員コード "EMP001" 希望納期 "2024-11-10T00:00:00+09:00" で新規登録する
    かつ:UC014 受注番号 "OD00000009" の情報を更新する (希望納期 "2024-11-15T00:00:00+09:00")
    ならば:UC014 "受注を更新しました" が表示される
    もし:UC014 受注番号 "OD00000009" で検索する
    ならば:UC014 希望納期 "2024-11-15T00:00" を含む受注情報が取得できる

  シナリオ: 登録済み受注を削除する
    もし:UC014 受注番号 "OD00000009" 受注日 "2024-11-01T00:00:00+09:00" 部門コード "10000" 顧客コード "009" 社員コード "EMP001" 希望納期 "2024-11-10T00:00:00+09:00" で新規登録する
    かつ:UC014 受注番号 "OD00000009" を削除する
    ならば:UC014 "受注を削除しました" が表示される

  シナリオ: 受注明細を追加登録する
    もし:UC014 受注番号 "OD00000009" をもとに以下の受注明細を登録する
      | 受注番号    | 枝番 | 商品コード | 商品名   | 数量 | 単価 |
      | OD00000009 | 1   | 10101001   | 鶏ささみ | 10   | 500  |
    ならば:UC014 "受注を登録しました" が表示される
    もし:UC014 受注番号 "OD00000009" で検索する
    ならば:UC014 明細データに商品コード "10101001" が含まれる

  シナリオ: 登録済み受注明細を更新する
    もし:UC014 受注番号 "OD00000009" をもとに以下の受注明細を登録する
      | 受注番号    | 枝番 | 商品コード | 商品名   | 数量 | 単価 |
      | OD00000009 | 1   | 10101001   | 鶏ささみ | 10   | 500  |
    かつ:UC014 受注番号 "OD00000009" の受注明細を更新する (数量 "15")
    ならば:UC014 "受注を更新しました" が表示される
    もし:UC014 受注番号 "OD00000009" で検索する
    ならば:UC014 明細データに数量 "15" の商品コード "10101001" が含まれる

  シナリオ: 登録済み受注明細を削除する
    もし:UC014 受注番号 "OD00000009" をもとに以下の受注明細を登録する
      | 受注番号    | 枝番 | 商品コード | 商品名   | 数量 | 単価 |
      | OD00000009 | 1   | 10101001   | 鶏ささみ | 10   | 500  |
    かつ:UC014 受注番号 "OD00000009" 商品コード "10101001" の受注明細を削除する
    ならば:UC014 "受注を更新しました" が表示される

  シナリオ: 顧客ごとの受注を検索する
    もし:UC014 顧客コード "001" で受注を検索する
    ならば:UC014 検索結果として受注一覧を取得できる
# language: ja
機能: 受注管理
  管理者として
  受注業務ルールを管理したい
  なぜなら業務ルールの一元管理が必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC016 "管理者" である
    前提:UC016 "部門データ" が登録されている
    前提:UC016 "社員データ" が登録されている
    前提:UC016 "取引先データ" が登録されている
    前提:UC016 "商品データ" が登録されている

  シナリオ: 受注ルールを確認する
    もし:UC016 "受注データ" をアップロードする
    ならば:UC016 "受注をアップロードしました" が表示される
    もし:UC016 "受注ルール" を確認する(確認項目なし)
    ならば:UC016 "受注ルールチェックを実行しました(確認項目はありません)" が表示される

  シナリオ: 受注ルールを確認する
    もし:UC016 確認内容のある "受注データ" をアップロードする
    ならば:UC016 "受注をアップロードしました" が表示される
    もし:UC016 "受注ルール" を確認する(確認項目あり)
    ならば:UC016 "受注ルールチェックを実行しました(確認項目があります)" が表示される
# language: ja
機能: 受注管理
  管理者として
  受注業務を管理したい
  なぜなら受注データの一元管理が必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC015 "管理者" である
    前提:UC015 "部門データ" が登録されている
    前提:UC015 "社員データ" が登録されている
    前提:UC015 "取引先データ" が登録されている
    前提:UC015 "商品データ" が登録されている
    前提:UC015 "受注データ" が登録されている

  シナリオ: 受注を新規登録する
    もし:UC015 "受注データ" をアップロードする
    ならば:UC015 "受注をアップロードしました" が表示される

  シナリオ: 受注を新規登録する
    もし:UC015 エラーのある "受注データ" をアップロードする
    ならば:UC015 "受注アップロード内容にエラーがあります" が表示される

2.6.2. 出荷/売上

# language: ja
機能: 出荷管理
  管理者として
  出荷業務を管理したい
  なぜなら出荷データの一元管理が必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC018 "管理者" である
    前提:UC018 "顧客データ" が登録されている
    前提:UC018 "商品データ" が登録されている
    前提:UC018 "受注データ" が登録されている

  シナリオ: 出荷一覧を取得する
    もし:UC018 "出荷一覧" を取得する
    ならば:UC018 "出荷一覧" を取得できる

  シナリオ: 出荷情報を取得する
    もし:UC018 受注番号 "OD00000001" 受注行番号 "1" で検索する
    ならば:UC018 受注番号 "OD00000001" の出荷情報を取得できる

  シナリオ: 出荷情報を保存する
    もし:UC018 受注番号 "OD00000001" の出荷情報を保存する
    ならば:UC018 "出荷を保存しました" が表示される

  シナリオ: 出荷を検索する
    もし:UC018 顧客コード "001" で出荷を検索する
    ならば:UC018 検索結果として出荷一覧を取得できる

  シナリオ: 出荷を指示する
    もし:UC018 受注番号 "OD00000001" で出荷指示を行う
    ならば:UC018 "出荷指示を実行しました" が表示される

  シナリオ: 出荷を確認する
    もし:UC018 受注番号 "OD00000001" で出荷確認を行う
    ならば:UC018 "出荷確認を実行しました" が表示される
# language: ja
機能: 出荷管理
  管理者として
  出荷業務ルールを管理したい
  なぜなら業務ルールの一元管理が必要だから
  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC019 "管理者" である
    前提:UC019 "部門データ" が登録されている
    前提:UC019 "社員データ" が登録されている
    前提:UC019 "取引先データ" が登録されている
    前提:UC019 "商品データ" が登録されている

  シナリオ: 出荷ルールを確認する
    もし:UC019 "受注データ" をアップロードする
    ならば:UC019 "受注をアップロードしました" が表示される
    もし:UC019 "出荷ルール" を確認する(確認項目なし)
    ならば:UC019 "出荷ルールチェックを実行しました(確認項目はありません)" が表示される

  シナリオ: 出荷ルールを確認する
    もし:UC019 "受注データ" をアップロードする
    ならば:UC019 "受注をアップロードしました" が表示される
    もし:UC019 "出荷ルール" を確認する(確認項目あり)
    ならば:UC019 "出荷ルールチェックを実行しました(確認項目があります)" が表示される
# language: ja
機能: 売上管理
  システムとして
  売上データを管理したい
  なぜなら効率的な売上管理が必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC017 "管理者" である
    前提:UC017 "顧客データ" が登録されている
    前提:UC017 "商品データ" が登録されている
    前提:UC017 "部門データ" が登録されている
    前提:UC017 "売上データ" が登録されている

  シナリオ: 売上一覧を取得する
    もし:UC017 "売上一覧" を取得する
    ならば:UC017 "売上一覧" を取得できる

  シナリオ: 売上を新規登録する
    もし:UC017 売上番号"SA12345678"、受注番号"OD12345678"、売上日"2024-11-01T00:00:00+09:00"、部門コード"10000"で売上データを登録する
    ならば:UC017 "売上を登録しました" が表示される

  シナリオ: 売上データを取得する
    もし:UC017 売上番号"SA12345678"、受注番号"OD12345678"、売上日"2024-11-01T00:00:00+09:00"、部門コード"10000"で売上データを登録する
    もし:UC017 売上番号 "SA12345678" で検索する
    ならば:UC017 売上番号 "SA12345678" の売上データが取得できる

  シナリオ: 登録済み売上データを更新する
    もし:UC017 売上番号"SA12345678"、受注番号"OD12345678"、売上日"2024-11-01T00:00:00+09:00"、部門コード"10000"で売上データを登録する
    もし:UC017 売上番号 "SA12345678" の売上データを更新する(備考 "修正済み")
    ならば:UC017 "売上を更新しました" が表示される
    もし:UC017 売上番号 "SA12345678" で検索する
    ならば:UC017 備考 "修正済み" を含む売上データが取得できる

  シナリオ: 登録済み売上を削除する
    もし:UC017 売上番号"SA12345678"、受注番号"OD12345678"、売上日"2024-11-01T00:00:00+09:00"、部門コード"10000"で売上データを登録する
    もし:UC017 売上番号 "SA12345678" の売上データを削除する
    ならば:UC017 "売上を削除しました" が表示される

  シナリオ: 売上を検索する
    もし:UC017 備考 "テスト備考" で受注を検索する
    ならば:UC017 検索結果として売上一覧を取得できる

  シナリオ: 売上明細を追加登録する
    もし:UC017 売上番号 "SA12345678" をもとに以下の売上明細を登録する
      | 売上番号    | 明細番号 | 製品コード | 製品名     | 売上単価 | 売上数量 | 割引額 |
      | SA12345678 | 1       | 20202002   | カップ麺   | 300      | 20       | 200    |
    ならば:UC017 "売上を登録しました" が表示される
    もし:UC017 売上番号 "SA12345678" で検索する
    ならば:UC017 明細データに製品コード "20202002" が含まれる

  シナリオ: 登録済み売上明細を更新する
    もし:UC017 売上番号 "SA12345678" をもとに以下の売上明細を登録する
      | 売上番号    | 明細番号 | 製品コード | 製品名     | 売上単価 | 売上数量 | 割引額 |
      | SA12345678 | 1       | 20202002   | カップ麺   | 300      | 20       | 200    |
    かつ:UC017 売上番号 "SA12345678" の売上明細を更新する (製品コード "20202002" 製品名 "カップ麺" 売上数量 "30")
    ならば:UC017 "売上を更新しました" が表示される
    もし:UC017 売上番号 "SA12345678" で検索する
    ならば:UC017 明細データに売上数量 "30" の製品コード "20202002" が含まれる

  シナリオ: 登録済み売上明細を削除する
    もし:UC017 売上番号 "SA12345678" をもとに以下の売上明細を登録する
      | 売上番号    | 明細番号 | 製品コード | 製品名     | 売上単価 | 売上数量 | 割引額 |
      | SA12345678 | 1       | 20202002   | カップ麺   | 300      | 20       | 200    |
    かつ:UC017 売上番号 "SA12345678" 製品コード "20202002" の売上明細を削除する
    ならば:UC017 "売上を更新しました" が表示される

  シナリオ: 売上げを集計する
    もし:UC017 売上集計を実行した
    ならば:UC017 "売上を集計しました" が表示される

2.6.3. 請求

# language: ja
機能: 請求管理
  システムとして
  請求データを管理したい
  なぜなら効率的な請求管理が必要だから

  背景:
    前提:UC001 ユーザーが登録されている
    前提:UC020 "管理者" である
    前提:UC020 "顧客データ" が登録されている
    前提:UC020 "商品データ" が登録されている
    前提:UC020 "部門データ" が登録されている
    前提:UC020 "請求データ" が登録されている

  シナリオ: 請求一覧を取得する
    もし:UC020 "請求一覧" を取得する
    ならば:UC020 "請求一覧" を取得できる

  シナリオ: 請求を新規登録する
    もし:UC020 請求番号"IV12345678"、請求日"2024-11-01T00:00:00+09:00"、取引先コード"001"で請求データを登録する
    ならば:UC020 "請求を登録しました" が表示される

  シナリオ: 請求データを取得する
    もし:UC020 請求番号"IV12345678"、請求日"2024-11-01T00:00:00+09:00"、取引先コード"001"で請求データを登録する
    もし:UC020 請求番号 "IV12345678" で検索する
    ならば:UC020 請求番号 "IV12345678" の請求データが取得できる

  シナリオ: 登録済み請求データを更新する
    もし:UC020 請求番号"IV12345678"、請求日"2024-11-01T00:00:00+09:00"、取引先コード"001"で請求データを登録する
    もし:UC020 請求番号 "IV12345678" の請求データを更新する(当月請求額 "50000")
    ならば:UC020 "請求を更新しました" が表示される
    もし:UC020 請求番号 "IV12345678" で検索する
    ならば:UC020 当月請求額 "50000" を含む請求データが取得できる

  シナリオ: 登録済み請求を削除する
    もし:UC020 請求番号"IV12345678"、請求日"2024-11-01T00:00:00+09:00"、取引先コード"001"で請求データを登録する
    もし:UC020 請求番号 "IV12345678" の請求データを削除する
    ならば:UC020 "請求を削除しました" が表示される

  シナリオ: 請求を検索する
    もし:UC020 取引先コード "001" で請求を検索する
    ならば:UC020 検索結果として請求一覧を取得できる

  シナリオ: 請求明細を追加登録する
    もし:UC020 請求番号 "IV12345678" をもとに以下の請求明細を登録する
      | 請求番号    | 売上番号    | 売上行番号 |
      | IV12345678 | SA12345678 | 1         |
    ならば:UC020 "請求を登録しました" が表示される
    もし:UC020 請求番号 "IV12345678" で検索する
    ならば:UC020 明細データに売上番号 "SA12345678" が含まれる

  シナリオ: 請求を集計する
    もし:UC020 請求集計を実行した
    ならば:UC020 "請求を集計しました" が表示される

3. アーキテクチャ

3.1. フロントエンド

Diagram

3.2. バックエンド

Diagram
package com.example.sms;

import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@AnalyzeClasses(packages = "com.example.sms")
@DisplayName("アーキテクチャルール")
public class ArchitectureRuleTest {

    @Test
    @DisplayName("プレゼンテーション層はサービス層とドメイン層にアクセスできる")
    public void presentationLayerShouldOnlyAccessServiceLayerAndDomainLayer() {
        JavaClasses importedClasses = new ClassFileImporter().importPackages("com.example.sms");
        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..presentation..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..infrastructure..")
                .check(importedClasses);
    }

    @Test
    @DisplayName("サービス層はドメイン層とインフラストラクチャ層のみにアクセスできる")
    public void serviceLayerShouldOnlyAccessDomainAndInfrastructureLayers() {
        JavaClasses importedClasses = new ClassFileImporter().importPackages("com.example.sms");
        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..service..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..presentation..")
                .check(importedClasses);
    }

    @Test
    @DisplayName("ドメイン層は他の層にアクセスできない")
    public void domainLayerShouldNotAccessOtherLayers() {
        JavaClasses importedClasses = new ClassFileImporter().importPackages("com.example.sms");
        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..domain..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..presentation..")
                .check(importedClasses);

        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..domain..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..service..")
                .check(importedClasses);

        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..domain..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..infrastructure..")
                .check(importedClasses);
    }

    @Test
    @DisplayName("インフラストラクチャ層はドメイン層とサービス層以外にアクセスできない")
    public void infrastructureLayerShouldNotAccessNonDomainLayers() {
        JavaClasses importedClasses = new ClassFileImporter().importPackages("com.example.sms");
        ArchRuleDefinition.noClasses()
                .that()
                .resideInAPackage("..infrastructure..")
                .should()
                .accessClassesThat()
                .resideInAPackage("..presentation..")
                .check(importedClasses);
    }
}

4. データモデル

library er summary
relationships.implied.compact

5. ドメインモデル

5.1. 認証・ユーザー

Diagram

5.2. 部門・社員

Diagram

5.3. 商品

Diagram

5.4. 取引先

Diagram

5.5. 受注

Diagram

5.6. 出荷/売上

Diagram

5.7. 請求

Diagram

5.8. 監査

Diagram

6. ユーザーインターフェース

6.1. ビュー

6.1.1. 認証

Diagram

6.1.2. ユーザー管理

Diagram

6.1.3. マスタ管理

部門
Diagram
社員
Diagram
商品
Diagram
Diagram
取引先
Diagram
コード
Diagram

6.1.4. 監査

Diagram

6.1.5. ダウンロード

Diagram

6.1.6. 販売

受注
Diagram
出荷/売上
Diagram
請求
Diagram

6.2. モデル

6.2.1. 認証

Diagram

6.2.2. ユーザー管理

Diagram

6.2.3. マスタ管理

部門
Diagram
社員
Diagram
商品
Diagram
取引先
Diagram
コード
Diagram

6.2.4. 監査

Diagram

6.2.5. ダウンロード

Diagram

6.2.6. 販売

受注
Diagram
出荷/売上
Diagram
請求
Diagram

6.3. インタラクション

6.3.1. 認証

Diagram

6.3.2. ユーザー管理

Diagram

6.3.3. マスタ管理

部門
Diagram
社員
Diagram
商品
Diagram
取引先
Diagram
コード
Diagram

6.3.4. 監査

Diagram

6.3.5. ダウンロード

Diagram

6.3.6. 販売

受注
Diagram
出荷/売上
Diagram
請求
Diagram