Added 'delayable' transaction option. Fixed issue in date pre-population

This commit is contained in:
2022-10-02 10:56:19 -04:00
parent 1acb7773b4
commit ee8816687b

84
main.go
View File

@@ -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]