コード例 #1
0
ファイル: test_report.py プロジェクト: manuel-koch/accounting
    def test_account_daily(self):
        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[0], INTERVAL_DAILY)
        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Test"]
        items = [i.descr for i in report.items]
        self.assertSetEqual(set(), set(items))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[0], INTERVAL_DAILY)
        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Foo"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'AAA'}, set(items))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[1], self.dates[2], INTERVAL_DAILY)
        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Foo"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'EEE', 'GGG'}, set(items))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[3], INTERVAL_DAILY)
        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Foo"]
        report += self._db["Root/Bar"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'AAA', 'BBB', 'EEE', 'FFF', 'GGG', 'HHH', 'III'},
                            set(items))
コード例 #2
0
ファイル: report.py プロジェクト: manuel-koch/accounting
    def __init__(self, accounts):
        """Construct view for given template to show account(s) report."""
        super().__init__()

        self._template = None

        today = datetime.date.today()
        startofmonth, endofmonth = rangeDateFromTillByInterval(
            today, today, INTERVAL_MONTHLY)
        self._report = Report(accounts[0].db, startofmonth, endofmonth)
        for acc in accounts:
            self._report += acc

        hbox = QtWidgets.QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)

        vbox = QtWidgets.QVBoxLayout()
        vbox.setSpacing(4)
        vbox.setContentsMargins(0, 0, 0, 0)
        hbox.addLayout(vbox)

        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.setContentsMargins(4, 0, 4, 4)
        self._fromDate = QtWidgets.QDateEdit()
        self._fromDate.setCalendarPopup(True)
        self._fromDate.setDate(startofmonth)
        self._fromDate.dateChanged.connect(self._rangeChanged)
        hbox2.addWidget(QtWidgets.QLabel("From"),
                        alignment=QtCore.Qt.AlignRight)
        hbox2.addWidget(self._fromDate)
        hbox2.addSpacing(40)
        hbox2.addWidget(QtWidgets.QLabel("to"), alignment=QtCore.Qt.AlignRight)
        self._tillDate = QtWidgets.QDateEdit()
        self._tillDate.setCalendarPopup(True)
        self._tillDate.setDate(endofmonth)
        self._tillDate.dateChanged.connect(self._rangeChanged)
        hbox2.addWidget(self._tillDate)
        hbox2.addSpacing(40)
        self._selectBtn = QtWidgets.QPushButton("Select")
        self._selectBtn.clicked.connect(self.selectTemplate)
        hbox2.addWidget(self._selectBtn, 1)
        self._createBtn = QtWidgets.QPushButton("Create")
        self._createBtn.clicked.connect(self.refreshReport)
        hbox2.addWidget(self._createBtn, 1)
        # self._printBtn = QtWidgets.QPushButton("Print")
        # self._printBtn.clicked.connect(self.printReport)
        # hbox2.addWidget(self._printBtn, 1)

        vbox.addLayout(hbox2)

        # self._browser = QtWebKitWidgets.QWebView(self)
        # vbox.addWidget(self._browser)

        self.setLayout(hbox)
コード例 #3
0
ファイル: test_report.py プロジェクト: manuel-koch/accounting
    def test_06_accounts_by_year(self):
        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[0], INTERVAL_ANUALY)
        self.assertEqual(datetime.timedelta(days=364), tillDate - fromDate)

        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Bar"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'BBB', 'FFF', 'HHH', 'LLL', 'NNN', 'PPP'},
                            set(items))

        grp = ItemGroupingByDateRange(fromDate, tillDate, INTERVAL_ANUALY)
        grp += report

        date_ranges = list(grp.groups())
        self.assertEqual(1, len(date_ranges))
        items_per_data_ranges = [
            list(grp.groupItems(date_range)) for date_range in date_ranges
        ]
        items_per_data_ranges = [[i.descr for i in items]
                                 for items in items_per_data_ranges]
        self.assertSetEqual({'BBB', 'FFF', 'HHH', 'LLL', 'NNN', 'PPP'},
                            set(items_per_data_ranges[0]))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[6], INTERVAL_ANUALY)
        self.assertEqual(datetime.timedelta(days=729), tillDate - fromDate)

        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Bar"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'BBB', 'FFF', 'HHH', 'LLL', 'NNN', 'PPP', 'RRR'},
                            set(items))

        grp = ItemGroupingByDateRange(fromDate, tillDate, INTERVAL_ANUALY)
        grp += report

        date_ranges = list(grp.groups())
        self.assertEqual(2, len(date_ranges))
        items_per_data_ranges = [
            list(grp.groupItems(date_range)) for date_range in date_ranges
        ]
        items_per_data_ranges = [[i.descr for i in items]
                                 for items in items_per_data_ranges]
        self.assertSetEqual({'BBB', 'FFF', 'HHH', 'LLL', 'NNN', 'PPP'},
                            set(items_per_data_ranges[0]))
        self.assertSetEqual({'RRR'}, set(items_per_data_ranges[1]))
コード例 #4
0
ファイル: test_report.py プロジェクト: manuel-koch/accounting
    def test_05_accounts_by_month(self):
        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[0], INTERVAL_MONTHLY)
        self.assertEqual(datetime.timedelta(days=30), tillDate - fromDate)

        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Foo"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'AAA', 'EEE', 'GGG'}, set(items))

        grp = ItemGroupingByDateRange(fromDate, tillDate, INTERVAL_MONTHLY)
        grp += report

        date_ranges = list(grp.groups())
        self.assertEqual(1, len(date_ranges))
        items_per_data_ranges = [
            list(grp.groupItems(date_range)) for date_range in date_ranges
        ]
        items_per_data_ranges = [[i.descr for i in items]
                                 for items in items_per_data_ranges]
        self.assertSetEqual({'AAA', 'EEE', 'GGG'},
                            set(items_per_data_ranges[0]))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[3], INTERVAL_MONTHLY)
        self.assertEqual(datetime.timedelta(days=60), tillDate - fromDate)

        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root/Foo"]
        items = [i.descr for i in report.items]
        self.assertSetEqual({'AAA', 'EEE', 'GGG', 'III'}, set(items))

        grp = ItemGroupingByDateRange(fromDate, tillDate, INTERVAL_MONTHLY)
        grp += report

        date_ranges = list(grp.groups())
        self.assertEqual(2, len(date_ranges))
        items_per_data_ranges = [
            list(grp.groupItems(date_range)) for date_range in date_ranges
        ]
        items_per_data_ranges = [[i.descr for i in items]
                                 for items in items_per_data_ranges]
        self.assertSetEqual({'AAA', 'EEE', 'GGG'},
                            set(items_per_data_ranges[0]))
        self.assertSetEqual({'III'}, set(items_per_data_ranges[1]))
コード例 #5
0
ファイル: test_report.py プロジェクト: manuel-koch/accounting
    def test_account_and_children_daily(self):
        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[2], INTERVAL_DAILY)
        report = Report(self._db, fromDate, tillDate)
        report += self._db["Root"]
        items = [i.descr for i in report.items]
        self.assertSetEqual(
            {'AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH'},
            set(items))

        fromDate, tillDate = rangeDateFromTillByInterval(
            self.dates[0], self.dates[3], INTERVAL_DAILY)
        report = Report(self._db, fromDate,
                        tillDate + datetime.timedelta(days=1))
        report += self._db["Root"]
        items = [i.descr for i in report.items]
        self.assertSetEqual(
            {
                'AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH', 'III',
                'JJJ'
            }, set(items))
コード例 #6
0
ファイル: test_report.py プロジェクト: manuel-koch/accounting
 def test_08_pie_template(self):
     fromDate, tillDate = rangeDateFromTillByInterval(
         self.dates[0], self.dates[0], INTERVAL_MONTHLY)
     report = Report(self._db, fromDate, tillDate)
     report += self._db["Root/Bar"]
     report_template_dir = os.path.normpath(
         os.path.join(os.path.dirname(__file__), "..", "accounting",
                      "templates"))
     report_template_name = "report_monthly_list_grouped_pct.accrep"
     template = ReportTemplate(report_template_dir, report_template_name)
     html = template.render(report)
     html_path = os.path.join(
         report_template_dir,
         os.path.splitext(report_template_name)[0] + ".html")
     with open(html_path, "w", encoding="utf-8") as f:
         f.write(html)
コード例 #7
0
ファイル: report.py プロジェクト: manuel-koch/accounting
class AccountReport(QtWidgets.QWidget):
    def __init__(self, accounts):
        """Construct view for given template to show account(s) report."""
        super().__init__()

        self._template = None

        today = datetime.date.today()
        startofmonth, endofmonth = rangeDateFromTillByInterval(
            today, today, INTERVAL_MONTHLY)
        self._report = Report(accounts[0].db, startofmonth, endofmonth)
        for acc in accounts:
            self._report += acc

        hbox = QtWidgets.QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)

        vbox = QtWidgets.QVBoxLayout()
        vbox.setSpacing(4)
        vbox.setContentsMargins(0, 0, 0, 0)
        hbox.addLayout(vbox)

        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.setContentsMargins(4, 0, 4, 4)
        self._fromDate = QtWidgets.QDateEdit()
        self._fromDate.setCalendarPopup(True)
        self._fromDate.setDate(startofmonth)
        self._fromDate.dateChanged.connect(self._rangeChanged)
        hbox2.addWidget(QtWidgets.QLabel("From"),
                        alignment=QtCore.Qt.AlignRight)
        hbox2.addWidget(self._fromDate)
        hbox2.addSpacing(40)
        hbox2.addWidget(QtWidgets.QLabel("to"), alignment=QtCore.Qt.AlignRight)
        self._tillDate = QtWidgets.QDateEdit()
        self._tillDate.setCalendarPopup(True)
        self._tillDate.setDate(endofmonth)
        self._tillDate.dateChanged.connect(self._rangeChanged)
        hbox2.addWidget(self._tillDate)
        hbox2.addSpacing(40)
        self._selectBtn = QtWidgets.QPushButton("Select")
        self._selectBtn.clicked.connect(self.selectTemplate)
        hbox2.addWidget(self._selectBtn, 1)
        self._createBtn = QtWidgets.QPushButton("Create")
        self._createBtn.clicked.connect(self.refreshReport)
        hbox2.addWidget(self._createBtn, 1)
        # self._printBtn = QtWidgets.QPushButton("Print")
        # self._printBtn.clicked.connect(self.printReport)
        # hbox2.addWidget(self._printBtn, 1)

        vbox.addLayout(hbox2)

        # self._browser = QtWebKitWidgets.QWebView(self)
        # vbox.addWidget(self._browser)

        self.setLayout(hbox)

    def _rangeChanged(self):
        """Handle change of from/till date range"""
        fd = self._fromDate.date()
        fd = datetime.date(fd.year(), fd.month(), fd.day())
        td = self._tillDate.date()
        td = datetime.date(td.year(), td.month(), td.day())
        valid = fd < td
        self._createBtn.setEnabled(valid)

    def getReport(self):
        return self._report

    def selectTemplate(self):
        """Choose template file to use for report"""
        settings = QtCore.QSettings()
        settings.beginGroup("Reports")
        templatedir = settings.value("mostRecentReportDir", "")
        templatepath, dummyFilter = QtWidgets.QFileDialog.getOpenFileName(
            self, self.tr("Open report template..."), templatedir,
            self.tr("Accounting Report Files (*.accrep)"))
        if not templatepath:
            return
        templatedir = os.path.dirname(templatepath)
        settings.setValue("mostRecentReportDir", templatedir)
        settings.endGroup()

        self._template = ReportTemplate(templatedir,
                                        os.path.basename(templatepath))
        self.refreshReport()

    def refreshReport(self):
        """Handle refreshing of report rendering."""
        fd = self._fromDate.date()
        fd = datetime.date(fd.year(), fd.month(), fd.day())
        td = self._tillDate.date()
        td = datetime.date(td.year(), td.month(), td.day())
        self._report.setRange(fd, td)
        html = self._template.render(self._report)
        outname = "{}_{}_{}.html".format(
            fd, td,
            os.path.splitext(self._template.name)[0])
        outpath = os.path.join(self._template.basepath, outname)
        with open(outpath, "w+", encoding="utf-8") as f:
            f.write(html)
        url = QtCore.QUrl.fromLocalFile(outpath).toString()
        webbrowser.open(url, new=0, autoraise=True)