class AccountReport:

    def __init__(self, account, startdate, enddate, title=None):
        self.account = account
        self.title = title or self.account.get_full_name()
        self.startdate = startdate
        self.enddate = enddate
        self._get_splits()
        self._make_report()

    def _get_splits(self):
        self.splits = self.account.GetSplitList()
        def f(x):
            txn = x.GetParent()
            txn_date = date.fromtimestamp(txn.GetDate())
            return txn_date >= self.startdate and txn_date <= self.enddate
        self.splits = filter(f, self.splits)

    def _make_report(self):
        self.total = GncNumeric()
        self.entries = []
        for split in self.splits:
            txn = split.GetParent()
            desc = txn.GetDescription()
            memo = split.GetMemo()
            txn_date = date.fromtimestamp(txn.GetDate())
            amount = split.GetValue()
            self.total = self.total.add_fixed(amount)
            self.entries.append({
                'date': txn_date,
                'owner': desc,
                'desc': memo,
                'amount': amount,
            })
        (self.report_total,self.report_rest) = gncn_round_with_rest(self.total)

    def write(self,io):
        w = csv.writer(io)
        w.writerow([])
        w.writerow(['Name',self.title])
        w.writerow(['Total',self.total])
        w.writerow(['Report Total',str(self.report_total)])
        w.writerow(['Report Rest',str(self.report_rest)])
        w.writerow(['Transactions','Date','Owner','Description','Amount'])
        for entry in self.entries:
            w.writerow(['',entry['date'],entry['owner'],entry['desc'],str(entry['amount'])])
        w.writerow([])