1
- import { DbChange , Transaction , TransactionInput } from '@ag/db/entities'
1
+ import { Account , DbChange , Transaction , TransactionInput } from '@ag/db/entities'
2
2
import { diff , uniqueId } from '@ag/util'
3
3
import assert from 'assert'
4
4
import { defineMessages } from 'react-intl'
@@ -10,7 +10,7 @@ import { dbWrite } from './dbWrite'
10
10
interface SaveTransactionParams {
11
11
input : TransactionInput
12
12
transactionId ?: string
13
- accountId ? : string
13
+ accountId : string
14
14
}
15
15
16
16
const saveTransaction = ( { input, transactionId, accountId } : SaveTransactionParams ) : CoreThunk =>
@@ -24,18 +24,24 @@ const saveTransaction = ({ input, transactionId, accountId }: SaveTransactionPar
24
24
const table = Transaction
25
25
let transaction : Transaction
26
26
let changes : DbChange [ ]
27
+ const amount = input . amount || 0
28
+
27
29
if ( transactionId ) {
28
30
transaction = await transactionRepository . getById ( transactionId )
29
31
const q = diff < Transaction . Props > ( transaction , input )
30
- changes = [ { table, t, edits : [ { id : transactionId , q } ] } ]
32
+ const delta = amount - transaction . amount
33
+ changes = [
34
+ { table, t, edits : [ { id : transactionId , q } ] } ,
35
+ ...Account . change . addTx ( t , accountId , delta ) ,
36
+ ]
31
37
transaction . update ( t , q )
32
38
} else {
33
- if ( ! accountId ) {
34
- throw new Error ( 'when creating an transaction, accountId must be specified' )
35
- }
36
39
transaction = new Transaction ( uniqueId ( ) , accountId , input )
37
40
transactionId = transaction . id
38
- changes = [ { table, t, adds : [ transaction ] } ]
41
+ changes = [
42
+ { table, t, adds : [ transaction ] } ,
43
+ ...Account . change . addTx ( t , accountId , input . amount ) ,
44
+ ]
39
45
}
40
46
assert ( transaction . accountId === accountId )
41
47
await dispatch ( dbWrite ( changes ) )
@@ -49,8 +55,11 @@ const deleteTransaction = (transactionId: string): CoreThunk =>
49
55
async function _deleteTransaction ( dispatch , getState , { ui : { alert, showToast } } ) {
50
56
const state = getState ( )
51
57
const intl = selectors . intl ( state )
58
+ const { transactionRepository } = selectors . appDb ( state )
52
59
53
60
try {
61
+ const transaction = await transactionRepository . getById ( transactionId )
62
+
54
63
const confirmed = await alert ( {
55
64
title : intl . formatMessage ( messages . title ) ,
56
65
body : intl . formatMessage ( messages . deleteTransactionBody ) ,
@@ -63,7 +72,10 @@ const deleteTransaction = (transactionId: string): CoreThunk =>
63
72
if ( confirmed ) {
64
73
const t = Date . now ( )
65
74
const table = Transaction
66
- const changes : DbChange [ ] = [ { table, t, deletes : [ transactionId ] } ]
75
+ const changes : DbChange [ ] = [
76
+ { table, t, deletes : [ transactionId ] } ,
77
+ ...Account . change . addTx ( t , transaction . accountId , - transaction . amount ) ,
78
+ ]
67
79
await dispatch ( dbWrite ( changes ) )
68
80
showToast ( intl . formatMessage ( messages . transactionDeleted ) , true )
69
81
}
0 commit comments