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