スポーツクラブの事業分析

## 背景

1年前くらいから、近所のティップネスに通っている。
体形はそこまで変わっていないが、前よりもご飯を美味しく食べられるようになったと思う。
今回は、ティップネスを参考にスポーツクラブのシステム化を想定して、事業分析を行う。

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

まずは、登場人物とシステム、外部システムを洗い出す。


```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title システムコンテキスト
left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}

storage "ユーザー" #line.dotted {
    actor "会員" as member
    actor "従業員" as employee
    actor "インストラクター" as instructor
}

component "システム" as system {
    component "入会申請" as apply_system
    component "会員サイト" as member_system
    component "管理サイト" as management_system
    database "DB" as db

    apply_system -- db
    management_system -- db
    member_system -- db
}


' 関連
member -- apply_system
member -- member_system
employee -- management_system
instructor -- management_system

@enduml
```

使ったことは無いが、おそらく店舗側の管理サイトがあるだろう。
一般会員向けには契約時の申し込みサイトと、会員用のサイトがある。
システム構築の目的については、整理した後で記述する。

## システム要求1

システムへの要求事項を以下にリストアップした。

### 要求一覧

- 事前web申込したい
- 会員サイトから、ポイント貯めたい
- 会員にカードを発行し、入退館の際はカードのバーコードをシステムで読み取らせる

一旦このままにしておく。
あとで図示する。

## ビジネスコンテキスト1

主要な業務を洗い出す。


```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title ビジネスコンテキスト
left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}


' アクター
actor 会員 as member
actor 従業員 as employee
actor インストラクター as instructor

' 業務
storage 会員登録
storage 入退館
storage スタジオレッスン
storage インストラクター管理

' もの


' 関連
member -- 会員登録
member -- 入退館
member -- スタジオレッスン


スタジオレッスン -- instructor
instructor -- インストラクター管理

会員登録 -- employee
インストラクター管理 -- employee
@enduml
```

とりあえず、最初に思いついたものだけ


## ドメインモデル1

システムの中で使われていそうな用語（概念）を関連づける。
とりあえず最初のモデルとして、用語の洗い出しと関連付けをしてみた。
用語は、会則から抜き出した
https://i.tipness.co.jp/i/pdf/kaisoku.pdf


```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title ドメインモデル
left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}


' 用語
storage 会員関連 {
    card 会員
    card 親権者
    card 除名処分
    card 氏名
    card 会員番号
    card パスワード
    card メールアドレス
    card 顔写真
    card 会員証
    card 会員種類
}
card 同伴ビジター
card 入会
card 契約期間
card 退会
card 退会希望月
card 休会
card 休会月会費
card 休会期間
card 休会希望月
card 休会手続期限
card プライベートロッカー
card 変更手続き

storage 会費関連 {
    card 会費
    card 入会金
    card 割引
    card 消費税
    card 支払方法
    card 支払時期
    card 滞納
}
card 施設
card 休館日
card 年次休館
card 定期休館
card 会費返金
card 店舗
card クラブサービス
card 提携クレジットカード会社
card 会員資格喪失
card 告知
card 法人登録会員
card 契約法人

' 関連


@enduml
```

法人の契約とかあったんですね。。
入会退会は想定してたけど、休会もあるんですね。しかも会費があるという。

## ビジネスコンテキスト2
ドメインモデルで発見された概念から、不足していた業務を補う


```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title ビジネスコンテキスト
left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}


' アクター
node スポーツクラブ {
    actor 従業員 as employee
}
actor インストラクター as instructor
actor 会員 as member
actor 契約法人 as contracted_corporation
actor クレジットカード会社 as credit_card_company
contracted_corporation . member

' 業務
storage 入会_退会_休会
storage 入退館
storage 会費支払
storage 法人契約
storage スタジオレッスン
storage インストラクター管理
storage 告知
storage 休館日管理

' もの


' 関連
contracted_corporation -- 法人契約
member -- 入会_退会_休会
member -- 会費支払
member -- 入退館
member -- スタジオレッスン

スタジオレッスン -- instructor
instructor -- インストラクター管理

会費支払 -- employee
入会_退会_休会 -- employee
インストラクター管理 -- employee
告知 -- employee
法人契約 -- employee
employee -- 休館日管理


credit_card_company -- 会費支払
@enduml
```

アクターとして、クレジットカード会社、契約法人を追加
業務として、会費支払、告知を追加

## ドメインモデル2
概念同士を勘で関連付ける（正確性は重視しない）
新たな概念が無いか、確認する
全部を無理やり関連付けなくてもよい


```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title ドメインモデル
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}


' 用語

storage 店舗関連 {
    ' 要素
    card 店舗
    card プライベートロッカー
    card 店舗スケジュール
    card 休館日
    card 休館
    card 年次休館
    card 定期休館
    card 臨時休館
    card 会費返金
    ' 関連
    店舗 -- 店舗スケジュール
    店舗 -- プライベートロッカー
    店舗スケジュール -- 休館日
    休館日 -- 休館
    休館 -- 定期休館
    定期休館 -- 年次休館
    休館 -- 臨時休館
    臨時休館 -- 会費返金
}

    card インストラクター
storage スタジオ関連 {
    ' 要素
    card スタジオ
    card スタジオレッスン
    card バーチャルレッスン
    card スタジオスケジュール

    ' 関連
    スタジオ -- スタジオスケジュール
    スタジオレッスン -- スタジオスケジュール
    インストラクター -- スタジオレッスン
    スタジオレッスン -- バーチャルレッスン

    ' 外部関連
    店舗 --- スタジオ
}

storage 会員オプション関連 {
    card プライベートロッカー契約
    ' 関連

    ' 外部関連
    プライベートロッカー --- プライベートロッカー契約
}

storage 法人契約関連 {
    card 契約法人
}

storage 入会関連 {
    card 入会
    card 契約期間

    ' 関連
    入会 -- 契約期間

    ' 外部関連
    店舗 --- 入会
}

storage 会員関連 {
    ' 要素
    card 会員
    card 法人登録会員
    card 親権者
    card 除名処分
    card 会員番号
    card パスワード
    card メールアドレス
    card 顔写真
    card 会員証
    card 会員種類
    ' 関連
    会員 -- 親権者
    会員 -- 除名処分
    会員 -- 会員番号
    会員 -- パスワード
    会員 -- メールアドレス
    会員 -- 顔写真
    会員 -- 会員証
    会員 -- 会員種類

    ' 外部関連
    入会 --- 会員
    会員 --- プライベートロッカー契約
}

storage 休会関連 {
    ' 要素
    card 休会
    card 休会月会費
    card 休会期間
    card 休会希望月
    card 休会手続期限
    ' 関連
    休会 -- 休会期間
    休会 -- 休会希望月
    休会 -- 休会手続期限
    休会 -- 休会月会費

    ' 外部関連
    会員 --- 休会
}

storage 退会関連 {
    ' 要素
    card 退会
    card 退会希望月
    ' 関連
    退会 -- 退会希望月

    ' 外部関連
    会員 --- 退会
}

card 同伴ビジター
card 変更手続き

storage 会費関連 {
    ' 要素
    card 会費
    card 入会金
    card 割引
    card 消費税
    card 支払方法
    card 支払時期
    card 滞納
    ' 関連
    会費 -- 入会金
    会費 -- 割引
    会費 -- 消費税
    会費 -- 支払方法
    会費 -- 支払時期
    会費 -- 滞納

    ' 外部関連
    会員 --- 会費
}

storage レッスン予約関連 {
    card レッスン予約
    ' 外部関連
    スタジオスケジュール --- レッスン予約
    会員 --- レッスン予約
}

card クラブサービス
card 提携クレジットカード会社
card 会員資格喪失
card 告知

' 関連

@enduml
```

## 業務フロー

ビジネスコンテキストの各業務から、詳細業務を図解していく。
正確性は重視せず、考慮漏れの業務や概念が無いかどうかを確かめる

### 入会契約1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_入会契約
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}


actor "会員" as member
participant "Web事前入会\n申請フォーム" as web_apply_system
actor "店舗スタッフ" as staff
participant "管理システム" as management_system

member -> web_apply_system: 事前登録
member <-- web_apply_system: 事前登録完了メール通知

member -> staff: 店舗訪問
member <- staff: 顔写真撮影、契約説明
member -> staff: 入会契約
staff -> management_system: 新規入会者登録
member <-- management_system: 入会登録完了メール通知
member <- staff: 会員カード発行

@enduml
```

### 会費支払1
```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_会費支払
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}


participant "管理システム" as management_system
participant "クレジットカード会社\n入金システム" as credit_card_system


management_system -> management_system: 会費支払処理開始
loop 会員数分繰り返し
  management_system -> credit_card_system: 入金依頼
  credit_card_system -> credit_card_system: 入金処理
  management_system <-- credit_card_system: 入金完了通知　
end loop

@enduml
```

### 休会契約1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_休会契約
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}

actor "会員" as member
actor "店舗スタッフ" as staff
participant "管理システム" as management_system

member -> staff: 店舗訪問
member <- staff: 契約説明
member -> staff: 休会契約
staff -> management_system: 会員情報更新
member <-- management_system: 休会完了メール通知

group 休会期間終了
  management_system -> management_system: 休会期間終了処理（自動）
  member <-- management_system: 会員再開完了メール通知
end group

@enduml
```


### 退会契約1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_退会契約
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}

actor "会員" as member
actor "店舗スタッフ" as staff
participant "管理システム" as management_system

member -> staff: 店舗訪問
member <- staff: 契約説明
member -> staff: 退会契約
staff -> management_system: 会員情報更新
member <-- management_system: 退会完了メール通知

@enduml
```

### 入退館1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_入退館
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}

actor "会員" as member
participant "バーコードリーダー" as barcode_reader
participant "管理システム" as management_system

group 入館処理
  member -> barcode_reader: 会員カード提示
  barcode_reader -> management_system: 会員照会
  barcode_reader <-- management_system: 認証
  member <-- barcode_reader: 応答
end group

group 退館処理
  member -> barcode_reader: 会員カード提示
  barcode_reader -> management_system: 会員照会
  barcode_reader <-- management_system: 認証
  member <-- barcode_reader: 応答
end group

@enduml
```


### 時間外入退館1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_時間外入退館
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}

actor "会員" as member
participant "ICリーダー" as ic_reader
participant "管理システム" as management_system

group 入館処理
  member -> ic_reader: 時間外会員カード提示
  ic_reader -> management_system: 会員照会
  ic_reader <-- management_system: 認証
  member <-- ic_reader: 応答
end group

group 退館処理
  member -> ic_reader: 時間外会員カード提示
  ic_reader -> management_system: 会員照会
  ic_reader <-- management_system: 認証
  member <-- ic_reader: 応答
end group

@enduml
```



### スタジオレッスン予約1

```plantuml
@startuml

' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title 業務フロー_スタジオレッスン予約
' left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 13
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    actor {
        fontColor black
        fontSize 12
    }
}

actor "会員" as member
actor "インストラクター" as instructor
participant "会員サイト" as member_system
participant "管理システム" as management_system


instructor -> management_system: レッスン登録
member_system <- management_system: レッスン予約開始

member -> member_system: レッスン予約
member -> instructor : レッスン参加

@enduml
```

時間外、24時間使えるジムの概念が抜けていたので追加した
休会をキャンセルする業務が抜けていたので追加した


## システムコンテキスト2
ドメインモデル、ビジネスコンテキスト、業務フローで新たに発見された概念を追加する

```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
' mainframe mainframe
title システムコンテキスト
left to right direction
scale max 2048 width

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

    ' === 要素別設定 ===
    rectangle {
        BackgroundColor business
        BorderColor #000
        RoundCorner 25
        BorderThickness 0.6
        fontColor black
        fontSize 14
    }
    actor {
        fontColor black
        fontSize 12
    }
    node {
        BorderColor #999999
        fontColor black
        fontSize 12
    }
    component {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    storage {
        BackgroundColor white
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
    database {
        BackgroundColor business
        BorderThickness 0.5
        BorderColor #666666
        fontColor black
        fontSize 11
    }
}

storage "ユーザー" #line.dotted {
    actor "契約法人" as contracted_corporation
    actor "入会希望者" as hopeful_member
    actor "会員" as member
    actor "店舗スタッフ" as staff
    actor "インストラクター" as instructor

    hopeful_member -- member
    contracted_corporation .. member
}

component "システム" as system {
    component "Web事前入会申請フォーム" as prior_web_application_system
    component "会員サイト" as member_site
    component "管理サイト" as management_site
    component "会員認証API" as member_auth_api
    database "DB" as db

    prior_web_application_system -- db
    management_site -- db
    member_site -- db
    db -- member_auth_api

    ' 外部関連
    member --- member_site
    hopeful_member --- prior_web_application_system
    staff --- management_site
    instructor --- management_site

}

component "外部システム" as outer_system {
    component "バーコードリーダー端末" as barcode_reader
    component "ICカードリーダー端末" as ic_reader

    ' 外部関連
    member --- barcode_reader
    member --- ic_reader
    member_auth_api .. barcode_reader
    member_auth_api .. ic_reader
}

' 関連

@enduml
```

## ERD
現在の情報で雑にERDを作成する
（どうせ色々漏れがあるだろうなのであまり気にせずに）

```plantuml
@startuml
' === ドキュメント設定 ===
right footer s.imamura
title ERD
scale max 2048 width
skinparam linetype ortho
skinparam shadowing false
hide footbox
' hide circle

' === スタイル ===
skinparam {
    ' === 共通設定 ===
    shadowing false
    ' linetype ortho
    backgroundColor whitesmoke
    arrow {
        color indianRed
        thickness 0.8
        fontSize 10
    }
    title {
        FontSize 14
        ' FontColor blue
        BorderThickness 10
        BorderColor transparent
    }

}

storage "店舗関連" #line.dotted {

    entity 店舗 <<(R, physical)>> {
        店舗ID
        --
        店舗名
        基本営業開始時刻
        基本営業終了時刻
        電話番号
        住所
    }
    entity 店舗営業スケジュール <<(R, physical)>> {
        店舗営業スケジュールID
        --
        店舗ID <<FK>>
        年月日
        営業可否
        休館理由
        営業開始時刻
        営業終了時刻
    }
    note right
    ◆休館理由
    ・週次定休日
    ・年次定休日
    ・臨時休館
    end note


    entity 店舗スタッフ <<(R, physical)>> {
      店舗スタッフID
      --
      スタッフ種別
      氏名
    }
    note right
    ◆スタッフ種別
    ・社員
    ・アルバイト
    end note

    entity 店舗スタッフ所属 <<(R, physical)>>{
      店舗ID
      店舗スタッフID
      --
    }

    entity スタジオ <<(R, physical)>>{
      スタジオID
      --
      店舗ID <<FK>>
      スタジオ名
      収容人数
    }

    ' 内部関連
    店舗 ||--o{ 店舗スタッフ所属
    店舗スタッフ ||--o{ 店舗スタッフ所属
    店舗 ||--o{ 店舗営業スケジュール
    店舗 ||--o{ スタジオ
}

storage "プラン関連" #line.dotted {
  entity 基本プラン <<(R, physical)>> {
    基本プランID
    --
    基本プラン名
    基本利用料金
    基本利用可能時間帯
    利用対象者条件
  }
  entity 店舗プラン <<(R, physical)>> {
    店舗プランID
    --
    店舗プラン名
    利用料金
    利用可能時間帯
  }

  ' 関連
  基本プラン ||--o{ 店舗プラン
  ' 外部関連
  店舗 ||---o{ 店舗プラン
}

storage "スタジオプログラム関連" #line.dotted {
    entity スタジオプログラム <<(R, physical)>> {
    スタジオプログラムID
    --
    プログラム種別
    プログラム名
  }
}

storage "法人関連" #line.dotted {
    entity 法人 <<(R, physical)>> {
        法人ID
        --
        法人名
    }
    entity 法人契約 <<(E, coral)>> {
        法人契約ID
        --
        法人ID
        契約年月日
        開始日
        終了日
    }
    ' 内部関連
    法人 ||--|{ 法人契約
    ' 外部関連
}

storage "入会契約関連" #line.dotted {
    entity 入会契約 <<(E, coral)>> {
        入会契約ID
        --
        店舗ID <<PK>>
        対応スタッフID <<PK>>
        入会年月日
        入会契約種別
    }
    note right
    ◆入会契約種別
    ・一般契約
    ・法人契約
    end note
    entity 法人入会契約 <<(E, coral)>> {
        法人入会契約ID
        --
        入会契約ID <<FK>>
        法人契約ID <<PK>>
    }
    ' 内部関連
    入会契約 |o-|| 法人入会契約

    ' 外部関連
    店舗プラン ||---o{ 入会契約
    店舗スタッフ ||...o{ 入会契約
    法人契約 |o---o{ 法人入会契約

}

storage "会員関連" #line.dotted {
    entity 会員 <<(R, physical)>>{
        会員ID
        --
        会員番号
        会員種別
        メールアドレス
        パスワード
        会員ステータス
        氏名
        生年月日
        緊急連絡先
    }
    note right
    ◆会員種別
    ・一般会員
    ・法人会員

    ◆会員ステータス
    ・有効
    ・休会中
    ・退会
    end note

    entity パスワードリセット <<(E, coral)>>{
        パスワードリセットID
        --
        メールアドレス
        トークン
        有効期限
        有効フラグ
    }

    ' 外部関連
    入会契約 ||---|| 会員
}

storage "会費納入関連" #line.dotted {
  entity 会費納入 <<(E, coral)>>{
    会費納入ID
    --
    会員ID <<FK>>
    対象年月
    会費納入年月日
  }

  ' 外部関連
  会員 ||---o{ 会費納入
}


storage "入退館関連" #line.dotted {
  entity 入退館 <<(E, coral)>>{
    入退館ID
    --
    会員ID <<FK>>
    店舗ID <<FK>>
    入退館日時
  }
  entity 時間外入退館 <<(E, coral)>>{
    時間外入退館ID
    --
    会員ID <<FK>>
    店舗ID <<FK>>
    時間外入退館日時
  }

  ' 外部関連
  店舗 ||---o{ 入退館
  会員 ||---o{ 入退館
  店舗 ||---o{ 時間外入退館
  会員 ||---o{ 時間外入退館
}

@enduml
```