プリザンターでのサブスクリプション管理をPower Automateで自動化してみた

# はじめに

[前回の記事](https://qiita.com/teppei12345/items/ff0532bcd1a37d654919)の内容をもう少しブラッシュアップした内容になります。大きく変わったことはありませんが、もう少しわかりやすくフローを作成しました。今回の記事でご紹介する内容が最終版となる予定です。そのため、最終的な設定や機能などをすべて記載しようと思います。以前の内容と重複する点があるかとは思いますが、ご了承ください。  

# まえおき

サブスクリプションというのは、Amazonプライムや冷凍弁当で知られているnoshなど、利用者が定期的に料金を支払い、企業がサービスを提供する仕組みのことです。今回、そのサブスクリプションをプリザンターでも再現しようと思います。  
サブスクリプションの利点としてあげられるのは利用者が何もしなくても契約が更新される点にあります。利用者が意識せずにサービスを使い続けることができるのは企業側が定期的に契約を更新しているからです。しかし、現状プリザンターにはこのような自動更新する機能がございません。そのため、サブスクリプションをプリザンターで管理する場合、定期的に手動で更新することになります。手動での更新は契約者が少ないうちは可能だと思いますが、契約者が多くなればなるほどほかの業務を圧迫してしまいます。そんな時、Power Automateを使えばこのような定期的な業務を自動化し、業務の効率化を図ることができます。  

# シチュエーション

あるサブスクリプションを展開しているA社担当者は、契約ごとにテーブルを作成し、テーブルには契約先ごとにレコードを作成しています。そして、レコード単位で契約内容を管理している状況です。担当者は毎月月初に契約期間を延長するのか、契約を打ち切るのかレコードを更新し、契約期限が迫っている契約者宛てに通知を送らなくてはいけません。

# テーブルの設定

* テーブル名：サブスクリプション
* レコード：契約者ごとのレコード
  例) 「通知処理対象レコード」・「更新処理対象レコード」・「完了処理対象レコード」
* 列：会社名・開始・契約期限・状況・自動更新・更新日時・コメント・メールアドレスの計8つ

※あくまでシチュエーションなので「契約期限」に「29日超過」と表示されていますが、気にしないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/84b62402-2514-d17b-c4a5-c34813b22a21.png)

# レコードの設定

* 列：会社名・開始・契約期限・状況・自動更新・メールアドレスの計6つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/18c47f67-6f21-26ee-87e7-1a510229fc6d.png)

詳しい内容は各フローの説明でします。以下、参照してください。

# 自動化前の業務の全体像

担当者がプリザンターへアクセスし、各レコードの記載内容を確認します。契約期限が超過している会社のうち、自動更新がオフの契約は完了処理が実行され状況を完了にします。また、自動更新がオンの契約は更新処理が実行され契約期限を延長します。さらに、契約期限が今月末に迫っている場合、通知処理が実行され契約者宛てに契約更新をするかどうかの通知を送ります。さらに、メールが送信されたことを担当者にも通知します。今回はこの業務をPower Automateで自動化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/9dd433ad-b5ac-6f10-9f93-6726de570d4c.png)

# Power Automateを使ったフローの全体像

毎月月初00:00に完了処理と更新処理が走り、同日08:00に通知処理が走ります。  
完了処理：契約期限が超過しているレコードのうち、自動更新がオフになっているレコードの状況項目を完了にします。  
更新処理：契約期限が超過しているレコードのうち、自動更新がオンになっているレコードの契約期限を3か月後に設定します。  
通知処理：契約期限が今月末となっているレコードのうち、自動更新がオフになっているレコードに契約更新をするかどうかの通知を送ります。この時、「メールアドレス」項目に入力されているメールアドレス宛に通知が送られます。また、担当者にもメールが送信された旨通知を送ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/17bacd8c-f665-28f1-d631-7a9f85509a00.png)

# フローの内容

## 完了処理

状況が200(=実施中)、かつ契約期限が超過、かつ自動更新オフの場合状況を900(=完了)に更新

:::note info
設定
タイムゾーン：日本標準時間
実行タイミング：毎月月初の00:00
:::

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/e1594b30-0151-5b9c-7f1b-a40427f62be6.png)

:::note info
変数定義
Name：baseUrl, Type：String, Value：<https://pleasanter.net/fs>
Name：SiteId, Type：String, Value：8893276
Name：ApiKey, Type：String, Value：e887...
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/fb8d7c70-679e-6eb5-84c3-c10ee8f537c1.png)

:::note info
Items Get
siteIdOrRecordId：変数「SiteId」
ApiVersion：1.1
ApiKey：変数「ApiKey」
ColumnFilterHash：{"Status": "[\"200\"]","CompletionTime": "[\",@{addHours(addDays(utcNow(),-1),9,'yyyy/MM/dd')}\"]","CheckA": false}
ApiDataType：Default
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/a6d95eff-62fa-b98f-3994-4023342aeba3.png)

:::note info
Items Update
recordId：(Items Getレスポンスの)IssueId
ApiVersion：1.1
ApiKey：変数「ApiKey」
Status：900(=完了)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/a0b0f907-aa91-1a18-c9b3-4df655fc0f76.png)

## 更新処理

状況が200(=実施中)、かつ契約期限が超過、かつ自動更新オンの場合完了を3か月後に更新

:::note info
設定
タイムゾーン：日本標準時間
実行タイミング：毎月月初の00:00
:::

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/e1594b30-0151-5b9c-7f1b-a40427f62be6.png)

:::note info
変数定義
Name：baseUrl, Type：String, Value：<https://pleasanter.net/fs>
Name：SiteId, Type：String, Value：8893276
Name：ApiKey, Type：String, Value：e887...
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/fb8d7c70-679e-6eb5-84c3-c10ee8f537c1.png)

:::note info
Items Get
siteIdOrRecordId：変数「SiteId」
ApiVersion：1.1
ApiKey：変数「ApiKey」
ColumnFilterHash：{"Status": "[\"200\"]","CompletionTime": "[\",@{addHours(addDays(utcNow(),-1),9,'yyyy/MM/dd')}\"]","CheckA": true}
ApiDataType：Default
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/485db8bf-06c9-6e77-5cf0-a1d111e0c82b.png)

:::note info
Items Update
recordId：(Items Getレスポンスの)IssueId
ApiVersion：1.1
ApiKey：変数「ApiKey」
CompletionTime：addToTime(startOfMonth(addToTime(utcNow(), 3, 'Month')),-1,'Day','yyyy/MM/dd')
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/2daaccd5-31ed-a49c-32ee-4edb3c9595bc.png)

## 通知処理

状況が200(=実施中)、かつ契約期限が当月末、かつ自動更新オフの場合契約更新するかどうか通知

:::note info
設定
タイムゾーン：日本標準時間
実行タイミング：毎月月初の08:00
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/a2f5ddbe-b64c-a9ff-7ee8-d083d9adbb60.png)

:::note info
変数定義
Name：baseUrl, Type：String, Value：<https://pleasanter.net/fs>
Name：SiteId, Type：String, Value：8893276
Name：ApiKey, Type：String, Value：e887...
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/fb8d7c70-679e-6eb5-84c3-c10ee8f537c1.png)

:::note info
Items Get
siteIdOrRecordId：変数「SiteId」
ApiVersion：1.1
ApiKey：変数「ApiKey」
ColumnFilterHash：{"Status": "[\"200\"]","CompletionTime": " [\",@{addToTime(startOfMonth(addToTime(utcNow(), 1, 'Month')),-1,'Day','yyyy/MM/dd')} \"]","CheckA": false}
ApiDataType：Default
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/4d368e80-e4c5-7fd1-1ed6-71a8845fd6f0.png)

:::note info
Teams
Post as：Flow bot
Post in：Channel
Team：サポートサービス(Power Automate)
Channel：General
Message：(Items Getレスポンスの)Titleさんに対して、確認メールを送信しました。契約延長する場合、下記レコードにその旨コメントがあります。関数「baseUrl」/items/(Items Getレスポンスの)IssueId
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/ed21755e-a726-9829-88a4-efb19f2e20ef.png)

:::note info
HTTP
Method：POST
URI：関数「baseUrl」/api/items/(Items Getレスポンスの)IssueId/OutgoingMails/Send
Headers：Content-Type, application/json
Body：{"ApiVersion": 1.1,"ApiKey": 関数「ApiKey」,"From": "common@implem.co.jp","To": (Items Getレスポンスの)ClassA,"BCC":"common@implem.co.jp","Title": "ご利用期限のお知らせ","Body": "契約期限が1か月を切りました。契約期限を過ぎてしまいますと、サポートを受けられなくなってしまいます。そのため、契約期限の延長をお勧めいたします。\n契約期限の延長を希望する場合、下記リンク先のコメントにてその旨ご連絡いただけますと幸いです。\n関数「baseUrl」/items/(Items Getレスポンスの)IssueId\n\nご検討のほど、よろしくお願いいたします。"}
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/a3d29000-3ac4-bf4c-f14b-a78138e59aa6.png)

# フロー実行前と後

### フロー実行前

今回の対象は3レコードです。  

* 完了処理：完了処理対象レコードの状況を完了に更新
* 更新処理：更新処理対象レコードの契約期限を3か月後に更新
* 通知処理：通知処理対象レコードのメールアドレスに契約を更新するかどうか通知(その際、自分にもメールが送られた旨Teamsに通知がくる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/2960b430-4d30-3b25-7337-750de3434d1a.png)

### フロー実行後

想定通り、完了処理対象レコードの状況を完了に更新され、更新処理対象レコードの契約期限を3か月後に更新されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/7e4c5b16-af21-7eb6-43bc-901cebd97645.png)  
通知処理に関しても想定通り、通知処理対象レコードのメールアドレスに契約を更新するかどうか通知(その際、自分にもメールが送られた旨Teamsに通知がくる)が来ていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/ca258613-f823-fb60-b051-c1f9feaf6385.png)  
また、Teamsにも想定通り通知が届いていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/e6d8a702-726b-c399-c1f0-b2444b92833f.png)

# おわりに

このように「プリザンター」×「Power Automate」の組み合わせによって、定期タスクを自動化し、業務の効率化に成功しました。ぜひ一度試してみてください。