Exemplo n.º 1
0
    def test_item(self):
        db = Database()
        acc = Account("Root")
        db += acc
        t = Transaction(datetime.date.today())
        db += t

        i = Item("Hello World", 2.99)
        t += i
        i += acc

        i = Item("Foo Bar", 1)
        t += i
        i += acc
Exemplo n.º 2
0
 def addTransaction(self, date, descr="", value=None, confirmed=None):
     "Add new transaction using given values"
     trn = Transaction(date)
     db = self._account.db
     db += trn
     item = Item(descr, value)
     item += self._account
     if confirmed is not None:
         item.setConfirmed(confirmed)
     trn += item
     self._updateRowCache()
     firstRow = self._getRowCacheIdx(trn)
     self.beginInsertRows(QtCore.QModelIndex(), firstRow, firstRow + 1)
     self.endInsertRows()
     self.setDirty(True)
Exemplo n.º 3
0
    def test_03_items(self):
        db = Database()
        acc1 = Account("A")
        db += acc1
        acc2 = Account("B")
        db += acc2

        t0 = Transaction(datetime.date.today())
        db += t0
        i0 = Item("AA", 1)
        t0 += i0
        i0 += acc1
        i1 = Item("BB", -1)
        t0 += i1
        i1 += acc2

        t1 = Transaction(datetime.date.today() + datetime.timedelta(days=1))
        db += t1
        i2 = Item("CC", -2)
        t1 += i2
        i2 += acc1
        i3 = Item("DD", -2)
        t1 += i3
        i3 += acc2

        expected_acc_items = [i0, i2]
        current_acc_items = list(acc1.filterItems())
        self.assertListEqual(expected_acc_items, current_acc_items)

        expected_acc_items = [i1, i3]
        current_acc_items = list(acc2.filterItems())
        self.assertListEqual(expected_acc_items, current_acc_items)

        t1.setDate(datetime.date.today() - datetime.timedelta(days=1))

        expected_acc_items = [i2, i0]
        current_acc_items = list(acc1.filterItems())
        self.assertListEqual(expected_acc_items, current_acc_items)

        expected_acc_items = [i3, i1]
        current_acc_items = list(acc2.filterItems())
        self.assertListEqual(expected_acc_items, current_acc_items)
Exemplo n.º 4
0
    def test_balanced(self):
        db = Database()
        asset = Account("Asset")
        db += asset
        debit = Account("Debit")
        db += asset

        t = Transaction(datetime.date.today())
        db += t

        i = Item("Hello World", 2)
        t += i
        i += asset

        self.assertEqual(Decimal("2.00"), t.getBalance())
        self.assertFalse(t.isBalanced())

        i = Item("Foo Bar", -1)
        t += i
        i += debit

        self.assertEqual(Decimal("1.00"), t.getBalance())
        self.assertFalse(t.isBalanced())

        i.setValue(-2)

        self.assertEqual(Decimal("0"), t.getBalance())
        self.assertTrue(t.isBalanced())
Exemplo n.º 5
0
    def test_01_xml(self):
        db = Database()
        acc1 = Account("Root")
        db += acc1
        acc2 = Account("Foo")
        acc1 += acc2
        acc3 = Account("Bar")
        acc1 += acc3

        t = Transaction(datetime.date.today(), "bar")
        db += t

        i = Item("AAA", -2)
        t += i
        i += acc1
        i = Item("BBB", 2)
        t += i
        i += acc2

        t = Transaction(datetime.date.today() + datetime.timedelta(days=1),
                        "foo")
        db += t
        i = Item("CCC", 2.99)
        t += i
        i += acc1
        i = Item("DDD", -2.99)
        i += acc3
        t += i

        t = Transaction(datetime.date.today() - datetime.timedelta(days=3),
                        "Flix")
        db += t
        i = Item(u"EEE <>/\\!'\"§$%&/(){}", 4)
        t += i
        i += acc1
        i = Item(u"FFF öäüÖÄÜß", -4)
        t += i
        i += acc3

        # remove the date/time depending string
        datePatchRe = re.compile("^\s*<saved\s+datetime=\".+?\"\s*/>\s*$",
                                 re.MULTILINE)

        xml = etree.tostring(db.toXml(),
                             encoding="utf-8",
                             xml_declaration=True,
                             pretty_print=True).decode("utf-8")
        print(xml)
        xml = datePatchRe.sub("", xml)
        print(xml)
        db2 = Database.parseFromXml(
            etree.parse(BytesIO(xml.encode("utf-8"))).getroot())
        xml2 = etree.tostring(db2.toXml(),
                              encoding="utf-8",
                              xml_declaration=True,
                              pretty_print=True).decode("utf-8")
        print(xml2)
        xml2 = datePatchRe.sub("", xml2)
        self.assertEqual(xml, xml2, "xml differs")
Exemplo n.º 6
0
    def testFilterByAccount(self):
        i = Item()
        a1 = Account("Foo")
        i += a1
        f = FilterAccountsAndChildren(a1)
        self.assertTrue(f.accepted(i))

        a2 = Account("Bar")
        f = FilterAccountsAndChildren(a2, a1)
        self.assertTrue(f.accepted(i))

        a3 = Account("Hello")
        f = FilterAccountsAndChildren(a2, a3)
        self.assertFalse(f.accepted(i))
Exemplo n.º 7
0
    def menuNewRandomDatabase(self):
        "Create a new and random filled database."
        LOGGER.info("Creating new random database...")
        self._clearViews()

        self._db = Database()
        self._dbPath = "unnamed"

        self._db._parsing = True
        for i in range(32):
            acc = Account("Account%d" % i)
            self._db += acc
            for ii in range(2):
                cacc = Account("Account%d" % ii)
                acc += cacc
                for iii in range(2):
                    ccacc = Account("Account%d" % iii)
                    cacc += ccacc
        accs = self._db.getChildAccounts(True)
        dt = datetime.datetime.now() - datetime.timedelta(seconds=60 * 60 *
                                                          500)
        for i in range(3000):
            t = Transaction(dt, "#" * random.randint(1, 32))
            self._db += t
            v = float(random.randint(1, 1000)) / 100
            i = Item("A" * random.randint(1, 32), v)
            t += i
            i += random.choice(accs)
            i = Item("B" * random.randint(1, 32), -v)
            t += i
            i += random.choice(accs)
            dt += datetime.timedelta(seconds=60 * 60)
        self._db._parsing = False

        self._accountTree.setDatabase(self._db)
        self._accountTree.expandAll()
        self.statusBar().showMessage("Created random database", 2000)
Exemplo n.º 8
0
    def test_transactions(self):
        today = datetime.date.today()
        db = Database()
        acc1 = Account("A")
        db += acc1
        acc2 = Account("B")
        db += acc2

        t0 = Transaction(today, "B")
        db += t0
        i0 = Item("AA", 1)
        t0 += i0
        i0 += acc1
        i1 = Item("BB", -1)
        t0 += i1
        i1 += acc2

        t1 = Transaction(today + datetime.timedelta(days=1), "C")
        db += t1
        i2 = Item("CC", -2)
        t1 += i2
        i2 += acc1
        i3 = Item("DD", -2)
        t1 += i3
        i3 += acc2

        t2 = Transaction(today - datetime.timedelta(days=5), "A")
        db += t2
        i4 = Item("EE", -3)
        t2 += i4
        i4 += acc1
        i5 = Item("FF", -3)
        t2 += i5
        i5 += acc2

        expected_transactions = [t2, t0, t1]
        current_transactions = list(db.filterTransactions())
        self.assertListEqual(expected_transactions, current_transactions)

        t1.setDate(today - datetime.timedelta(days=1))

        expected_transactions = [t2, t1, t0]
        current_transactions = list(db.filterTransactions())
        self.assertListEqual(expected_transactions, current_transactions)
Exemplo n.º 9
0
    def testFilterByDate(self):
        f1 = FilterGreaterOrEqualDate("2013-07-01")
        f2 = FilterLessOrEqualDate("2013-07-31")
        f3 = f1 & f2

        t = Transaction("2013-07-07")
        i = Item()
        t += i
        self.assertTrue(f1.accepted(t))
        self.assertFalse(f1.rejected(t))

        self.assertTrue(f2.accepted(t))
        self.assertFalse(f2.rejected(t))

        self.assertTrue(f3.accepted(t))
        self.assertFalse(f3.rejected(t))

        self.assertTrue(f1.accepted(i))
        self.assertFalse(f1.rejected(i))

        self.assertTrue(f2.accepted(i))
        self.assertFalse(f2.rejected(i))

        self.assertTrue(f3.accepted(i))
        self.assertFalse(f3.rejected(i))

        t = Transaction("2013-08-07")
        i = Item()
        t += i

        self.assertTrue(f1.accepted(t))
        self.assertFalse(f1.rejected(t))

        self.assertFalse(f2.accepted(t))
        self.assertTrue(f2.rejected(t))

        self.assertFalse(f3.accepted(t))
        self.assertTrue(f3.rejected(t))

        self.assertTrue(f1.accepted(i))
        self.assertFalse(f1.rejected(i))

        self.assertFalse(f2.accepted(i))
        self.assertTrue(f2.rejected(i))

        self.assertFalse(f3.accepted(i))
        self.assertTrue(f3.rejected(i))

        t = Transaction("2013-06-07")
        i = Item()
        t += i

        self.assertFalse(f1.accepted(t))
        self.assertTrue(f1.rejected(t))

        self.assertTrue(f2.accepted(t))
        self.assertFalse(f2.rejected(t))

        self.assertFalse(f3.accepted(t))
        self.assertTrue(f3.rejected(t))

        self.assertFalse(f1.accepted(i))
        self.assertTrue(f1.rejected(i))

        self.assertTrue(f2.accepted(i))
        self.assertFalse(f2.rejected(i))

        self.assertFalse(f3.accepted(i))
        self.assertTrue(f3.rejected(i))
Exemplo n.º 10
0
 def _newItem(self, descr, val, trn, acc):
     i = Item(descr, val)
     trn += i
     i += acc
     return i
Exemplo n.º 11
0
 def addTransactionItem(self, idx, descr="", value=None, confirmed=None):
     "Add new item to transaction corresponding to given index"
     if not idx.isValid():
         return
     row = self._rowCache[idx.row()]
     transaction, item, dummyAccu = row
     newItem = None
     if transaction is not None:
         newItem = Item(descr, value)
         if confirmed is not None:
             newItem.setConfirmed(confirmed)
         transaction += newItem
         newItem += self._account
         if value is None and not transaction.isBalanced():
             # try to balance transaction when new item has been added
             newItem.setValue(-transaction.getBalance())
     elif item is not None:
         trn = item.transaction
         newItem = Item(descr, value)
         if confirmed is not None:
             newItem.setConfirmed(confirmed)
         trn += newItem
         newItem += self._account
         if value is None and not trn.isBalanced():
             # try to balance transaction when new item has been added
             newItem.setValue(-trn.getBalance())
     if newItem:
         self._updateRowCache()
         firstRow = self._getRowCacheIdx(newItem)
         self.beginInsertRows(QtCore.QModelIndex(), firstRow, firstRow)
         self.endInsertRows()
         self.setDirty(True)