-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbucket_transfer.go
121 lines (108 loc) · 2.98 KB
/
bucket_transfer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package api
import (
"database/sql"
"time"
"github.com/pkg/errors"
"github.com/lieut-data/go-moneywell/api/money"
)
// BucketTransfer represents a transfer between buckets in a MoneyWell document.
//
// The MoneyWell SQLite schema for the ZBUCKETRANSFER table is as follows:
// > .schema ZBUCKETTRANSFER {
// CREATE TABLE ZBUCKETTRANSFER (
// Z_PK INTEGER PRIMARY KEY,
// Z_ENT INTEGER,
// Z_OPT INTEGER,
// ZDATEYMD INTEGER,
// ZISUSERCREATED INTEGER,
// ZSEQUENCE INTEGER,
// ZTYPE INTEGER,
// ZACCOUNT INTEGER,
// ZBUCKET INTEGER,
// ZEVENT INTEGER,
// ZTRANSFERSIBLING INTEGER,
// ZAMOUNT DECIMAL,
// ZMEMO VARCHAR,
// ZTICDSSYNCID VARCHAR,
// ZUNIQUEID VARCHAR
// );
type BucketTransfer struct {
PrimaryKey int
Date time.Time
TransferType int
Amount money.Money
Bucket int64
TargetBucket int64
}
// GetDate implements the Event interface to return the bucket transfer date.
func (bt *BucketTransfer) GetDate() time.Time {
return bt.Date
}
// GetAmount implements the Event interface to return the bucket transfer amount.
func (bt *BucketTransfer) GetAmount() money.Money {
return bt.Amount
}
// GetAmount implements the Event interface to return the bucket in question.
func (bt *BucketTransfer) GetBucket() int64 {
return bt.Bucket
}
// GetBucketTransfers fetches the set of bucket transfers in a MoneyWell document.
func GetBucketTransfers(database *sql.DB) ([]BucketTransfer, error) {
rows, err := database.Query(`
SELECT
zbt.Z_PK,
zbt.ZDATEYMD,
zbt.ZTYPE,
CAST(ROUND(zbt.ZAMOUNT * 100) AS INTEGER),
zbt.ZBUCKET,
zbt2.ZBUCKET,
zb.ZCURRENCYCODE
FROM
ZBUCKETTRANSFER zbt
JOIN
ZBUCKET zb ON ( zb.Z_PK = zbt.ZBUCKET )
JOIN
ZBUCKETTRANSFER zbt2 ON ( zbt2.Z_PK = zbt.ZTRANSFERSIBLING )
ORDER BY
zbt.ZDATEYMD ASC,
zbt.ZSEQUENCE ASC
`)
if err != nil {
return nil, errors.Wrap(err, "failed to query bucket transfers")
}
defer rows.Close()
bucketTransfers := []BucketTransfer{}
var primaryKey, dateymd, transferType int
var amountRaw, bucket, targetBucket int64
var currencyCode string
for rows.Next() {
err := rows.Scan(
&primaryKey,
&dateymd,
&transferType,
&amountRaw,
&bucket,
&targetBucket,
¤cyCode,
)
if err != nil {
return nil, errors.Wrap(err, "failed to scan account")
}
date, err := parseDateymd(dateymd)
if err != nil {
return nil, errors.Wrap(err, "failed to parse bucket transfer date")
}
bucketTransfers = append(bucketTransfers, BucketTransfer{
PrimaryKey: primaryKey,
Date: date,
TransferType: transferType,
Amount: money.Money{
Currency: currencyCode,
Amount: amountRaw,
},
Bucket: bucket,
TargetBucket: targetBucket,
})
}
return bucketTransfers, nil
}