diff --git a/controllers/main.py b/controllers/main.py index aa11c014270c5025a21e1e2fd4d3e3644cbdaa67..f3b4ab07bfb2f34d07e4cdfc7717447c957cf2e7 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -4,7 +4,7 @@ import csv from datetime import date, datetime from io import BytesIO, StringIO - +from odoo.addons.lefilament_export_journal_tool.controllers.main import JournalDatasExport from odoo import http from odoo.http import request from odoo.tools.misc import xlwt @@ -13,7 +13,7 @@ from odoo.tools.safe_eval import safe_eval from odoo.addons.web.controllers.main import content_disposition, serialize_exception -class JournalDatasExport(http.Controller): +class JournalDatasExport(JournalDatasExport): # ------------------------------------------------------ # Routes # ------------------------------------------------------ @@ -46,38 +46,44 @@ class JournalDatasExport(http.Controller): domain += safe_eval(export_id.export_domain) export_line_ids = request.env["account.move.line"].search(domain) # FIXME: Crappy could refactor to [[]] or {} to group by invoice name as key - export_line_grouped_by_invoice = export_line_ids.sorted(lambda l: l.move_id.name) + export_line_grouped_by_invoice = {} + for el in export_line_ids: + if not export_line_grouped_by_invoice.get(el.move_id.name): + export_line_grouped_by_invoice[el.move_id.name] = [] + export_line_grouped_by_invoice[el.move_id.name].append(el) + # export_line_grouped_by_invoice = export_line_ids.sorted(lambda l: l.move_id.name) lines_to_export = [] initial_sum_line = ['' for _ in range(len(export_id.fields_ids))] sum_line = initial_sum_line[:] big_sum_line = None - previous_invoice_name = export_line_grouped_by_invoice[0].move_id.name - for line in export_line_grouped_by_invoice: - if line.name != previous_invoice_name: - lines_to_export.append(sum_line) - if not big_sum_line: - # Initialise bigsum to the same size and value of the sum_line - # So it has not to be initialized with list of empty string - big_sum_line = sum_line[:] - else: - big_sum_line = [value + sum_line[i] for i,value in enumerate(big_sum_line)] - sum_line = initial_sum_line[:] - row = [] - for key,field in enumerate(export_id.fields_ids): - if field.is_python: - value = safe_eval(field["field_name"], {"line": line}, mode="eval") - if field.is_sum and value: - if sum_line[key] == '': - sum_line[key] = 0 - sum_line[key] += float(value) - else: - value = safe_eval(field["field_name"]) - row.append(value) - lines_to_export.append(row) - line.write({"date_export": datetime.now()}) - previous_invoice_name = line.name - lines_to_export.append(sum_line) - lines_to_export.append([value + sum_line[i] for i,value in enumerate(big_sum_line)]) + + for invoice_name, move_lines in export_line_grouped_by_invoice.items(): + for line in move_lines: + row = [] + for key,field in enumerate(export_id.fields_ids): + if field.is_python: + value = safe_eval(field["field_name"], {"line": line}, mode="eval") + if field.is_sum and value: + if sum_line[key] == '': + sum_line[key] = 0 + sum_line[key] += float(value) + else: + value = safe_eval(field["field_name"]) + row.append(value) + lines_to_export.append(row) + line.write({"date_export": datetime.now()}) + lines_to_export.append(sum_line) + if not big_sum_line: + # Initialise bigsum to the same size and value of the sum_line + # So it has not to be initialized with list of empty string + big_sum_line = sum_line[:] + else: + big_sum_line = [value + sum_line[i] for i, value in + enumerate(big_sum_line)] + sum_line = initial_sum_line[:] + else: + # lines_to_export.append(sum_line) + lines_to_export.append(big_sum_line) filename_ = ( export_id.company_id.name.title().replace(" ", "") @@ -94,65 +100,3 @@ class JournalDatasExport(http.Controller): # ------------------------------------------------------ # Common function # ------------------------------------------------------ - def export_csv(self, export_id, lines_to_export, filename_): - fp = StringIO() - export_file = csv.writer( - fp, delimiter=export_id.delimiter, quoting=csv.QUOTE_ALL - ) - # Add header line - if export_id.is_header: - row = [] - for head in export_id.fields_ids.mapped("name"): - row.append(head) - export_file.writerow(row) - - for line in lines_to_export: - # Format date value - line_values = [ - value - if not isinstance(value, date) - else value.strftime(export_id.csv_datestyle) - for value in line - ] - export_file.writerow(line_values) - - fp.seek(0) - data = fp.read() - fp.close() - - filename = filename_ + ".csv" - csvhttpheaders = [ - ("Content-Type", "text/csv;charset=utf8"), - ("Content-Disposition", content_disposition(filename)), - ] - return request.make_response(data, headers=csvhttpheaders) - - def export_xls(self, export_id, lines_to_export, filename_): - workbook = xlwt.Workbook() - worksheet = workbook.add_sheet(filename_) - base_style = xlwt.easyxf("align: wrap yes") - date_style = xlwt.XFStyle() - date_style.num_format_str = export_id.xls_datestyle - - if export_id.is_header: - for i, fieldname in enumerate(export_id.fields_ids.mapped("name")): - worksheet.write(0, i, fieldname) - worksheet.col(i).width = 4000 # around 220 pixels - - for row_index, line in enumerate(lines_to_export): - for cell_index, value in enumerate(line): - cell_style = base_style - if isinstance(value, date): - cell_style = date_style - worksheet.write(row_index + 1, cell_index, value, cell_style) - fp = BytesIO() - workbook.save(fp) - fp.seek(0) - data = fp.read() - fp.close() - filename = filename_ + ".xls" - xlshttpheaders = [ - ("Content-Type", "text/csv;charset=utf8"), - ("Content-Disposition", content_disposition(filename)), - ] - return request.make_response(data, headers=xlshttpheaders) diff --git a/datas/export_intercom_datas.xml b/datas/export_intercom_datas.xml index 27f08d45d951cffba94baf180f5f3095c63f5087..547e3987cbbaacd73df612f24f1616730251d544 100644 --- a/datas/export_intercom_datas.xml +++ b/datas/export_intercom_datas.xml @@ -76,7 +76,7 @@ <record id="intercom_vt_7" model="export.journal.field"> <field name="name">Description du produit</field> <field name="sequence">7</field> - <field name="field_name">''</field> + <field name="field_name">line.product_id.name</field> <field name="export_id" ref="emgidi_export_intercom.emgidi_export_intercom_journal" @@ -95,6 +95,7 @@ <field name="name">Quantité</field> <field name="sequence">9</field> <field name="field_name">line.quantity</field> + <field name="is_sum">True</field> <field name="export_id" ref="emgidi_export_intercom.emgidi_export_intercom_journal" @@ -112,7 +113,7 @@ <record id="intercom_vt_11" model="export.journal.field"> <field name="name">Montant Hors-taxe Signé</field> <field name="sequence">11</field> - <field name="field_name">line.price_subtotal</field> + <field name="field_name">-line.price_subtotal</field> <field name="is_sum">True</field> <field name="export_id" @@ -122,7 +123,7 @@ <record id="intercom_vt_12" model="export.journal.field"> <field name="name">Total signé</field> <field name="sequence">12</field> - <field name="field_name">''</field> + <field name="field_name">-line.balance</field> <field name="is_sum">True</field> <field name="export_id" @@ -130,9 +131,9 @@ /> </record> <record id="intercom_vt_13" model="export.journal.field"> - <field name="name">Total signé en devises</field> + <field name="name">Signé en devises</field> <field name="sequence">13</field> - <field name="field_name">''</field> + <field name="field_name">-line.amount_currency</field> <field name="is_sum">True</field> <field name="export_id" @@ -151,7 +152,9 @@ <record id="intercom_vt_15" model="export.journal.field"> <field name="name">Pays de destination</field> <field name="sequence">15</field> - <field name="field_name">line.move_id.partner_shipping_id.country_id.display_name</field> + <field name="field_name"> + line.move_id.partner_shipping_id.country_id.display_name + </field> <field name="export_id" ref="emgidi_export_intercom.emgidi_export_intercom_journal" @@ -178,7 +181,8 @@ <record id="intercom_vt_18" model="export.journal.field"> <field name="name">Département d'expédition</field> <field name="sequence">18</field> - <field name="field_name">''</field> + <field name="field_name">31</field> + <field name="is_python" eval="False"/> <field name="export_id" ref="emgidi_export_intercom.emgidi_export_intercom_journal"