---
title: Send survey notification
tags: v1
---
# Send survey notification
[ToC]
# 先備知識
fio = app = S.M.A.R.T. Contract
## MongoDB
- Collection: `fio`
- field: fio.invitations = [{type: '', status: '', email: '', date: ''}, ...]
- type: value of ['user', 'approver']
- status: value of ['pending', 'active', 'reject']
- email: value of ['被邀請人的 email']
- date: value of ['更改日期']
- Collection: `fio_xxx_obj`
- 紀錄每一筆上鏈(IOTA)的所有資訊
# 需求
1. 可以在 app 裡一次發給所有被邀請的 user 填寫 survey 通知
2. 通知要顯示在 user 的 dashboard 上
3. user 在 dashboard 上點擊 Open survey 開啟表單,開啟表單後 點及 Yes 即消失 No 則開啟表單
# UX
1. send survey

2. Notification display on user's dashboard

3. click open survey to open survey


4. choose Yes/No to confirm the survey is completed or not (after clicking open survey the button will transfer to Yes/No option)
- url: /dashboard
- 
# 初步規劃
1. 在 fio.invitations 裡新增欄位是一個 array 叫 survey 紀錄 survey 寄送日期
- 欄位:
```
survey :[date]
```

2. 寄出 survey => 所有被邀請的 user 全部加上 survey: [date]
## student / teacher
- teacher:
- fio_id
- many `_id` in `fio_xxxx_obj` (SELECT `student's username(欄位名稱 Email)` FROM `fio_xxxx_obj`)
- 要紀錄「哪個欄位要用來作為 email/username」辨別
- fio.email(系統變數) = "Email" (欄位名稱)
- student:
- fio_id
- 收到 survey 通知
- 如何收到?
- fio.invitations
- 顯示在 Dashboard today
- {user_type: [user, approver], email, status, date}
- question
- 顯示在小鈴鐺內的資料?
- log?
- read => log
## notification for user
alpha_admin.notification
{
type:
fio_id: int,
}
## 可能遇到問題
1. user 不點擊 Yes 通知不會消失 是否加上時間去判斷
2. 重複寄送表單? 在 UX 第四點點選 No 將重新開啟表單
3. 需要紀錄 user CTA: yes/no 並呈現在網頁上?
4. User 按錯 yes 怎麼辦?點擊 yes 之前會需要有個再次確認的提示嗎?
5. App Notification 與原本的設計「小鈴鐺」的關係是?
- 小鈴鐺 
- e.g. GCP 
1. 「通知」的定義: teacher, studnet / other apps' user
- 小鈴鐺
2. /dashboard 呈現的 survey 狀態,不是「通知」
- 資料庫要存
- 現在的狀態
- 異動紀錄
3. 資料庫設計
- 從最 top 的角度去思考,去看現在你要處理的問題是屬於哪一小塊
- 這一小塊
- 不會影響到其塊:ok
- 會影響到其他塊:重新規劃
- 資料存取
- 使用者會用到的資料,存入 alpha_admin
- app 會用到的資料,存入 fio
- 有些資料,會同時存入 alpha_admin 與 fio
- 資料有分成
- 現狀
- 異動紀錄
# Jack 的想法
- /dashboard today 這裡希望是放關於 app-dashboard 的通知,包括 invite user,send survey...等
- 小鈴鐺 will be system alert in the future including credit card,bill...etc
- 異動紀錄可以先記起來 could be useful data,未來可能在 app page 多一個 tab : activity log
## survey 狀態
- teacher
- after student finished a survey teacher will see on the action require
- student
- can see the status of the survey in resume
## 總結 Jack
- 通知:
- /dashboard today = 所有 app 的通知
- 狀態:
- 老師: /app-dashboard action required
- 學生: /app-dashboard resume

## 2021/06/02 會議記錄
- 如果上鏈失敗通知誰 authenticate but fail?
- User 應該會期望我們去幫他上鏈
- 上鏈失敗 應該自動幫他們重上 另外通知 User 他們也不能做什麼
- 還有發生機率應該也不高 就不另外通知
- 已經 authenticated survey 顯示一個星期
- 已經 authenticated survey 通知 會顯示 Go to resume

# 需要在 /app-dashboard 收到通知的情況
1. 收到邀請 (已完成)
2. 顯示一天內接受的邀請 (已完成)
3. 學生被通知填寫 survey,可直接打開填寫
4. 學生的 survey 被認證了(顯示一個禮拜)
5. 老師需要 authenticate survey 的通知,可直接打開 survey 並 authenticate
6. 其他 solution ?
# 規劃
- 不另外存取,使用現有資料,加上欄位 survey
- 在 fio.invitations 裡新增欄位 是 array 叫 survey 藉此判斷通知是否寄送與寄送時間
- 欄位:
```
survey:[
{
notification: sent / completed,
date:date
}
]
```

- 老師
- click send survey => notification = sent
- 學生
- if notification == sent => /app-dashboard 通知
- 完成 survey => notification = completed => /app-dashboard 通知消失
# 虛擬碼
- 通知老師 authenticate survey
```
const fio = db.fio.find {
fio.invitation.email == req.session.username
&& fio.invitation.user_type == approver
}
if fio then xxx = fio._id
else throw Error
if fio_xxx_obj["On Chain"] == Pending
then show notification
```
- 通知學生填寫 survey
```
if fio.invitation.email == req.session.username
&& fio.invitation.user_type == user
&& fio.invitation.status == active
&& fio.invitation.notification == sent
then show notification
```
- 通知學生已被 authenticate survey(一週內)
```
const fio = db.fio.find {
fio.invitation.email == req.session.username
&& fio.invitation.user_type == user
}
if fio then xxx = fio._id
else throw Error
if fio_xxx_obj["On Chain"] == Done
&& fio_xxx_obj[Your Email] == req.session.username
&& fio_xxx_obj["時間戳記"]<一週內
then show notification
```
## S.M.A.R.T Contract
[執行 S.M.A.R.T Contract 圖1](https://gitlab.com/fio.io/tms/-/blob/dev/sheet#L131)
[執行 S.M.A.R.T Contract 圖2](https://gitlab.com/fio.io/tms/-/blob/dev/sheet#L120-122)
- 圖1

- 圖2

資料庫規劃
survey:[
{name:20210614_survey,date:date}
]
const onChainData = Mongo.db.find('fio_'+fio._id+'_obj',username)
survey 數量即收到表單的數量
notification 數量 = survey.length - Mongo.db.find('fio_'+fio._id+'_obj',username)
# 邏輯流程圖
