Added 'delayable' transaction option. Fixed issue in date pre-population
This commit is contained in:
84
main.go
84
main.go
@@ -2,7 +2,6 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
@@ -51,6 +50,7 @@ type ConfigYaml struct {
|
|||||||
type Transaction struct {
|
type Transaction struct {
|
||||||
Amount float64
|
Amount float64
|
||||||
Date time.Time
|
Date time.Time
|
||||||
|
Delayable bool
|
||||||
Frequency string
|
Frequency string
|
||||||
HardDate bool
|
HardDate bool
|
||||||
Late bool
|
Late bool
|
||||||
@@ -62,6 +62,7 @@ type TransactionYaml struct {
|
|||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
Amount float64 `yaml:"amount"`
|
Amount float64 `yaml:"amount"`
|
||||||
Date string `yaml:"date"`
|
Date string `yaml:"date"`
|
||||||
|
Delayable *bool `yaml:"delayable"`
|
||||||
Frequency string `yaml:"frequency,omitempty"`
|
Frequency string `yaml:"frequency,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,9 +82,13 @@ func parseConfig(configYaml *ConfigYaml) Config {
|
|||||||
|
|
||||||
for _, transaction := range configYaml.Credit {
|
for _, transaction := range configYaml.Credit {
|
||||||
formalDate, hardDate := parseDate(transaction.Date)
|
formalDate, hardDate := parseDate(transaction.Date)
|
||||||
|
if transaction.Delayable == nil {
|
||||||
|
transaction.Delayable = &[]bool{true}[0]
|
||||||
|
}
|
||||||
newTransaction := Transaction{
|
newTransaction := Transaction{
|
||||||
Amount: transaction.Amount,
|
Amount: transaction.Amount,
|
||||||
Date: formalDate,
|
Date: formalDate,
|
||||||
|
Delayable: *transaction.Delayable,
|
||||||
OrigDate: formalDate,
|
OrigDate: formalDate,
|
||||||
HardDate: hardDate,
|
HardDate: hardDate,
|
||||||
Frequency: transaction.Frequency,
|
Frequency: transaction.Frequency,
|
||||||
@@ -95,9 +100,13 @@ func parseConfig(configYaml *ConfigYaml) Config {
|
|||||||
|
|
||||||
for _, transaction := range configYaml.Transactions {
|
for _, transaction := range configYaml.Transactions {
|
||||||
formalDate, hardDate := parseDate(transaction.Date)
|
formalDate, hardDate := parseDate(transaction.Date)
|
||||||
|
if transaction.Delayable == nil {
|
||||||
|
transaction.Delayable = &[]bool{true}[0]
|
||||||
|
}
|
||||||
newTransaction := Transaction{
|
newTransaction := Transaction{
|
||||||
Amount: transaction.Amount,
|
Amount: transaction.Amount,
|
||||||
Date: formalDate,
|
Date: formalDate,
|
||||||
|
Delayable: *transaction.Delayable,
|
||||||
OrigDate: formalDate,
|
OrigDate: formalDate,
|
||||||
HardDate: hardDate,
|
HardDate: hardDate,
|
||||||
Frequency: transaction.Frequency,
|
Frequency: transaction.Frequency,
|
||||||
@@ -189,6 +198,7 @@ func addTransaction(transactionLog *TransactionLog, transaction *Transaction) {
|
|||||||
Name: transaction.Name,
|
Name: transaction.Name,
|
||||||
Amount: transaction.Amount,
|
Amount: transaction.Amount,
|
||||||
Date: date,
|
Date: date,
|
||||||
|
Delayable: transaction.Delayable,
|
||||||
OrigDate: date,
|
OrigDate: date,
|
||||||
HardDate: false,
|
HardDate: false,
|
||||||
Late: false,
|
Late: false,
|
||||||
@@ -227,12 +237,12 @@ func delayTransaction(transactionLog *TransactionLog, transaction *Transaction)
|
|||||||
func executeTransaction(transactionLog *TransactionLog, accounts []Account, transaction *Transaction) bool {
|
func executeTransaction(transactionLog *TransactionLog, accounts []Account, transaction *Transaction) bool {
|
||||||
executed := false
|
executed := false
|
||||||
finalDate := transactionLog.EndDate
|
finalDate := transactionLog.EndDate
|
||||||
if transaction.Date.Weekday() == 0 || transaction.Date.Weekday() == 6 {
|
if transaction.Date.Weekday() == 0 || transaction.Date.Weekday() == 6 && transaction.Delayable {
|
||||||
delayTransaction(transactionLog, transaction)
|
delayTransaction(transactionLog, transaction)
|
||||||
} else if transaction.Amount > 0 {
|
} else if transaction.Amount > 0 {
|
||||||
accounts[0].Balance = accounts[0].Balance + transaction.Amount
|
accounts[0].Balance = accounts[0].Balance + transaction.Amount
|
||||||
executed = true
|
executed = true
|
||||||
} else if transaction.Amount < 0 && math.Abs(transaction.Amount) > (accounts[0].Balance-accounts[0].Minimum) && transaction.Date.Before(finalDate) {
|
} else if transaction.Amount < 0 && math.Abs(transaction.Amount) > (accounts[0].Balance-accounts[0].Minimum) && transaction.Date.Before(finalDate) && transaction.Delayable {
|
||||||
delayTransaction(transactionLog, transaction)
|
delayTransaction(transactionLog, transaction)
|
||||||
} else if transaction.Amount < 0 {
|
} else if transaction.Amount < 0 {
|
||||||
accounts[0].Balance = accounts[0].Balance + transaction.Amount
|
accounts[0].Balance = accounts[0].Balance + transaction.Amount
|
||||||
@@ -294,57 +304,50 @@ func printOutput(date time.Time, initialBalances []Account, executedCharges []Tr
|
|||||||
divider2 := delim2 + "|"
|
divider2 := delim2 + "|"
|
||||||
|
|
||||||
fmt.Println(divider)
|
fmt.Println(divider)
|
||||||
output := fmt.Sprint(date.Format("Jan 02 2006"))
|
outString := fmt.Sprint(date.Format("Jan 02 2006"))
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
rear_spacer := strings.Repeat(" ", 65-len(outString))
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
fmt.Printf("%s%s |\n", outString, rear_spacer)
|
||||||
for _, v := range initialBalances {
|
for _, v := range initialBalances {
|
||||||
spacer := strings.Repeat(" ", 19-len(fmt.Sprintf("%.2f", v.Balance)))
|
spacer := strings.Repeat(" ", 19-len(fmt.Sprintf("%.2f", v.Balance)))
|
||||||
output := fmt.Sprintf("$%.2f%s| %s", v.Balance, spacer, v.Name)
|
outString := fmt.Sprintf("$%.2f%s| %s", v.Balance, spacer, v.Name)
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
rear_spacer := strings.Repeat(" ", 65-len(outString))
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
fmt.Printf("%s%s |\n", outString, rear_spacer)
|
||||||
}
|
}
|
||||||
for _, charge := range executedCharges {
|
for _, charge := range executedCharges {
|
||||||
spacer := strings.Repeat(" ", 18-len(fmt.Sprintf("%.2f", math.Abs(charge.Amount))))
|
spacer := strings.Repeat(" ", 18-len(fmt.Sprintf("%.2f", math.Abs(charge.Amount))))
|
||||||
|
outString := ""
|
||||||
if charge.Amount <= 0 {
|
if charge.Amount <= 0 {
|
||||||
output := fmt.Sprintf("-$%.2f%s| %s", math.Abs(charge.Amount), spacer, charge.Name)
|
outString = "-"
|
||||||
if charge.Late {
|
|
||||||
late_tag := fmt.Sprintf("(%s - %s)", "Late", charge.OrigDate.Format("Jan 02 2006"))
|
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(late_tag)-len(output))
|
|
||||||
fmt.Printf("%s%s%s |\n", output, rear_spacer, late_tag)
|
|
||||||
} else if charge.Date.After(charge.OrigDate) {
|
|
||||||
weekend_tag := fmt.Sprintf("(%s - %s)", "Weekend", charge.OrigDate.Format("Jan 02 2006"))
|
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(weekend_tag)-len(output))
|
|
||||||
fmt.Printf("%s%s%s |\n", output, rear_spacer, weekend_tag)
|
|
||||||
} else {
|
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
output := fmt.Sprintf("+$%.2f%s| %s", charge.Amount, spacer, charge.Name)
|
outString = "+"
|
||||||
if charge.Late {
|
}
|
||||||
late_tag := fmt.Sprintf("(%s - %s)", "Late", charge.OrigDate.Format("Jan 02 2006"))
|
outString = fmt.Sprintf("%s$%.2f%s| %s", outString, math.Abs(charge.Amount), spacer, charge.Name)
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(late_tag)-len(output))
|
if charge.Late {
|
||||||
fmt.Printf("%s%s%s |\n", output, rear_spacer, late_tag)
|
late_tag := fmt.Sprintf("(%s - %s)", "Late", charge.OrigDate.Format("Jan 02 2006"))
|
||||||
} else {
|
rear_spacer := strings.Repeat(" ", 65-len(late_tag)-len(outString))
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
fmt.Printf("%s%s%s |\n", outString, rear_spacer, late_tag)
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
} else if charge.Date.After(charge.OrigDate) {
|
||||||
}
|
weekend_tag := fmt.Sprintf("(%s - %s)", "Weekend", charge.OrigDate.Format("Jan 02 2006"))
|
||||||
|
rear_spacer := strings.Repeat(" ", 65-len(weekend_tag)-len(outString))
|
||||||
|
fmt.Printf("%s%s%s |\n", outString, rear_spacer, weekend_tag)
|
||||||
|
} else {
|
||||||
|
rear_spacer := strings.Repeat(" ", 65-len(outString))
|
||||||
|
fmt.Printf("%s%s |\n", outString, rear_spacer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Println(divider2)
|
fmt.Println(divider2)
|
||||||
for _, v := range accounts {
|
for _, v := range accounts {
|
||||||
spacer := strings.Repeat(" ", 19-len(fmt.Sprintf("%.2f", v.Balance)))
|
spacer := strings.Repeat(" ", 19-len(fmt.Sprintf("%.2f", v.Balance)))
|
||||||
output := fmt.Sprintf("$%.2f%s| %s", v.Balance, spacer, v.Name)
|
outString := fmt.Sprintf("$%.2f%s| %s", v.Balance, spacer, v.Name)
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
rear_spacer := strings.Repeat(" ", 65-len(outString))
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
fmt.Printf("%s%s |\n", outString, rear_spacer)
|
||||||
}
|
}
|
||||||
fmt.Println(divider + "\n")
|
fmt.Println(divider + "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
yfile, err := ioutil.ReadFile(os.Args[1])
|
yfile, err := os.ReadFile(os.Args[1])
|
||||||
dates := make([]time.Time, 0)
|
dates := make([]time.Time, 0)
|
||||||
base := time.Now()
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
@@ -380,16 +383,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
current := time.Date(base.Year(),
|
collectTransactions(config.Credit, &transactionLog)
|
||||||
base.Month(), base.Day(), 0, 0, 0, 0, time.UTC)
|
collectTransactions(config.Transactions, &transactionLog)
|
||||||
|
|
||||||
|
current := transactionLog.StartDate
|
||||||
for current.Before(transactionLog.EndDate.AddDate(0, 0, 7)) {
|
for current.Before(transactionLog.EndDate.AddDate(0, 0, 7)) {
|
||||||
dates = append(dates, current)
|
dates = append(dates, current)
|
||||||
current = current.AddDate(0, 0, 1)
|
current = current.AddDate(0, 0, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
collectTransactions(config.Credit, &transactionLog)
|
|
||||||
collectTransactions(config.Transactions, &transactionLog)
|
|
||||||
|
|
||||||
for _, date := range dates {
|
for _, date := range dates {
|
||||||
if _, ok := transactionLog.Transactions[date]; ok {
|
if _, ok := transactionLog.Transactions[date]; ok {
|
||||||
dateCharges := transactionLog.Transactions[date]
|
dateCharges := transactionLog.Transactions[date]
|
||||||
|
|||||||
Reference in New Issue
Block a user