/*
* Copyright (c) 2015 Ngewi Fet <ngewif@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gnucash.android.db.adapter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.support.annotation.NonNull;
import org.gnucash.android.app.GnuCashApplication;
import org.gnucash.android.model.BudgetAmount;
import org.gnucash.android.model.Money;
import java.util.ArrayList;
import java.util.List;
import static org.gnucash.android.db.DatabaseSchema.BudgetAmountEntry;
/**
* Database adapter for {@link BudgetAmount}s
*/
public class BudgetAmountsDbAdapter extends DatabaseAdapter<BudgetAmount> {
/**
* Opens the database adapter with an existing database
*
* @param db SQLiteDatabase object
*/
public BudgetAmountsDbAdapter(SQLiteDatabase db) {
super(db, BudgetAmountEntry.TABLE_NAME, new String[] {
BudgetAmountEntry.COLUMN_BUDGET_UID ,
BudgetAmountEntry.COLUMN_ACCOUNT_UID ,
BudgetAmountEntry.COLUMN_AMOUNT_NUM ,
BudgetAmountEntry.COLUMN_AMOUNT_DENOM ,
BudgetAmountEntry.COLUMN_PERIOD_NUM
});
}
public static BudgetAmountsDbAdapter getInstance(){
return GnuCashApplication.getBudgetAmountsDbAdapter();
}
@Override
public BudgetAmount buildModelInstance(@NonNull Cursor cursor) {
String budgetUID = cursor.getString(cursor.getColumnIndexOrThrow(BudgetAmountEntry.COLUMN_BUDGET_UID));
String accountUID = cursor.getString(cursor.getColumnIndexOrThrow(BudgetAmountEntry.COLUMN_ACCOUNT_UID));
long amountNum = cursor.getLong(cursor.getColumnIndexOrThrow(BudgetAmountEntry.COLUMN_AMOUNT_NUM));
long amountDenom = cursor.getLong(cursor.getColumnIndexOrThrow(BudgetAmountEntry.COLUMN_AMOUNT_DENOM));
long periodNum = cursor.getLong(cursor.getColumnIndexOrThrow(BudgetAmountEntry.COLUMN_PERIOD_NUM));
BudgetAmount budgetAmount = new BudgetAmount(budgetUID, accountUID);
budgetAmount.setAmount(new Money(amountNum, amountDenom, getAccountCurrencyCode(accountUID)));
budgetAmount.setPeriodNum(periodNum);
populateBaseModelAttributes(cursor, budgetAmount);
return budgetAmount;
}
@Override
protected @NonNull SQLiteStatement setBindings(@NonNull SQLiteStatement stmt, @NonNull final BudgetAmount budgetAmount) {
stmt.clearBindings();
stmt.bindString(1, budgetAmount.getBudgetUID());
stmt.bindString(2, budgetAmount.getAccountUID());
stmt.bindLong(3, budgetAmount.getAmount().getNumerator());
stmt.bindLong(4, budgetAmount.getAmount().getDenominator());
stmt.bindLong(5, budgetAmount.getPeriodNum());
stmt.bindString(6, budgetAmount.getUID());
return stmt;
}
/**
* Return budget amounts for the specific budget
* @param budgetUID GUID of the budget
* @return List of budget amounts
*/
public List<BudgetAmount> getBudgetAmountsForBudget(String budgetUID){
Cursor cursor = fetchAllRecords(BudgetAmountEntry.COLUMN_BUDGET_UID + "=?",
new String[]{budgetUID}, null);
List<BudgetAmount> budgetAmounts = new ArrayList<>();
while (cursor.moveToNext()){
budgetAmounts.add(buildModelInstance(cursor));
}
cursor.close();
return budgetAmounts;
}
/**
* Delete all the budget amounts for a budget
* @param budgetUID GUID of the budget
* @return Number of records deleted
*/
public int deleteBudgetAmountsForBudget(String budgetUID){
return mDb.delete(mTableName, BudgetAmountEntry.COLUMN_BUDGET_UID + "=?",
new String[]{budgetUID});
}
/**
* Returns the budgets associated with a specific account
* @param accountUID GUID of the account
* @return List of {@link BudgetAmount}s for the account
*/
public List<BudgetAmount> getBudgetAmounts(String accountUID) {
Cursor cursor = fetchAllRecords(BudgetAmountEntry.COLUMN_ACCOUNT_UID + " = ?", new String[]{accountUID}, null);
List<BudgetAmount> budgetAmounts = new ArrayList<>();
while(cursor.moveToNext()){
budgetAmounts.add(buildModelInstance(cursor));
}
cursor.close();
return budgetAmounts;
}
/**
* Returns the sum of the budget amounts for a particular account
* @param accountUID GUID of the account
* @return Sum of the budget amounts
*/
public Money getBudgetAmountSum(String accountUID){
List<BudgetAmount> budgetAmounts = getBudgetAmounts(accountUID);
Money sum = Money.createZeroInstance(getAccountCurrencyCode(accountUID));
for (BudgetAmount budgetAmount : budgetAmounts) {
sum = sum.add(budgetAmount.getAmount());
}
return sum;
}
}