Skip to content

Commit

Permalink
Cannot show transaction details if not added to database.
Browse files Browse the repository at this point in the history
  • Loading branch information
pnemonic78 committed Jan 23, 2025
1 parent 53a46e7 commit 349578b
Show file tree
Hide file tree
Showing 16 changed files with 95 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@
import org.gnucash.android.receivers.AccountCreator;
import org.gnucash.android.test.ui.util.DisableAnimationsRule;
import org.gnucash.android.ui.account.AccountsActivity;
import org.gnucash.android.ui.common.Refreshable;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/java/org/gnucash/android/db/BookDbHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import org.gnucash.android.db.DatabaseSchema.BookEntry;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.model.Book;

Expand Down Expand Up @@ -80,7 +79,7 @@ public Book insertBlankBook(@NonNull SQLiteDatabase db) {
SQLiteDatabase mainDb = helper.getWritableDatabase(); //actually create the db
AccountsDbAdapter accountsDbAdapter = new AccountsDbAdapter(
mainDb,
new TransactionsDbAdapter(mainDb, new SplitsDbAdapter(mainDb))
new TransactionsDbAdapter(mainDb)
);

String rootAccountUID = accountsDbAdapter.getOrCreateGnuCashRootAccountUID();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public AccountsDbAdapter(@NonNull SQLiteDatabase db, @NonNull TransactionsDbAdap
* @param db Database to create an adapter for
*/
public AccountsDbAdapter(SQLiteDatabase db) {
this(db, new TransactionsDbAdapter(db, new SplitsDbAdapter(db)));
this(db, new TransactionsDbAdapter(db));
}

/**
Expand All @@ -145,18 +145,15 @@ public static AccountsDbAdapter getInstance() {
public void addRecord(@NonNull Account account, UpdateMethod updateMethod) {
Timber.d("Replace account to db");
//in-case the account already existed, we want to update the templates based on it as well
List<Transaction> templateTransactions = mTransactionsAdapter.getScheduledTransactionsForAccount(account.getUID());
super.addRecord(account, updateMethod);
String accountUID = account.getUID();
//now add transactions if there are any
if (account.getAccountType() != AccountType.ROOT) {
//update the fully qualified account name
updateRecord(accountUID, AccountEntry.COLUMN_FULL_NAME, getFullyQualifiedAccountName(accountUID));
for (Transaction t : account.getTransactions()) {
t.setCommodity(account.getCommodity());
mTransactionsAdapter.addRecord(t, updateMethod);
}
for (Transaction transaction : templateTransactions) {
List<Transaction> scheduledTransactions = mTransactionsAdapter.getScheduledTransactionsForAccount(account.getUID());
for (Transaction transaction : scheduledTransactions) {
mTransactionsAdapter.addRecord(transaction, UpdateMethod.update);
}
}
Expand Down Expand Up @@ -213,8 +210,13 @@ public long bulkAddRecords(@NonNull List<Account> accountList, UpdateMethod upda
stmt.bindString(11, account.getCommodity().getUID());

String parentAccountUID = account.getParentUID();
if (parentAccountUID == null && account.getAccountType() != AccountType.ROOT) {
parentAccountUID = getOrCreateGnuCashRootAccountUID();
if (account.getAccountType() != AccountType.ROOT) {
if (TextUtils.isEmpty(parentAccountUID)) {
parentAccountUID = getOrCreateGnuCashRootAccountUID();
account.setParentUID(parentAccountUID);
}
//update the fully qualified account name
account.setFullName(getFullyQualifiedAccountName(account));
}
if (parentAccountUID != null) {
stmt.bindString(12, parentAccountUID);
Expand Down Expand Up @@ -1130,6 +1132,25 @@ public String getFullyQualifiedAccountName(String accountUID) {
return parentAccountName + ACCOUNT_NAME_SEPARATOR + accountName;
}

/**
* Returns the full account name including the account hierarchy (parent accounts)
*
* @param account The account
* @return Fully qualified (with parent hierarchy) account name
*/
public String getFullyQualifiedAccountName(@NonNull Account account) {
String accountName = account.getName();
String parentAccountUID = account.getParentUID();

if (TextUtils.isEmpty(parentAccountUID) || parentAccountUID.equalsIgnoreCase(getOrCreateGnuCashRootAccountUID())) {
return accountName;
}

String parentAccountName = getFullyQualifiedAccountName(parentAccountUID);

return parentAccountName + ACCOUNT_NAME_SEPARATOR + accountName;
}

/**
* get account's full name directly from DB
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ private String getRootAccountUID(String dbName) {
DatabaseHelper databaseHelper = new DatabaseHelper(context, dbName);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
AccountsDbAdapter accountsDbAdapter = new AccountsDbAdapter(db,
new TransactionsDbAdapter(db, new SplitsDbAdapter(db)));
new TransactionsDbAdapter(db));
String uid = accountsDbAdapter.getOrCreateGnuCashRootAccountUID();
db.close();
return uid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import android.content.ContentValues;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.text.TextUtils;
Expand Down Expand Up @@ -211,7 +212,7 @@ public boolean isOpen() {
*
* @param model Model to be saved to the database
*/
public void addRecord(@NonNull final Model model) {
public void addRecord(@NonNull final Model model) throws SQLException {
addRecord(model, UpdateMethod.replace);
}

Expand All @@ -222,14 +223,14 @@ public void addRecord(@NonNull final Model model) {
* @param model Subclass of {@link BaseModel} to be added
* @param updateMethod Method to use for adding the record
*/
public void addRecord(@NonNull final Model model, UpdateMethod updateMethod) {
public void addRecord(@NonNull final Model model, UpdateMethod updateMethod) throws SQLException {
Timber.d("Adding %s record to database: ", model.getClass().getSimpleName());
final SQLiteStatement statement;
switch (updateMethod) {
case insert:
statement = getInsertStatement();
synchronized (statement) {
setBindings(statement, model).execute();
model.id = setBindings(statement, model).executeInsert();
}
break;
case update:
Expand All @@ -241,7 +242,7 @@ public void addRecord(@NonNull final Model model, UpdateMethod updateMethod) {
default:
statement = getReplaceStatement();
synchronized (statement) {
setBindings(statement, model).execute();
model.id = setBindings(statement, model).executeInsert();
}
break;
}
Expand All @@ -254,29 +255,33 @@ public void addRecord(@NonNull final Model model, UpdateMethod updateMethod) {
* @param updateMethod Method to use when persisting them
* @return Number of rows affected in the database
*/
private long doAddModels(@NonNull final List<Model> modelList, UpdateMethod updateMethod) {
private long doAddModels(@NonNull final List<Model> modelList, UpdateMethod updateMethod) throws SQLException {
long nRow = 0;
final SQLiteStatement statement;
switch (updateMethod) {
case update:
synchronized (getUpdateStatement()) {
statement = getUpdateStatement();
synchronized (statement) {
for (Model model : modelList) {
setBindings(getUpdateStatement(), model).execute();
setBindings(statement, model).execute();
nRow++;
}
}
break;
case insert:
synchronized (getInsertStatement()) {
statement = getInsertStatement();
synchronized (statement) {
for (Model model : modelList) {
setBindings(getInsertStatement(), model).execute();
setBindings(statement, model).execute();
nRow++;
}
}
break;
default:
synchronized (getReplaceStatement()) {
statement = getReplaceStatement();
synchronized (statement) {
for (Model model : modelList) {
setBindings(getReplaceStatement(), model).execute();
setBindings(statement, model).execute();
nRow++;
}
}
Expand All @@ -296,14 +301,14 @@ public long bulkAddRecords(@NonNull List<Model> modelList) {
return bulkAddRecords(modelList, UpdateMethod.replace);
}

public long bulkAddRecords(@NonNull List<Model> modelList, UpdateMethod updateMethod) {
public long bulkAddRecords(@NonNull List<Model> modelList, UpdateMethod updateMethod) throws SQLException {
if (modelList.isEmpty()) {
Timber.w("Empty model list. Cannot bulk add records, returning 0");
return 0;
}

Timber.i("Bulk adding %d %s records to the database", modelList.size(),
modelList.isEmpty() ? "null" : modelList.get(0).getClass().getSimpleName());
modelList.get(0).getClass().getSimpleName());
long nRow;
try {
beginTransaction();
Expand Down Expand Up @@ -719,7 +724,7 @@ public int updateRecord(@NonNull String uid, @NonNull ContentValues contentValue
return mDb.update(mTableName, contentValues, CommonColumns.COLUMN_UID + "=?", new String[]{uid});
}

public void updateRecord(Model model) {
public void updateRecord(Model model) throws SQLException {
addRecord(model, UpdateMethod.update);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,15 @@ public class TransactionsDbAdapter extends DatabaseAdapter<Transaction> {

private final CommoditiesDbAdapter mCommoditiesDbAdapter;

/**
* Overloaded constructor. Creates adapter for already open db
*
* @param db SQlite db instance
*/
public TransactionsDbAdapter(SQLiteDatabase db) {
this(db, new SplitsDbAdapter(db));
}

/**
* Overloaded constructor. Creates adapter for already open db
*
Expand Down Expand Up @@ -105,7 +114,7 @@ public SplitsDbAdapter getSplitDbAdapter() {
* @param transaction {@link Transaction} to be inserted to database
*/
@Override
public void addRecord(@NonNull Transaction transaction, UpdateMethod updateMethod) {
public void addRecord(@NonNull Transaction transaction, UpdateMethod updateMethod) throws SQLException {
Timber.d("Adding transaction to the db via %s", updateMethod.name());
try {
beginTransaction();
Expand All @@ -118,7 +127,7 @@ public void addRecord(@NonNull Transaction transaction, UpdateMethod updateMetho
super.addRecord(transaction, updateMethod);

Timber.d("Adding splits for transaction");
ArrayList<String> splitUIDs = new ArrayList<>(transaction.getSplits().size());
List<String> splitUIDs = new ArrayList<>(transaction.getSplits().size());
for (Split split : transaction.getSplits()) {
Timber.d("Replace transaction split in db");
if (imbalanceSplit == split) {
Expand All @@ -137,8 +146,6 @@ public void addRecord(@NonNull Transaction transaction, UpdateMethod updateMetho
Timber.d("%d splits deleted", deleted);

setTransactionSuccessful();
} catch (SQLException e) {
Timber.e(e);
} finally {
endTransaction();
}
Expand All @@ -155,7 +162,7 @@ public void addRecord(@NonNull Transaction transaction, UpdateMethod updateMetho
* @return Number of transactions inserted
*/
@Override
public long bulkAddRecords(@NonNull List<Transaction> transactionList, UpdateMethod updateMethod) {
public long bulkAddRecords(@NonNull List<Transaction> transactionList, UpdateMethod updateMethod) throws SQLException {
long start = System.nanoTime();
long rowInserted = super.bulkAddRecords(transactionList, updateMethod);
long end = System.nanoTime();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
import org.gnucash.android.app.GnuCashApplication;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.DatabaseAdapter;
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.export.csv.CsvAccountExporter;
import org.gnucash.android.export.csv.CsvTransactionsExporter;
Expand Down Expand Up @@ -458,7 +457,7 @@ private void backupAndDeleteTransactions() {
boolean preserveOpeningBalances = GnuCashApplication.shouldSaveOpeningBalances(false);

SQLiteDatabase db = GnuCashApplication.getActiveDb();
TransactionsDbAdapter transactionsDbAdapter = new TransactionsDbAdapter(db, new SplitsDbAdapter(db));
TransactionsDbAdapter transactionsDbAdapter = new TransactionsDbAdapter(db);
if (preserveOpeningBalances) {
openingBalances = new AccountsDbAdapter(db, transactionsDbAdapter).getAllOpeningBalanceTransactions();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@
import org.gnucash.android.db.adapter.PricesDbAdapter;
import org.gnucash.android.db.adapter.RecurrenceDbAdapter;
import org.gnucash.android.db.adapter.ScheduledActionDbAdapter;
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.model.Account;
import org.gnucash.android.model.AccountType;
Expand Down Expand Up @@ -345,7 +344,7 @@ public GncXmlHandler() {
DatabaseHelper databaseHelper = new DatabaseHelper(GnuCashApplication.getAppContext(), mBook.getUID());
mDatabaseHelper = databaseHelper;
mDB = databaseHelper.getWritableDatabase();
mTransactionsDbAdapter = new TransactionsDbAdapter(mDB, new SplitsDbAdapter(mDB));
mTransactionsDbAdapter = new TransactionsDbAdapter(mDB);
mAccountsDbAdapter = new AccountsDbAdapter(mDB, mTransactionsDbAdapter);
RecurrenceDbAdapter recurrenceDbAdapter = new RecurrenceDbAdapter(mDB);
mScheduledActionsDbAdapter = new ScheduledActionDbAdapter(mDB, recurrenceDbAdapter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import org.gnucash.android.db.adapter.DatabaseAdapter;
import org.gnucash.android.db.adapter.RecurrenceDbAdapter;
import org.gnucash.android.db.adapter.ScheduledActionDbAdapter;
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.export.ExportAsyncTask;
import org.gnucash.android.export.ExportParams;
Expand Down Expand Up @@ -277,7 +276,7 @@ private static boolean shouldExecuteScheduledBackup(ScheduledAction scheduledAct
private static int executeTransactions(@NonNull Context context, ScheduledAction scheduledAction, SQLiteDatabase db) {
int executionCount = 0;
String actionUID = scheduledAction.getActionUID();
TransactionsDbAdapter transactionsDbAdapter = new TransactionsDbAdapter(db, new SplitsDbAdapter(db));
TransactionsDbAdapter transactionsDbAdapter = new TransactionsDbAdapter(db);
Transaction trxnTemplate;
try {
trxnTemplate = transactionsDbAdapter.getRecord(actionUID);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@
import org.gnucash.android.db.DatabaseSchema.BookEntry;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.ui.account.AccountsActivity;
import org.gnucash.android.ui.common.Refreshable;
Expand Down Expand Up @@ -330,7 +329,7 @@ private void setStatisticsText(View view, String bookUID) {
final Context context = view.getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context, bookUID);
SQLiteDatabase db = dbHelper.getReadableDatabase();
TransactionsDbAdapter trnAdapter = new TransactionsDbAdapter(db, new SplitsDbAdapter(db));
TransactionsDbAdapter trnAdapter = new TransactionsDbAdapter(db);
int transactionCount = (int) trnAdapter.getRecordsCount();
String transactionStats = getResources().getQuantityString(R.plurals.book_transaction_stats, transactionCount, transactionCount);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.SQLException;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -43,6 +44,8 @@

import java.util.MissingFormatArgumentException;

import timber.log.Timber;

/**
* Activity for displaying transaction information
*
Expand Down Expand Up @@ -275,7 +278,13 @@ private void duplicateTransaction(@Nullable String transactionUID) {
Transaction transaction = dbAdapter.getRecord(transactionUID);
Transaction duplicate = new Transaction(transaction, true);
duplicate.setTime(System.currentTimeMillis());
dbAdapter.addRecord(duplicate, DatabaseAdapter.UpdateMethod.insert);
try {
dbAdapter.addRecord(duplicate, DatabaseAdapter.UpdateMethod.insert);
if (duplicate.id <= 0) return;
} catch (SQLException e) {
Timber.e(e);
return;
}

// Show the new transaction
Intent intent = new Intent(getIntent())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -440,11 +441,15 @@ private void deleteTransaction(long transactionId) {
}

private void duplicateTransaction(long transactionId) {
Transaction transaction = mTransactionsDbAdapter.getRecord(transactionId);
Transaction duplicate = new Transaction(transaction, true);
duplicate.setTime(System.currentTimeMillis());
mTransactionsDbAdapter.addRecord(duplicate, DatabaseAdapter.UpdateMethod.insert);
refresh();
try {
Transaction transaction = mTransactionsDbAdapter.getRecord(transactionId);
Transaction duplicate = new Transaction(transaction, true);
duplicate.setTime(System.currentTimeMillis());
mTransactionsDbAdapter.addRecord(duplicate, DatabaseAdapter.UpdateMethod.insert);
refresh();
} catch (SQLException e) {
Timber.e(e);
}
}

private void moveTransaction(long transactionId) {
Expand Down
Loading

0 comments on commit 349578b

Please sign in to comment.