Add delayed reason

This commit is contained in:
2025-04-28 22:13:00 -04:00
parent fc228d329e
commit 85721d7815
4 changed files with 118 additions and 27 deletions

78
main.go
View File

@@ -19,9 +19,13 @@ import (
)
const (
maxWidth = 100
maxWidth = 100
DelayWeekend DelayReason = "Weekend"
DelayInsufficient DelayReason = "Insufficient Funds"
)
type DelayReason string
type timeSlice []time.Time
func (s timeSlice) Len() int { return len(s) }
@@ -50,6 +54,12 @@ type Account struct {
Minimum float64 `yaml:"minimum"`
}
type AccountYaml struct {
Name string `yaml:"name"`
Balance string `yaml:"balance"`
Minimum string `yaml:"minimum"`
}
type Charge struct {
Name string
Late bool
@@ -65,21 +75,22 @@ type Config struct {
type ConfigYaml struct {
Start string
End string
Accounts []Account
Accounts []AccountYaml
Credit []TransactionYaml
Transactions []TransactionYaml
}
type Transaction struct {
Amount float64
Date time.Time
Delayable bool
Frequency string
ID string
Delayed bool
Name string
OriginDate time.Time
Shift string
Amount float64
Date time.Time
Delayable bool
Frequency string
ID string
Delayed bool
DelayedReason DelayReason
Name string
OriginDate time.Time
Shift string
}
type TransactionYaml struct {
@@ -228,8 +239,33 @@ func parseTransaction(transactionYaml TransactionYaml) (*Transaction, error) {
}
func parseConfig(configYaml ConfigYaml) *Config {
accounts := make([]Account, 0)
for _, account := range configYaml.Accounts {
balanceStr := strings.ReplaceAll(account.Balance, "$", "")
balanceStr = strings.ReplaceAll(balanceStr, ",", "")
balance, err := strconv.ParseFloat(balanceStr, 32)
if err != nil {
logrus.Fatal(err)
}
var minimum float64 = 0
if account.Minimum != "" {
minimumStr := strings.ReplaceAll(account.Minimum, "$", "")
minimumStr = strings.ReplaceAll(minimumStr, ",", "")
minimum, err = strconv.ParseFloat(minimumStr, 32)
if err != nil {
logrus.Fatal(err)
}
}
accounts = append(accounts, Account{
Name: account.Name,
Balance: balance,
Minimum: minimum,
})
}
config := &Config{
Accounts: configYaml.Accounts,
Accounts: accounts,
Transactions: make([]*Transaction, 0),
}
@@ -368,6 +404,12 @@ func calculateShift(transactionLog TransactionLog, transaction Transaction) time
newDate = newDate.AddDate(0, 0, add)
}
if newDate.Before(transactionLog.first()) || newDate.After(transactionLog.last()) {
for isWeekend(newDate) {
newDate = newDate.AddDate(0, 0, add)
}
}
return newDate
}
@@ -391,7 +433,7 @@ func (tl *TransactionLog) delayTransaction(transaction *Transaction) {
newDate = tl.last()
}
if isWeekend(newDate) {
for isWeekend(newDate) {
newDate = newDate.AddDate(0, 0, 1)
}
@@ -403,6 +445,9 @@ func (tl *TransactionLog) delayTransaction(transaction *Transaction) {
tl.LogDays[newDate].Transactions[transaction.ID] = transaction
transaction.Delayed = true
if transaction.DelayedReason == "" {
transaction.DelayedReason = DelayInsufficient
}
}
@@ -414,6 +459,7 @@ func (tl *TransactionLog) executeTransaction(transaction *Transaction) bool {
if isWeekend(transaction.Date) && transaction.Delayable {
logrus.Debugf("Delaying %s due to weekend scheduling\n", transaction.Name)
tl.delayTransaction(transaction)
transaction.DelayedReason = DelayWeekend
return false
}
@@ -658,10 +704,8 @@ func printOutput(logDay LogDay) {
prefix = "+"
}
if charge.Delayed {
suffix = fmt.Sprintf("(%s - %s) |", "Late", charge.OriginDate.Format("Jan 02 2006"))
} else if charge.Date != charge.OriginDate {
suffix = fmt.Sprintf("(%s - %s) |", "Weekend", charge.OriginDate.Format("Jan 02 2006"))
if charge.DelayedReason != "" {
suffix = fmt.Sprintf("(%s: %s - %s) |", "Delayed", charge.DelayedReason, charge.OriginDate.Format("Jan 02 2006"))
}
printTransactionLine(charge.Amount, charge.Name, prefix, suffix, fullWidth)