Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

服用履歴の連番対応(after: 2025-04-01) #1291

Merged
merged 58 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
e95855e
Move property
bannzai Jan 14, 2025
f522ff8
Fix o list
bannzai Jan 14, 2025
0e99262
Fix
bannzai Jan 14, 2025
0692137
Fix display domain
bannzai Jan 14, 2025
09dd442
Fix
bannzai Jan 14, 2025
46f61e3
remove unnecessary argument
bannzai Jan 14, 2025
691066d
rename test method
bannzai Jan 14, 2025
f5ea435
Fix test case
bannzai Jan 14, 2025
a5a1910
Rename to lastTakenOrZeroPillNumber
bannzai Jan 15, 2025
2206de5
Rename
bannzai Jan 15, 2025
9ba1f30
Rename
bannzai Jan 15, 2025
9867296
Prepare lastTakenPillNumberWithoutDate
bannzai Jan 15, 2025
f1a18a1
Add test case
bannzai Jan 15, 2025
f534b71
Fix
bannzai Jan 15, 2025
b0e4a5d
Bugfix
bannzai Jan 15, 2025
5101bc4
Fix test name
bannzai Jan 15, 2025
df21477
Add test case
bannzai Jan 15, 2025
0084387
Fix
bannzai Jan 15, 2025
2098733
Fix
bannzai Jan 15, 2025
686e10b
Set lastTakenDate to null
bannzai Jan 15, 2025
6cb68e2
Allow null
bannzai Jan 15, 2025
f89e940
Fix
bannzai Jan 15, 2025
11b12aa
Fix
bannzai Jan 15, 2025
a726fdf
Fix
bannzai Jan 15, 2025
3e70ae8
Fix test case
bannzai Jan 15, 2025
258b288
Fix nullable
bannzai Jan 15, 2025
c4f62b8
Fix
bannzai Jan 15, 2025
69f69ae
Fix
bannzai Jan 15, 2025
30e1fd1
Fix test case
bannzai Jan 15, 2025
a679e99
Renaem
bannzai Jan 15, 2025
736a995
Fix test case
bannzai Jan 15, 2025
052c82a
Fix
bannzai Jan 15, 2025
5d7fab8
Fix
bannzai Jan 15, 2025
418f59f
Remove
bannzai Jan 15, 2025
439e6d2
Fix
bannzai Jan 15, 2025
b80cdc4
Fix
bannzai Jan 15, 2025
18fcae9
Fix test case
bannzai Jan 15, 2025
c657a20
Fix
bannzai Jan 15, 2025
42014ce
Fix
bannzai Jan 15, 2025
153ea6f
Fix
bannzai Jan 15, 2025
f9d34af
Fix
bannzai Jan 15, 2025
2784b71
Paste to cycle
bannzai Jan 15, 2025
5657e31
Fix
bannzai Jan 15, 2025
9731fe8
Fix
bannzai Jan 15, 2025
414e872
Fix calclation
bannzai Jan 15, 2025
03d2703
Fix
bannzai Jan 15, 2025
ced808f
Fix cyclic implementation
bannzai Jan 15, 2025
1320425
Fix
bannzai Jan 15, 2025
0e407ac
Fix
bannzai Jan 15, 2025
e0b9ef0
Fix
bannzai Jan 15, 2025
e2a71df
Fix
bannzai Jan 15, 2025
5f1e7ea
Remove
bannzai Jan 15, 2025
c23dd8a
Fix
bannzai Jan 15, 2025
f24fa4e
Fix
bannzai Jan 16, 2025
7fc2065
Remove optional
bannzai Jan 16, 2025
4bbd234
Revert "Remove optional"
bannzai Jan 16, 2025
9378f88
Revert "Fix"
bannzai Jan 16, 2025
cc955ba
Add comment
bannzai Jan 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions lib/entity/pill_sheet.codegen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:pilll/entity/firestore_id_generator.dart';
import 'package:pilll/utils/datetime/date_add.dart';
Expand Down Expand Up @@ -125,12 +127,31 @@ class PillSheet with _$PillSheet {
// lastTakenPillNumber は最後に服了したピルの番号を返す
// あえてnon nullにしている。なぜならよく比較するのでnullableだと不便だから
// まだpillを飲んでない場合は `0` が変える。飲んでいる場合は 1以上の値が入る
int get lastTakenPillNumber {
int get lastTakenOrZeroPillNumber {
final lastTakenDate = this.lastTakenDate;
if (lastTakenDate == null) {
return 0;
}

// NOTE: [PillSheet:OLD_Calc_LastTakenPillNumber] 服用日が開始日より前の場合がある。服用日数を1つ目の1番目のピルシートに調整した時
if (lastTakenDate.isBefore(beginingDate)) {
return 0;
}

return pillNumberFor(targetDate: lastTakenDate);
}

int? get lastTakenPillNumber {
final lastTakenDate = this.lastTakenDate;
if (lastTakenDate == null) {
return null;
}

// NOTE: [PillSheet:OLD_Calc_LastTakenPillNumber] 服用日が開始日より前の場合がある。服用日数を1つ目の1番目のピルシートに調整した時
if (lastTakenDate.isBefore(beginingDate)) {
return null;
}

return pillNumberFor(targetDate: lastTakenDate);
}

Expand All @@ -144,7 +165,7 @@ class PillSheet with _$PillSheet {
return lastTakenDate.isAfter(today()) || isSameDay(lastTakenDate, today());
}

bool get isTakenAll => typeInfo.totalCount == lastTakenPillNumber;
bool get isTakenAll => typeInfo.totalCount == lastTakenOrZeroPillNumber;
bool get isBegan => beginingDate.date().toUtc().millisecondsSinceEpoch < now().toUtc().millisecondsSinceEpoch;
bool get inNotTakenDuration => todayPillNumber > typeInfo.dosingPeriod;
bool get pillSheetHasRestOrFakeDuration => !pillSheetType.isNotExistsNotTakenDuration;
Expand Down Expand Up @@ -179,8 +200,10 @@ class PillSheet with _$PillSheet {
return dates[pillNumberInPillSheet - 1];
}

// NOTE: [PillSheet:OLD_Calc_LastTakenPillNumber] beginDate > targetDate(lastTakenDate) の場合がある。「本日の服用日」を編集して1番目を未服用にした場合
// pillNumberは0は不自然なので、1番を返す
int pillNumberFor({required DateTime targetDate}) {
return daysBetween(beginingDate.date(), targetDate) - summarizedRestDuration(restDurations: restDurations, upperDate: targetDate) + 1;
return max(daysBetween(beginingDate.date(), targetDate) - summarizedRestDuration(restDurations: restDurations, upperDate: targetDate) + 1, 1);
}

// ピルシートのピルの日付を取得する
Expand Down
191 changes: 129 additions & 62 deletions lib/entity/pill_sheet_group.codegen.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:pilll/entity/firestore_timestamp_converter.dart';
import 'package:pilll/entity/pill_sheet.codegen.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
Expand Down Expand Up @@ -111,6 +112,35 @@ class PillSheetGroup with _$PillSheetGroup {
}
}

PillSheet get lastTakenPillSheetOrFirstPillSheet {
for (final pillSheet in pillSheets.reversed) {
if (pillSheet.lastTakenDate != null) {
return pillSheet;
}
}
return pillSheets[0];
}

// テストまで作ったが、プロダクションではまだ使ってない。とはいえ普通に使うメソッドなので visibleForTestingにしておく
@visibleForTesting
int? get lastTakenPillNumberWithoutDate {
for (final pillSheet in pillSheets.reversed) {
final lastTakenPillNumber = pillSheet.lastTakenPillNumber;
if (lastTakenPillNumber != null) {
switch (pillSheetAppearanceMode) {
case PillSheetAppearanceMode.number:
case PillSheetAppearanceMode.date:
return _pillNumberInPillSheet(pillNumberInPillSheet: lastTakenPillNumber);
case PillSheetAppearanceMode.sequential:
return _sequentialPillSheetNumber(pageIndex: pillSheet.groupIndex, pillNumberInPillSheet: lastTakenPillNumber);
case PillSheetAppearanceMode.cyclicSequential:
return _cycleSequentialPillSheetNumber(pageIndex: pillSheet.groupIndex, pillNumberInPillSheet: lastTakenPillNumber);
}
}
}
return null;
}

List<PillSheetType> get pillSheetTypes => pillSheets.map((e) => e.pillSheetType).toList();

List<RestDuration> get restDurations {
Expand All @@ -120,50 +150,85 @@ class PillSheetGroup with _$PillSheetGroup {
);
}

late final List<PillSheetGroupPillNumberDomainPillMarkValue> pillMarksPillNumber = _pillMarksPillNumber();
late final List<PillSheetGroupPillNumberDomainPillMarkValue> pillNumbersInPillSheet = _pillNumbersInPillSheet();
late final List<PillSheetGroupPillNumberDomainPillMarkValue> pillNumbersForSequential = _pillNumbersForSequential();
late final List<PillSheetGroupPillNumberDomainPillMarkValue> pillNumbersForCyclicSequential = _pillNumbersForCyclicSequential();
}

extension PillSheetGroupDisplayDomain on PillSheetGroup {
// 日付以外を返す
String displayPillNumberOnlyNumber({
int pillNumberWithoutDateOrZero({
// 例えば履歴の表示の際にbeforePillSheetGroupとafterPillSheetGroupのpillSheetAppearanceModeが違う場合があるので、pillSheetAppearanceModeを引数にする
required PillSheetAppearanceMode pillSheetAppearanceMode,
required int pageIndex,
required int pillNumberInPillSheet,
}) {
// pillNumberInPillSheet: lastTakenOrZeroPillNumberが0の場合に0を返す
// PillSheetModifiedHistoryPillNumberOrDate.taken で beforeLastTakenPillNumber にプラス1しており、整合性を保つため
if (pillNumberInPillSheet == 0) {
return 0;
}

switch (pillSheetAppearanceMode) {
case PillSheetAppearanceMode.number:
return _pillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet);
case PillSheetAppearanceMode.date:
return _pillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet);
case PillSheetAppearanceMode.sequential:
return _displaySequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
return _sequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
case PillSheetAppearanceMode.cyclicSequential:
return _cycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
}
}

int pillNumberWithoutDateOrZeroFromDate({
// 例えば履歴の表示の際にbeforePillSheetGroupとafterPillSheetGroupのpillSheetAppearanceModeが違う場合があるので、pillSheetAppearanceModeを引数にする
required PillSheetAppearanceMode pillSheetAppearanceMode,
required DateTime date,
}) {
switch (pillSheetAppearanceMode) {
case PillSheetAppearanceMode.number:
return _displayPillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet);
return pillNumbersInPillSheet.firstWhere((e) => isSameDay(e.date, date)).number;
case PillSheetAppearanceMode.date:
return _displayPillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet);
return pillNumbersInPillSheet.firstWhere((e) => isSameDay(e.date, date)).number;
case PillSheetAppearanceMode.sequential:
return pillNumbersForSequential.firstWhere((e) => isSameDay(e.date, date)).number;
case PillSheetAppearanceMode.cyclicSequential:
return _displayCycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
return pillNumbersForCyclicSequential.firstWhere((e) => isSameDay(e.date, date)).number;
}
}

String displayPillNumber({
// 日付以外を返す
String displayPillNumberWithoutDate({
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return pillNumberWithoutDateOrZero(
pillSheetAppearanceMode: pillSheetAppearanceMode,
pageIndex: pageIndex,
pillNumberInPillSheet: pillNumberInPillSheet,
).toString();
}

String displayPillNumberOrDate({
required bool premiumOrTrial,
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return switch (pillSheetAppearanceMode) {
PillSheetAppearanceMode.number => _displayPillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet),
final pillNumber = switch (pillSheetAppearanceMode) {
PillSheetAppearanceMode.number => _pillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet),
PillSheetAppearanceMode.date => premiumOrTrial
? _displayPillSheetDate(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet)
: _displayPillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet),
PillSheetAppearanceMode.sequential => _displaySequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet),
PillSheetAppearanceMode.cyclicSequential =>
_displayCycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet),
: _pillNumberInPillSheet(pillNumberInPillSheet: pillNumberInPillSheet),
PillSheetAppearanceMode.sequential => _sequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet),
PillSheetAppearanceMode.cyclicSequential => _cycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet),
};
return pillNumber.toString();
}

String _displayPillNumberInPillSheet({
int _pillNumberInPillSheet({
required int pillNumberInPillSheet,
}) {
return '$pillNumberInPillSheet';
return pillNumberInPillSheet;
}

@visibleForTesting
Expand All @@ -182,33 +247,33 @@ extension PillSheetGroupDisplayDomain on PillSheetGroup {
}

@visibleForTesting
String displaySequentialPillSheetNumber({
int sequentialPillSheetNumber({
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return _displaySequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
return _sequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
}

String _displaySequentialPillSheetNumber({
int _sequentialPillSheetNumber({
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return pillNumbersForSequential.where((e) => e.pillSheet.groupIndex == pageIndex).toList()[pillNumberInPillSheet - 1].number.toString();
return pillNumbersForSequential.where((e) => e.pillSheet.groupIndex == pageIndex).toList()[pillNumberInPillSheet - 1].number;
}

@visibleForTesting
String displayCycleSequentialPillSheetNumber({
int cycleSequentialPillSheetNumber({
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return _displayCycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
return _cycleSequentialPillSheetNumber(pageIndex: pageIndex, pillNumberInPillSheet: pillNumberInPillSheet);
}

String _displayCycleSequentialPillSheetNumber({
int _cycleSequentialPillSheetNumber({
required int pageIndex,
required int pillNumberInPillSheet,
}) {
return pillNumbersForCyclicSequential.where((e) => e.pillSheet.groupIndex == pageIndex).toList()[pillNumberInPillSheet - 1].number.toString();
return pillNumbersForCyclicSequential.where((e) => e.pillSheet.groupIndex == pageIndex).toList()[pillNumberInPillSheet - 1].number;
}
}

Expand All @@ -234,15 +299,15 @@ extension PillSheetGroupPillNumberDomain on PillSheetGroup {
// NOTE: 日付のbegin,endも.numberと一緒な扱いにする
case PillSheetAppearanceMode.number:
case PillSheetAppearanceMode.date:
return pillMarksPillNumber;
return pillNumbersInPillSheet;
case PillSheetAppearanceMode.sequential:
return pillNumbersForSequential;
case PillSheetAppearanceMode.cyclicSequential:
return pillNumbersForCyclicSequential;
}
}

List<PillSheetGroupPillNumberDomainPillMarkValue> _pillMarksPillNumber() {
List<PillSheetGroupPillNumberDomainPillMarkValue> _pillNumbersInPillSheet() {
return pillSheets
.map((pillSheet) =>
pillSheet.dates.indexed.map((e) => PillSheetGroupPillNumberDomainPillMarkValue(pillSheet: pillSheet, date: e.$2, number: e.$1)).toList())
Expand All @@ -269,25 +334,31 @@ extension PillSheetGroupPillNumberDomain on PillSheetGroup {

final displayNumberSetting = this.displayNumberSetting;
if (displayNumberSetting != null) {
final beginPillNumberOffset = displayNumberSetting.beginPillNumber;
if (beginPillNumberOffset != null && beginPillNumberOffset > 0) {
pillMarks = pillMarks.map((e) => e.copyWith(number: e.number + beginPillNumberOffset - 1)).toList();
final beginPillNumber = displayNumberSetting.beginPillNumber;
if (beginPillNumber != null && beginPillNumber > 0) {
pillMarks = pillMarks.map((e) => e.copyWith(number: e.number + beginPillNumber - 1)).toList();
}

final endPillNumberOffset = displayNumberSetting.endPillNumber;
if (endPillNumberOffset != null && endPillNumberOffset > 0) {
final endPillNumberOffsetIndexes = pillMarks.indexed.where((e) => e.$2.number % endPillNumberOffset == 0).map((e) => e.$1);
final beginPillNumberOffsetIndexes = endPillNumberOffsetIndexes.map((e) => e + 1).toList();
for (int beginPillNumberOffsetIndex in beginPillNumberOffsetIndexes) {
if (beginPillNumberOffsetIndex < pillMarks.length) {
for (final (sublistIndex, (pillMarkIndex, pillMark)) in pillMarks.indexed.toList().sublist(beginPillNumberOffsetIndex).indexed.toList()) {
pillMarks[pillMarkIndex] = pillMark.copyWith(number: sublistIndex + 1);
}
}
final endPillNumber = displayNumberSetting.endPillNumber;
if (endPillNumber != null && endPillNumber > 0) {
final pillCount = endPillNumber - (beginPillNumber ?? 1) + 1;
debugPrint('endPillNumber: $endPillNumber, beginPillNumber: $beginPillNumber, pillCount: $pillCount');
for (final (pillMarkIndex, pillMark) in pillMarks.indexed) {
debugPrint('--------------------');
final loopOffset = (pillMarkIndex ~/ pillCount);
debugPrint('loopOffset: $loopOffset');

final countOffset = loopOffset * pillCount;
final number = pillMark.number - countOffset;
debugPrint(
'index: $pillMarkIndex, pillMark.number: ${pillMark.number}, loopOffset: $loopOffset, countOffset: $countOffset, number: $number, date: ${pillMark.date}');
pillMarks[pillMarkIndex] = pillMark.copyWith(number: number);
}
}
}

debugPrint(pillMarks.map((e) => '${e.date} ${e.number}').join('\n'));

return pillMarks;
}

Expand Down Expand Up @@ -322,25 +393,31 @@ extension PillSheetGroupPillNumberDomain on PillSheetGroup {

final displayNumberSetting = this.displayNumberSetting;
if (displayNumberSetting != null) {
final beginPillNumberOffset = displayNumberSetting.beginPillNumber;
if (beginPillNumberOffset != null && beginPillNumberOffset > 0) {
pillMarks = pillMarks.map((e) => e.copyWith(number: e.number + beginPillNumberOffset - 1)).toList();
final beginPillNumber = displayNumberSetting.beginPillNumber;
if (beginPillNumber != null && beginPillNumber > 0) {
pillMarks = pillMarks.map((e) => e.copyWith(number: e.number + beginPillNumber - 1)).toList();
}

final endPillNumberOffset = displayNumberSetting.endPillNumber;
if (endPillNumberOffset != null && endPillNumberOffset > 0) {
final endPillNumberOffsetIndexes = pillMarks.indexed.where((e) => e.$2.number % endPillNumberOffset == 0).map((e) => e.$1);
final beginPillNumberOffsetIndexes = endPillNumberOffsetIndexes.map((e) => e + 1).toList();
for (int beginPillNumberOffsetIndex in beginPillNumberOffsetIndexes) {
if (beginPillNumberOffsetIndex < pillMarks.length) {
for (final (sublistIndex, (pillMarkIndex, pillMark)) in pillMarks.indexed.toList().sublist(beginPillNumberOffsetIndex).indexed.toList()) {
pillMarks[pillMarkIndex] = pillMark.copyWith(number: sublistIndex + 1);
}
}
final endPillNumber = displayNumberSetting.endPillNumber;
if (endPillNumber != null && endPillNumber > 0) {
final pillCount = endPillNumber - (beginPillNumber ?? 1) + 1;
debugPrint('endPillNumber: $endPillNumber, beginPillNumber: $beginPillNumber, pillCount: $pillCount');
for (final (pillMarkIndex, pillMark) in pillMarks.indexed) {
debugPrint('--------------------');
final loopOffset = (pillMarkIndex ~/ pillCount);
debugPrint('loopOffset: $loopOffset');

final countOffset = loopOffset * pillCount;
final number = pillMark.number - countOffset;
debugPrint(
'index: $pillMarkIndex, pillMark.number: ${pillMark.number}, loopOffset: $loopOffset, countOffset: $countOffset, number: $number, date: ${pillMark.date}');
pillMarks[pillMarkIndex] = pillMark.copyWith(number: number);
}
}
}

debugPrint(pillMarks.map((e) => '${e.date} ${e.number}').join('\n'));

return pillMarks;
}
}
Expand Down Expand Up @@ -415,16 +492,6 @@ extension PillSheetGroupRestDurationDomain on PillSheetGroup {
return pillSheets.map((e) => e.activeRestDuration).whereNotNull().firstOrNull;
}

PillSheet get lastTakenPillSheetOrFirstPillSheet {
for (final pillSheet in pillSheets.reversed) {
if (pillSheet.lastTakenDate != null) {
return pillSheet;
}
}

return pillSheets[0];
}

PillSheet get targetBeginRestDurationPillSheet {
final PillSheet targetPillSheet;
if (lastTakenPillSheetOrFirstPillSheet.isTakenAll) {
Expand Down
Loading
Loading