# 未登入天數討論
## 理由
目前殭屍稅是以未登入天數*當日薪水去計算,而目前未登入天數計算為:
```
未登入天數累進 = floor((現在登入的時間 - 上次登入的時間) / 一天的時間)
若上次登入時間小於當季開始時間,則以當季開始時間算
換季時,未登入天數統計:
以當季結束時間,再做如下的累進公式一次:
floor((當季結束時間 - 最近一次登入的時間) / 一天的時間)
若最後的算出來的未登入天數大於當季的天數(目前是7天),則
未登入的天數為當季的天數。
備註:
換季時做的累進公式並不會去判斷是否最近一次登入的時間小於當季開始的時間,
而是以實際最近一次登入的時間去計算。
```
而這樣的計算,會發生即使每天有登入,也還會被記為登入天數的情況。例如:昨天十點登,今天十一點登,則今天會被記未登入天數一天。這樣不符合當初對於當日未登入的使用者不發薪的目的。
## 改進方案
1. 維持原樣
* 未登入天數計算公式 : 如上所述
* 系統更動 : 無
* 系統效能影響 : 無影響
* 對每日長時間遊玩的使用者的影響 : 不會被課稅
* 對於每日上線時間不固定的使用者的影響 : 如上所述,有可能會被記未登入天數,課殭屍稅。
* 對殭屍的影響 : 記未登入天數,被課稅
2. 以換季時間 (目前是 10:00) 作為每天的換日時間點,以跨過換日時間點的次數來計算未登入次數
* 未登入天數計算公式 :
```
未登入天數累進 = max(上次登入到現在跨過的換日點總數 - 1, 0)
換日點:每日 10:00
跨過換日點的定義為:
上次登入的時間 <= 換日點的時間 < 現在登入的時間
若上次登入的時間小於當季開始時間,則以當季開始時間開始算
換季時,未登入天數統計:
以當季節束時間,再做如下的累進公式一次:
floor((當季結束時間 - 最近一次登入的時間) / 一天的時間)
若最後的算出來的未登入天數大於當季的天數(目前是7天),則
未登入的天數為當季的天數。
備註:
換季時做的累進公式並不會去判斷是否最近一次登入的時間小於當季開始的時間,
而是以實際最近一次登入的時間去計算。
```
* 實作細節 :
```
上次登入到現在跨過的換日點總數計算:
令現在登入時間為N,上次登入時間為P,當季開始時間為S,一天的時間為T
則跨過換日點總數為:
ceil((N - S)/T) - ceil((max(P, S) - S)/T)
```
* 系統更動 : 只要更新公式就好
* 系統效能影響 : 極小,可忽略
* 對每日長時間遊玩的使用者的影響 : 不會被課稅
* 對於每日上線時間不固定的使用者的影響 : 不會被課稅
* 對殭屍的影響 : 記未登入天數,被課稅
## 以登入例子比較各方案
假設當季開始時間為週日10:00,結束時間為下週日10:00
### 登入時計算的未登入累進比較
登入例子| 方案一 登入時計算的未登入累進 | 方案二 登入時計算的未登入累進 |
--- | --- | --- |
當天重登入 (現在登入為今天12:00,上次登入為今天11:00) |0|0|
跨日登入,相差小於24小時 (現在登入的時間為今天11:00,上次登入時間為昨天12:00) | 0 | 0 |
跨日登入,相差等於24小時 (現在登入時間今天12:00,上次登入時間昨天12:00)| 1 | 0 |
跨日登入,相差大於24小時 (現在登入時間為今天12:00,上次登入時間為昨天11:00) | 1 | 0 |
中間差一日登入,相差小於48小時 (現在登入時間為今天11:00,上次登入時間為前天12:00) | 1| 1 |
中間差一日登入,相差等於48小時 (現在登入時間為今天的12:00,上次登入時間為前天12:00) | 2| 1 |
中間差一日登入,相差大於48小時 (現在登入時間為今天的12:00,上次登入時間為前天11:00) | 2| 1 |
當季首次登入時間在當季第1天 (登入時間在週日10:00到週一9:59) | 0 | 0|
當季首次登入時間在當季第2天 (登入時間在週一10:01到週二9:59) | 1 | 1|
當季首次登入時間在當季第3天 (登入時間在週二10:01到週三9:59) | 2 | 2|
當季首次登入時間在當季第4天 (登入時間在週三10:01到週四9:59) | 3 | 3|
當季首次登入時間在當季第5天 (登入時間在週四10:01到週五9:59) | 4 | 4|
當季首次登入時間在當季第6天 (登入時間在週五10:01到週六的9:59) | 5 | 5|
當季首次登入時間在當季第7天 (登入時間為週六10:01到當季結束時間) | 6 | 6|
當季首次登入在當季第1個換日點 (登入時間為週一10:00) | 1 | 0|
當季首次登入在當季第2個換日點 (登入時間為週二10:00) | 2 | 1|
當季首次登入在當季第3個換日點 (登入時間為週三10:00) | 3 | 2|
當季首次登入在當季第4個換日點 (登入時間為週四10:00) | 4 | 3|
當季首次登入在當季第5個換日點 (登入時間為週五10:00) | 5 | 4|
當季首次登入在當季第6個換日點 (登入時間為週六10:00) | 6 | 5|
備註 : 以上時間的例子以24小時制表示