/******************************************************************************* * Copyright (c) 2010 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Denis Solonenko - initial API and implementation * Abdsandryk - identifying credit card payments ******************************************************************************/ package ru.orangesoftware.financisto2.model; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import ru.orangesoftware.financisto2.db.DatabaseHelper.TransactionColumns; import ru.orangesoftware.financisto2.db.DatabaseHelper.BlotterColumns; import javax.persistence.*; import java.util.Date; import java.util.EnumMap; import java.util.List; import java.util.Map; @Entity @Table(name = "transactions") public class Transaction extends TransactionBase { private static final String SPLIT_EXTRA = "split"; @Column(name = "category_id") public long categoryId; @Column(name = "project_id") public long projectId; @Column(name = "from_account_id") public long fromAccountId; @Column(name = "to_account_id") public long toAccountId; @Column(name = "payee_id") public long payeeId; @Column(name = "blob_key") public String blobKey; @Column(name = "original_currency_id") public long originalCurrencyId; @Transient public EnumMap<SystemAttribute, String> systemAttributes; @Transient public Map<Long, String> categoryAttributes; @Transient public List<Transaction> splits; @Transient public long unsplitAmount; public ContentValues toValues() { ContentValues values = new ContentValues(); values.put(TransactionColumns.parent_id.name(), parentId); values.put(TransactionColumns.category_id.name(), categoryId); values.put(TransactionColumns.project_id.name(), projectId); values.put(TransactionColumns.datetime.name(), dateTime); values.put(TransactionColumns.from_account_id.name(), fromAccountId); values.put(TransactionColumns.to_account_id.name(), toAccountId); values.put(TransactionColumns.payee_id.name(), payeeId); values.put(TransactionColumns.note.name(), note); values.put(TransactionColumns.from_amount.name(), fromAmount); values.put(TransactionColumns.to_amount.name(), toAmount); values.put(TransactionColumns.original_currency_id.name(), originalCurrencyId); values.put(TransactionColumns.original_from_amount.name(), originalFromAmount); values.put(TransactionColumns.is_template.name(), isTemplate); values.put(TransactionColumns.template_name.name(), templateName); values.put(TransactionColumns.recurrence.name(), recurrence); values.put(TransactionColumns.notification_options.name(), notificationOptions); values.put(TransactionColumns.status.name(), status.name()); values.put(TransactionColumns.attached_picture.name(), attachedPicture); values.put(TransactionColumns.is_ccard_payment.name(), isCCardPayment); values.put(TransactionColumns.last_recurrence.name(), lastRecurrence); values.put(TransactionColumns.updated_on.name(), updatedOn); values.put(TransactionColumns.remote_key.name(), remoteKey); values.put(TransactionColumns.blob_key.name(), blobKey); return values; } public void toIntentAsSplit(Intent intent) { intent.putExtra(SPLIT_EXTRA, this); } public static Transaction fromIntentAsSplit(Intent intent) { return (Transaction)intent.getSerializableExtra(SPLIT_EXTRA); } public static Transaction fromBlotterCursor(Cursor c) { long id = c.getLong(BlotterColumns._id.ordinal()); Transaction t = new Transaction(); t.id = id; t.parentId = c.getLong(BlotterColumns.parent_id.ordinal()); t.fromAccountId = c.getLong(BlotterColumns.from_account_id.ordinal()); t.toAccountId = c.getLong(BlotterColumns.to_account_id.ordinal()); t.categoryId = c.getLong(BlotterColumns.category_id.ordinal()); t.projectId = c.getLong(BlotterColumns.project_id.ordinal()); t.payeeId = c.getLong(BlotterColumns.payee_id.ordinal()); t.note = c.getString(BlotterColumns.note.ordinal()); t.fromAmount = c.getLong(BlotterColumns.from_amount.ordinal()); t.toAmount = c.getLong(BlotterColumns.to_amount.ordinal()); t.dateTime = c.getLong(BlotterColumns.datetime.ordinal()); t.originalCurrencyId = c.getLong(BlotterColumns.original_currency_id.ordinal()); t.originalFromAmount = c.getLong(BlotterColumns.original_from_amount.ordinal()); t.isTemplate = c.getInt(BlotterColumns.is_template.ordinal()); t.templateName = c.getString(BlotterColumns.template_name.ordinal()); t.recurrence = c.getString(BlotterColumns.recurrence.ordinal()); t.notificationOptions = c.getString(BlotterColumns.notification_options.ordinal()); t.status = TransactionStatus.valueOf(c.getString(BlotterColumns.status.ordinal())); t.attachedPicture = c.getString(BlotterColumns.attached_picture.ordinal()); t.isCCardPayment = c.getInt(BlotterColumns.is_ccard_payment.ordinal()); t.lastRecurrence = c.getLong(BlotterColumns.last_recurrence.ordinal()); return t; } public boolean isTransfer() { return toAccountId > 0; } public boolean isSplitParent() { return categoryId == Category.SPLIT_CATEGORY_ID; } public String getSystemAttribute(SystemAttribute sa) { return systemAttributes != null ? systemAttributes.get(sa) : null; } @Override public Transaction clone() { try { return (Transaction)super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } @Override public String toString() { return String.valueOf(new Date(dateTime)) + ":" + "FA(" + fromAccountId + ")->" + fromAmount + "," + "TA(" + toAccountId + ")->" + toAmount; } }