From b68e8dd7fe3d7c636ff3911be2d43e51c61ff04e Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 21 Sep 2022 14:50:31 +0300 Subject: [PATCH] Transactions --- lib/data/models/models.dart | 1 + lib/data/models/models.g.dart | 4 + .../repositories/transaction_repository.dart | 40 +++++++++ .../transaction/transaction_actions.dart | 12 +-- .../transaction/transaction_middleware.dart | 83 +++++++++++++++++++ 5 files changed, 134 insertions(+), 6 deletions(-) diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index 1ce8b8fd7..343622dcd 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -118,6 +118,7 @@ class EntityAction extends EnumClass { static const EntityAction save = _$save; static const EntityAction accept = _$accept; static const EntityAction addToInventory = _$addToInventory; + static const EntityAction convert = _$convert; static const EntityAction convertToExpense = _$convertToExpense; static const EntityAction convertToPayment = _$convertToPayment; static const EntityAction merge = _$merge; diff --git a/lib/data/models/models.g.dart b/lib/data/models/models.g.dart index ec27e501f..3fd4d6e40 100644 --- a/lib/data/models/models.g.dart +++ b/lib/data/models/models.g.dart @@ -83,6 +83,7 @@ const EntityAction _$cancel = const EntityAction._('cancel'); const EntityAction _$save = const EntityAction._('save'); const EntityAction _$accept = const EntityAction._('accept'); const EntityAction _$addToInventory = const EntityAction._('addToInventory'); +const EntityAction _$convert = const EntityAction._('convert'); const EntityAction _$convertToExpense = const EntityAction._('convertToExpense'); const EntityAction _$convertToPayment = @@ -227,6 +228,8 @@ EntityAction _$valueOf(String name) { return _$accept; case 'addToInventory': return _$addToInventory; + case 'convert': + return _$convert; case 'convertToExpense': return _$convertToExpense; case 'convertToPayment': @@ -308,6 +311,7 @@ final BuiltSet _$values = _$save, _$accept, _$addToInventory, + _$convert, _$convertToExpense, _$convertToPayment, _$merge, diff --git a/lib/data/repositories/transaction_repository.dart b/lib/data/repositories/transaction_repository.dart index e9f9a4585..92f79a551 100644 --- a/lib/data/repositories/transaction_repository.dart +++ b/lib/data/repositories/transaction_repository.dart @@ -52,6 +52,46 @@ class TransactionRepository { return transactionResponse.data.toList(); } + Future convertToPayment(Credentials credentials, + String transactionId, List invoiceIds) async { + final url = credentials.url + '/bank_transactions/match'; + final dynamic response = await webClient.post( + url, + credentials.token, + data: json.encode( + { + 'id': transactionId, + 'invoice_ids': invoiceIds.join(','), + }, + ), + ); + + final TransactionItemResponse transactionResponse = serializers + .deserializeWith(TransactionItemResponse.serializer, response); + + return transactionResponse.data; + } + + Future convertToExpense( + Credentials credentials, String transactionId, String vendorId) async { + final url = credentials.url + '/bank_transactions/match'; + final dynamic response = await webClient.post( + url, + credentials.token, + data: json.encode( + { + 'id': transactionId, + 'vendor_id': vendorId, + }, + ), + ); + + final TransactionItemResponse transactionResponse = serializers + .deserializeWith(TransactionItemResponse.serializer, response); + + return transactionResponse.data; + } + Future saveData( Credentials credentials, TransactionEntity transaction) async { final data = diff --git a/lib/redux/transaction/transaction_actions.dart b/lib/redux/transaction/transaction_actions.dart index a961e91b6..e6c175c97 100644 --- a/lib/redux/transaction/transaction_actions.dart +++ b/lib/redux/transaction/transaction_actions.dart @@ -213,9 +213,9 @@ class ConvertTransactionToPaymentSuccess implements StopSaving, PersistData { } class ConvertTransactionToPaymentFailure implements StopSaving { - ConvertTransactionToPaymentFailure(this.transaction); + ConvertTransactionToPaymentFailure(this.error); - final TransactionEntity transaction; + final dynamic error; } class ConvertTransactionToExpenseRequest implements StartSaving { @@ -237,9 +237,9 @@ class ConvertTransactionToExpenseSuccess implements StopSaving, PersistData { } class ConvertTransactionToExpenseFailure implements StopSaving { - ConvertTransactionToExpenseFailure(this.transaction); + ConvertTransactionToExpenseFailure(this.error); - final TransactionEntity transaction; + final dynamic error; } class ConvertTransactionsRequest implements StartSaving { @@ -256,9 +256,9 @@ class ConvertTransactionsSuccess implements StopSaving, PersistData { } class ConvertTransactionsFailure implements StopSaving { - ConvertTransactionsFailure(this.transactions); + ConvertTransactionsFailure(this.error); - final List transactions; + final dynamic error; } class FilterTransactions implements PersistUI { diff --git a/lib/redux/transaction/transaction_middleware.dart b/lib/redux/transaction/transaction_middleware.dart index 0c8589548..a19ca54ba 100644 --- a/lib/redux/transaction/transaction_middleware.dart +++ b/lib/redux/transaction/transaction_middleware.dart @@ -24,6 +24,9 @@ List> createStoreTransactionsMiddleware([ final archiveTransaction = _archiveTransaction(repository); final deleteTransaction = _deleteTransaction(repository); final restoreTransaction = _restoreTransaction(repository); + final convertTransactions = _convertTransactions(repository); + final convertToPayment = _convertToPayment(repository); + final convertToExpense = _convertToExpense(repository); return [ TypedMiddleware(viewTransactionList), @@ -35,6 +38,11 @@ List> createStoreTransactionsMiddleware([ TypedMiddleware(archiveTransaction), TypedMiddleware(deleteTransaction), TypedMiddleware(restoreTransaction), + TypedMiddleware(convertTransactions), + TypedMiddleware( + convertToPayment), + TypedMiddleware( + convertToExpense), ]; } @@ -164,6 +172,81 @@ Middleware _restoreTransaction(TransactionRepository repository) { }; } +Middleware _convertTransactions(TransactionRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as ConvertTransactionsRequest; + repository + .bulkAction(store.state.credentials, action.transactionIds, + EntityAction.convert) + .then((List transactions) { + store.dispatch(ConvertTransactionsSuccess(transactions)); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(ConvertTransactionsFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + +Middleware _convertToPayment(TransactionRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as ConvertTransactionToPaymentRequest; + repository + .convertToPayment( + store.state.credentials, + action.transactionId, + action.invoiceIds, + ) + .then((TransactionEntity transactions) { + store.dispatch(ConvertTransactionToPaymentSuccess(transactions)); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(ConvertTransactionToPaymentFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + +Middleware _convertToExpense(TransactionRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as ConvertTransactionToExpenseRequest; + repository + .convertToExpense( + store.state.credentials, + action.transactionId, + action.vendorId, + ) + .then((TransactionEntity transactions) { + store.dispatch(ConvertTransactionToExpenseSuccess(transactions)); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(ConvertTransactionToExpenseFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + Middleware _saveTransaction(TransactionRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveTransactionRequest;