Skip to content

Commit b69b442

Browse files
committed
Recurring expenses
1 parent 987dfb8 commit b69b442

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2850
-102
lines changed

Diff for: lib/data/models/company_model.dart

+9-1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ abstract class CompanyEntity extends Object
113113
products: BuiltList<ProductEntity>(),
114114
invoices: BuiltList<InvoiceEntity>(),
115115
recurringInvoices: BuiltList<InvoiceEntity>(),
116+
recurringExpenses: BuiltList<ExpenseEntity>(),
116117
payments: BuiltList<PaymentEntity>(),
117118
quotes: BuiltList<InvoiceEntity>(),
118119
credits: BuiltList<InvoiceEntity>(),
@@ -271,6 +272,9 @@ abstract class CompanyEntity extends Object
271272
@BuiltValueField(wireName: 'recurring_invoices')
272273
BuiltList<InvoiceEntity> get recurringInvoices;
273274

275+
@BuiltValueField(wireName: 'recurring_expenses')
276+
BuiltList<ExpenseEntity> get recurringExpenses;
277+
274278
BuiltList<PaymentEntity> get payments;
275279

276280
BuiltList<InvoiceEntity> get quotes;
@@ -533,6 +537,9 @@ abstract class CompanyEntity extends Object
533537
} else if (entityType == EntityType.recurringInvoice &&
534538
enabledModules & kModuleRecurringInvoices == 0) {
535539
return false;
540+
} else if (entityType == EntityType.recurringExpense &&
541+
enabledModules & kModuleRecurringExpenses == 0) {
542+
return false;
536543
}
537544

538545
return true;
@@ -554,7 +561,8 @@ abstract class CompanyEntity extends Object
554561
..useCommaAsDecimalPlace = false
555562
..reportIncludeDrafts = false
556563
..systemLogs.replace(BuiltList<SystemLogEntity>())
557-
..subscriptions.replace(BuiltList<SubscriptionEntity>());
564+
..subscriptions.replace(BuiltList<SubscriptionEntity>())
565+
..recurringExpenses.replace(BuiltList<ExpenseEntity>());
558566

559567
static Serializer<CompanyEntity> get serializer => _$companyEntitySerializer;
560568
}

Diff for: lib/data/models/company_model.g.dart

+28-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: lib/data/models/entities.dart

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class EntityType extends EnumClass {
3939
static const EntityType invoiceItem = _$invoiceItem;
4040
static const EntityType design = _$design;
4141
// STARTER: entity type - do not remove comment
42+
static const EntityType recurringExpense = _$recurringExpense;
43+
4244
static const EntityType subscription = _$subscription;
4345
static const EntityType webhook = _$webhook;
4446
static const EntityType token = _$token;

Diff for: lib/data/models/entities.g.dart

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: lib/data/models/recurring_expense_model.dart

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class RecurringExpenseFields {
2+
static const String number = 'number';
3+
static const String privateNotes = 'private_notes';
4+
static const String publicNotes = 'public_notes';
5+
static const String shouldBeInvoiced = 'should_be_invoiced';
6+
static const String transactionId = 'transaction_id';
7+
static const String transactionReference = 'transaction_reference';
8+
static const String bankId = 'bank_id';
9+
static const String currencyId = 'currency_id';
10+
static const String categoryId = 'category_id';
11+
static const String category = 'category';
12+
static const String netAmount = 'net_amount';
13+
static const String amount = 'amount';
14+
static const String taxAmount = 'tax_amount';
15+
static const String expenseDate = 'date';
16+
static const String paymentDate = 'payment_date';
17+
static const String exchangeRate = 'exchange_rate';
18+
static const String invoiceCurrencyId = 'invoice_currency_id';
19+
static const String taxRate1 = 'tax_rate1';
20+
static const String taxName1 = 'tax_name1';
21+
static const String taxRate2 = 'tax_rate2';
22+
static const String taxName2 = 'tax_name2';
23+
static const String taxRate3 = 'tax_rate3';
24+
static const String taxName3 = 'tax_name3';
25+
static const String clientId = 'client_id';
26+
static const String client = 'client';
27+
static const String invoiceId = 'invoice_id';
28+
static const String vendorId = 'vendor_id';
29+
static const String vendor = 'vendor';
30+
static const String status = 'status';
31+
static const String customValue1 = 'custom1';
32+
static const String customValue2 = 'custom2';
33+
static const String customValue3 = 'custom3';
34+
static const String customValue4 = 'custom4';
35+
static const String updatedAt = 'updated_at';
36+
static const String archivedAt = 'archived_at';
37+
static const String isDeleted = 'is_deleted';
38+
static const String documents = 'documents';
39+
}

Diff for: lib/data/models/serializers.dart

+1-5
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,12 @@ import 'package:invoiceninja_flutter/redux/payment/payment_state.dart';
4141
import 'package:invoiceninja_flutter/redux/quote/quote_state.dart';
4242

4343
// STARTER: import - do not remove comment
44+
import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_state.dart';
4445
import 'package:invoiceninja_flutter/data/models/subscription_model.dart';
4546
import 'package:invoiceninja_flutter/redux/subscription/subscription_state.dart';
46-
4747
import 'package:invoiceninja_flutter/data/models/task_status_model.dart';
4848
import 'package:invoiceninja_flutter/redux/task_status/task_status_state.dart';
49-
5049
import 'package:invoiceninja_flutter/redux/expense_category/expense_category_state.dart';
51-
5250
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_state.dart';
5351
import 'package:invoiceninja_flutter/data/models/webhook_model.dart';
5452
import 'package:invoiceninja_flutter/redux/webhook/webhook_state.dart';
@@ -132,11 +130,9 @@ part 'serializers.g.dart';
132130
SubscriptionEntity,
133131
SubscriptionListResponse,
134132
SubscriptionItemResponse,
135-
136133
TaskStatusEntity,
137134
TaskStatusListResponse,
138135
TaskStatusItemResponse,
139-
140136
ExpenseCategoryEntity,
141137
ExpenseCategoryListResponse,
142138
ExpenseCategoryItemResponse,

Diff for: lib/data/models/serializers.g.dart

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
import 'dart:core';
4+
import 'package:built_collection/built_collection.dart';
5+
import 'package:invoiceninja_flutter/data/models/serializers.dart';
6+
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
7+
import 'package:invoiceninja_flutter/data/models/models.dart';
8+
import 'package:invoiceninja_flutter/data/web_client.dart';
9+
10+
class RecurringExpenseRepository {
11+
const RecurringExpenseRepository({
12+
this.webClient = const WebClient(),
13+
});
14+
15+
final WebClient webClient;
16+
17+
Future<ExpenseEntity> loadItem(
18+
Credentials credentials, String entityId) async {
19+
final dynamic response = await webClient.get(
20+
'${credentials.url}/recurring_expenses/$entityId', credentials.token);
21+
22+
final ExpenseItemResponse recurringExpenseResponse =
23+
serializers.deserializeWith(ExpenseItemResponse.serializer, response);
24+
25+
return recurringExpenseResponse.data;
26+
}
27+
28+
Future<BuiltList<ExpenseEntity>> loadList(Credentials credentials) async {
29+
final String url = credentials.url + '/recurring_expenses?';
30+
final dynamic response = await webClient.get(url, credentials.token);
31+
32+
final ExpenseListResponse recurringExpenseResponse =
33+
serializers.deserializeWith(ExpenseListResponse.serializer, response);
34+
35+
return recurringExpenseResponse.data;
36+
}
37+
38+
Future<List<ExpenseEntity>> bulkAction(
39+
Credentials credentials, List<String> ids, EntityAction action) async {
40+
final url = credentials.url + '/recurring_expenses/bulk';
41+
final dynamic response = await webClient.post(url, credentials.token,
42+
data: json.encode({'ids': ids, 'action': action.toApiParam()}));
43+
44+
final ExpenseListResponse recurringExpenseResponse =
45+
serializers.deserializeWith(ExpenseListResponse.serializer, response);
46+
47+
return recurringExpenseResponse.data.toList();
48+
}
49+
50+
Future<ExpenseEntity> saveData(
51+
Credentials credentials, ExpenseEntity recurringExpense) async {
52+
final data =
53+
serializers.serializeWith(ExpenseEntity.serializer, recurringExpense);
54+
dynamic response;
55+
56+
if (recurringExpense.isNew) {
57+
response = await webClient.post(
58+
credentials.url + '/recurring_expenses', credentials.token,
59+
data: json.encode(data));
60+
} else {
61+
final url =
62+
'${credentials.url}/recurring_expenses/${recurringExpense.id}';
63+
response =
64+
await webClient.put(url, credentials.token, data: json.encode(data));
65+
}
66+
67+
final ExpenseItemResponse recurringExpenseResponse =
68+
serializers.deserializeWith(ExpenseItemResponse.serializer, response);
69+
70+
return recurringExpenseResponse.data;
71+
}
72+
}

0 commit comments

Comments
 (0)