diff --git a/handler/transaction.go b/handler/transaction.go index 99494a3..5713be6 100644 --- a/handler/transaction.go +++ b/handler/transaction.go @@ -137,7 +137,8 @@ func (h TransactionImpl) handleUpdateTransaction() http.HandlerFunc { TreasureChestId: r.FormValue("treasure-chest-id"), Value: r.FormValue("value"), Timestamp: r.FormValue("timestamp"), - Note: r.FormValue("note"), + Party: r.FormValue("party"), + Description: r.FormValue("description"), } if input.Id == "new" { diff --git a/migration/006_transaction_description.up.sql b/migration/006_transaction_description.up.sql new file mode 100644 index 0000000..a667fd0 --- /dev/null +++ b/migration/006_transaction_description.up.sql @@ -0,0 +1,4 @@ + +ALTER TABLE "transaction" DROP COLUMN note; +ALTER TABLE "transaction" ADD COLUMN party TEXT; +ALTER TABLE "transaction" ADD COLUMN description TEXT; diff --git a/service/transaction.go b/service/transaction.go index eb2c2d7..4b789f9 100644 --- a/service/transaction.go +++ b/service/transaction.go @@ -73,14 +73,14 @@ func (s TransactionImpl) Add(user *types.User, transactionInput types.Transactio } r, err := tx.NamedExec(` - INSERT INTO "transaction" (id, user_id, account_id, treasure_chest_id, value, timestamp, note, error, created_at, created_by) - VALUES (:id, :user_id, :account_id, :treasure_chest_id, :value, :timestamp, :note, :error, :created_at, :created_by)`, transaction) + INSERT INTO "transaction" (id, user_id, account_id, treasure_chest_id, value, timestamp, party, description, error, created_at, created_by) + VALUES (:id, :user_id, :account_id, :treasure_chest_id, :value, :timestamp, :party, :description, :error, :created_at, :created_by)`, transaction) err = db.TransformAndLogDbError("transaction Insert", r, err) if err != nil { return nil, err } - if transaction.AccountId != nil { + if transaction.Error == nil && transaction.AccountId != nil { r, err = tx.Exec(` UPDATE account SET current_balance = current_balance + ? @@ -91,7 +91,7 @@ func (s TransactionImpl) Add(user *types.User, transactionInput types.Transactio } } - if transaction.TreasureChestId != nil { + if transaction.Error == nil && transaction.TreasureChestId != nil { r, err = tx.Exec(` UPDATE treasure_chest SET current_balance = current_balance + ? @@ -141,7 +141,7 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput) return nil, types.ErrInternal } - if transaction.AccountId != nil { + if transaction.Error == nil && transaction.AccountId != nil { r, err := tx.Exec(` UPDATE account SET current_balance = current_balance - ? @@ -151,7 +151,7 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput) return nil, err } } - if transaction.TreasureChestId != nil { + if transaction.Error == nil && transaction.TreasureChestId != nil { r, err := tx.Exec(` UPDATE treasure_chest SET current_balance = current_balance - ? @@ -167,7 +167,7 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput) return nil, err } - if transaction.AccountId != nil { + if transaction.Error == nil && transaction.AccountId != nil { r, err := tx.Exec(` UPDATE account SET current_balance = current_balance + ? @@ -177,7 +177,7 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput) return nil, err } } - if transaction.TreasureChestId != nil { + if transaction.Error == nil && transaction.TreasureChestId != nil { r, err := tx.Exec(` UPDATE treasure_chest SET current_balance = current_balance + ? @@ -195,7 +195,8 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput) treasure_chest_id = :treasure_chest_id, value = :value, timestamp = :timestamp, - note = :note, + party = :party, + description = :description, error = :error, updated_at = :updated_at, updated_by = :updated_by @@ -275,33 +276,45 @@ func (s TransactionImpl) Delete(user *types.User, id string) error { _ = tx.Rollback() }() - r, err := tx.Exec(` - UPDATE account - SET current_balance = current_balance - (SELECT value FROM "transaction" WHERE id = ? AND user_id = ?) - WHERE id = (SELECT account_id FROM "transaction" WHERE id = ? AND user_id = ?) - `, uuid, user.Id, uuid, user.Id) - err = db.TransformAndLogDbError("transaction Delete", r, err) - if err != nil && err != db.ErrNotFound { - return err - } - r, err = tx.Exec(` - UPDATE treasure_chest - SET current_balance = current_balance - (SELECT value FROM "transaction" WHERE id = ? AND user_id = ?) - WHERE id = (SELECT treasure_chest_id FROM "transaction" WHERE id = ? AND user_id = ?) - `, uuid, user.Id, uuid, user.Id) - err = db.TransformAndLogDbError("transaction Delete", r, err) - if err != nil && err != db.ErrNotFound { + var transaction types.Transaction + err = tx.Get(&transaction, `SELECT * FROM "transaction" WHERE user_id = ? AND id = ?`, user.Id, uuid) + err = db.TransformAndLogDbError("transaction Delete", nil, err) + if err != nil { return err } - r, err = tx.Exec("DELETE FROM \"transaction\" WHERE id = ? AND user_id = ?", uuid, user.Id) + if transaction.Error == nil && transaction.AccountId != nil { + r, err := tx.Exec(` + UPDATE account + SET current_balance = current_balance - ? + WHERE id = ? + AND user_id = ?`, transaction.Value, transaction.AccountId, user.Id) + err = db.TransformAndLogDbError("transaction Delete", r, err) + if err != nil && err != db.ErrNotFound { + return err + } + } + + if transaction.Error == nil && transaction.TreasureChestId != nil { + r, err := tx.Exec(` + UPDATE treasure_chest + SET current_balance = current_balance - ? + WHERE id = ? + AND user_id = ?`, transaction.Value, transaction.TreasureChestId, user.Id) + err = db.TransformAndLogDbError("transaction Delete", r, err) + if err != nil && err != db.ErrNotFound { + return err + } + } + + r, err := tx.Exec("DELETE FROM \"transaction\" WHERE id = ? AND user_id = ?", uuid, user.Id) err = db.TransformAndLogDbError("transaction Delete", r, err) if err != nil { return err } err = tx.Commit() - err = db.TransformAndLogDbError("transaction RecalculateBalances", nil, err) + err = db.TransformAndLogDbError("transaction Delete", nil, err) if err != nil { return err } @@ -375,8 +388,9 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error { if err != nil { return err } + if transaction.Error != nil { - log.Info("err: %s", *transaction.Error) + continue } if transaction.AccountId != nil { @@ -491,8 +505,14 @@ func (s TransactionImpl) validateAndEnrichTransaction(tx *sqlx.Tx, oldTransactio return nil, fmt.Errorf("could not parse timestamp: %w", ErrBadRequest) } - if input.Note != "" { - err = validateString(input.Note, "note") + if input.Party != "" { + err = validateString(input.Party, "party") + if err != nil { + return nil, err + } + } + if input.Description != "" { + err = validateString(input.Description, "description") if err != nil { return nil, err } @@ -506,7 +526,8 @@ func (s TransactionImpl) validateAndEnrichTransaction(tx *sqlx.Tx, oldTransactio TreasureChestId: treasureChestUuid, Value: valueInt, Timestamp: timestamp, - Note: input.Note, + Party: input.Party, + Description: input.Description, CreatedAt: createdAt, CreatedBy: createdBy, diff --git a/template/transaction/transaction.templ b/template/transaction/transaction.templ index 207f469..d60288d 100644 --- a/template/transaction/transaction.templ +++ b/template/transaction/transaction.templ @@ -30,13 +30,14 @@ templ EditTransaction(transaction *types.Transaction, accounts []*types.Account, {{ var ( timestamp time.Time - value string id string cancelUrl string ) - note := "" + party := "" + description := "" accountId := "" + value := "0.00" treasureChestId := "" if transaction == nil { timestamp = time.Now().UTC().Truncate(time.Minute) @@ -45,7 +46,8 @@ templ EditTransaction(transaction *types.Transaction, accounts []*types.Account, cancelUrl = "/empty" } else { timestamp = transaction.Timestamp.UTC().Truncate(time.Minute) - note = transaction.Note + party = transaction.Party + description = transaction.Description if transaction.AccountId != nil { accountId = transaction.AccountId.String() } @@ -74,11 +76,18 @@ templ EditTransaction(transaction *types.Transaction, accounts []*types.Account, value={ timestamp.String() } class="bg-white input datetime" /> - + + + diff --git a/types/transaction.go b/types/transaction.go index 9aaf74c..3eaa9ad 100644 --- a/types/transaction.go +++ b/types/transaction.go @@ -17,8 +17,10 @@ type Transaction struct { Id uuid.UUID UserId uuid.UUID `db:"user_id"` - Timestamp time.Time - Note string + Timestamp time.Time + Company string + Party string + Description string // account id is only nil, if the transaction is a deposit to a treasure chest AccountId *uuid.UUID `db:"account_id"` @@ -40,5 +42,6 @@ type TransactionInput struct { TreasureChestId string Value string Timestamp string - Note string + Party string + Description string }