Merge lp:~unifield-team/unifield-addons/UF_1711 into lp:unifield-addons

Proposed by jftempo
Status: Needs review
Proposed branch: lp:~unifield-team/unifield-addons/UF_1711
Merge into: lp:unifield-addons
Diff against target: 874 lines (+514/-39)
9 files modified
account/account.py (+40/-6)
account/account_report.xml (+11/-0)
account/report/__init__.py (+1/-0)
account/report/account_profit_horizontal.rml (+11/-9)
account/report/account_profit_loss.py (+74/-12)
account/report/account_profit_loss.rml (+6/-6)
account/report/profit_loss_xls.mako (+347/-0)
account/wizard/account_report_profit_loss.py (+19/-6)
account/wizard/account_report_profit_loss_view.xml (+5/-0)
To merge this branch: bzr merge lp:~unifield-team/unifield-addons/UF_1711
Reviewer Review Type Date Requested Status
UniField Dev Team Pending
Review via email: mp+193558@code.launchpad.net
To post a comment you must log in.
4596. By Sean Carroll <sean@sean-msf>

UF_1711: [WIP] WIP commit for JF.

4597. By Sean Carroll <sean@sean-msf>

UF_1711: [WIP] WIP added profit_loss_xls.mako

4598. By Sean Carroll <sean@sean-msf>

UF_1711: [IMP] Added XLS report

4599. By Sean Carroll <sean@sean-msf>

UF_1711: [IMP] Mods to xls report

Unmerged revisions

4599. By Sean Carroll <sean@sean-msf>

UF_1711: [IMP] Mods to xls report

4598. By Sean Carroll <sean@sean-msf>

UF_1711: [IMP] Added XLS report

4597. By Sean Carroll <sean@sean-msf>

UF_1711: [WIP] WIP added profit_loss_xls.mako

4596. By Sean Carroll <sean@sean-msf>

UF_1711: [WIP] WIP commit for JF.

4595. By Sean Carroll

UF-1711: [FIX] removed debugging info

4594. By Sean Carroll

UF_1711: [IMP] added code to convert currencies at account line move level

4593. By Sean Carroll

UF-1711: [IMP] Added currency selection and conversion for P&L

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'account/account.py'
2--- account/account.py 2013-09-30 15:03:30 +0000
3+++ account/account.py 2013-11-27 20:02:46 +0000
4@@ -227,6 +227,8 @@
5
6 def __compute(self, cr, uid, ids, field_names, arg=None, context=None,
7 query='', query_params=()):
8+ # Jira-1711: Added cnvt_currency to context. If it exists then balances will be converted
9+ # TODO This method needs review during refactoring.
10 """ compute the balance, debit and/or credit for the provided
11 account ids
12 Arguments:
13@@ -268,12 +270,13 @@
14 # INNER JOIN (VALUES (id1), (id2), (id3), ...) AS tmp (id)
15 # ON l.account_id = tmp.id
16 # or make _get_children_and_consol return a query and join on that
17- request = ("SELECT l.account_id as id, " +\
18+ # Jira 1711 - added posting_date and document_date to query
19+ request = ("SELECT l.account_id as id, l.currency_id as currency_id, l.date as posting_date, l.document_date as document_date, " +\
20 ', '.join(map(mapping.__getitem__, field_names)) +
21 " FROM account_move_line l" \
22 " WHERE l.account_id IN %s " \
23 + filters +
24- " GROUP BY l.account_id")
25+ " GROUP BY l.account_id, l.currency_id, l.date, l.document_date")
26 params = (tuple(children_and_consolidated),) + query_params
27 cr.execute(request, params)
28 self.logger.notifyChannel('addons.'+self._name, netsvc.LOG_DEBUG,
29@@ -281,6 +284,23 @@
30
31 for res in cr.dictfetchall():
32 accounts[res['id']] = res
33+
34+ # If the 'cnvt_to_curr' context variable is set with a currency id, then convert to this currency
35+ if context['cnvt_to_curr']:
36+ functional_currency_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.currency_id.id
37+ for account,dct in accounts.items():
38+ if dct[field_names[0]] == 0.0:
39+ pass
40+ else:
41+ date_context = {'date': dct['posting_date']}
42+ converted_amount = self.pool.get('res.currency').compute(cr,
43+ uid,
44+ functional_currency_id,
45+ context['cnvt_to_curr'],
46+ dct[field_names[0]] or 0.0,
47+ round=True,
48+ context=date_context)
49+ accounts[account][field_names[0]] = converted_amount
50
51 # consolidate accounts with direct children
52 children_and_consolidated.reverse()
53@@ -300,16 +320,30 @@
54 brs.pop(0)
55 for fn in field_names:
56 sums.setdefault(current.id, {})[fn] = accounts.get(current.id, {}).get(fn, 0.0)
57+ #sums.setdefault(current.id, {})['posting_date'] = accounts.get(current.id, {}).get('posting_date')
58 for child in current.child_id:
59- if child.company_id.currency_id.id == current.company_id.currency_id.id:
60- sums[current.id][fn] += sums[child.id][fn]
61- else:
62- sums[current.id][fn] += currency_obj.compute(cr, uid, child.company_id.currency_id.id, current.company_id.currency_id.id, sums[child.id][fn], context=context)
63+ # Jira 1711 - if 'cnvt_to_curr' is in the context it is used to convert sums earlier in this method
64+ if context['cnvt_to_curr']:
65+ pass
66+ else:
67+ if child.company_id.currency_id.id == current.company_id.currency_id.id:
68+ sums[current.id][fn] += sums[child.id][fn]
69+ else:
70+ sums[current.id][fn] += currency_obj.compute(cr, uid, child.company_id.currency_id.id, current.company_id.currency_id.id, sums[child.id][fn], context=context)
71 res = {}
72 null_result = dict((fn, 0.0) for fn in field_names)
73 for id in ids:
74 res[id] = sums.get(id, null_result)
75 return res
76+
77+ #def get_converted_account_line(self, cr, uid, from_currency, to_currency, amount, posting_date):
78+ # db_pool = pooler.get_pool(self.cr.dbname)#
79+
80+ # rate_pool = db_pool.get('res.currency_rate')
81+ # from_rate = rate_pool.browse(cr, uid, from_currency, context=None)
82+ # to_rate = rate_pool.browse(cr, uid, to_currency, context=None)
83+ # return amount * (from_rate / to_rate)
84+
85
86 def _get_company_currency(self, cr, uid, ids, field_name, arg, context=None):
87 result = {}
88
89=== modified file 'account/account_report.xml'
90--- account/account_report.xml 2011-01-18 18:01:02 +0000
91+++ account/account_report.xml 2013-11-27 20:02:46 +0000
92@@ -11,6 +11,17 @@
93 <report auto="False" id="account_general_journal" model="account.journal.period" name="account.general.journal" rml="account/report/account_general_journal.rml" string="General Journal" header="False"/>
94 <report auto="False" id="account_journal" model="account.journal.period" name="account.journal.period.print" rml="account/report/account_journal.rml" string="Journal" header="False"/>
95 <report auto="False" id="account_overdue" model="res.partner" name="account.overdue" rml="account/report/account_print_overdue.rml" string="Overdue Payments"/>
96+
97+ <report id="pl_account_xls"
98+ name="pl.account_xls"
99+ model="account.account"
100+ file="account/report/profit_loss_xls.mako"
101+ report_type="webkit"
102+ string="Account Balance (xls)"
103+ auto="False"
104+ menu="False"
105+ />
106+
107 <report
108 auto="False"
109 id="account_invoices"
110
111=== modified file 'account/report/__init__.py'
112--- account/report/__init__.py 2011-01-14 00:11:01 +0000
113+++ account/report/__init__.py 2013-11-27 20:02:46 +0000
114@@ -42,5 +42,6 @@
115 import account_balance_sheet
116 import account_profit_loss
117
118+
119 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
120
121
122=== modified file 'account/report/account_profit_horizontal.rml'
123--- account/report/account_profit_horizontal.rml 2011-06-29 05:29:28 +0000
124+++ account/report/account_profit_horizontal.rml 2013-11-27 20:02:46 +0000
125@@ -148,9 +148,10 @@
126 <font color="white"> </font>
127 </para>
128 <para style="P2">[[ get_data(data) or removeParentNode('para')]]</para>
129- <blockTable colWidths="250.0,100.0,150.0,120.0,150.0" style="Table2_header">
130+ <blockTable colWidths="200.0,50.0,100.0,150.0,120.0,150.0" style="Table2_header">
131 <tr>
132 <td><para style="terp_tblheader_General_Centre">Chart of Account </para></td>
133+ <td><para style="terp_tblheader_General_Centre">Currency</para></td>
134 <td><para style="terp_tblheader_General_Centre">Fiscal Year</para></td>
135 <td><para style="terp_tblheader_General_Centre">Filter By [[ get_filter(data)!='No Filter' and get_filter(data) ]]</para></td>
136 <td><para style="terp_tblheader_General_Centre">Display Account</para></td>
137@@ -158,6 +159,7 @@
138 </tr>
139 <tr>
140 <td><para style="terp_default_Centre_8">[[ get_account(data) or removeParentNode('para') ]]</para></td>
141+ <td><para style="terp_default_Centre_8">[[ get_currency(data).name ]]</para></td>
142 <td><para style="terp_default_Centre_8">[[ get_fiscalyear(data) or '' ]]</para></td>
143 <td><para style="terp_default_Centre_8">[[ get_filter(data)=='No Filter' and get_filter(data) or removeParentNode('para') ]] </para>
144 <blockTable colWidths="70.0,70.0" style="Table3">[[ get_filter(data)=='Date' or removeParentNode('blockTable') ]]
145@@ -213,7 +215,7 @@
146 <td>
147 <para style="terp_default_9">
148
149- <font face="Times-Roman">[[ repeatIn(get_lines(),'a' ) ]] </font>[[ a['code'] ]]<font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]]</font>
150+ <font face="Times-Roman">[[ repeatIn(get_lines(data),'a' ) ]] </font>[[ a['code'] ]]<font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]]</font>
151 </para>
152 </td>
153 <td>
154@@ -222,7 +224,7 @@
155 </para>
156 </td>
157 <td>
158- <para style="terp_default_Right_9"><font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a['balance'])) ]] [[ company.currency_id.symbol ]]</font></para>
159+ <para style="terp_default_Right_9"><font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a['balance'])) ]]</font></para>
160 </td>
161 <td>
162 <para style="terp_default_9">
163@@ -235,7 +237,7 @@
164 </para>
165 </td>
166 <td>
167- <para style="terp_default_Right_9"><font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[(a['code1'] and a['name1']) and formatLang(abs(a['balance1'])) or removeParentNode('font') ]] [[ company.currency_id.symbol ]]</font></para>
168+ <para style="terp_default_Right_9"><font>[[ a['level']&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[(a['code1'] and a['name1']) and formatLang(abs(a['balance1'])) or removeParentNode('font') ]]</font></para>
169 </td>
170 </tr>
171 </blockTable>
172@@ -248,7 +250,7 @@
173 <para style="terp_default_Bold_9">[[ final_result()['type'] == 'Net Profit' and final_result()['type'] or '' ]]</para>
174 </td>
175 <td>
176- <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(abs(final_result()['balance'])) ]] [[ company.currency_id.symbol ]]</para>
177+ <para style="terp_default_Right_9_Bold"> [[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(abs(final_result()['balance'])) ]] </para>
178 </td>
179 <td>
180 <para style="terp_default_Bold_9"></para>
181@@ -257,9 +259,9 @@
182 <para style="terp_default_Bold_9">[[ final_result()['type'] == 'Net Loss' and final_result()['type'] or '' ]]</para>
183 </td>
184 <td>
185- <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and company.currency_id.symbol ]]</para>
186+ <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and '' ]]</para>
187 </td>
188- </tr>
189+ </tr>t
190 </blockTable>
191
192 <blockTable colWidths="290.16,100.32,290.16,100.32" style="Table_Net_Profit_Loss">
193@@ -268,13 +270,13 @@
194 <para style="terp_default_Bold_9">Total:</para>
195 </td>
196 <td>
197- <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_dr())) ]] [[ company.currency_id.symbol ]]</u></para>
198+ <para style="terp_default_Right_9_Bold"><u>[[ get_currency(data).name ]] [[ formatLang(abs(sum_dr())) ]] </u></para>
199 </td>
200 <td>
201 <para style="terp_default_Bold_9">Total:</para>
202 </td>
203 <td>
204- <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_cr())) ]] [[ company.currency_id.symbol ]]</u></para>
205+ <para style="terp_default_Right_9_Bold"><u>[[ get_currency(data).name ]] [[ formatLang(abs(sum_cr())) ]] </u></para>
206 </td>
207 </tr>
208 </blockTable>
209
210=== modified file 'account/report/account_profit_horizontal.sxw'
211Binary files account/report/account_profit_horizontal.sxw 2011-06-29 05:29:28 +0000 and account/report/account_profit_horizontal.sxw 2013-11-27 20:02:46 +0000 differ
212=== modified file 'account/report/account_profit_loss.py'
213--- account/report/account_profit_loss.py 2011-06-29 05:29:28 +0000
214+++ account/report/account_profit_loss.py 2013-11-27 20:02:46 +0000
215@@ -21,8 +21,14 @@
216 import time
217 import pooler
218 from report import report_sxw
219+from report_webkit.webkit_report import WebKitParser
220+from spreadsheet_xml.spreadsheet_xml_write import SpreadsheetReport
221 from common_report_header import common_report_header
222 from tools.translate import _
223+from osv import osv
224+import cgi
225+
226+
227
228 class report_pl_account_horizontal(report_sxw.rml_parse, common_report_header):
229
230@@ -34,10 +40,13 @@
231 self.result = {}
232 self.result_temp = []
233 self.localcontext.update( {
234+ 'currency_sum_dr': self.currency_sum_dr,
235+ 'currency_sum_cr': self.currency_sum_cr,
236 'time': time,
237 'get_lines': self.get_lines,
238 'get_lines_another': self.get_lines_another,
239 'get_currency': self._get_currency,
240+ 'get_display_account': self.get_display_account,
241 'get_data': self.get_data,
242 'sum_dr': self.sum_dr,
243 'sum_cr': self.sum_cr,
244@@ -53,6 +62,7 @@
245 'get_end_date':self._get_end_date,
246 'get_company':self._get_company,
247 'get_target_move': self._get_target_move,
248+ 'get_currency': self.get_currency,
249 })
250 self.context = context
251
252@@ -78,17 +88,47 @@
253 if self.res_pl['type'] == _('Net Loss'):
254 self.result_sum_cr += self.res_pl['balance']
255 return self.result_sum_cr
256-
257+
258+ def currency_sum_dr(self,data):
259+ output = self.get_currency(data).name + ' ' + str(self.result_sum_dr)
260+ print 'sfc: ', output
261+ return output
262+
263+ def currency_sum_cr(self,data):
264+ return self.get_currency(data).name + ' ' + str(self.result_sum_cr)
265+
266+
267+ def get_currency(self,data):
268+ cr, uid = self.cr, self.uid
269+ ctx = self.context.copy()
270+ db_pool = pooler.get_pool(self.cr.dbname)
271+ currency_pool = db_pool.get('res.currency')
272+
273+ currency_id = data['form']['currency_id']
274+ currency = currency_pool.browse(cr, uid, currency_id, context=ctx)
275+
276+ return currency
277+
278+ def get_display_account(self,data):
279+ display_account = 'With balance is not equal to 0'
280+ if data['form']['display_account']=='bal_all':
281+ display_account = 'All'
282+ if data['form']['display_account']=='bal_movement':
283+ display_account = 'With movements'
284+ return display_account
285+
286 def get_data(self, data):
287 cr, uid = self.cr, self.uid
288 db_pool = pooler.get_pool(self.cr.dbname)
289
290 account_pool = db_pool.get('account.account')
291 currency_pool = db_pool.get('res.currency')
292+ res_currency_obj = self.pool.get('res.currency')
293
294 types = [
295 'expense',
296 'income'
297+
298 ]
299
300 ctx = self.context.copy()
301@@ -99,26 +139,38 @@
302 elif data['form']['filter'] == 'filter_date':
303 ctx['date_from'] = data['form'].get('date_from', False)
304 ctx['date_to'] = data['form'].get('date_to', False)
305-
306+
307+
308 cal_list = {}
309 account_id = data['form'].get('chart_account_id', False)
310 account_ids = account_pool._get_children_and_consol(cr, uid, account_id, context=ctx)
311 accounts = account_pool.browse(cr, uid, account_ids, context=ctx)
312+
313+ rpt_currency_id = data['form']['currency_id']
314+ rpt_currency = currency_pool.browse(cr, uid, rpt_currency_id, context=ctx)
315+ ctx['cnvt_to_curr'] = rpt_currency_id
316+
317
318 for typ in types:
319 accounts_temp = []
320 for account in accounts:
321 if (account.user_type.report_type) and (account.user_type.report_type == typ):
322 currency = account.currency_id and account.currency_id or account.company_id.currency_id
323- if typ == 'expense' and account.type <> 'view' and (account.debit <> account.credit):
324- self.result_sum_dr += abs(account.debit - account.credit)
325- if typ == 'income' and account.type <> 'view' and (account.debit <> account.credit):
326- self.result_sum_cr += abs(account.debit - account.credit)
327+
328+ # if currency == rpt_currency:
329+ account_debit = account.debit
330+ account_credit = account.credit
331+ account_balance = account.balance
332+
333+ if typ == 'expense' and account.type <> 'view' and (account_debit <> account_credit):
334+ self.result_sum_dr += abs(account_debit - account_credit)
335+ if typ == 'income' and account.type <> 'view' and (account_debit <> account_credit):
336+ self.result_sum_cr += abs(account_debit - account_credit)
337 if data['form']['display_account'] == 'bal_movement':
338- if (not currency_pool.is_zero(self.cr, self.uid, currency, account.credit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account.debit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account.balance)):
339+ if (not currency_pool.is_zero(self.cr, self.uid, currency, account_credit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account_debit)) or (not currency_pool.is_zero(self.cr, self.uid, currency, account_balance)):
340 accounts_temp.append(account)
341 elif data['form']['display_account'] == 'bal_solde':
342- if not currency_pool.is_zero(self.cr, self.uid, currency, account.balance):
343+ if not currency_pool.is_zero(self.cr, self.uid, currency, account_balance):
344 accounts_temp.append(account)
345 else:
346 accounts_temp.append(account)
347@@ -172,16 +224,26 @@
348 self.result_temp.append(temp)
349 return None
350
351- def get_lines(self):
352+ def get_lines(self,data):
353+ if data['form']['export_format'] == 'xls':
354+ for row in self.result_temp:
355+ for key in ('name', 'name1'):
356+ if key not in row:
357+ continue
358+ row[key] = cgi.escape(row[key])
359 return self.result_temp
360+
361+
362
363 def get_lines_another(self, group):
364 return self.result.get(group, [])
365-
366+
367+
368+
369+
370 report_sxw.report_sxw('report.pl.account.horizontal', 'account.account',
371 'addons/account/report/account_profit_horizontal.rml',parser=report_pl_account_horizontal, header='internal landscape')
372
373-report_sxw.report_sxw('report.pl.account', 'account.account',
374- 'addons/account/report/account_profit_loss.rml',parser=report_pl_account_horizontal, header='internal')
375+SpreadsheetReport('report.pl.account_xls','account.account','addons/account/report/profit_loss_xls.mako',parser=report_pl_account_horizontal)
376
377 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
378
379=== modified file 'account/report/account_profit_loss.rml'
380--- account/report/account_profit_loss.rml 2011-06-29 05:29:28 +0000
381+++ account/report/account_profit_loss.rml 2013-11-27 20:02:46 +0000
382@@ -219,7 +219,7 @@
383 </para>
384 </td>
385 <td>
386- <para style="terp_default_Right_9"><font>[[ a.level&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a.balance)) ]] [[ company.currency_id.symbol ]]</font></para>
387+ <para style="terp_default_Right_9"><font>[[ a.level&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a.balance)) ]] [[ currency_id.symbol ]]</font></para>
388 </td>
389 </tr>
390 </blockTable>
391@@ -232,7 +232,7 @@
392 <para style="terp_default_Bold_9">[[ final_result()['type'] == 'Net Profit' and final_result()['type'] or removeParentNode('blockTable') ]]</para>
393 </td>
394 <td>
395- <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and company.currency_id.symbol ]]</para>
396+ <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Profit' and currency_id.symbol ]]</para>
397 </td>
398 </tr>
399 </blockTable>
400@@ -242,7 +242,7 @@
401 <para style="terp_default_Bold_9">Total:</para>
402 </td>
403 <td>
404- <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_dr())) ]] [[ company.currency_id.symbol ]]</u></para>
405+ <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_dr())) ]] [[ currency.symbol ]]</u></para>
406 </td>
407 </tr>
408 </blockTable>
409@@ -274,7 +274,7 @@
410 </para>
411 </td>
412 <td>
413- <para style="terp_default_Right_9"><font>[[ a.level&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a.balance)) ]] [[ company.currency_id.symbol ]]</font></para>
414+ <para style="terp_default_Right_9"><font>[[ a.level&lt;4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]</font><font>[[ formatLang(abs(a.balance)) ]] [[ currency_id.symbol ]]</font></para>
415 </td>
416 </tr>
417 </blockTable>
418@@ -287,7 +287,7 @@
419 <para style="terp_default_Bold_9">[[ final_result()['type'] == 'Net Loss' and final_result()['type'] or removeParentNode('blockTable') ]]</para>
420 </td>
421 <td>
422- <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and company.currency_id.symbol ]]</para>
423+ <para style="terp_default_Right_9_Bold">[[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and formatLang(abs(final_result()['balance'])) ]] [[ final_result()['balance'] and final_result()['type'] == 'Net Loss' and currency_id.symbol ]]</para>
424 </td>
425 </tr>
426 </blockTable>
427@@ -297,7 +297,7 @@
428 <para style="terp_default_Bold_9">Total:</para>
429 </td>
430 <td>
431- <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_cr())) ]] [[ company.currency_id.symbol ]]</u></para>
432+ <para style="terp_default_Right_9_Bold"><u>[[ formatLang(abs(sum_cr())) ]] [[ currency_id.symbol ]]</u></para>
433 </td>
434 </tr>
435 </blockTable>
436
437=== modified file 'account/report/account_profit_loss.sxw'
438Binary files account/report/account_profit_loss.sxw 2011-06-29 05:29:28 +0000 and account/report/account_profit_loss.sxw 2013-11-27 20:02:46 +0000 differ
439=== added file 'account/report/profit_loss_xls.mako'
440--- account/report/profit_loss_xls.mako 1970-01-01 00:00:00 +0000
441+++ account/report/profit_loss_xls.mako 2013-11-27 20:02:46 +0000
442@@ -0,0 +1,347 @@
443+<?xml version="1.0"?>
444+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
445+ xmlns:o="urn:schemas-microsoft-com:office:office"
446+ xmlns:x="urn:schemas-microsoft-com:office:excel"
447+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
448+ xmlns:html="http://www.w3.org/TR/REC-html40">
449+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
450+ <Author>MSFUser</Author>
451+ <LastAuthor>Sean Carroll</LastAuthor>
452+ <Revision>0</Revision>
453+ <TotalTime>0</TotalTime>
454+ <Created>2012-06-18T15:46:09Z</Created>
455+ <Version>14.0</Version>
456+ </DocumentProperties>
457+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
458+ <AllowPNG/>
459+ </OfficeDocumentSettings>
460+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
461+ <WindowHeight>7820</WindowHeight>
462+ <WindowWidth>21540</WindowWidth>
463+ <WindowTopX>0</WindowTopX>
464+ <WindowTopY>0</WindowTopY>
465+ <TabRatio>385</TabRatio>
466+ <ProtectStructure>False</ProtectStructure>
467+ <ProtectWindows>False</ProtectWindows>
468+ </ExcelWorkbook>
469+ <Styles>
470+ <Style ss:ID="Default" ss:Name="Normal">
471+ <Alignment ss:Vertical="Bottom"/>
472+ <Borders/>
473+ <Font x:Family="Swiss"/>
474+ <Interior/>
475+ <NumberFormat/>
476+ <Protection/>
477+ </Style>
478+ <Style ss:ID="s35">
479+ <Alignment ss:Vertical="Bottom"/>
480+ <Font ss:FontName="Lohit Hindi" x:Family="Swiss"/>
481+ <Interior/>
482+ <NumberFormat/>
483+ <Protection ss:Protected="0"/>
484+ </Style>
485+ <Style ss:ID="s36" ss:Parent="s35">
486+ <Borders>
487+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
488+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
489+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
490+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
491+ </Borders>
492+ <Font x:Family="Swiss" ss:Bold="1"/>
493+ </Style>
494+ <Style ss:ID="s37" ss:Parent="s35">
495+ <Borders>
496+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
497+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
498+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
499+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
500+ </Borders>
501+ <Font x:Family="Swiss"/>
502+ </Style>
503+ <Style ss:ID="s38" ss:Parent="s35">
504+ <Font x:Family="Swiss"/>
505+ </Style>
506+ <Style ss:ID="s39" ss:Parent="s35">
507+ <Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1"/>
508+ <Borders>
509+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
510+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
511+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
512+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
513+ </Borders>
514+ <Font x:Family="Swiss"/>
515+ <NumberFormat ss:Format="d\-m\-yy"/>
516+ </Style>
517+ <Style ss:ID="s40" ss:Parent="s35">
518+ <Borders>
519+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
520+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
521+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
522+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
523+ </Borders>
524+ <Font x:Family="Swiss"/>
525+ <NumberFormat ss:Format="Standard"/>
526+ </Style>
527+ <Style ss:ID="s41" ss:Parent="s35">
528+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
529+ <Borders>
530+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
531+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
532+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
533+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
534+ </Borders>
535+ <Font x:Family="Swiss" ss:Color="#FFFFFF" ss:Bold="1"/>
536+ <Interior ss:Color="#DD0806" ss:Pattern="Solid"/>
537+ </Style>
538+ <Style ss:ID="s42" ss:Parent="s35">
539+ <Alignment ss:Vertical="Center" ss:WrapText="1"/>
540+ <Borders>
541+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
542+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
543+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
544+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
545+ </Borders>
546+ <Font x:Family="Swiss" ss:Color="#FFFFFF" ss:Bold="1"/>
547+ <Interior ss:Color="#DD0806" ss:Pattern="Solid"/>
548+ </Style>
549+ <Style ss:ID="s44" ss:Parent="s35">
550+ <Borders>
551+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
552+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
553+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
554+ </Borders>
555+ <Font x:Family="Swiss"/>
556+ <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
557+ </Style>
558+ <Style ss:ID="s45" ss:Parent="s35">
559+ <Borders>
560+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
561+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
562+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
563+ </Borders>
564+ <Font x:Family="Swiss"/>
565+ </Style>
566+ <Style ss:ID="s46" ss:Parent="s35">
567+ <Borders>
568+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
569+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
570+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
571+ </Borders>
572+ <Font x:Family="Swiss"/>
573+ <NumberFormat ss:Format="Standard"/>
574+ </Style>
575+ <Style ss:ID="s47" ss:Parent="s35">
576+ <Borders>
577+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
578+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
579+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
580+ </Borders>
581+ <Font x:Family="Swiss"/>
582+ <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
583+ <NumberFormat ss:Format="Standard"/>
584+ </Style>
585+ <Style ss:ID="s48" ss:Parent="s35">
586+ <Borders>
587+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
588+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
589+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
590+ </Borders>
591+ <Font x:Family="Swiss"/>
592+ <NumberFormat ss:Format="0.0\%"/>
593+ </Style>
594+ <Style ss:ID="s91">
595+ <Font x:Family="Swiss" ss:Bold="1"/>
596+ </Style>
597+ <Style ss:ID="s92">
598+ <Borders>
599+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
600+ </Borders>
601+ </Style>
602+ <Style ss:ID="s93">
603+ <Borders>
604+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
605+ </Borders>
606+ <Font x:Family="Swiss" ss:Bold="1"/>
607+ </Style>
608+ </Styles>
609+ <Worksheet ss:Name="Profit and Loss">
610+ <Table ss:ExpandedColumnCount="7" x:FullColumns="1"
611+ x:FullRows="1" ss:DefaultColumnWidth="53" ss:DefaultRowHeight="12">
612+ <Column ss:Width="99"/>
613+ <Column ss:Width="70"/>
614+ <Column ss:Width="57"/>
615+ <Column ss:Width="59"/>
616+ <Column ss:Width="60"/>
617+ <Column ss:AutoFitWidth="0" ss:Width="101"/>
618+ <Row ss:Height="13">
619+ <Cell ss:StyleID="s36"><Data ss:Type="String">PROFIT AND LOSS</Data></Cell>
620+ <Cell ss:StyleID="s37"/>
621+ <Cell ss:StyleID="s38"/>
622+ <Cell ss:StyleID="s38"/>
623+ <Cell ss:StyleID="s38"/>
624+ <Cell ss:StyleID="s38"/>
625+ <Cell ss:StyleID="s38"/>
626+ </Row>
627+ <Row ss:Height="13">
628+ <Cell ss:StyleID="s45"><Data ss:Type="String">Report date:</Data></Cell>
629+ <Cell ss:StyleID="s45"><Data ss:Type="String">${time.strftime('%Y-%m-%d')|n}</Data></Cell>
630+ <Cell ss:StyleID="s38"/>
631+ <Cell ss:StyleID="s38"/>
632+ <Cell ss:StyleID="s38"/>
633+ <Cell ss:StyleID="s38"/>
634+ <Cell ss:StyleID="s38"/>
635+ </Row>
636+ <Row ss:Index="4" ss:Height="13">
637+ <Cell ss:StyleID="s45"><Data ss:Type="String">Chart of Accounts:</Data></Cell>
638+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_account(data)}</Data></Cell>
639+ <Cell ss:StyleID="s38"/>
640+ <Cell ss:StyleID="s38"/>
641+ <Cell ss:StyleID="s38"/>
642+ <Cell ss:StyleID="s38"/>
643+ <Cell ss:StyleID="s38"/>
644+ </Row>
645+ <Row ss:Height="13">
646+ <Cell ss:StyleID="s45"><Data ss:Type="String">Currency:</Data></Cell>
647+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_currency(data).name}</Data></Cell>
648+ <Cell ss:StyleID="s38"/>
649+ <Cell ss:StyleID="s38"/>
650+ <Cell ss:StyleID="s38"/>
651+ <Cell ss:StyleID="s38"/>
652+ <Cell ss:StyleID="s38"/>
653+ </Row>
654+ <Row ss:Height="13">
655+ <Cell ss:StyleID="s45"><Data ss:Type="String">Fiscal Year:</Data></Cell>
656+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_fiscalyear(data) or ''}</Data></Cell>
657+ <Cell ss:StyleID="s38"/>
658+ <Cell ss:StyleID="s38"/>
659+ <Cell ss:StyleID="s38"/>
660+ <Cell ss:StyleID="s38"/>
661+ <Cell ss:StyleID="s38"/>
662+ </Row>
663+ <Row ss:Height="13">
664+ <Cell ss:StyleID="s45"><Data ss:Type="String">Filter</Data></Cell>
665+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_filter(data) or 'No Filter'}</Data></Cell>
666+ <Cell ss:StyleID="s38"/>
667+ <Cell ss:StyleID="s38"/>
668+ <Cell ss:StyleID="s38"/>
669+ <Cell ss:StyleID="s38"/>
670+ <Cell ss:StyleID="s38"/>
671+ </Row>
672+ <Row ss:Height="13">
673+ <Cell ss:StyleID="s45"><Data ss:Type="String">Display Account:</Data></Cell>
674+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_display_account(data)}</Data></Cell>
675+ <Cell ss:StyleID="s38"/>
676+ <Cell ss:StyleID="s38"/>
677+ <Cell ss:StyleID="s38"/>
678+ <Cell ss:StyleID="s38"/>
679+ <Cell ss:StyleID="s38"/>
680+ </Row>
681+ <Row ss:Height="13">
682+ <Cell ss:StyleID="s45"><Data ss:Type="String">Target:</Data></Cell>
683+ <Cell ss:StyleID="s45"><Data ss:Type="String">${get_target_move(data) or ''}</Data></Cell>
684+ <Cell ss:StyleID="s38"/>
685+ <Cell ss:StyleID="s38"/>
686+ <Cell ss:StyleID="s38"/>
687+ <Cell ss:StyleID="s38"/>
688+ <Cell ss:StyleID="s38"/>
689+ </Row>
690+ <Row ss:AutoFitHeight="0" ss:Height="13">
691+ <Cell ss:StyleID="s45"><Data ss:Type="String"></Data></Cell>
692+ <Cell ss:StyleID="s38"/>
693+ <Cell ss:StyleID="s38"/>
694+ <Cell ss:StyleID="s38"/>
695+ <Cell ss:StyleID="s38"/>
696+ <Cell ss:StyleID="s38"/>
697+ <Cell ss:StyleID="s38"/>
698+ </Row>
699+ <Row ss:AutoFitHeight="0" ss:Height="27">
700+ <Cell ss:StyleID="s41"><Data ss:Type="String">Code</Data></Cell>
701+ <Cell ss:StyleID="s42"><Data ss:Type="String">Particular</Data></Cell>
702+ <Cell ss:StyleID="s42"><Data ss:Type="String">Balance</Data></Cell>
703+ <Cell ss:StyleID="s41"><Data ss:Type="String">Code</Data></Cell>
704+ <Cell ss:StyleID="s42"><Data ss:Type="String">Particular</Data></Cell>
705+ <Cell ss:StyleID="s42"><Data ss:Type="String">Balance</Data></Cell>
706+ <Cell ss:StyleID="s38"/>
707+ </Row>
708+
709+<%
710+get_data(data)
711+rows = get_lines(data)
712+fin = final_result()
713+%>
714+% for row in rows:
715+ <Row ss:Height="14">
716+ <Cell ss:StyleID="s45"><Data ss:Type="String">${row['code'] or ''}</Data></Cell>
717+ <Cell ss:StyleID="s45"><Data ss:Type="String">${row['name'] or ''}</Data></Cell>
718+ <Cell ss:StyleID="s46"><Data ss:Type="String">${row['balance'] or ''}</Data></Cell>
719+ <Cell ss:StyleID="s45"><Data ss:Type="String">${row['code1'] or ''}</Data></Cell>
720+ <Cell ss:StyleID="s45"><Data ss:Type="String">${row['name1'] or ''}</Data></Cell>
721+ <Cell ss:StyleID="s46"><Data ss:Type="String">${row['balance1'] or ''}</Data></Cell>
722+</Row>
723+% endfor
724+
725+ <Row>
726+ <Cell ss:Index="2" ss:StyleID="s91"/>
727+ <Cell ss:StyleID="s91"/>
728+ <Cell ss:StyleID="s91"/>
729+ <Cell ss:StyleID="s91"/>
730+ <Cell ss:StyleID="s91"/>
731+ </Row>
732+
733+ <Row ss:Height="14">
734+ <Cell ss:StyleID="s45"><Data ss:Type="String"></Data></Cell>
735+ <Cell ss:StyleID="s45"><Data ss:Type="String">${fin['type'] if fin['type'] == 'Net Profit' else ''}</Data></Cell>
736+ <Cell ss:StyleID="s46"><Data ss:Type="String">${fin['balance'] if fin['type'] == 'Net Profit' else ''}</Data></Cell>
737+ <Cell ss:StyleID="s45"><Data ss:Type="String"></Data></Cell>
738+ <Cell ss:StyleID="s45"><Data ss:Type="String">${fin['type'] if fin['type'] == 'Net Loss' else ''}</Data></Cell>
739+ <Cell ss:StyleID="s46"><Data ss:Type="String">${fin['balance'] if fin['type'] == 'Net Loss' else ''}</Data></Cell>
740+</Row>
741+
742+ <Row>
743+ <Cell ss:Index="2" ss:StyleID="s91"/>
744+ <Cell ss:StyleID="s91"/>
745+ <Cell ss:StyleID="s91"/>
746+ <Cell ss:StyleID="s91"/>
747+ <Cell ss:StyleID="s91"/>
748+ </Row>
749+ <Row>
750+ <Cell ss:StyleID="s92"/>
751+ <Cell ss:StyleID="s93"><Data ss:Type="String">Total</Data></Cell>
752+ <Cell ss:StyleID="s93"><Data ss:Type="String">${currency_sum_dr(data)}</Data></Cell>
753+ <Cell ss:StyleID="s93"/>
754+ <Cell ss:StyleID="s93"><Data ss:Type="String">Total</Data></Cell>
755+ <Cell ss:StyleID="s93"><Data ss:Type="String">${currency_sum_cr(data)}</Data></Cell>
756+ </Row>
757+ </Table>
758+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
759+ <PageSetup>
760+ <Layout x:StartPageNumber="1"/>
761+ <Header x:Margin="0.78749999999999998"
762+ x:Data="&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12&amp;A"/>
763+ <Footer x:Margin="0.78749999999999998"
764+ x:Data="&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12Page &amp;P"/>
765+ <PageMargins x:Bottom="1.05277777777778" x:Left="0.78749999999999998"
766+ x:Right="0.78749999999999998" x:Top="1.05277777777778"/>
767+ </PageSetup>
768+ <Print>
769+ <ValidPrinterInfo/>
770+ <PaperSizeIndex>9</PaperSizeIndex>
771+ <HorizontalResolution>-4</HorizontalResolution>
772+ <VerticalResolution>-4</VerticalResolution>
773+ </Print>
774+ <Zoom>125</Zoom>
775+ <PageLayoutZoom>125</PageLayoutZoom>
776+ <Selected/>
777+ <Panes>
778+ <Pane>
779+ <Number>3</Number>
780+ <ActiveRow>18</ActiveRow>
781+ <ActiveCol>9</ActiveCol>
782+ <RangeSelection>R18C10:R19C10</RangeSelection>
783+ </Pane>
784+ </Panes>
785+ <ProtectObjects>False</ProtectObjects>
786+ <ProtectScenarios>False</ProtectScenarios>
787+ </WorksheetOptions>
788+ </Worksheet>
789+</Workbook>
790
791=== modified file 'account/wizard/account_report_profit_loss.py'
792--- account/wizard/account_report_profit_loss.py 2011-01-14 00:11:01 +0000
793+++ account/wizard/account_report_profit_loss.py 2013-11-27 20:02:46 +0000
794@@ -20,6 +20,9 @@
795 ##############################################################################
796
797 from osv import osv, fields
798+import pooler
799+import time
800+
801
802 class account_pl_report(osv.osv_memory):
803 """
804@@ -30,31 +33,41 @@
805 _description = "Account Profit And Loss Report"
806 _columns = {
807 'display_type': fields.boolean("Landscape Mode"),
808+ 'currency_id': fields.many2one('res.currency', required=True, readonly=False, string='Currency'),
809+ 'export_format': fields.selection([('xls', 'Excel'), ('pdf', 'PDF')], string="Export format", required=True),
810 }
811
812 _defaults = {
813 'display_type': True,
814 'journal_ids': [],
815- 'target_move': False
816+ 'target_move': False,
817+ 'export_format': lambda *a: 'pdf',
818+ 'currency_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.currency_id.id,
819 }
820+
821+
822
823 def _print_report(self, cr, uid, ids, data, context=None):
824 if context is None:
825 context = {}
826 data = self.pre_print_report(cr, uid, ids, data, context=context)
827- data['form'].update(self.read(cr, uid, ids, ['display_type'])[0])
828- if data['form']['display_type']:
829+ #data = {'code': 'code1', 'particular': 'particular1', 'bal': 'bal1'}
830+
831+
832+ data['form'].update(self.read(cr, uid, ids, ['display_type', 'currency_id','export_format'])[0])
833+ if data['form']['export_format'] == 'pdf':
834 return {
835 'type': 'ir.actions.report.xml',
836 'report_name': 'pl.account.horizontal',
837 'datas': data,
838 }
839- else:
840+ if data['form']['export_format'] == 'xls':
841 return {
842- 'type': 'ir.actions.report.xml',
843- 'report_name': 'pl.account',
844+ 'type': 'ir.actions.report.xml',
845+ 'report_name': 'pl.account_xls',
846 'datas': data,
847 }
848+
849
850 account_pl_report()
851
852
853=== modified file 'account/wizard/account_report_profit_loss_view.xml'
854--- account/wizard/account_report_profit_loss_view.xml 2011-01-14 00:11:01 +0000
855+++ account/wizard/account_report_profit_loss_view.xml 2013-11-27 20:02:46 +0000
856@@ -22,6 +22,8 @@
857 <xpath expr="//field[@name='fiscalyear_id']" position="after">
858 <field name="display_account"/>
859 <field name="display_type"/>
860+ <field name="export_format"/>
861+ <field name="currency_id"/>
862 </xpath>
863 </data>
864 </field>
865@@ -36,6 +38,9 @@
866 <field name="view_id" ref="account_pl_report_view"/>
867 <field name="target">new</field>
868 </record>
869+
870+
871+
872
873 <menuitem
874 parent="account.menu_finance_legal_statement"

Subscribers

People subscribed via source and target branches

to all changes: