Adding detection for charges scheduled on weekends
This commit is contained in:
122
main.go
122
main.go
@@ -198,15 +198,27 @@ func addTransaction(transactionLog *TransactionLog, transaction *Transaction) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func delayTransaction(transactionLog *TransactionLog, transaction *Transaction) {
|
func delayTransaction(transactionLog *TransactionLog, transaction *Transaction) {
|
||||||
transaction.Late = true
|
newDate := transaction.Date
|
||||||
newDate := transaction.Date.AddDate(0, 0, 1)
|
if transaction.Date.Weekday() == 0 || transaction.Date.Weekday() == 6 {
|
||||||
_, ok := transactionLog.Transactions[newDate]
|
if transaction.Date.Weekday() == 0 {
|
||||||
for !ok {
|
newDate = newDate.AddDate(0, 0, 1)
|
||||||
if newDate == transactionLog.EndDate {
|
} else if transaction.Date.Weekday() == 6 {
|
||||||
break
|
newDate = newDate.AddDate(0, 0, 2)
|
||||||
}
|
}
|
||||||
|
if _, ok := transactionLog.Transactions[newDate]; !ok {
|
||||||
|
transactionLog.Transactions[newDate] = make([]Transaction, 0)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
transaction.Late = true
|
||||||
newDate = newDate.AddDate(0, 0, 1)
|
newDate = newDate.AddDate(0, 0, 1)
|
||||||
_, ok = transactionLog.Transactions[newDate]
|
_, ok := transactionLog.Transactions[newDate]
|
||||||
|
for !ok {
|
||||||
|
if newDate == transactionLog.EndDate {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
newDate = newDate.AddDate(0, 0, 1)
|
||||||
|
_, ok = transactionLog.Transactions[newDate]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
transaction.Date = newDate
|
transaction.Date = newDate
|
||||||
transactionLog.Transactions[newDate] = append(transactionLog.Transactions[newDate], *transaction)
|
transactionLog.Transactions[newDate] = append(transactionLog.Transactions[newDate], *transaction)
|
||||||
@@ -215,11 +227,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.Amount > 0 {
|
if transaction.Date.Weekday() == 0 || transaction.Date.Weekday() == 6 {
|
||||||
|
delayTransaction(transactionLog, transaction)
|
||||||
|
} 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) {
|
||||||
if transaction.Amount < 0 && math.Abs(transaction.Amount) > (accounts[0].Balance-accounts[0].Minimum) && transaction.Date.Before(finalDate) {
|
|
||||||
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
|
||||||
@@ -298,6 +311,10 @@ func printOutput(date time.Time, initialBalances []Account, executedCharges []Tr
|
|||||||
late_tag := fmt.Sprintf("(%s - %s)", "Late", charge.OrigDate.Format("Jan 02 2006"))
|
late_tag := fmt.Sprintf("(%s - %s)", "Late", charge.OrigDate.Format("Jan 02 2006"))
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(late_tag)-len(output))
|
rear_spacer := strings.Repeat(" ", 65-len(late_tag)-len(output))
|
||||||
fmt.Printf("%s%s%s |\n", output, rear_spacer, late_tag)
|
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 {
|
} else {
|
||||||
rear_spacer := strings.Repeat(" ", 65-len(output))
|
rear_spacer := strings.Repeat(" ", 65-len(output))
|
||||||
fmt.Printf("%s%s |\n", output, rear_spacer)
|
fmt.Printf("%s%s |\n", output, rear_spacer)
|
||||||
@@ -326,6 +343,8 @@ func printOutput(date time.Time, initialBalances []Account, executedCharges []Tr
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
yfile, err := ioutil.ReadFile(os.Args[1])
|
yfile, err := ioutil.ReadFile(os.Args[1])
|
||||||
|
dates := make([]time.Time, 0)
|
||||||
|
base := time.Now()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
@@ -361,50 +380,59 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
current := time.Date(base.Year(),
|
||||||
|
base.Month(), base.Day(), 0, 0, 0, 0, time.UTC)
|
||||||
|
for current.Before(transactionLog.EndDate.AddDate(0, 0, 7)) {
|
||||||
|
dates = append(dates, current)
|
||||||
|
current = current.AddDate(0, 0, 1)
|
||||||
|
}
|
||||||
|
|
||||||
collectTransactions(config.Credit, &transactionLog)
|
collectTransactions(config.Credit, &transactionLog)
|
||||||
collectTransactions(config.Transactions, &transactionLog)
|
collectTransactions(config.Transactions, &transactionLog)
|
||||||
|
|
||||||
for _, date := range transactionLog.Dates {
|
for _, date := range dates {
|
||||||
dateCharges := transactionLog.Transactions[date]
|
if _, ok := transactionLog.Transactions[date]; ok {
|
||||||
chargeCount := len(dateCharges)
|
dateCharges := transactionLog.Transactions[date]
|
||||||
executedCharges := make([]Transaction, 0)
|
chargeCount := len(dateCharges)
|
||||||
credits := make([]Transaction, 0)
|
executedCharges := make([]Transaction, 0)
|
||||||
late := make([]Transaction, 0)
|
credits := make([]Transaction, 0)
|
||||||
charges := make([]Transaction, 0)
|
late := make([]Transaction, 0)
|
||||||
initialBalances := make([]Account, len(config.Accounts))
|
charges := make([]Transaction, 0)
|
||||||
copy(initialBalances, config.Accounts)
|
initialBalances := make([]Account, len(config.Accounts))
|
||||||
for _, charge := range dateCharges {
|
copy(initialBalances, config.Accounts)
|
||||||
if charge.Amount > 0 {
|
for _, charge := range dateCharges {
|
||||||
credits = append(credits, charge)
|
if charge.Amount > 0 {
|
||||||
} else if charge.Late {
|
credits = append(credits, charge)
|
||||||
late = append(late, charge)
|
} else if charge.Late {
|
||||||
} else {
|
late = append(late, charge)
|
||||||
charges = append(charges, charge)
|
} else {
|
||||||
|
charges = append(charges, charge)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
for _, charge := range credits {
|
||||||
for _, charge := range credits {
|
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
||||||
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
executedCharges = append(executedCharges, charge)
|
||||||
executedCharges = append(executedCharges, charge)
|
} else {
|
||||||
} else {
|
chargeCount--
|
||||||
chargeCount--
|
}
|
||||||
}
|
}
|
||||||
}
|
for _, charge := range late {
|
||||||
for _, charge := range late {
|
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
||||||
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
executedCharges = append(executedCharges, charge)
|
||||||
executedCharges = append(executedCharges, charge)
|
} else {
|
||||||
} else {
|
chargeCount--
|
||||||
chargeCount--
|
}
|
||||||
}
|
}
|
||||||
}
|
for _, charge := range charges {
|
||||||
for _, charge := range charges {
|
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
||||||
if executeTransaction(&transactionLog, config.Accounts, &charge) {
|
executedCharges = append(executedCharges, charge)
|
||||||
executedCharges = append(executedCharges, charge)
|
} else {
|
||||||
} else {
|
chargeCount--
|
||||||
chargeCount--
|
}
|
||||||
|
}
|
||||||
|
if chargeCount > 0 {
|
||||||
|
printOutput(date, initialBalances, executedCharges, config.Accounts)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if chargeCount > 0 {
|
|
||||||
printOutput(date, initialBalances, executedCharges, config.Accounts)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user