diff --git a/weboob/applications/boobank/boobank.py b/weboob/applications/boobank/boobank.py index d3691fc9..dcbc3ccc 100644 --- a/weboob/applications/boobank/boobank.py +++ b/weboob/applications/boobank/boobank.py @@ -18,7 +18,7 @@ # along with weboob. If not, see . -import datetime +import datetime, uuid from dateutil.relativedelta import relativedelta from dateutil.parser import parse as parse_date from decimal import Decimal, InvalidOperation @@ -33,6 +33,73 @@ from weboob.tools.application.formatters.iformatter import IFormatter, PrettyFor __all__ = ['Boobank'] +class OfxFormatter(IFormatter): + MANDATORY_FIELDS = ('id', 'date', 'raw', 'amount', 'category') + TYPES_ACCTS = ['', 'CHECKING', 'SAVINGS', 'DEPOSIT', 'LOAN', 'MARKET', 'JOINT'] + TYPES_TRANS = ['', 'DIRECTDEP', 'PAYMENT', 'CHECK', 'DEP', 'OTHER', 'ATM', 'POS', 'INT', 'FEE'] + TYPES_CURRS = ['', 'EUR', 'CHF', 'USD'] + + balance = Decimal(0) + coming = Decimal(0) + + def start_format(self, **kwargs): + account = kwargs['account'] + self.balance = account.balance + self.coming = account.coming + + self.output(u'OFXHEADER:100') + self.output(u'DATA:OFXSGML') + self.output(u'VERSION:102') + self.output(u'SECURITY:NONE') + self.output(u'ENCODING:USASCII') + self.output(u'CHARSET:1252') + self.output(u'COMPRESSION:NONE') + self.output(u'OLDFILEUID:NONE') + self.output(u'NEWFILEUID:%s\n' % uuid.uuid1()) + self.output(u'0INFO') + self.output(u'%s113942ENG' % datetime.date.today().strftime('%Y%m%d')) + self.output(u'%s' % uuid.uuid1()) + self.output(u'0INFOnull') + self.output(u'%s' % 'EUR') #account.currency_text) + self.output(u'null') + self.output(u'null') + self.output(u'%s' % account.id) + self.output(u'%s' % (self.TYPES_ACCTS[account.type] or 'CHECKING')) + self.output(u'null') + self.output(u'') + self.output(u'%s' % datetime.date.today().strftime('%Y%m%d')) + self.output(u'%s' % datetime.date.today().strftime('%Y%m%d')) + + def format_obj(self, obj, alias): + if obj.type != 0: + result = u'%s\n' % self.TYPES_TRANS[obj.type] + else: + result = u'%s\n' % ('DEBIT' if obj.amount < 0 else 'CREDIT') + + result += u'%s\n' % obj.date.strftime('%Y%m%d') + result += u'%s\n' % obj.amount + result += u'%s\n' % obj.unique_id() + + if hasattr(obj, 'label') and not empty(obj.label): + result += u'%s' % obj.label.replace('&', '&') + else: + result += u'%s' % obj.raw.replace('&', '&') + + return result + + def flush(self): + self.output(u'') + self.output(u'%s' % self.balance) + self.output(u'%s' % datetime.date.today().strftime('%Y%m%d')) + + try: + self.output(u'%s' % (self.balance + self.coming)) + except TypeError: + self.output(u'%s' % self.balance) + + self.output(u'%s' % datetime.date.today().strftime('%Y%m%d')) + self.output(u'') + class QifFormatter(IFormatter): MANDATORY_FIELDS = ('id', 'date', 'raw', 'amount') @@ -220,6 +287,7 @@ class Boobank(ReplApplication): 'transfer': TransferFormatter, 'qif': QifFormatter, 'pretty_qif': PrettyQifFormatter, + 'ofx': OfxFormatter, 'ops_list': TransactionsFormatter, 'investment_list': InvestmentFormatter, } @@ -266,7 +334,7 @@ class Boobank(ReplApplication): old_count = self.options.count self.options.count = None - self.start_format() + self.start_format(account=account) for backend, transaction in self.do(command, account, backends=account.backend): if end_date is not None and transaction.date < end_date: break