diff --git a/account_export_csv/README.rst b/account_export_csv/README.rst new file mode 100644 index 00000000..e4d132ac --- /dev/null +++ b/account_export_csv/README.rst @@ -0,0 +1,82 @@ +================== +Account Export CSV +================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github + :target: https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv + :alt: OCA/account-financial-reporting +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_export_csv + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/91/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + + +Add a wizard that allow you to export a csv file based on accounting +journal entries + +- Trial Balance +- Analytic Balance (with accounts) +- Journal Entries + +You can filter by date range + +**Table of contents** + +.. contents:: + :local: + +Known issues / Roadmap +====================== + + +* rearange wizard view with only one button to generate file plus define a selection list to select report type + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/account-financial-reporting `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_export_csv/__init__.py b/account_export_csv/__init__.py new file mode 100644 index 00000000..40272379 --- /dev/null +++ b/account_export_csv/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/account_export_csv/__manifest__.py b/account_export_csv/__manifest__.py new file mode 100644 index 00000000..a461243c --- /dev/null +++ b/account_export_csv/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2013 Camptocamp SA +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Account Export CSV', + 'summary': "Adds accounting CSV export", + 'version': '12.0.1.1.0', + 'depends': [ + 'account', + 'date_range', + ], + 'author': "Camptocamp,Odoo Community Association (OCA)", + 'website': 'http://www.camptocamp.com', + 'license': 'AGPL-3', + 'data': [ + 'wizard/account_export_csv_view.xml', + ], + 'installable': True, +} diff --git a/account_export_csv/i18n/account_export_csv.po b/account_export_csv/i18n/account_export_csv.po new file mode 100644 index 00000000..790827a5 --- /dev/null +++ b/account_export_csv/i18n/account_export_csv.po @@ -0,0 +1,111 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_export_csv +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-10 15:11+0000\n" +"PO-Revision-Date: 2013-04-10 15:11+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_export_csv +#: model:ir.model,name:account_export_csv.model_account_csv_export +msgid "Export Accounting" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,export_filename:0 +msgid "Export CSV Filename" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Trial Balance" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Analytic Balance (with accounts)" +msgstr "" + +#. module: account_export_csv +#: help:account.csv.export,periods:0 +msgid "All periods in the fiscal year if empty" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,periods:0 +msgid "Periods" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Close" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export +#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export +msgid "Accounting CSV Export" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,data:0 +msgid "CSV" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,fiscalyear_id:0 +msgid "Fiscalyear" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Analytic Balance (with accounts)" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,stop_period_id:0 +msgid "End period" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Close" +msgstr "" + +#. module: account_export_csv +#: view:account.csv.export:0 +#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export +#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export +msgid "Accounting CSV Export" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,data:0 +msgid "CSV" +msgstr "" + +#. module: account_export_csv +#: model:ir.model,name:account_export_csv.model_account_csv_export +msgid "Export Accounting Entries" +msgstr "" + +#. module: account_export_csv +#: field:account.csv.export,fiscalyear_id:0 +msgid "Fiscalyear" +msgstr "" + diff --git a/account_export_csv/i18n/fr.po b/account_export_csv/i18n/fr.po new file mode 100644 index 00000000..c6aaa766 --- /dev/null +++ b/account_export_csv/i18n/fr.po @@ -0,0 +1,74 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_export_csv +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-10 15:11+0000\n" +"PO-Revision-Date: 2013-04-10 15:11+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_export_csv +#: model:ir.model,name:account_export_csv.model_account_csv_export +msgid "Export Accounting" +msgstr "Export comptable" + +#. module: account_export_csv +#: field:account.csv.export,export_filename:0 +msgid "Export CSV Filename" +msgstr "Nom du fichier CSV d'export" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Trial Balance" +msgstr "Balance générale" + +#. module: account_export_csv +#: field:account.csv.export,company_id:0 +msgid "Company" +msgstr "Société" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Analytic Balance (with accounts)" +msgstr "Balance analytique (avec comptes)" + +#. module: account_export_csv +#: help:account.csv.export,periods:0 +msgid "All periods in the fiscal year if empty" +msgstr "Toutes les périodes de l'année fiscale si vide" + +#. module: account_export_csv +#: field:account.csv.export,periods:0 +msgid "Periods" +msgstr "Périodes" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Close" +msgstr "Fermer" + +#. module: account_export_csv +#: view:account.csv.export:0 +#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export +#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export +msgid "Accounting CSV Export" +msgstr "Export comptable CSV" + +#. module: account_export_csv +#: field:account.csv.export,data:0 +msgid "CSV" +msgstr "CSV" + +#. module: account_export_csv +#: field:account.csv.export,fiscalyear_id:0 +msgid "Fiscalyear" +msgstr "Année fiscale" + diff --git a/account_export_csv/i18n/nl.po b/account_export_csv/i18n/nl.po new file mode 100644 index 00000000..b1f95346 --- /dev/null +++ b/account_export_csv/i18n/nl.po @@ -0,0 +1,74 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_export_csv +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-08-22 12:52+0000\n" +"PO-Revision-Date: 2013-08-22 12:52+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_export_csv +#: model:ir.model,name:account_export_csv.model_account_csv_export +msgid "Export Accounting" +msgstr "Export Financiën" + +#. module: account_export_csv +#: field:account.csv.export,export_filename:0 +msgid "Export CSV Filename" +msgstr "Export CSV bestandsnaam" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Trial Balance" +msgstr "Proefbalans" + +#. module: account_export_csv +#: field:account.csv.export,company_id:0 +msgid "Company" +msgstr "Bedrijf" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Analytic Balance (with accounts)" +msgstr "Kostenplaatsenbalans (met rekeningen)" + +#. module: account_export_csv +#: help:account.csv.export,periods:0 +msgid "All periods in the fiscal year if empty" +msgstr "Alle periodes van het boekjaar indien leeg" + +#. module: account_export_csv +#: field:account.csv.export,periods:0 +msgid "Periods" +msgstr "Periodes" + +#. module: account_export_csv +#: view:account.csv.export:0 +msgid "Close" +msgstr "Sluiten" + +#. module: account_export_csv +#: view:account.csv.export:0 +#: model:ir.actions.act_window,name:account_export_csv.action_account_csv_export +#: model:ir.ui.menu,name:account_export_csv.menu_account_csv_export +msgid "Accounting CSV Export" +msgstr "CSV export financiën" + +#. module: account_export_csv +#: field:account.csv.export,data:0 +msgid "CSV" +msgstr "CSV" + +#. module: account_export_csv +#: field:account.csv.export,fiscalyear_id:0 +msgid "Fiscalyear" +msgstr "Boekjaar" + diff --git a/account_export_csv/readme/CONTRBUTORS.rst b/account_export_csv/readme/CONTRBUTORS.rst new file mode 100644 index 00000000..5f39c61f --- /dev/null +++ b/account_export_csv/readme/CONTRBUTORS.rst @@ -0,0 +1,16 @@ +* Camptocamp + + * Yannick Vaucher + * Alexandre Fayolle + * Vincent Renaville + * Guewen Baconnier + +* Acsone + + * Stéphane Bidoul + * Laetitia Gangloff + * Adrien Peiffer + +* Akretion + + * David Béal diff --git a/account_export_csv/readme/DESCRIPTION.rst b/account_export_csv/readme/DESCRIPTION.rst new file mode 100644 index 00000000..2f682d54 --- /dev/null +++ b/account_export_csv/readme/DESCRIPTION.rst @@ -0,0 +1,9 @@ + +Add a wizard that allow you to export a csv file based on accounting +journal entries + +- Trial Balance +- Analytic Balance (with accounts) +- Journal Entries + +You can filter by date range diff --git a/account_export_csv/readme/ROADMAP.rst b/account_export_csv/readme/ROADMAP.rst new file mode 100644 index 00000000..b5b9cf59 --- /dev/null +++ b/account_export_csv/readme/ROADMAP.rst @@ -0,0 +1,2 @@ + +* rearange wizard view with only one button to generate file plus define a selection list to select report type diff --git a/account_export_csv/static/description/index.html b/account_export_csv/static/description/index.html new file mode 100644 index 00000000..9a7f5f99 --- /dev/null +++ b/account_export_csv/static/description/index.html @@ -0,0 +1,426 @@ + + + + + + +Account Export CSV + + + +
+

Account Export CSV

+ + +

Beta License: AGPL-3 OCA/account-financial-reporting Translate me on Weblate Try me on Runbot

+

Add a wizard that allow you to export a csv file based on accounting +journal entries

+
    +
  • Trial Balance
  • +
  • Analytic Balance (with accounts)
  • +
  • Journal Entries
  • +
+

You can filter by date range

+

Table of contents

+ +
+

Known issues / Roadmap

+
    +
  • rearange wizard view with only one button to generate file plus define a selection list to select report type
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/account-financial-reporting project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_export_csv/tests/__init__.py b/account_export_csv/tests/__init__.py new file mode 100644 index 00000000..d94ad021 --- /dev/null +++ b/account_export_csv/tests/__init__.py @@ -0,0 +1 @@ +from . import test_account_export_csv diff --git a/account_export_csv/tests/test_account_export_csv.py b/account_export_csv/tests/test_account_export_csv.py new file mode 100644 index 00000000..92ed402b --- /dev/null +++ b/account_export_csv/tests/test_account_export_csv.py @@ -0,0 +1,40 @@ +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date +from dateutil import relativedelta + +from odoo.tests.common import TransactionCase +from odoo import fields + + +class TestAccountExportCsv(TransactionCase): + + def setUp(self): + super(TestAccountExportCsv, self).setUp() + self.report_wizard = self.env['account.csv.export'] + today_dt = date.today() + next_month_date = today_dt + relativedelta.relativedelta(months=1) + self.report_date_start = fields.Date.to_string(today_dt) + self.report_date_end = fields.Date.to_string(next_month_date) + + def test_1(self): + report_wizard = self.report_wizard.create({ + 'date_start': self.report_date_start, + 'date_end': self.report_date_end + }) + report_wizard.action_manual_export_account() + + def test_2(self): + report_wizard = self.report_wizard.create({ + 'date_start': self.report_date_start, + 'date_end': self.report_date_end + }) + report_wizard.action_manual_export_analytic() + + def test_3(self): + report_wizard = self.report_wizard.create({ + 'date_start': self.report_date_start, + 'date_end': self.report_date_end + }) + report_wizard.action_manual_export_journal_entries() diff --git a/account_export_csv/wizard/__init__.py b/account_export_csv/wizard/__init__.py new file mode 100644 index 00000000..2c9e63ab --- /dev/null +++ b/account_export_csv/wizard/__init__.py @@ -0,0 +1 @@ +from . import account_export_csv diff --git a/account_export_csv/wizard/account_export_csv.py b/account_export_csv/wizard/account_export_csv.py new file mode 100644 index 00000000..bab4118e --- /dev/null +++ b/account_export_csv/wizard/account_export_csv.py @@ -0,0 +1,352 @@ +# Copyright 2013 Camptocamp SA +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import itertools +import tempfile +from io import StringIO, BytesIO +import base64 + +import csv +import codecs + +from odoo import api, fields, models, _ + + +class AccountingWriter(object): + + """ + A CSV writer which will write rows to CSV file "f", + which is encoded in the given encoding. + """ + + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + # Redirect output to a queue + self.queue = StringIO() + # created a writer with Excel formating settings + self.writer = csv.writer(self.queue, dialect=dialect, **kwds) + self.stream = f + self.encoder = codecs.getincrementalencoder(encoding)() + + def writerow(self, row): + # we ensure that we do not try to encode none or bool + row = (x or '' for x in row) + self.writer.writerow(row) + # Fetch UTF-8 output from the queue ... + data = self.queue.getvalue() + # ... and reencode it into the target encoding as BytesIO + data = self.encoder.encode(data) + # write to the target stream + self.stream.write(data) + # seek() or truncate() have side effect then we reinitialize StringIO + # https://stackoverflow.com/questions/4330812/how-do-i-clear-a-stringio-object + self.queue = StringIO() + + def writerows(self, rows): + for row in rows: + self.writerow(row) + # https://docs.python.org/3/library/io.html#io.IOBase.close + self.queue.close() + + +class AccountCSVExport(models.TransientModel): + _name = 'account.csv.export' + _description = 'Export Accounting' + + data = fields.Binary('CSV', readonly=True) + company_id = fields.Many2one( + comodel_name='res.company', string='Company', invisible=True, + default=lambda self: self._get_company_default()) + date_start = fields.Date(required=True) + date_end = fields.Date(required=True) + date_range_id = fields.Many2one( + comodel_name='date.range', string='Date range') + journal_ids = fields.Many2many( + comodel_name='account.journal', string='Journals', + default=lambda s: s._get_journal_default(), + help='If empty, use all journals, only used for journal entries') + export_filename = fields.Char( + string='Export CSV Filename', size=128, default='account_export.csv') + + @api.model + def _get_journal_default(self): + """ Implements your own default """ + return False + + @api.model + def _get_company_default(self): + return self.env.user.company_id + + @api.onchange('date_range_id') + def _onchange_date_range(self): + if self.date_range_id: + self.date_start = self.date_range_id.date_start + self.date_end = self.date_range_id.date_end + + @api.onchange('date_start', 'date_end') + def _onchange_dates(self): + if self.date_range_id: + if self.date_start != self.date_range_id.date_start or \ + self.date_end != self.date_range_id.date_end: + self.date_range_id = False + + def action_manual_export_account(self): + self.ensure_one() + rows = self._get_data("account") + file_data = BytesIO() + try: + writer = AccountingWriter(file_data) + writer.writerows(rows) + file_value = file_data.getvalue() + self.write({'data': base64.encodestring(file_value)}) + finally: + file_data.close() + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.csv.export', + 'view_mode': 'form', + 'res_id': self.id, + 'views': [(False, 'form')], + 'target': 'new', + } + + def _get_header_account(self): + return [ + _('CODE'), + _('NAME'), + _('DEBIT'), + _('CREDIT'), + _('BALANCE'), + ] + + def _get_rows_account(self, journal_ids): + """ + Return list to generate rows of the CSV file + """ + self.ensure_one() + self.env.cr.execute(""" + select ac.code,ac.name, + sum(debit) as sum_debit, + sum(credit) as sum_credit, + sum(debit) - sum(credit) as balance + from account_move_line as aml,account_account as ac + where aml.account_id = ac.id + AND aml.date >= %(date_start)s + AND aml.date <= %(date_end)s + group by ac.id,ac.code,ac.name + order by ac.code + """, {'date_start': self.date_start, + 'date_end': self.date_end}) + res = self.env.cr.fetchall() + + rows = [] + for line in res: + rows.append(list(line)) + return rows + + def action_manual_export_analytic(self): + self.ensure_one() + rows = self._get_data("analytic") + file_data = BytesIO() + try: + writer = AccountingWriter(file_data) + writer.writerows(rows) + file_value = file_data.getvalue() + self.write({'data': base64.encodestring(file_value)}) + finally: + file_data.close() + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.csv.export', + 'view_mode': 'form', + 'view_type': 'form', + 'res_id': self.id, + 'views': [(False, 'form')], + 'target': 'new', + } + + def _get_header_analytic(self): + return [ + _('ANALYTIC CODE'), + _('ANALYTIC NAME'), + _('CODE'), + _('ACCOUNT NAME'), + _('DEBIT'), + _('CREDIT'), + _('BALANCE'), + ] + + def _get_rows_analytic(self, journal_ids): + """ + Return list to generate rows of the CSV file + """ + self.ensure_one() + self.env.cr.execute(""" select aac.code as analytic_code, + aac.name as analytic_name, + ac.code,ac.name, + sum(debit) as sum_debit, + sum(credit) as sum_credit, + sum(debit) - sum(credit) as balance + from account_move_line + left outer join account_analytic_account as aac + on (account_move_line.analytic_account_id = aac.id) + inner join account_account as ac + on account_move_line.account_id = ac.id + AND account_move_line.date >= %(date_start)s + AND account_move_line.date <= %(date_end)s + group by aac.id,aac.code,aac.name,ac.id,ac.code,ac.name + order by aac.code + """, {'date_start': self.date_start, + 'date_end': self.date_end}) + res = self.env.cr.fetchall() + + rows = [] + for line in res: + rows.append(list(line)) + return rows + + def action_manual_export_journal_entries(self): + """ + Here we use TemporaryFile to avoid full filling the Odoo worker + Memory + We also write the data to the wizard with SQL query as write seems + to use too much memory as well. + + Those improvements permitted to improve the export from a 100k line to + 200k lines + with default `limit_memory_hard = 805306368` (768MB) with more lines, + you might encounter a MemoryError when trying to download the file even + if it has been generated. + + To be able to export bigger volume of data, it is advised to set + limit_memory_hard to 2097152000 (2 GB) to generate the file and let + Odoo load it in the wizard when trying to download it. + + Tested with up to a generation of 700k entry lines + """ + self.ensure_one() + rows = self._get_data("journal_entries") + with tempfile.TemporaryFile() as file_data: + writer = AccountingWriter(file_data) + writer.writerows(rows) + with tempfile.TemporaryFile() as base64_data: + file_data.seek(0) + base64.encode(file_data, base64_data) + base64_data.seek(0) + self.env.cr.execute(""" + UPDATE account_csv_export + SET data = %s + WHERE id = %s""", (base64_data.read(), self.id)) + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.csv.export', + 'view_mode': 'form', + 'res_id': self.id, + 'views': [(False, 'form')], + 'target': 'new', + } + + def _get_header_journal_entries(self): + return [ + # Standard Sage export fields + _('DATE'), + _('JOURNAL CODE'), + _('ACCOUNT CODE'), + _('PARTNER NAME'), + _('REF'), + _('DESCRIPTION'), + _('DEBIT'), + _('CREDIT'), + _('FULL RECONCILE'), + _('ANALYTIC ACCOUNT CODE'), + + # Other fields + _('ENTRY NUMBER'), + _('ACCOUNT NAME'), + _('BALANCE'), + _('AMOUNT CURRENCY'), + _('CURRENCY'), + _('ANALYTIC ACCOUNT NAME'), + _('JOURNAL'), + _('TAX CODE'), + _('TAX NAME'), + _('BANK STATEMENT'), + ] + + def _get_rows_journal_entries(self, journal_ids): + """ + Create a generator of rows of the CSV file + """ + self.ensure_one() + self.env.cr.execute(""" + SELECT + account_move_line.date AS date, + account_journal.name as journal, + account_account.code AS account_code, + res_partner.name AS partner_name, + account_move_line.ref AS ref, + account_move_line.name AS description, + account_move_line.debit AS debit, + account_move_line.credit AS credit, + account_full_reconcile.name as full_reconcile, + account_analytic_account.code AS analytic_account_code, + account_move.name AS entry_number, + account_account.name AS account_name, + account_move_line.debit - account_move_line.credit AS balance, + account_move_line.amount_currency AS amount_currency, + res_currency.name AS currency, + account_analytic_account.name AS analytic_account_name, + account_journal.name as journal, + acct.description as tax_code, + acct.name as tax_name, + account_bank_statement.name AS bank_statement + FROM + public.account_move_line + JOIN account_account on + (account_account.id=account_move_line.account_id) + JOIN account_journal on + (account_journal.id = account_move_line.journal_id) + LEFT JOIN res_currency on + (res_currency.id=account_move_line.currency_id) + LEFT JOIN account_full_reconcile on + (account_full_reconcile.id = account_move_line.full_reconcile_id) + LEFT JOIN res_partner on + (res_partner.id=account_move_line.partner_id) + LEFT JOIN account_move on + (account_move.id=account_move_line.move_id) + LEFT JOIN account_analytic_account on + (account_analytic_account.id=account_move_line.analytic_account_id) + LEFT JOIN account_bank_statement on + (account_bank_statement.id=account_move_line.statement_id) + LEFT JOIN account_tax acct on + (acct.id=account_move_line.tax_line_id) + WHERE account_move_line.date >= %(date_start)s + AND account_move_line.date <= %(date_end)s + AND account_journal.id IN %(journal_ids)s + ORDER BY account_move_line.date + """, {'journal_ids': tuple(journal_ids), + 'date_start': self.date_start, + 'date_end': self.date_end}) + while 1: + # http://initd.org/psycopg/docs/cursor.html#cursor.fetchmany + # Set cursor.arraysize to minimize network round trips + self.env.cr.arraysize = 100 + rows = self.env.cr.fetchmany() + if not rows: + break + for row in rows: + yield row + + def _get_data(self, result_type): + self.ensure_one() + get_header_func = getattr( + self, ("_get_header_%s" % (result_type)), None) + get_rows_func = getattr(self, ("_get_rows_%s" % (result_type)), None) + if self.journal_ids: + journal_ids = [x.id for x in self.journal_ids] + else: + j_obj = self.env["account.journal"] + journal_ids = j_obj.search([]).ids + rows = itertools.chain((get_header_func(),), + get_rows_func(journal_ids)) + return rows diff --git a/account_export_csv/wizard/account_export_csv_view.xml b/account_export_csv/wizard/account_export_csv_view.xml new file mode 100644 index 00000000..0f245935 --- /dev/null +++ b/account_export_csv/wizard/account_export_csv_view.xml @@ -0,0 +1,64 @@ + + + + + Accounting Entries CSV Export + account.csv.export + +
+ + + + + + + + + + + + +
+
+ + + + +
+
+ + +
+
+ + + Accounting CSV Export + account.csv.export + ir.actions.act_window + form + + new + + + + +