---
# System prepended metadata

title: お客様ごとの機能出し分け処理の実装/ver.1(2023/07/13)
tags: [クイックレンタル, RentalGO, 要件定義書, Shopify]

---

## 目的
Shopifyにおけるレンタル事業サポートを目的とした既存自社開発アプリ「クイックレンタル」の新機能として「お客様ごとの機能切り分け処理」を実装する。この処理を実装することによって、今までどのお客様に対しても提供していたクイックレンタルのオプション機能をお客様の要望に応じてカスタマイズ出来るようになる。

また、この機能を追加することで、今後開発予定の「ステップメール」「サブスクレンタル」機能などもオプション機能として提供できる。

ちなみに、202307現在は「クイックレンタル」というアプリ名だが202309以降は「RentalGO」というアプリ名に変更となる。

## 概要

### システム方式・構成

システムを実装するにあたり、以下の制御方法と管理方法を採用する。

- 制御方法  
フロントエンド側にてお客様の登録しているオプションに合わせて機能の表示・非表示を行う。
- 管理方法  
クイックレンタルアプリ本体のDBのShopsテーブルに紐付く子テーブルを作成し、お客さまごとに機能のOn/Offを管理する。
### 用語定義

以下に今回の機能において重要な用語について解説する。

- 機能出し分け処理  
今回の主とする機能のこと
お客様のステータス(プラン課金及びオプション状態等)により機能を
出し分ける処理である
- 機能管理テーブル
Shopsの子テーブルで、機能ごとにbool値で管理されている

- **プラン分類**

```
プラン分類の前提条件として以下３つの管理を行う
TODO: 2と3については暫定的な名称のためカッコ内の意図を含んだ名称に変える

    1. 表示用
    クイックレンタル管理画面内アカウントタブに表示されるプラン分類のこと(DBでは扱わない)、ShopifyAppリストでも同様の表示
        TRIAL,ENTERPRISE
    2. 内部プラン(詳細)
    RentlGOのDB(appsubscriotions/plan)とShopifyの契約情報に記録されるプラン分類のこと
        TRIAL,STANDARD,ENTERPRISE
    3. ステータス管理(メモ)
    お客様の契約プランや契約時期を加味したステータスを管理するプラン分類のこと
      TRIAL,STANDARD_$49,STANDARD_$299,ENTERPRISE_MERCHANT,ENTERPRISE_PARTNER
```
- TRIALプラン 
現在のお試しプラン、RentalGO展開後は機能最小限に留める
- STANDRDプラン
現在の課金プラン、そのまま購入・店頭受け取り機能も含める
(STANDARD_$49とSTANDARD_$299に分類される)
    - STANDARD_$49
    20230531までに契約されたSTANDARDプラン、月額$49
    - STANDARD_$299
    20230601から20230831までに契約されたSTANDARDプラン、月額$49
- ENTERPRISEプラン
RentalGO展開後の課金プランの総称。ステータス管理では流入によって下記二つに分類。
    - ENTERPRISE_MERCHANT
ENTERPRISE①、Shopifyアプリストアからお問い合わせがあったお客様
    - ENTERPRISE_PARTNER
ENTERPRISE②、ミライガタリから営業をかけて契約したお客様

## 業務要件

### 現状のフロー
前提：
- アプリのインストールとテーマへの埋め込みが済んでいること
- カスタマーのフローは省略

そのまま購入及び店頭受け取り機能共通のフロー
1. 商品管理画面よりレンタルプランを適用させたい商品を登録する 
1. 次に「クイックレンタル」アプリ管理画面に移る
1. レンタルプラン一覧タブをクリックし、新規プラン作成ボタンをクリックする
1. 上記操作を行って出てきたウィンドウに必須項目を入力する(プラン名、レンタル適用商品、在庫数、発送準備期間、レンタル受付期間、レンタル泊数、価格)
1. レンタル販売の注意事項に関しては必須ではないが特記事項がある場合は入力する

そのまま購入機能のフローは以下のようになる
1. 上記の操作に引き続きそのまま購入のトグルボタンをクリックし機能を有効にする(無効：灰色、有効：緑色)
1. そのまま購入機能をオンにすると"そのまま購入価格"のフィールドが出現するので入力をする(必須)
1. そのまま購入機能の注意事項に関しては必須ではないが特記事項がある場合は入力する
1. ウィンドウ右下にある保存ボタンを押してプランを有効にする

店頭受取機能のフローは以下のようになる
1. 上記の操作に引き続き店頭受取のトグルボタンをクリックし機能を有効にする(無効：灰色、有効：緑色)
1. ウィンドウ右下にある保存ボタンを押してプランを有効にする


### 構築後のフロー
前提：
- そのまま購入機能と店頭受け取り機能ともに未契約のストアとする
- 機能が有効なストアは現状のフローのままとする
- 解約は発生しないものとする
- カスタマーのフローは省略

そのまま購入機能のフローは以下のようになる
1. 新規ストアのため、RentalGOの利用を検討している/そのまま購入のトグルボタンが非表示となっており使えない
2. 問い合わせを行う
3. Shopifyペイメントを通さない契約によって買い切り型のオプション追加料金を支払う(銀行振込など)
4. 機能管理テーブルの該当ストアのそのまま購入カラムのbool値をfalseからtrueに書き換える
5. そのまま購入機能が使えるようになる
6. その後の操作は現状のフローのままとなる

店頭受取機能のフローは以下のようになる
1. 新規ストアのため、RentalGOの利用を検討している/そのまま購入のトグルボタンが非表示となっており使えない
2. 問い合わせを行う
3. Shopifyペイメントを通さない契約によって買い切り型のオプション追加料金を支払う(銀行振込など)
4. 機能管理テーブルの該当ストアの　店頭受取カラムのbool値をfalseからtrueに書き換える
5. 店頭受取購入機能が使えるようになる
6. その後の操作は現状のフローのままとなる

[<図> Figma/ RentalGo要件定義/機能出し分け処理業務フロー](https://www.figma.com/file/HMlQLDiVIBXPIVmtsoXaKa/%E6%A9%9F%E8%83%BD%E5%87%BA%E3%81%97%E5%88%86%E3%81%91%E5%87%A6%E7%90%86%E6%93%8D%E4%BD%9C%E3%83%95%E3%83%AD%E3%83%BC?type=whiteboard&node-id=0-1&t=YI0xcSf3GWtIdJ4d-0)
[<図> Figma/ RentalGo要件定義/機能出し分け処理操作フロー](https://www.figma.com/file/d1bxREDC3O035qfTuUniie/%E6%A9%9F%E8%83%BD%E5%87%BA%E3%81%97%E5%88%86%E3%81%91%E5%87%A6%E7%90%86%E6%93%8D%E4%BD%9C%E3%83%95%E3%83%AD%E3%83%BC?type=whiteboard&node-id=0-1&t=MFj6LLP4VOGzxKb3-0)
### 利用者一覧

- マーチャント  
    このアプリをインストールしたストアを運営する管理者のこと
- カスタマー
    このアプリがインストールされたストアに訪れてレンタル商品を購入する人のこと


## 機能要件

### 画面

今回の画面で変わる部分はアプリ管理画面のプラン作成/編集フォーム内の2箇所となる
カスタマーユーザーインターフェースとして追加となる部分は今の所ない

1. そのまま購入機能セクション  
オプション加入状況によって表示/非表示を切り替える
1. 店頭受取機能セクション  
オプション加入状況によって表示/非表示を切り替える
![](https://hackmd.io/_uploads/rJ3m5-Hth.png)


### 情報・データ

本機能では以下のデータが追加されます


**出し分けする機能に対して設定するデータ**
1. そのまま購入機能On/Off
On:true、Off:falseで切り替える(初期値はfalse)
1. 店頭受取機能On/Off 
On:true、Off:falseで切り替える(初期値はfalse)
1. 内部プランの分類情報
- ENTERPRISE
の1分類を追加(ENTERPRISEに関しては機能の出し分けを行う)
4. ステータス管理の分類情報
- TRIAL
- STANDARD_$49
- STANDARD_$299
- ENTERPRISE_MERCHANT
- ENTERPRISE_PARTNER
の５分類を追加(DB上でお客様の分類を行うために用いる)

### 備考
**既に設定されている内部プランの分類情報**
- TRIAL
- STANDARD
上記追加分を合わせると内部プランは3分類となる

**出し分けする機能と出し分けない機能の分類**
1. 出し分けする機能  
- そのまま購入機能
- 店頭受取機能  

2. 出し分けしない機能
　レンタルプラン作成、レンタル注文管理、レンタルカレンダー、休業日設定（定期休業、臨時休業）、運用管理、店舗設定(レンタル商品共通の注意書きの記述)
 
**新たに追加するテーブル**
1. 機能管理テーブル
Shopsの子テーブルで、機能ごとにbool値で管理されている
1. お客様のステータス管理テーブル(historyテーブル、書き込み専用)


**新たに追加するファイル**
1. 機能出し分け処理ファイル(仮)
出し分け処理を行いたい機能の前に条件分岐を行い出力をさせる関数を記したファイル

**出来れば管理したいデータ項目**
各レコードの機能on/offの状態を利用してonとなっている機能名を出力するカラムを定義したい
(お客様に急いで返事等を行いたいので)
例) フィールドの値:そのまま購入,店頭受取

(あとで消す)問題点：レコードの変更が行われたら同期処理(整合性チェック)を行わないといけないので重くならないか心配
プログラム上で計算させて管理UI作った方が処理的には良さそうな気もする

### データフロー
**機能情報管理について**
1. システム管理者は契約内容を参照し、機能管理DBに機能管理情報(true/false)を書き込む(ここはバッチ処理、以下は即時処理)
2. システムは機能管理DBにアクセスし、ShopIDを元に機能管理情報を読み込む
3. システムは機能管理情報を元に機能出し分け判定を行う
4. システムは機能出し分け判定を元に機能設定画面の表示/非表示を行う

**ステータス管理について(機能出し分け処理には影響しない)**
1. システム管理者は契約内容を参照し、ステータス管理DBに顧客流入情報を書き込む
2. システムは機能管理DBにアクセスし、ShopIDを元に機能管理情報を読み込む
3. システムは機能管理情報を元にオプション機能名を算出する
4. システムはオプション機能名をステータス管理DBに書き込む

(課題：既存のお客様に関しての顧客流入情報の取り扱いをどうするか)
[<図> Figma/ RentalGo要件定義/機能出し分けデータフロー](https://www.figma.com/file/cEcClhFfC9Mlse5A1i9Jl1/%E6%A9%9F%E8%83%BD%E5%87%BA%E3%81%97%E5%88%86%E3%81%91%E5%87%A6%E7%90%86%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC?type=whiteboard&node-id=0-1&t=H0bQp56E6SNfX0U5-0)
### プログラムの流れ

1. タブの中身を出力するファイル`web/src/components/plan/action/common/form.jsx`に「機能出し分け処理ファイル」を読み込み関数を実行させる
1. 機能出し分け処理ファイルでは「機能管理テーブル」のそのまま購入機能と店頭受取機能On/Offの情報を見に行きオブジェクトに代入する
1. 1.に戻り、form.jsxではそのオブジェクトの状態をチェックしてtrueが入っているのならそのまま購入機能または店頭受取機能を表示させ、falseなら非表示の状態にする
1. それ以後は現在のシステムのデータフローのままとなる

- 今後、タブのOn/Offにも対応できるように`web/src/components/index.jsx`でも機能出し分け処理ファイルを読み込める状態にしておく
