Recurring schedule

This commit is contained in:
Hillel Coren 2021-09-29 17:21:26 +03:00
parent 47e769653b
commit 2bb05d1919
3 changed files with 45 additions and 0 deletions

View File

@ -604,11 +604,26 @@ abstract class ExpenseEntity extends Object
@override @override
String get listDisplayName => number ?? ''; String get listDisplayName => number ?? '';
@nullable
@BuiltValueField(compare: false)
int get loadedAt;
bool isBetween(String startDate, String endDate) { bool isBetween(String startDate, String endDate) {
return (startDate ?? '').compareTo(date ?? '') <= 0 && return (startDate ?? '').compareTo(date ?? '') <= 0 &&
(endDate ?? '').compareTo(date ?? '') >= 0; (endDate ?? '').compareTo(date ?? '') >= 0;
} }
bool get isLoaded => loadedAt != null && loadedAt > 0;
bool get isStale {
if (!isLoaded) {
return true;
}
return DateTime.now().millisecondsSinceEpoch - loadedAt >
kMillisecondsToRefreshActivities;
}
bool get isUpcoming => convertSqlDateToDateTime(date).isAfter(DateTime.now()); bool get isUpcoming => convertSqlDateToDateTime(date).isAfter(DateTime.now());
bool get isRecurring => [EntityType.recurringExpense].contains(entityType); bool get isRecurring => [EntityType.recurringExpense].contains(entityType);

View File

@ -302,6 +302,12 @@ class _$ExpenseEntitySerializer implements StructuredSerializer<ExpenseEntity> {
specifiedType: const FullType( specifiedType: const FullType(
BuiltList, const [const FullType(ExpenseScheduleEntity)]))); BuiltList, const [const FullType(ExpenseScheduleEntity)])));
} }
value = object.loadedAt;
if (value != null) {
result
..add('loadedAt')
..add(serializers.serialize(value, specifiedType: const FullType(int)));
}
value = object.isChanged; value = object.isChanged;
if (value != null) { if (value != null) {
result result
@ -528,6 +534,10 @@ class _$ExpenseEntitySerializer implements StructuredSerializer<ExpenseEntity> {
BuiltList, const [const FullType(ExpenseScheduleEntity)])) BuiltList, const [const FullType(ExpenseScheduleEntity)]))
as BuiltList<Object>); as BuiltList<Object>);
break; break;
case 'loadedAt':
result.loadedAt = serializers.deserialize(value,
specifiedType: const FullType(int)) as int;
break;
case 'isChanged': case 'isChanged':
result.isChanged = serializers.deserialize(value, result.isChanged = serializers.deserialize(value,
specifiedType: const FullType(bool)) as bool; specifiedType: const FullType(bool)) as bool;
@ -941,6 +951,8 @@ class _$ExpenseEntity extends ExpenseEntity {
@override @override
final BuiltList<ExpenseScheduleEntity> recurringDates; final BuiltList<ExpenseScheduleEntity> recurringDates;
@override @override
final int loadedAt;
@override
final bool isChanged; final bool isChanged;
@override @override
final int createdAt; final int createdAt;
@ -1006,6 +1018,7 @@ class _$ExpenseEntity extends ExpenseEntity {
this.nextSendDate, this.nextSendDate,
this.remainingCycles, this.remainingCycles,
this.recurringDates, this.recurringDates,
this.loadedAt,
this.isChanged, this.isChanged,
this.createdAt, this.createdAt,
this.updatedAt, this.updatedAt,
@ -1244,6 +1257,7 @@ class _$ExpenseEntity extends ExpenseEntity {
..add('nextSendDate', nextSendDate) ..add('nextSendDate', nextSendDate)
..add('remainingCycles', remainingCycles) ..add('remainingCycles', remainingCycles)
..add('recurringDates', recurringDates) ..add('recurringDates', recurringDates)
..add('loadedAt', loadedAt)
..add('isChanged', isChanged) ..add('isChanged', isChanged)
..add('createdAt', createdAt) ..add('createdAt', createdAt)
..add('updatedAt', updatedAt) ..add('updatedAt', updatedAt)
@ -1446,6 +1460,10 @@ class ExpenseEntityBuilder
set recurringDates(ListBuilder<ExpenseScheduleEntity> recurringDates) => set recurringDates(ListBuilder<ExpenseScheduleEntity> recurringDates) =>
_$this._recurringDates = recurringDates; _$this._recurringDates = recurringDates;
int _loadedAt;
int get loadedAt => _$this._loadedAt;
set loadedAt(int loadedAt) => _$this._loadedAt = loadedAt;
bool _isChanged; bool _isChanged;
bool get isChanged => _$this._isChanged; bool get isChanged => _$this._isChanged;
set isChanged(bool isChanged) => _$this._isChanged = isChanged; set isChanged(bool isChanged) => _$this._isChanged = isChanged;
@ -1534,6 +1552,7 @@ class ExpenseEntityBuilder
_nextSendDate = $v.nextSendDate; _nextSendDate = $v.nextSendDate;
_remainingCycles = $v.remainingCycles; _remainingCycles = $v.remainingCycles;
_recurringDates = $v.recurringDates?.toBuilder(); _recurringDates = $v.recurringDates?.toBuilder();
_loadedAt = $v.loadedAt;
_isChanged = $v.isChanged; _isChanged = $v.isChanged;
_createdAt = $v.createdAt; _createdAt = $v.createdAt;
_updatedAt = $v.updatedAt; _updatedAt = $v.updatedAt;
@ -1615,6 +1634,7 @@ class ExpenseEntityBuilder
nextSendDate: BuiltValueNullFieldError.checkNotNull(nextSendDate, 'ExpenseEntity', 'nextSendDate'), nextSendDate: BuiltValueNullFieldError.checkNotNull(nextSendDate, 'ExpenseEntity', 'nextSendDate'),
remainingCycles: BuiltValueNullFieldError.checkNotNull(remainingCycles, 'ExpenseEntity', 'remainingCycles'), remainingCycles: BuiltValueNullFieldError.checkNotNull(remainingCycles, 'ExpenseEntity', 'remainingCycles'),
recurringDates: _recurringDates?.build(), recurringDates: _recurringDates?.build(),
loadedAt: loadedAt,
isChanged: isChanged, isChanged: isChanged,
createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'ExpenseEntity', 'createdAt'), createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'ExpenseEntity', 'createdAt'),
updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, 'ExpenseEntity', 'updatedAt'), updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, 'ExpenseEntity', 'updatedAt'),

View File

@ -92,6 +92,10 @@ class _ExpenseViewState extends State<ExpenseView>
? localization.documents ? localization.documents
: '${localization.documents} (${expense.documents.length})', : '${localization.documents} (${expense.documents.length})',
), ),
if (expense.isRecurring)
Tab(
text: localization.schedule,
)
], ],
), ),
body: Builder(builder: (context) { body: Builder(builder: (context) {
@ -113,6 +117,12 @@ class _ExpenseViewState extends State<ExpenseView>
child: ExpenseViewDocuments( child: ExpenseViewDocuments(
viewModel: viewModel, expense: viewModel.expense), viewModel: viewModel, expense: viewModel.expense),
), ),
if (expense.isRecurring)
RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context),
child: ExpenseViewDocuments(
viewModel: viewModel, expense: viewModel.expense),
),
], ],
), ),
), ),