Transfer edition and several fixs

[RecordTransactionActivity]
- Fix Buy tab crash when editing a transaction
- Fix Sell transaction edition not working at all
- Add Transfer edition
- Add 'Deduct from holdings' switch to all tabs

[SettingsActivity]
- Fix manual entires import not filling all database columns

[General]
- Fix balance calculation not working properly
This commit is contained in:
Tanguy Herbron 2018-08-20 04:54:16 +02:00
parent f907a4bdb1
commit 7f0518a96a
9 changed files with 341 additions and 137 deletions

View File

@ -10,12 +10,14 @@ import android.support.design.widget.TextInputEditText;
import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatButton;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.DatePicker; import android.widget.DatePicker;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TimePicker; import android.widget.TimePicker;
import com.herbron.moodl.Activities.HomeActivity; import com.herbron.moodl.Activities.HomeActivity;
@ -46,6 +48,7 @@ public class BuyFragment extends CustomRecordFragment {
private AppCompatButton saveBuyButton; private AppCompatButton saveBuyButton;
private static Spinner feesCurrencySpinner; private static Spinner feesCurrencySpinner;
private static View view; private static View view;
private Switch deductHoldingsSwitch;
private ArrayAdapter<String> currencyFeeAdapter; private ArrayAdapter<String> currencyFeeAdapter;
@ -131,150 +134,7 @@ public class BuyFragment extends CustomRecordFragment {
} }
}; };
@Nullable private TextWatcher feesTextWatcher = new TextWatcher() {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.record_transaction_fragment_buy, container, false);
context = getActivity().getApplicationContext();
calendar = Calendar.getInstance();
sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.UK);
preferenceManager = new PreferencesManager(getContext());
initializeViewElements();
return view;
}
private void checkCallingIntent()
{
Intent intent = getActivity().getIntent();
transactionId = intent.getIntExtra("transactionId", -1);
if(transactionId != -1)
{
DatabaseManager databaseManager = new DatabaseManager(context);
transaction = databaseManager.getCurrencyTransactionById(transactionId);
if(transaction.getType().equals("b"))
{
fillFields();
}
}
}
private void fillFields()
{
amoutEditText.setText(String.valueOf(transaction.getAmount()));
buyPriceEditText.setText(String.valueOf(transaction.getPrice()));
calendar.setTimeInMillis(transaction.getTimestamp());
buyDateEditText.setText(sdf.format(calendar.getTime()));
totalValueEditText.setText(String.valueOf(transaction.getAmount() * transaction.getPrice()));
fees_editText.setText(String.valueOf(transaction.getFees()));
note_editText.setText(transaction.getNote());
}
private void initializeViewElements()
{
totalValueEditText = view.findViewById(R.id.totalValue_editText_buy);
totalValueEditText.addTextChangedListener(totalValueTextWatcher);
amoutEditText = view.findViewById(R.id.amount_editText_buy);
amoutEditText.addTextChangedListener(amountTextWatcher);
buyPriceEditText = view.findViewById(R.id.buyPrice_editText);
buyDateEditText = view.findViewById(R.id.buyDate_editText);
buyDateEditText.setText(sdf.format(calendar.getTime()));
buyDateEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createDatePicker();
}
});
feesCurrencySpinner = view.findViewById(R.id.feesCurrency_editText_buy);
currencyFeeAdapter = new ArrayAdapter<String>(getSecureContext(), android.R.layout.simple_spinner_item, new ArrayList<>());
currencyFeeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
feesCurrencySpinner.setAdapter(currencyFeeAdapter);
if(fragmentPair != null)
{
updateAdapter();
}
saveBuyButton = view.findViewById(R.id.saveBuyButton);
saveBuyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isFieldCorrectlyFilled(amoutEditText, true) && isFieldCorrectlyFilled(buyPriceEditText, true) && isFieldCorrectlyFilled(totalValueEditText, true))
{
double amount = Double.parseDouble(amoutEditText.getText().toString());
double purchasePrice = Double.parseDouble(buyPriceEditText.getText().toString());
double fees;
String feeCurrency;
if(feesCurrencySpinner.getSelectedItemPosition() < 1)
{
feeCurrency = fragmentPair.getFrom();
}
else
{
feeCurrency = fragmentPair.getTo();
}
fees = getFees(feeCurrency, amount, purchasePrice);
String note = note_editText.getText().toString();
DatabaseManager databaseManager = new DatabaseManager(getContext());
preferenceManager.setMustUpdateSummary(true);
if(transactionId == -1)
{
databaseManager.addTransaction(fragmentCurrency.getSymbol()
, amount
, calendar.getTime()
, purchasePrice
, fees
, note
, fragmentPair.getFrom().equals(fragmentCurrency.getSymbol()) ? fragmentPair.getTo() : fragmentPair.getFrom()
, feeCurrency
, ""
, fragmentExchange.getName()
, "b"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f");
Intent intent = new Intent(getActivity(), HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
else
{
databaseManager.updateTransactionWithId(transactionId
, amount
, calendar.getTime()
, purchasePrice
, fees
, note
, fragmentPair.getFrom().equals(fragmentCurrency.getSymbol()) ? fragmentPair.getTo() : fragmentPair.getFrom()
, feeCurrency
, ""
, fragmentExchange.getName()
,"b"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f");
}
getActivity().finish();
}
}
});
fees_editText = view.findViewById(R.id.fees_editText_buy);
fees_editText.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
totalValueEditText.removeTextChangedListener(totalValueTextWatcher); totalValueEditText.removeTextChangedListener(totalValueTextWatcher);
@ -371,11 +231,166 @@ public class BuyFragment extends CustomRecordFragment {
totalValueEditText.addTextChangedListener(totalValueTextWatcher); totalValueEditText.addTextChangedListener(totalValueTextWatcher);
amoutEditText.addTextChangedListener(amountTextWatcher); amoutEditText.addTextChangedListener(amountTextWatcher);
} }
};
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.record_transaction_fragment_buy, container, false);
context = getActivity().getApplicationContext();
calendar = Calendar.getInstance();
sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.UK);
preferenceManager = new PreferencesManager(getContext());
initializeViewElements();
return view;
}
private void checkCallingIntent()
{
Intent intent = getActivity().getIntent();
transactionId = intent.getIntExtra("transactionId", -1);
if(transactionId != -1)
{
DatabaseManager databaseManager = new DatabaseManager(context);
transaction = databaseManager.getCurrencyTransactionById(transactionId);
if(transaction.getType() == null || transaction.getType().equals("b"))
{
fillFields();
}
}
}
private void fillFields()
{
amoutEditText.setText(String.valueOf(transaction.getAmount()));
buyPriceEditText.setText(String.valueOf(transaction.getPrice()));
calendar.setTimeInMillis(transaction.getTimestamp());
buyDateEditText.setText(sdf.format(calendar.getTime()));
totalValueEditText.setText(String.valueOf(transaction.getAmount() * transaction.getPrice()));
fees_editText.setText(String.valueOf(transaction.getFees()));
note_editText.setText(transaction.getNote());
}
private void initializeViewElements()
{
totalValueEditText = view.findViewById(R.id.totalValue_editText_buy);
amoutEditText = view.findViewById(R.id.amount_editText_buy);
buyPriceEditText = view.findViewById(R.id.buyPrice_editText);
buyDateEditText = view.findViewById(R.id.buyDate_editText);
buyDateEditText.setText(sdf.format(calendar.getTime()));
buyDateEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createDatePicker();
}
}); });
feesCurrencySpinner = view.findViewById(R.id.feesCurrency_editText_buy);
currencyFeeAdapter = new ArrayAdapter<String>(getSecureContext(), android.R.layout.simple_spinner_item, new ArrayList<>());
currencyFeeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
feesCurrencySpinner.setAdapter(currencyFeeAdapter);
deductHoldingsSwitch = view.findViewById(R.id.deductHoldingsBuy);
if(fragmentPair != null)
{
updateAdapter();
}
saveBuyButton = view.findViewById(R.id.saveBuyButton);
saveBuyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isFieldCorrectlyFilled(amoutEditText, true) && isFieldCorrectlyFilled(buyPriceEditText, true) && isFieldCorrectlyFilled(totalValueEditText, true))
{
double amount = Double.parseDouble(amoutEditText.getText().toString());
double purchasePrice = Double.parseDouble(buyPriceEditText.getText().toString());
double fees;
String feeCurrency;
if(feesCurrencySpinner.getSelectedItemPosition() < 1)
{
feeCurrency = fragmentPair.getFrom();
}
else
{
feeCurrency = fragmentPair.getTo();
}
fees = getFees(feeCurrency, amount, purchasePrice);
String note = note_editText.getText().toString();
DatabaseManager databaseManager = new DatabaseManager(getContext());
preferenceManager.setMustUpdateSummary(true);
if(transactionId == -1)
{
databaseManager.addTransaction(fragmentCurrency.getSymbol()
, amount
, calendar.getTime()
, purchasePrice
, fees
, note
, fragmentPair.getFrom().equals(fragmentCurrency.getSymbol()) ? fragmentPair.getTo() : fragmentPair.getFrom()
, feeCurrency
, ""
, fragmentExchange.getName()
, "b"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
Intent intent = new Intent(getActivity(), HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
else
{
databaseManager.updateTransactionWithId(transactionId
, amount
, calendar.getTime()
, purchasePrice
, fees
, note
, fragmentPair.getFrom().equals(fragmentCurrency.getSymbol()) ? fragmentPair.getTo() : fragmentPair.getFrom()
, feeCurrency
, ""
, fragmentExchange.getName()
,"b"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
}
getActivity().finish();
}
}
});
fees_editText = view.findViewById(R.id.fees_editText_buy);
note_editText = view.findViewById(R.id.note_editText_buy); note_editText = view.findViewById(R.id.note_editText_buy);
checkCallingIntent(); checkCallingIntent();
setupTextWatchers();
}
private void setupTextWatchers()
{
totalValueEditText.addTextChangedListener(totalValueTextWatcher);
amoutEditText.addTextChangedListener(amountTextWatcher);
fees_editText.addTextChangedListener(feesTextWatcher);
} }
private double getFees(String feeCurrency, double amount, double purchasedPrice) private double getFees(String feeCurrency, double amount, double purchasedPrice)

View File

@ -16,6 +16,7 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.DatePicker; import android.widget.DatePicker;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TimePicker; import android.widget.TimePicker;
import com.herbron.moodl.Activities.HomeActivity; import com.herbron.moodl.Activities.HomeActivity;
@ -46,6 +47,7 @@ public class SellFragment extends CustomRecordFragment {
private AppCompatButton saveSellButton; private AppCompatButton saveSellButton;
private static Spinner feesCurrencySpinner; private static Spinner feesCurrencySpinner;
private static View view; private static View view;
private Switch deductHoldingsSwitch;
private ArrayAdapter<String> currencyFeeAdapter; private ArrayAdapter<String> currencyFeeAdapter;
@ -177,6 +179,8 @@ public class SellFragment extends CustomRecordFragment {
updateAdapter(); updateAdapter();
} }
deductHoldingsSwitch = view.findViewById(R.id.deductHoldingsSell);
saveSellButton = view.findViewById(R.id.saveSellButton); saveSellButton = view.findViewById(R.id.saveSellButton);
saveSellButton.setOnClickListener(new View.OnClickListener() { saveSellButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -218,7 +222,8 @@ public class SellFragment extends CustomRecordFragment {
, "" , ""
, fragmentExchange.getName() , fragmentExchange.getName()
, "s" , "s"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"); , feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
Intent intent = new Intent(getActivity(), HomeActivity.class); Intent intent = new Intent(getActivity(), HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
@ -237,7 +242,8 @@ public class SellFragment extends CustomRecordFragment {
, "" , ""
, fragmentExchange.getName() , fragmentExchange.getName()
,"s" ,"s"
, feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"); , feesCurrencySpinner.getSelectedItemPosition() % 2 == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
} }
getActivity().finish(); getActivity().finish();
@ -386,7 +392,7 @@ public class SellFragment extends CustomRecordFragment {
DatabaseManager databaseManager = new DatabaseManager(context); DatabaseManager databaseManager = new DatabaseManager(context);
transaction = databaseManager.getCurrencyTransactionById(transactionId); transaction = databaseManager.getCurrencyTransactionById(transactionId);
if(transaction.getType().equals("b")) if(transaction.getType().equals("s"))
{ {
fillFields(); fillFields();
} }

View File

@ -9,7 +9,6 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputEditText;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -18,13 +17,16 @@ import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.DatePicker; import android.widget.DatePicker;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TimePicker; import android.widget.TimePicker;
import com.herbron.moodl.Activities.HomeActivity;
import com.herbron.moodl.CustomLayouts.CustomRecordFragment; import com.herbron.moodl.CustomLayouts.CustomRecordFragment;
import com.herbron.moodl.DataManagers.CurrencyData.Currency; import com.herbron.moodl.DataManagers.CurrencyData.Currency;
import com.herbron.moodl.DataManagers.CurrencyData.Transaction; import com.herbron.moodl.DataManagers.CurrencyData.Transaction;
import com.herbron.moodl.DataManagers.DatabaseManager; import com.herbron.moodl.DataManagers.DatabaseManager;
import com.herbron.moodl.DataManagers.ExchangeManager.Exchange; import com.herbron.moodl.DataManagers.ExchangeManager.Exchange;
import com.herbron.moodl.DataManagers.PreferencesManager;
import com.herbron.moodl.R; import com.herbron.moodl.R;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -43,7 +45,10 @@ public class TransferFragment extends CustomRecordFragment {
private Spinner toSpinner; private Spinner toSpinner;
private Spinner feeSpinner; private Spinner feeSpinner;
private Switch deductHoldingsSwitch;
private Button saveButton; private Button saveButton;
private int transactionId; private int transactionId;
private Transaction transaction; private Transaction transaction;
@ -72,10 +77,13 @@ public class TransferFragment extends CustomRecordFragment {
{ {
if(isTransactionPossible()) if(isTransactionPossible())
{ {
PreferencesManager preferencesManager = new PreferencesManager(getContext());
DatabaseManager databaseManager = new DatabaseManager(getContext()); DatabaseManager databaseManager = new DatabaseManager(getContext());
double amount = Double.valueOf(amountEditText.getText().toString()); double amount = Double.valueOf(amountEditText.getText().toString());
double fees = getFees(); double fees = getFees();
if(transactionId == -1)
{
databaseManager.addTransaction(fragmentCurrency.getSymbol() databaseManager.addTransaction(fragmentCurrency.getSymbol()
, amount , amount
, calendar.getTime() , calendar.getTime()
@ -87,7 +95,31 @@ public class TransferFragment extends CustomRecordFragment {
, getDestination() , getDestination()
, getSource() , getSource()
, "t" , "t"
, feeSpinner.getSelectedItemPosition() == 0 ? "p" : "f"); , feeSpinner.getSelectedItemPosition() == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
Intent intent = new Intent(getActivity(), HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
else
{
databaseManager.updateTransactionWithId(transactionId
, amount
, calendar.getTime()
, 0
, fees
, noteEditText.getText().toString()
, ""
, fragmentCurrency.getSymbol()
, getDestination()
, getSource()
,"t"
, feeSpinner.getSelectedItemPosition() == 0 ? "p" : "f"
, deductHoldingsSwitch.isChecked());
}
preferencesManager.setMustUpdateSummary(true);
getActivity().finish(); getActivity().finish();
} }
@ -146,6 +178,8 @@ public class TransferFragment extends CustomRecordFragment {
saveButton = view.findViewById(R.id.saveTransferButton); saveButton = view.findViewById(R.id.saveTransferButton);
saveButton.setOnClickListener(saveButtonClickListener); saveButton.setOnClickListener(saveButtonClickListener);
deductHoldingsSwitch = view.findViewById(R.id.deductHoldingsTransfer);
checkCallingIntent(); checkCallingIntent();
} }
@ -159,7 +193,7 @@ public class TransferFragment extends CustomRecordFragment {
DatabaseManager databaseManager = new DatabaseManager(getContext()); DatabaseManager databaseManager = new DatabaseManager(getContext());
transaction = databaseManager.getCurrencyTransactionById(transactionId); transaction = databaseManager.getCurrencyTransactionById(transactionId);
if(transaction.getType().equals("t")) if(transaction.getType() != null && transaction.getType().equals("t"))
{ {
fillFields(); fillFields();
} }
@ -168,8 +202,61 @@ public class TransferFragment extends CustomRecordFragment {
private void fillFields() private void fillFields()
{ {
setupFromSpinner();
setupToSpinner();
amountEditText.setText(String.valueOf(transaction.getAmount())); amountEditText.setText(String.valueOf(transaction.getAmount()));
//Fill other fields calendar.setTimeInMillis(transaction.getTimestamp());
transferDateEditText.setText(sdf.format(calendar.getTime()));
feesEditText.setText(String.format(Locale.UK, "%f", transaction.getFees()));
noteEditText.setText(transaction.getNote());
feeSpinner.setSelection(transaction.getFeeFormat().equals("p") ? 0 : 1);
}
private void setupFromSpinner()
{
switch (transaction.getSource())
{
case EXCHANGE_CODE:
fromSpinner.setSelection(0);
break;
case WALLET_CODE:
fromSpinner.setSelection(1);
break;
case MINING_CODE:
fromSpinner.setSelection(2);
break;
case ELSE_WALLET_CODE:
fromSpinner.setSelection(3);
break;
case AIRDROP_CODE:
fromSpinner.setSelection(4);
break;
case UNKNOWN_CODE:
fromSpinner.setSelection(5);
break;
case FORK_CODE:
fromSpinner.setSelection(6);
break;
}
}
private void setupToSpinner()
{
switch (transaction.getDestination())
{
case EXCHANGE_CODE:
toSpinner.setSelection(0);
break;
case WALLET_CODE:
toSpinner.setSelection(1);
break;
case ELSE_WALLET_CODE:
toSpinner.setSelection(2);
break;
case UNKNOWN_CODE:
toSpinner.setSelection(3);
break;
}
} }
private void setupSpinnesr() private void setupSpinnesr()

View File

@ -19,8 +19,9 @@ public class Transaction {
private String source; private String source;
private String destination; private String destination;
private String type; private String type;
private boolean isDeducted;
public Transaction(int transactionId, String symbol, String symPair, double amount, long timestamp, double purchasedPrice, double fees, String note, String feeCurrency, String source, String destination, String type, String feeFormat) public Transaction(int transactionId, String symbol, String symPair, double amount, long timestamp, double purchasedPrice, double fees, String note, String feeCurrency, String source, String destination, String type, String feeFormat, boolean isDeducted)
{ {
this.transactionId = transactionId; this.transactionId = transactionId;
this.symbol = symbol; this.symbol = symbol;
@ -35,6 +36,7 @@ public class Transaction {
this.destination = destination; this.destination = destination;
this.type = type; this.type = type;
this.feeFormat = feeFormat; this.feeFormat = feeFormat;
this.isDeducted = isDeducted;
} }
public int getTransactionId() { public int getTransactionId() {
@ -143,4 +145,12 @@ public class Transaction {
public void setFeeFormat(String feeFormat) { public void setFeeFormat(String feeFormat) {
this.feeFormat = feeFormat; this.feeFormat = feeFormat;
} }
public boolean isDeducted() {
return isDeducted;
}
public void setDeducted(boolean deducted) {
isDeducted = deducted;
}
} }

View File

@ -3,6 +3,7 @@ package com.herbron.moodl.DataManagers;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; import android.util.Log;
@ -31,7 +32,7 @@ import java.util.Set;
public class DatabaseManager extends SQLiteOpenHelper{ public class DatabaseManager extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 16; private static final int DATABASE_VERSION = 17;
private static final String DATABASE_NAME = "mdn.db"; private static final String DATABASE_NAME = "mdn.db";
@ -52,6 +53,7 @@ public class DatabaseManager extends SQLiteOpenHelper{
private static final String KEY_TRANSACTION_FEE_FORMAT = "feeFormat"; private static final String KEY_TRANSACTION_FEE_FORMAT = "feeFormat";
private static final String KEY_TRANSACTION_NOTES = "notes"; private static final String KEY_TRANSACTION_NOTES = "notes";
private static final String KEY_TRANSACTION_TYPE = "transactionType"; private static final String KEY_TRANSACTION_TYPE = "transactionType";
private static final String KEY_TRANSACTION_DEDUCT = "deductHoldings";
private static final String KEY_EXCHANGE_ID = "idExchange"; private static final String KEY_EXCHANGE_ID = "idExchange";
private static final String KEY_EXCHANGE_NAME = "name"; private static final String KEY_EXCHANGE_NAME = "name";
@ -87,10 +89,11 @@ public class DatabaseManager extends SQLiteOpenHelper{
+ KEY_TRANSACTION_PAIR + " VARCHAR(4)," + KEY_TRANSACTION_PAIR + " VARCHAR(4),"
+ KEY_TRANSACTION_FEE_CURRENCY + " VARCHAR(4)," + KEY_TRANSACTION_FEE_CURRENCY + " VARCHAR(4),"
+ KEY_TRANSACTION_FEES + " REAL," + KEY_TRANSACTION_FEES + " REAL,"
+ KEY_TRANSACTION_FEE_FORMAT + " VARCHAT(1)," + KEY_TRANSACTION_FEE_FORMAT + " VARCHAR(1),"
+ KEY_TRANSACTION_SOURCE + " TEXT," + KEY_TRANSACTION_SOURCE + " TEXT,"
+ KEY_TRANSACTION_DESTINATION + " TEXT," + KEY_TRANSACTION_DESTINATION + " TEXT,"
+ KEY_TRANSACTION_TYPE + " VARCHAR(1)" + KEY_TRANSACTION_TYPE + " VARCHAR(1),"
+ KEY_TRANSACTION_DEDUCT + " INTEGER"
+ ");"); + ");");
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_EXCHANGE_KEYS + "(" db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_EXCHANGE_KEYS + "("
@ -154,7 +157,7 @@ public class DatabaseManager extends SQLiteOpenHelper{
return false; return false;
} }
public void updateTransactionWithId(int transactionId, double amount, Date date, double purchasedPrice, double fees, String note, String symbolFrom, String feeCurrency, String destination, String source, String type, String feeFormat) public void updateTransactionWithId(int transactionId, double amount, Date date, double purchasedPrice, double fees, String note, String symbolFrom, String feeCurrency, String destination, String source, String type, String feeFormat, boolean deductFromHoldings)
{ {
SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues(); ContentValues cv = new ContentValues();
@ -170,12 +173,13 @@ public class DatabaseManager extends SQLiteOpenHelper{
cv.put(KEY_TRANSACTION_DESTINATION, destination); cv.put(KEY_TRANSACTION_DESTINATION, destination);
cv.put(KEY_TRANSACTION_TYPE, type); cv.put(KEY_TRANSACTION_TYPE, type);
cv.put(KEY_TRANSACTION_FEE_FORMAT, feeFormat); cv.put(KEY_TRANSACTION_FEE_FORMAT, feeFormat);
cv.put(KEY_TRANSACTION_DEDUCT, deductFromHoldings ? 1 : 0);
db.update(TABLE_MANUAL_TRANSACTIONS, cv, KEY_TRANSACTION_ID + "=" + transactionId, null); db.update(TABLE_MANUAL_TRANSACTIONS, cv, KEY_TRANSACTION_ID + "=" + transactionId, null);
} }
public void addTransaction(String symbol, Double amount, Date date, double purchasePrice, double fees, String note, String symbolFrom, String feeCurrency, String destination, String source, String type, String feeFormat) public void addTransaction(String symbol, Double amount, Date date, double purchasePrice, double fees, String note, String symbolFrom, String feeCurrency, String destination, String source, String type, String feeFormat, boolean deductFromHoldings)
{ {
SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
@ -192,8 +196,9 @@ public class DatabaseManager extends SQLiteOpenHelper{
values.put(KEY_TRANSACTION_DESTINATION, destination); values.put(KEY_TRANSACTION_DESTINATION, destination);
values.put(KEY_TRANSACTION_TYPE, type); values.put(KEY_TRANSACTION_TYPE, type);
values.put(KEY_TRANSACTION_FEE_FORMAT, feeFormat); values.put(KEY_TRANSACTION_FEE_FORMAT, feeFormat);
values.put(KEY_TRANSACTION_DEDUCT, deductFromHoldings ? 1 : 0);
Log.d("moodl", "Insert result " + db.insert(TABLE_MANUAL_TRANSACTIONS, null, values)); db.insert(TABLE_MANUAL_TRANSACTIONS, null, values);
db.close(); db.close();
} }
@ -463,19 +468,37 @@ public class DatabaseManager extends SQLiteOpenHelper{
values.put(KEY_TRANSACTION_DATE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_DATE))); values.put(KEY_TRANSACTION_DATE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_DATE)));
values.put(KEY_TRANSACTION_PURCHASE_PRICE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_PURCHASE_PRICE))); values.put(KEY_TRANSACTION_PURCHASE_PRICE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_PURCHASE_PRICE)));
values.put(KEY_TRANSACTION_FEES, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_FEES))); values.put(KEY_TRANSACTION_FEES, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_FEES)));
values.put(KEY_TRANSACTION_NOTES, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_NOTES)));
values.put(KEY_TRANSACTION_PAIR, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_PAIR)));
values.put(KEY_TRANSACTION_FEE_CURRENCY, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_FEE_CURRENCY)));
values.put(KEY_TRANSACTION_SOURCE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_SOURCE)));
values.put(KEY_TRANSACTION_DESTINATION, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_DESTINATION)));
values.put(KEY_TRANSACTION_TYPE, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_TYPE)));
values.put(KEY_TRANSACTION_FEE_FORMAT, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_FEE_FORMAT)));
values.put(KEY_TRANSACTION_DEDUCT, DataCrypter.decrypt(context, rawValues.getString(KEY_TRANSACTION_DEDUCT)));
} }
else else
{ {
values.put(KEY_TRANSACTION_SYMBOL, rawValues.getString(KEY_TRANSACTION_SYMBOL)); values.put(KEY_TRANSACTION_SYMBOL, rawValues.getString(KEY_TRANSACTION_SYMBOL));
values.put(KEY_TRANSACTION_AMOUNT, rawValues.getString(KEY_TRANSACTION_AMOUNT)); values.put(KEY_TRANSACTION_AMOUNT, rawValues.getString(KEY_TRANSACTION_AMOUNT));
values.put(KEY_TRANSACTION_DATE, rawValues.getString(KEY_TRANSACTION_DATE)); values.put(KEY_TRANSACTION_DATE, rawValues.getString(KEY_TRANSACTION_DATE));
values.put(KEY_TRANSACTION_PURCHASE_PRICE, rawValues.getString(KEY_TRANSACTION_PURCHASE_PRICE)); values.put(KEY_TRANSACTION_PURCHASE_PRICE, rawValues.getDouble(KEY_TRANSACTION_PURCHASE_PRICE));
values.put(KEY_TRANSACTION_FEES, rawValues.getString(KEY_TRANSACTION_FEES)); values.put(KEY_TRANSACTION_FEES, rawValues.getDouble(KEY_TRANSACTION_FEES));
values.put(KEY_TRANSACTION_NOTES, rawValues.getString(KEY_TRANSACTION_NOTES));
values.put(KEY_TRANSACTION_PAIR, rawValues.getString(KEY_TRANSACTION_PAIR));
values.put(KEY_TRANSACTION_FEE_CURRENCY, rawValues.getString(KEY_TRANSACTION_FEE_CURRENCY));
values.put(KEY_TRANSACTION_SOURCE, rawValues.getString(KEY_TRANSACTION_SOURCE));
values.put(KEY_TRANSACTION_DESTINATION, rawValues.getString(KEY_TRANSACTION_DESTINATION));
values.put(KEY_TRANSACTION_TYPE, rawValues.getString(KEY_TRANSACTION_TYPE));
values.put(KEY_TRANSACTION_FEE_FORMAT, rawValues.getString(KEY_TRANSACTION_FEE_FORMAT));
values.put(KEY_TRANSACTION_DEDUCT, rawValues.getInt(KEY_TRANSACTION_DEDUCT));
} }
} catch (JSONException e) { } catch (JSONException e) {
Log.d("moodl", "Error while inserting transaction " + e.getMessage()); Log.d("moodl", "Error while inserting transaction " + e.getMessage());
} }
Log.d("mood", "Raw " + rawValues.toString());
db.insert(TABLE_MANUAL_TRANSACTIONS, null, values); db.insert(TABLE_MANUAL_TRANSACTIONS, null, values);
db.close(); db.close();
} }
@ -585,7 +608,7 @@ public class DatabaseManager extends SQLiteOpenHelper{
if(symbol.equals(feeSym)) if(symbol.equals(feeSym))
{ {
currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL)) currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_AMOUNT)) + resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES)))); , -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_AMOUNT)) - resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES))));
} }
else else
{ {
@ -595,16 +618,27 @@ public class DatabaseManager extends SQLiteOpenHelper{
break; break;
case "t": case "t":
if(isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE))) && isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION)))) if(isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE))) && isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION))))
{
if(!resultatList.isNull(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)))
{
if(resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)) == 1)
{
currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_AMOUNT)) - resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES))));
}
else
{ {
currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL)) currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES)))); , -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES))));
} }
}
}
else else
{ {
if(isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE)))) if(isBalanceRelated(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE))))
{ {
currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL)) currencyList.add(new Currency(resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_AMOUNT)) + resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES)))); , -resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_AMOUNT)) - resultatList.getDouble(resultatList.getColumnIndex(KEY_TRANSACTION_FEES))));
} }
else else
{ {
@ -656,6 +690,15 @@ public class DatabaseManager extends SQLiteOpenHelper{
if(resultatList.moveToFirst()) if(resultatList.moveToFirst())
{ {
boolean deduct = false;
if(!resultatList.isNull(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)))
{
deduct = resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)) == 1;
}
Log.d("moodl", "> " + resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_TYPE)));
transaction = new Transaction(resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_ID)) transaction = new Transaction(resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_ID))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_PAIR)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_PAIR))
@ -668,9 +711,12 @@ public class DatabaseManager extends SQLiteOpenHelper{
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_TYPE)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_TYPE))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_FEE_FORMAT))); , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_FEE_FORMAT))
, deduct);
} }
Log.d("moodl", "> " + DatabaseUtils.dumpCurrentRowToString(resultatList));
resultatList.close(); resultatList.close();
db.close(); db.close();
@ -688,6 +734,13 @@ public class DatabaseManager extends SQLiteOpenHelper{
while (resultatList.moveToNext()) while (resultatList.moveToNext())
{ {
boolean deduct = false;
if(!resultatList.isNull(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)))
{
deduct = resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_DEDUCT)) == 1;
}
transactionList.add(new Transaction(resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_ID)) transactionList.add(new Transaction(resultatList.getInt(resultatList.getColumnIndex(KEY_TRANSACTION_ID))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SYMBOL))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_PAIR)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_PAIR))
@ -700,7 +753,8 @@ public class DatabaseManager extends SQLiteOpenHelper{
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_SOURCE))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_DESTINATION))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_TYPE)) , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_TYPE))
, resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_FEE_FORMAT)))); , resultatList.getString(resultatList.getColumnIndex(KEY_TRANSACTION_FEE_FORMAT))
, deduct));
} }
resultatList.close(); resultatList.close();

View File

@ -104,6 +104,16 @@
</LinearLayout> </LinearLayout>
<Switch
android:id="@+id/deductHoldingsBuy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/deductFromHoldings"
android:textSize="@dimen/mdtp_material_button_textsize"
android:layout_marginTop="@dimen/margin"
android:layout_marginBottom="@dimen/margin"
android:checked="true"/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/input_note_buy" android:id="@+id/input_note_buy"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -104,6 +104,16 @@
</LinearLayout> </LinearLayout>
<Switch
android:id="@+id/deductHoldingsSell"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/addToHoldings"
android:textSize="@dimen/mdtp_material_button_textsize"
android:layout_marginTop="@dimen/margin"
android:layout_marginBottom="@dimen/margin"
android:checked="true"/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/input_note_sell" android:id="@+id/input_note_sell"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -86,6 +86,16 @@
</LinearLayout> </LinearLayout>
<Switch
android:id="@+id/deductHoldingsTransfer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/deductFromHoldings"
android:textSize="@dimen/mdtp_material_button_textsize"
android:layout_marginTop="@dimen/margin"
android:layout_marginBottom="@dimen/margin"
android:checked="true"/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/input_note_transfert" android:id="@+id/input_note_transfert"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -295,7 +295,9 @@
<string name="percentageFee">%1$s fixed</string> <string name="percentageFee">%1$s fixed</string>
<string name="activity_sell_price">Sell price</string> <string name="activity_sell_price">Sell price</string>
<string name="activity_sell_date">Sell date</string> <string name="activity_sell_date">Sell date</string>
<string name="activity_transfert_date">Date of transfert</string> <string name="activity_transfert_date">Date of transfer</string>
<string name="error_no_valid_from_to">This transaction is not valid</string> <string name="error_no_valid_from_to">This transaction is not valid</string>
<string name="deductFromHoldings">Deduct from holdings</string>
<string name="addToHoldings">Add to holdings</string>
</resources> </resources>