Browse Source

Merge pull request #597 from akretion/12-csv-export

Migration 12 account_export_csv
pull/634/head
Alexis de Lattre 5 years ago
committed by GitHub
parent
commit
996faeb61f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 82
      account_export_csv/README.rst
  2. 1
      account_export_csv/__init__.py
  3. 20
      account_export_csv/__manifest__.py
  4. 111
      account_export_csv/i18n/account_export_csv.po
  5. 74
      account_export_csv/i18n/fr.po
  6. 74
      account_export_csv/i18n/nl.po
  7. 16
      account_export_csv/readme/CONTRBUTORS.rst
  8. 9
      account_export_csv/readme/DESCRIPTION.rst
  9. 2
      account_export_csv/readme/ROADMAP.rst
  10. 426
      account_export_csv/static/description/index.html
  11. 1
      account_export_csv/tests/__init__.py
  12. 40
      account_export_csv/tests/test_account_export_csv.py
  13. 1
      account_export_csv/wizard/__init__.py
  14. 352
      account_export_csv/wizard/account_export_csv.py
  15. 64
      account_export_csv/wizard/account_export_csv_view.xml

82
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 <https://github.com/OCA/account-financial-reporting/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 <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_export_csv%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
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 <https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
account_export_csv/__init__.py

@ -0,0 +1 @@
from . import wizard

20
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,
}

111
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 ""

74
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"

74
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: <stefan@therp.nl>\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"

16
account_export_csv/readme/CONTRBUTORS.rst

@ -0,0 +1,16 @@
* Camptocamp
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com>
* Vincent Renaville <vincent.renaville@camptocamp.com>
* Guewen Baconnier <guewen.baconnier@camptocamp.com>
* Acsone
* Stéphane Bidoul <stephane.bidoul@acsone.eu>
* Laetitia Gangloff <laetitia.gangloff@acsone.eu>
* Adrien Peiffer <adrien.peiffer@acsone.eu>
* Akretion
* David Béal <david.beal@akretion.com>

9
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

2
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

426
account_export_csv/static/description/index.html

@ -0,0 +1,426 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
<title>Account Export CSV</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="account-export-csv">
<h1 class="title">Account Export CSV</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv"><img alt="OCA/account-financial-reporting" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_export_csv"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/91/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>Add a wizard that allow you to export a csv file based on accounting
journal entries</p>
<ul class="simple">
<li>Trial Balance</li>
<li>Analytic Balance (with accounts)</li>
<li>Journal Entries</li>
</ul>
<p>You can filter by date range</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#known-issues-roadmap" id="id1">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id1">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>rearange wizard view with only one button to generate file plus define a selection list to select report type</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_export_csv%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_export_csv">OCA/account-financial-reporting</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

1
account_export_csv/tests/__init__.py

@ -0,0 +1 @@
from . import test_account_export_csv

40
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()

1
account_export_csv/wizard/__init__.py

@ -0,0 +1 @@
from . import account_export_csv

352
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

64
account_export_csv/wizard/account_export_csv_view.xml

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_csv_export_view" model="ir.ui.view">
<field name="name">Accounting Entries CSV Export</field>
<field name="model">account.csv.export</field>
<field name="arch" type="xml">
<form string="Accounting CSV Export">
<group>
<group>
<field name="company_id" />
</group>
</group>
<group>
<group>
<field name="date_range_id" domain="['|', ('company_id', '=', company_id), ('company_id', '=', False)]"/>
<label for="date_start" string="Date" class="oe_inline"/>
<div>
<field name="date_start" class="oe_inline"/>
<span string="-" class="oe_inline"/>
<field name="date_end" class="oe_inline"/>
</div>
</group>
<group>
</group>
</group>
<div>
<label for="journal_ids" />
<field name="journal_ids"/>
</div>
<separator string ="Report" colspan="4"/>
<group colspan="4">
<field name="data" filename="export_filename"/>
</group>
<footer>
<button name="action_manual_export_account" string="Trial Balance" type="object" icon="fa-cog"/>
<button name="action_manual_export_analytic" string="Analytic Balance (with accounts)" type="object" icon="fa-cog"/>
<button name="action_manual_export_journal_entries" string="Journal Entries" type="object" icon="fa-cog"/>
or
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="action_account_csv_export" model="ir.actions.act_window">
<field name="name">Accounting CSV Export</field>
<field name="res_model">account.csv.export</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_csv_export_view"/>
<field name="target">new</field>
</record>
<menuitem
name="Accounting CSV Export"
action="action_account_csv_export"
id="menu_account_csv_export"
parent="account.menu_finance_reports"
sequence="110"
/>
</odoo>
Loading…
Cancel
Save