-
Notifications
You must be signed in to change notification settings - Fork 0
/
ledger.go
137 lines (109 loc) · 2.6 KB
/
ledger.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package ledger
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/c-bata/go-prompt"
"github.com/justmeandopensource/cashio/internal/common"
)
type Ledger struct {
Name string
Currency string
}
// A StatsData represents a period and an amount of money
type StatsData struct {
Period string
Amount float64
}
func FetchLedgers() ([]*Ledger, error) {
query := "SELECT name, currency FROM ledgers"
rows, err := common.DbConn.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var ledgers []*Ledger
for rows.Next() {
var name, currency string
if err := rows.Scan(&name, ¤cy); err != nil {
return nil, err
}
ledger := &Ledger{
Name: name,
Currency: currency,
}
ledgers = append(ledgers, ledger)
}
return ledgers, nil
}
func GetLedgersList() ([]string, error) {
ledgers := []string{}
ledgersList, _ := FetchLedgers()
for _, item := range ledgersList {
ledgers = append(ledgers, item.Name)
}
return ledgers, nil
}
func GetCurrencyForLedger(ledgerName string) string {
ledgersList, _ := FetchLedgers()
for _, item := range ledgersList {
if item.Name == ledgerName {
return item.Currency
}
}
return ""
}
func AddLedger() {
reader := bufio.NewReader(os.Stdin)
var (
ledgerName string
currency string
)
for {
fmt.Print("name: ")
ledgerName, _ = reader.ReadString('\n')
ledgerName = strings.TrimSuffix(ledgerName, "\n")
ledgerName = strings.Replace(ledgerName, " ", "_", -1)
if len(ledgerName) > 0 {
if !IsValidLedger(ledgerName) {
break
} else {
fmt.Fprintln(os.Stdout, common.ColorizeRed("[E] ledger with that name already exists. try again"))
}
} else {
fmt.Fprintln(os.Stdout, common.ColorizeRed("[E] ledger name is required"))
}
}
currencyNames := common.GetCurrencyNames()
for {
common.SaveTermState()
currency = prompt.Input("currency [tab for options]: ", common.Completer(currencyNames), prompt.OptionShowCompletionAtStart(), prompt.OptionMaxSuggestion(25))
common.RestoreTermState()
found := false
for _, c := range currencyNames {
if currency == c {
found = true
break
}
}
if found {
break
}
fmt.Fprintln(os.Stdout, common.ColorizeRed("[E] currency not supported"))
}
if err := common.CreateLedgerTables(ledgerName, currency); err != nil {
fmt.Fprintln(os.Stderr, common.ColorizeRed(fmt.Sprint("[E] ", err)))
} else {
fmt.Fprintln(os.Stdout, common.ColorizeBlue("[I] ledger added"))
}
}
func IsValidLedger(ledgerName string) bool {
ledgers, _ := FetchLedgers()
for _, item := range ledgers {
if item.Name == ledgerName {
return true
}
}
return false
}