Add delayed reason
This commit is contained in:
78
main.go
78
main.go
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user