Source code for biweeklybudget.models.transaction

"""
The latest version of this package is available at:
<http://github.com/jantman/biweeklybudget>

################################################################################
Copyright 2016 Jason Antman <jason@jasonantman.com> <http://www.jasonantman.com>

    This file is part of biweeklybudget, also known as biweeklybudget.

    biweeklybudget is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    biweeklybudget is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with biweeklybudget.  If not, see <http://www.gnu.org/licenses/>.

The Copyright and Authors attributions contained herein may not be removed or
otherwise altered, except to add the Author attribution of a contributor to
this work. (Additional Terms pursuant to Section 7b of the AGPL v3)
################################################################################
While not legally required, I sincerely request that anyone who finds
bugs please submit them at <https://github.com/jantman/biweeklybudget> or
to me via email, and that you send any contributions or improvements
either as a pull request on GitHub, or to me via email.
################################################################################

AUTHORS:
Jason Antman <jason@jasonantman.com> <http://www.jasonantman.com>
################################################################################
"""

from sqlalchemy import Column, Integer, Numeric, String, Date, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql.expression import null
from biweeklybudget.models.base import Base, ModelAsDict
from biweeklybudget.utils import dtnow
from biweeklybudget.settings import RECONCILE_BEGIN_DATE


[docs]class Transaction(Base, ModelAsDict): __tablename__ = 'transactions' __table_args__ = ( {'mysql_engine': 'InnoDB'} ) #: Primary Key id = Column(Integer, primary_key=True) #: date of the transaction date = Column(Date, default=dtnow().date()) #: Actual amount of the transaction actual_amount = Column(Numeric(precision=10, scale=4), nullable=False) #: Budgeted amount of the transaction budgeted_amount = Column(Numeric(precision=10, scale=4)) #: description description = Column(String(254), nullable=False, index=True) #: free-form notes notes = Column(String(254)) #: ID of the account this transaction is against account_id = Column(Integer, ForeignKey('accounts.id')) #: Relationship - :py:class:`~.Account` this transaction is against account = relationship( "Account", backref="transactions", uselist=False ) #: ID of the ScheduledTransaction this Transaction was created from; #: set when a scheduled transaction is converted to a real one scheduled_trans_id = Column( Integer, ForeignKey('scheduled_transactions.id') ) #: Relationship - the :py:class:`~.ScheduledTransaction` #: this Transaction was created from; set when a scheduled transaction #: is converted to a real one scheduled_trans = relationship( "ScheduledTransaction", backref="transactions", uselist=False ) #: ID of the Budget this transaction is against budget_id = Column(Integer, ForeignKey('budgets.id')) #: Relationship - the :py:class:`~.Budget` this transaction is against budget = relationship( "Budget", backref="transactions", uselist=False ) def __repr__(self): return "<Transaction(id=%s)>" % ( self.id ) @staticmethod
[docs] def unreconciled(db): """ Return a query to match all unreconciled Transactions. :param db: active database session to use for queries :type db: sqlalchemy.orm.session.Session :return: query to match all unreconciled Transactions :rtype: sqlalchemy.orm.query.Query """ return db.query(Transaction).filter( Transaction.reconcile.__eq__(null()), Transaction.date.__ge__(RECONCILE_BEGIN_DATE), Transaction.account.has(reconcile_trans=True) )