OpenERP 6.1 Swiss localization: how to fix "Trial balance" financial report

Problem statement

Since OpenERP 5.x from 2009 I’ve never got working “Trial balance” financial report. The very important fact is that I use “Swiss localization” (l18ch) from camp2camp. Swiss localization allows to create Swiss chart of accounts. However, for unknown reasons, many standard reports doesn’t work.

In this article I provide a simple fix for the “Trial balance” report, I have found after many hours of debugging and code studying…

Symptoms:

Unfortunately, OpenERP is very poor written system. It fails in different places, providing misleading error. I hope that after my explanation you will see why I use the term “poor written”. In my opinion, the company invites programmers with “basic” knowledge of programming style and it never follows or even create a sort of “good programming practice”.

Well, in my case, every time when I started the “Trial balance”, the system just reports about internal server error without any details at client side. Well, if I run server in terminal, I can finally found that system caught a bug as follows:

[toggle_box align="left" width="100%" background="#f5f5f5"] [toggle_item title="OpenERP server error log" color="#fff" icon="code" ] [highlighter label="Trace log from OpernERP server in terminal mode" linenums="yes" startnums="1"]

ERROR ? openerp.service.web_services: Exception: list index out of rangeparagraph text u'<para>(d&#233;biteurs-clients)</font></para>' caused exception
Traceback (most recent call last):

  File "/usr/share/openerp/service/web_services.py", line 727, in go
    (result, format) = obj.create(cr, uid, ids, datas, context)

  File "/usr/share/openerp/report/report_sxw.py", line 440, in create
    fnct_ret = fnct(cr, uid, ids, data, report_xml, context)

  File "/usr/share/openerp/report/report_sxw.py", line 509, in create_source_pdf
    return self.create_single_pdf(cr, uid, ids, data, report_xml, context)

  File "/usr/share/openerp/report/report_sxw.py", line 531, in create_single_pdf
    pdf = create_doc(etree.tostring(processed_rml),rml_parser.localcontext,logo,title.encode('utf8'))

  File "/usr/share/openerp/report/interface.py", line 207, in create_pdf

    obj.render()

  File "/usr/share/openerp/report/render/render.py", line 59, in render

    self._result = self._render()

  File "/usr/share/openerp/report/render/rml.py", line 41, in _render

    return rml2pdf.parseNode(self.rml, self.localcontext, images=self.bin_datas, path=self.path,title=self.title)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 1007, in parseNode

    r.render(fp)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 314, in render

    pt_obj.render(el)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 983, in render

    fis += r.render(node_story)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 877, in render

    return process_story(node_story)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 870, in process_story

    flow = self._flowable(node)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 793, in _flowable

    return  self._table(node)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 677, in _table

    fl = self._flowable(n, extra_style=paraStyle)

  File "/usr/share/openerp/report/render/rml2pdf/trml2pdf.py", line 746, in _flowable

    result.append(platypus.Paragraph(i, style, **(utils.attr_get(node, [], {'bulletText':'str'}))))

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paragraph.py", line 988, in __init__

    self._setup(text, style, bulletText or getattr(style,'bulletText',None), frags, cleanBlockQuotedText)

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paragraph.py", line 1010, in _setup

    style, frags, bulletTextFrags = _parser.parse(text,style)

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paraparser.py", line 1147, in parse

    annotateException('paragraph text %s caused exception' % ascii(text))

  File "/usr/lib/python2.7/dist-packages/reportlab/lib/utils.py", line 1337, in annotateException

    rl_reraise(t,v,b)

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paraparser.py", line 1145, in parse

    self.feed(text)

  File "/usr/lib/python2.7/HTMLParser.py", line 117, in feed

    self.goahead(0)

  File "/usr/lib/python2.7/HTMLParser.py", line 163, in goahead

    k = self.parse_endtag(i)

  File "/usr/lib/python2.7/HTMLParser.py", line 401, in parse_endtag

    self.handle_endtag(elem)

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paraparser.py", line 1181, in handle_endtag

    end()

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paraparser.py", line 834, in end_para

    self._pop()

  File "/usr/lib/python2.7/dist-packages/reportlab/platypus/paraparser.py", line 985, in _pop

    frag = self._stack[-1]

IndexError: list index out of rangeparagraph text u'<para>(clients-debtors)</font></para>' caused exception

769 15542 ERROR ? openerp.netsvc: list index out of rangeparagraph text u'<para>(d&#233;biteurs-clients)</font></para>' caused exception

(<type 'exceptions.IndexError'>, IndexError("list index out of rangeparagraph text u'<para>(d&#233;biteurs-clients)</font></para>' caused exception",), <traceback object at 0x7f9a408f04d0>)

770 15542 ERROR ? openerp.service.netrpc_server: netrpc: cannot deliver exception message to client

Traceback (most recent call last):

  File "/usr/share/openerp/service/netrpc_server.py", line 71, in run

    valid_exception = Exception(netrpc_handle_exception_legacy(e))

  File "/usr/share/openerp/service/netrpc_server.py", line 93, in netrpc_handle_exception_legacy

    return 'warning -- ' + e.name + '\n\n' + e.value

TypeError: coercing to Unicode: need string or buffer, tuple found

[/highlighter] [/toggle_item] [/toggle_box]

Well, you can see, that at the beginning there are many possible reasons why it can not working. The message is completely unclear…

On the client side one gets the error as follows:

image    and    image

So, those messages give no clue, what the problem might be.

Analysis:

I started from thinking that the problem causes by a special character in the string as follows: <strong>&#233;</strong> and I spent considerable amount of time to find out that it doesn’t help. I fixed a potential Unicode bug in reportlib here, I fixed another very annoyed bug with pywebdav which exists since my migration on Ubunut 14.04 which is described here, I checked many as I thought related issues like this one or another one.

But when I installed WinpDb on Ubuntu computer as it described here and debugged the code of the report generation, I start thinking that the bug might be created by content.

Well, this assumption was really got, the only question was to find which content can produce a bug. Having hundreds accounts don’t allow to do so in an easy way.

Finally, search by string in the error server log, pointed me onto multilingual name of Financial account with the code 110.0 in OpenERP->Accounting->Configuration->Financial Accounting->Accounts->Accounts.

[highlighter label="Name of the 110.0 account" linenums="yes" startnums="1"]

Receivables from sales and services
            (débiteurs-clients)

[/highlighter]

As you can see here, the name has 2 row but in the OpenERP GUI it shows as a string… so you have no idea that it contains break line character and thus this character is the root of the problem!

Fix:

Well, as soon as I changed the name of the account by replacing the original name by anything else from scratch or if I remove everything between services and (débiteurs words, and put there space or any others characters, it works.

What is a miracle!!! That is why OpenERP developers never accept such a problem as a bug and ask their client to find the problem by themselves!

So, the reason of the bug was a symbol in the name of account!

Final words

As I wrote before - it looks like the company for programmers, who create OpenERP code, must create and apply a programming style guidelines, which force them to check strings in such places of the system for prohibited characters and thus avoid such problems in the future!

Hope, this article can help someone else from Switzerland to fix the unavailability of standard financial OpenERP reports.