def print_tx(tx: Transaction): print( "{0:%Y-%m-%d}|{1:20s}|{2:50s}|{3:>10s}|{4:>10s}|{5:20s}|{6:30s}|" .format( tx.date, tx.joined_value("p.acc_name"), tx.description, amt(tx.debit), amt(tx.credit), tx.joined_value("project.proj_name"), tx.joined_value("contact.contact_name"), ))
def __init__(self, parent): super(ContactTab, self).__init__(parent=parent) layout = QVBoxLayout(self) q = Transaction.query(keys_only=False, include_subclasses=True, raw=True) q.add_aggregate("amt", name="total", groupby=Contact, func="SUM") q.add_join(Contact, "contact", jointype="RIGHT") self.table = grumpy.view.TableView(q, [ bucks.app.base.DebitCreditColumn( attr='total', sign=bucks.app.base.DebitCreditColumn.Debit), bucks.app.DebitCreditColumn( attr='total', sign=bucks.app.base.DebitCreditColumn.Credit), grumpy.model.TableColumn(attr='contact."contact_name"', header='Name') ], key_attr='contact."_key"') self.table.setMinimumSize(400, 300) layout.addWidget(self.table) self.form = ContactForm(self) layout.addWidget(self.form) self.setLayout(layout) self.table.objectSelected.connect(self.form.set_instance) self.form.refresh.connect(self.table.refresh) QCoreApplication.instance().importer.imported.connect( self.table.refresh)
def __init__(self, tab): super(ContactForm, self).__init__(tab, Contact) self.addProperty(Contact, "^", 0, 1, refclass=Contact, query=self.query, label="Alias for", required=False) self.addProperty(Contact, "contact_name", 2, 1) q = Transaction.query(keys_only=False, include_subclasses=True, raw=True) q.add_parent_join(Account) q.add_filter("contact", "XX") self.tx_list = grumpy.view.TableView(q, [ grumpy.model.TableColumn(attr='date', header='Date'), grumpy.model.TableColumn(attr='+p."acc_name"', header='Account'), bucks.app.base.DebitCreditColumn( attr='amt', sign=bucks.app.base.DebitCreditColumn.Debit), bucks.app.base.DebitCreditColumn( attr='amt', sign=bucks.app.base.DebitCreditColumn.Credit), grumpy.model.TableColumn(attr='description', header='Description') ], key_attr='_key') self.addTab(self.tx_list, "Transactions")
def getvalue(self, instance): if not instance.is_new(): from bucks.datamodel.account import Transaction q = Transaction.query() q.add_filter(self.entity_prop, "->", instance) q.add_aggregate("amt") return q.singleton()
def list_transactions(self, dummy=None): def print_tx(tx: Transaction): print( "{0:%Y-%m-%d}|{1:50s}|{2:>10s}|{3:>10s}|{4:20s}|{5:20s}|{6:30s}|" .format( tx.date, tx.description, amt(tx.debit), amt(tx.credit), tx.category.cat_name if tx.category else '', tx.project.proj_name if tx.project else '', tx.contact.contact_name if tx.contact else '', )) if self.account(): account: Account = self.account() with gripe.db.Tx.begin(): txs = account.transactions() if txs: table_header(("Date", 10), ("Description", 50), ("Debit", 10), ("Credit", 10), ("Category", 20), ("Project", 20), ("Contact", 30)) total = Transaction(parent=None, date=datetime.date.today(), description='Total', debit=0.0, credit=0.0) for tx in txs: print_tx(tx) total.debit += tx.debit total.credit += tx.credit print_tx(total) return dummy
def get_categories(cls): from bucks.datamodel.account import Transaction q = Transaction.query(keys_only=False, include_subclasses=True, alias="category") q.add_synthetic_column("debit", "(CASE WHEN amt < 0 THEN -amt ELSE 0 END)") q.add_synthetic_column("credit", "(CASE WHEN amt > 0 THEN amt ELSE 0 END)") q.add_aggregate("k.debit", name="total_debit", groupby=Category, func="SUM", default=0.0) q.add_aggregate("k.credit", name="total_credit", groupby=Category, func="SUM", default=0.0) q.add_aggregate("k.amt", name="total", groupby=Category, func="SUM", default=0.0) q.add_join(Category, "category", jointype="RIGHT") q.add_sort("category.cat_name") return q
def transactions(self): from bucks.datamodel.account import Account from bucks.datamodel.account import Transaction from bucks.datamodel.project import Project from bucks.datamodel.contact import Contact q = Transaction.query(keys_only=False) q.add_parent_join(Account) q.add_filter("category", "->", self) q.add_synthetic_column("debit", "(CASE WHEN amt < 0 THEN -amt ELSE 0 END)") q.add_synthetic_column("credit", "(CASE WHEN amt > 0 THEN amt ELSE 0 END)") q.add_join(Project, "project", jointype="LEFT", alias="prj") q.add_join(Contact, "contact", jointype="LEFT", alias="ctc") q.add_sort("date") return q
def persist(self): attrs = { "date": self.date, "amt": self.amount, "currency": self.currency, "foreign_amt": self.foreign_amount, "description": self.description, "contact": self.find_or_create(Contact, "contact_name", self.contact), "category": self.find_or_create(Category, "cat_name", self.category), "project": self.find_or_create(Project, "proj_name", self.project) } if self.type == "T": attrs["counter"] = self.find_or_create(Account, "acc_name", self.counter) tx = Transaction.for_type(self.account, self.type, **attrs) if tx: tx.put()
def __init__(self, parent): super(ProjectTab, self).__init__(parent=parent) layout = QVBoxLayout(self) q = Transaction.query(keys_only=False, include_subclasses=True, alias="project") q.add_synthetic_column("debit", "(CASE WHEN amt < 0 THEN -amt ELSE 0 END)") q.add_synthetic_column("credit", "(CASE WHEN amt > 0 THEN amt ELSE 0 END)") q.add_aggregate("k.debit", name="total_debit", groupby=Project, func="SUM") q.add_aggregate("k.credit", name="total_credit", groupby=Project, func="SUM") q.add_aggregate("k.amt", name="total", groupby=Project, func="SUM") q.add_join(Project, "project", jointype="RIGHT") self.tree = grumpy.view.TreeView( self, kind=Project, query=q, root=None, columns=[ grumpy.model.TableColumn("total_debit", header="Debit"), grumpy.model.TableColumn("total_credit", header="Credit"), grumpy.model.TableColumn("total", header="Total"), ]) self.tree.setMinimumSize(400, 300) layout.addWidget(self.tree) self.form = ProjectForm(self) layout.addWidget(self.form) self.setLayout(layout) self.tree.objectSelected.connect(self.form.set_instance) self.form.refresh.connect(self.tree.refresh) QCoreApplication.instance().importer.imported.connect( self.tree.refresh)
def transactions(self, dummy=None): def print_tx(tx: Transaction): print( "{0:%Y-%m-%d}|{1:20s}|{2:50s}|{3:>10s}|{4:>10s}|{5:20s}|{6:30s}|" .format( tx.date, tx.joined_value("p.acc_name"), tx.description, amt(tx.debit), amt(tx.credit), tx.joined_value("project.proj_name"), tx.joined_value("contact.contact_name"), )) if self.category(): category: Category = self.category() with gripe.db.Tx.begin(): txs = category.transactions() if txs: print( "{0:^10s}|{1:^20s}|{2:^50s}|{3:^10s}|{4:^10s}|{5:^20s}|{6:^30s}|" .format("Date", "Account", "Description", "Debit", "Credit", "Project", "Contact")) print( "{0:-<10s}+{0:-<20s}+{0:-<50s}+{0:-<10s}+{0:-<10s}+{0:-<20s}+{0:-<30s}+" .format('')) total = Transaction(parent=None, date=datetime.date.today(), description='Total', debit=0.0, credit=0.0) for tx in txs: print_tx(tx) total.debit += tx.debit total.credit += tx.credit print_tx(total) return dummy
def init_tx(self): ret = Transaction() sign = -1.0 if self.type.currentIndex() == 0 else 1.0 ret.amt = sign * float(self.amount.text()) return ret