mreficent
8 years ago
15 changed files with 1024 additions and 0 deletions
-
67account_journal_report/README.rst
-
12account_journal_report/__init__.py
-
30account_journal_report/__openerp__.py
-
259account_journal_report/i18n/es.po
-
12account_journal_report/report/__init__.py
-
50account_journal_report/report/journal_ledger_report.py
-
201account_journal_report/report/journal_ledger_report_xlsx.py
-
40account_journal_report/report/reports.xml
-
BINaccount_journal_report/static/description/icon.png
-
6account_journal_report/tests/__init__.py
-
114account_journal_report/tests/test_account_journal_report.py
-
85account_journal_report/views/templates.xml
-
11account_journal_report/wizard/__init__.py
-
86account_journal_report/wizard/wizard_print_journal_ledger.py
-
51account_journal_report/wizard/wizard_print_journal_ledger_view.xml
@ -0,0 +1,67 @@ |
|||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
============== |
||||
|
Journal Report |
||||
|
============== |
||||
|
|
||||
|
Adds the following report in PDF and XLSX format: |
||||
|
|
||||
|
* Journal Ledger. It groups the moves by their entries. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
|
||||
|
Users willing to access to this report should have proper Accounting & Finance rights: |
||||
|
|
||||
|
#. Go to *Settings / Users* and edit your user to add the corresponding access rights as follows. |
||||
|
#. In *Application / Accounting & Finance*, select *Accountant* or *Adviser* options. |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
To use this module, you need to: |
||||
|
|
||||
|
#. Go to *Invoicing* or *Accounting* menu |
||||
|
#. Press 'Reporting > PDF Reports > Journal Ledger' |
||||
|
#. Press 'Print' to print in PDF or 'Export' to export in Excel. |
||||
|
|
||||
|
|
||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
||||
|
:alt: Try me on Runbot |
||||
|
:target: https://runbot.odoo-community.org/runbot/91/9.0 |
||||
|
|
||||
|
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 smash it by providing detailed and welcomed feedback. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Joaquin Gutierrez <joaquingpedrosa@gmail.com> |
||||
|
* Pedro M. Baeza <pedro.baeza@tecnativa.com> |
||||
|
* RGB Consulting SL (http://www.rgbconsulting.com) |
||||
|
* Miquel Raïch <miquel.raich@eficent.com> |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: http://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
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. |
||||
|
|
||||
|
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,12 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa S.L. (http://www.tecnativa.com) |
||||
|
# Pedro M. Baeza <pedro.baeza@tecnativa.com> |
||||
|
# Copyright 2017 RGB Consulting S.L. (http://www.rgbconsulting.com) |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# Miquel Raich <miquel.raich@eficent.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from . import report |
||||
|
from . import wizard |
@ -0,0 +1,30 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa - Pedro M. Baeza |
||||
|
# Copyright 2017 RGB Consulting |
||||
|
# Copyright 2017 Eficent - Miquel Raich |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
{ |
||||
|
'name': "Journal Report", |
||||
|
'version': "9.0.1.0.0", |
||||
|
'depends': [ |
||||
|
"account", |
||||
|
"report_xlsx", |
||||
|
], |
||||
|
'license': "AGPL-3", |
||||
|
'author': "J. Gutierrez, " |
||||
|
"Tecnativa, " |
||||
|
"RGB Consulting, " |
||||
|
"Eficent, " |
||||
|
"Odoo Community Association (OCA)", |
||||
|
'website': "http://github.com/OCA/account-financial-reporting", |
||||
|
'category': "Accounting", |
||||
|
'summary': "Journal Report", |
||||
|
'data': [ |
||||
|
"wizard/wizard_print_journal_ledger_view.xml", |
||||
|
"report/reports.xml", |
||||
|
"views/templates.xml", |
||||
|
], |
||||
|
"installable": True, |
||||
|
} |
@ -0,0 +1,259 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * account_journal_report |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 9.0c\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2017-05-02 14:48+0200\n" |
||||
|
"PO-Revision-Date: 2017-05-02 14:48+0200\n" |
||||
|
"Language-Team: \n" |
||||
|
"MIME-Version: 1.0\n" |
||||
|
"Content-Type: text/plain; charset=UTF-8\n" |
||||
|
"Content-Transfer-Encoding: 8bit\n" |
||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n" |
||||
|
"X-Generator: Poedit 1.8.7.1\n" |
||||
|
"Last-Translator: \n" |
||||
|
"Language: es\n" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:74 |
||||
|
#, python-format |
||||
|
msgid " to " |
||||
|
msgstr " a " |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "<em>Account name</em>" |
||||
|
msgstr "<em>Nombre cuenta</em>" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "<em>Account</em>" |
||||
|
msgstr "<em>Cuenta</em>" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "<em>Description</em>" |
||||
|
msgstr "<em>Descripción</em>" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:95 |
||||
|
#, python-format |
||||
|
msgid "Account" |
||||
|
msgstr "Cuenta" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:98 |
||||
|
#, python-format |
||||
|
msgid "Account name" |
||||
|
msgstr "Nombre cuenta" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: selection:account.journal.entries.report,sort_selection:0 |
||||
|
msgid "By date" |
||||
|
msgstr "Por fecha" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: selection:account.journal.entries.report,sort_selection:0 |
||||
|
msgid "By entry number" |
||||
|
msgstr "Por nº de entrada" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: selection:account.journal.entries.report,sort_selection:0 |
||||
|
msgid "By reference number" |
||||
|
msgstr "Por referencia" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.account_journal_ledger_report_view |
||||
|
msgid "Cancel" |
||||
|
msgstr "Cancelar" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_create_uid |
||||
|
msgid "Created by" |
||||
|
msgstr "Creado por" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_create_date |
||||
|
msgid "Created on" |
||||
|
msgstr "Creado el" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:107 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Credit" |
||||
|
msgstr "Haber" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:92 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Date" |
||||
|
msgstr "Fecha" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_date_end |
||||
|
msgid "Date end" |
||||
|
msgstr "Fecha final" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_date_start |
||||
|
msgid "Date start" |
||||
|
msgstr "Fecha inicial" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:104 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Debit" |
||||
|
msgstr "Debe" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:101 |
||||
|
#, python-format |
||||
|
msgid "Description" |
||||
|
msgstr "Descripción" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_display_name |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_report_account_journal_report_journal_ledger_display_name |
||||
|
msgid "Display Name" |
||||
|
msgstr "Nombre mostrado" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_sort_selection |
||||
|
msgid "Entries Sorted By" |
||||
|
msgstr "Entradas ordenadas por" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:89 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Entry" |
||||
|
msgstr "Entrada" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.account_journal_ledger_report_view |
||||
|
msgid "Export" |
||||
|
msgstr "Exportar" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "From" |
||||
|
msgstr "De" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:74 |
||||
|
#, python-format |
||||
|
msgid "From " |
||||
|
msgstr "De " |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_id |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_report_account_journal_report_journal_ledger_id |
||||
|
msgid "ID" |
||||
|
msgstr "ID" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:79 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Journal" |
||||
|
msgstr "Diario" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:180 |
||||
|
#: model:ir.actions.report.xml,name:account_journal_report.account_journal_ledger_report |
||||
|
#: model:ir.actions.report.xml,name:account_journal_report.action_account_journal_ledger_xlsx |
||||
|
#: model:ir.ui.menu,name:account_journal_report.menu_journal_ledger_report |
||||
|
#, python-format |
||||
|
msgid "Journal Ledger" |
||||
|
msgstr "Libro Diario" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "Journal Ledger -" |
||||
|
msgstr "Libro Diario -" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_journal_ids |
||||
|
msgid "Journals" |
||||
|
msgstr "Diarios" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_landscape |
||||
|
msgid "Landscape mode" |
||||
|
msgstr "Modo apaisado" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report___last_update |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_report_account_journal_report_journal_ledger___last_update |
||||
|
msgid "Last Modified on" |
||||
|
msgstr "Última modificación el" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_write_uid |
||||
|
msgid "Last Updated by" |
||||
|
msgstr "Última actualización por" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.model.fields,field_description:account_journal_report.field_account_journal_entries_report_write_date |
||||
|
msgid "Last Updated on" |
||||
|
msgstr "Última actualización el" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/wizard/wizard_print_journal_ledger.py:57 |
||||
|
#: code:addons/account_journal_report/wizard/wizard_print_journal_ledger.py:76 |
||||
|
#, python-format |
||||
|
msgid "No data available" |
||||
|
msgstr "No hay datos disponibles" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/wizard/wizard_print_journal_ledger.py:58 |
||||
|
#: code:addons/account_journal_report/wizard/wizard_print_journal_ledger.py:77 |
||||
|
#, python-format |
||||
|
msgid "No records found for your selection!" |
||||
|
msgstr "No se han encontrado registros para su selección" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:82 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Partner" |
||||
|
msgstr "Empresa" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.account_journal_ledger_report_view |
||||
|
msgid "Print" |
||||
|
msgstr "Imprimir" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.actions.act_window,name:account_journal_report.wizard_account_journal_ledger_report_new |
||||
|
#: model:ir.model,name:account_journal_report.model_account_journal_entries_report |
||||
|
msgid "Print Journal Ledger" |
||||
|
msgstr "Imprimir Libro Diario" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.account_journal_ledger_report_view |
||||
|
msgid "Print journal ledger" |
||||
|
msgstr "Imprimir libro diario" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: code:addons/account_journal_report/report/journal_ledger_report_xlsx.py:85 |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
#, python-format |
||||
|
msgid "Reference" |
||||
|
msgstr "Referencia" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.account_journal_ledger_report_view |
||||
|
msgid "or" |
||||
|
msgstr "o" |
||||
|
|
||||
|
#. module: account_journal_report |
||||
|
#: model:ir.ui.view,arch_db:account_journal_report.journal_ledger |
||||
|
msgid "to" |
||||
|
msgstr "a" |
@ -0,0 +1,12 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa S.L. (http://www.tecnativa.com) |
||||
|
# Pedro M. Baeza <pedro.baeza@tecnativa.com> |
||||
|
# Copyright 2017 RGB Consulting S.L. (http://www.rgbconsulting.com) |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# Miquel Raich <miquel.raich@eficent.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from . import journal_ledger_report |
||||
|
from . import journal_ledger_report_xlsx |
@ -0,0 +1,50 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa - Pedro M. Baeza |
||||
|
# Copyright 2017 RGB Consulting |
||||
|
# Copyright 2017 Eficent - Miquel Raich |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from openerp import api, fields, models |
||||
|
|
||||
|
|
||||
|
class JournalLedger(models.AbstractModel): |
||||
|
_name = 'report.account_journal_report.journal_ledger' |
||||
|
|
||||
|
def _format_date_to_lang(self, str_date): |
||||
|
if 'lang' not in self._context: |
||||
|
return str_date |
||||
|
lang_code = self._context['lang'] |
||||
|
lang_id = self.env['res.lang']._lang_get(lang_code) |
||||
|
lang = self.env['res.lang'].browse(lang_id) |
||||
|
date = fields.Date.from_string(str_date) |
||||
|
return date.strftime(lang.date_format) |
||||
|
|
||||
|
@api.multi |
||||
|
def render_html(self, data): |
||||
|
account_move_obj = self.env['account.move'] |
||||
|
report_obj = self.env['report'] |
||||
|
|
||||
|
date_start = data.get('date_start') |
||||
|
date_end = data.get('date_end') |
||||
|
journal_ids = data.get('journal_ids', []) |
||||
|
|
||||
|
move_ids = account_move_obj.search( |
||||
|
[('date', '<=', date_end), |
||||
|
('date', '>=', date_start), |
||||
|
('journal_id', 'in', journal_ids), |
||||
|
('state', '!=', 'draft')], |
||||
|
order=data.get('sort_selection', 'date') + ', id') |
||||
|
|
||||
|
report = report_obj._get_report_from_name( |
||||
|
'account_journal_report.journal_ledger') |
||||
|
docargs = { |
||||
|
'doc_model': report.model, |
||||
|
'docs': move_ids, |
||||
|
'date_start': self._format_date_to_lang( |
||||
|
date_start), |
||||
|
'date_end': self._format_date_to_lang( |
||||
|
date_end), |
||||
|
} |
||||
|
return report_obj.render( |
||||
|
'account_journal_report.journal_ledger', docargs) |
@ -0,0 +1,201 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2017 RGB Consulting S.L. (http://www.rgbconsulting.com) |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# Miquel Raich <miquel.raich@eficent.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
try: |
||||
|
from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx |
||||
|
except ImportError: |
||||
|
ReportXlsx = object |
||||
|
from openerp.report import report_sxw |
||||
|
from openerp import _ |
||||
|
|
||||
|
|
||||
|
class JournalLedgerXlsx(ReportXlsx): |
||||
|
def __init__(self, name, table, rml=False, parser=False, header=True, |
||||
|
store=False): |
||||
|
super(ReportXlsx, self).__init__( |
||||
|
name, table, rml, parser, header, store) |
||||
|
|
||||
|
self.sheet = None |
||||
|
self.row_pos = None |
||||
|
|
||||
|
self.format_title = None |
||||
|
self.format_border_top = None |
||||
|
|
||||
|
def _define_formats(self, workbook): |
||||
|
""" Add cell formats to current workbook. |
||||
|
Available formats: |
||||
|
* format_title |
||||
|
* format_header |
||||
|
* format_header_right |
||||
|
* format_header_italic |
||||
|
* format_border_top |
||||
|
""" |
||||
|
self.format_title = workbook.add_format({ |
||||
|
'bold': True, |
||||
|
'align': 'center', |
||||
|
'bg_color': '#46C646', |
||||
|
'border': True |
||||
|
}) |
||||
|
self.format_header = workbook.add_format({ |
||||
|
'bold': True, |
||||
|
'bg_color': '#FFFFCC', |
||||
|
'border': True |
||||
|
}) |
||||
|
self.format_header_right = workbook.add_format({ |
||||
|
'bold': True, |
||||
|
'bg_color': '#FFFFCC', |
||||
|
'border': True, |
||||
|
'align': 'right' |
||||
|
}) |
||||
|
self.format_header_italic = workbook.add_format({ |
||||
|
'bold': True, |
||||
|
'bg_color': '#FFFFCC', |
||||
|
'border': True, |
||||
|
'italic': True |
||||
|
}) |
||||
|
self.format_border_top = workbook.add_format({ |
||||
|
'top': 1, |
||||
|
'bg_color': '#eeeeee' |
||||
|
}) |
||||
|
|
||||
|
def _write_report_title(self, title): |
||||
|
self.sheet.merge_range( |
||||
|
self.row_pos, 0, self.row_pos, 6, title, self.format_title |
||||
|
) |
||||
|
self.row_pos += 1 |
||||
|
|
||||
|
def _write_report_range(self, date1, date2): |
||||
|
self.sheet.merge_range( |
||||
|
self.row_pos, 0, self.row_pos, 1, |
||||
|
_('From ')+date1+_(' to ')+date2+_(':')) |
||||
|
self.row_pos += 1 |
||||
|
|
||||
|
def _set_headers(self): |
||||
|
# Journal |
||||
|
self.sheet.write_string(self.row_pos, 2, _('Journal'), |
||||
|
self.format_header) |
||||
|
# Partner |
||||
|
self.sheet.write_string(self.row_pos, 3, _('Partner'), |
||||
|
self.format_header) |
||||
|
# Reference |
||||
|
self.sheet.write_string(self.row_pos, 4, _('Reference'), |
||||
|
self.format_header) |
||||
|
self.row_pos += 1 |
||||
|
# Entry |
||||
|
self.sheet.write_string(self.row_pos, 0, _('Entry'), |
||||
|
self.format_header) |
||||
|
# Date |
||||
|
self.sheet.write_string(self.row_pos, 1, _('Date'), self.format_header) |
||||
|
|
||||
|
# Account |
||||
|
self.sheet.write_string(self.row_pos, 2, _('Account'), |
||||
|
self.format_header_italic) |
||||
|
# Account name |
||||
|
self.sheet.write_string(self.row_pos, 3, _('Account name'), |
||||
|
self.format_header_italic) |
||||
|
# Description |
||||
|
self.sheet.write_string(self.row_pos, 4, _('Description'), |
||||
|
self.format_header_italic) |
||||
|
# Debit |
||||
|
self.sheet.write_string(self.row_pos, 5, _('Debit'), |
||||
|
self.format_header_right) |
||||
|
# Credit |
||||
|
self.sheet.write_string(self.row_pos, 6, _('Credit'), |
||||
|
self.format_header_right) |
||||
|
self.sheet.freeze_panes(4, 0) |
||||
|
self.row_pos += 1 |
||||
|
|
||||
|
def _generate_report_content(self, report_data): |
||||
|
for move in report_data: |
||||
|
# Entry |
||||
|
self.sheet.write_string(self.row_pos, 0, move.name or '', |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(0, 0, 18) |
||||
|
# Date |
||||
|
self.sheet.write_string(self.row_pos, 1, move.date or '', |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(1, 1, 12) |
||||
|
# Journal |
||||
|
self.sheet.write_string(self.row_pos, 2, |
||||
|
move.journal_id.name or '', |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(2, 2, 30) |
||||
|
# Partner |
||||
|
self.sheet.write_string(self.row_pos, 3, |
||||
|
move.partner_id.name or '', |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(3, 3, 40) |
||||
|
# Reference |
||||
|
self.sheet.write_string(self.row_pos, 4, move.ref or '', |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(4, 4, 40) |
||||
|
# Debit |
||||
|
self.sheet.write_number(self.row_pos, 5, move.amount or 0, |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(5, 5, 12) |
||||
|
# Credit |
||||
|
self.sheet.write_number(self.row_pos, 6, move.amount or 0, |
||||
|
self.format_border_top) |
||||
|
self.sheet.set_column(6, 6, 12) |
||||
|
|
||||
|
self.row_pos += 1 |
||||
|
for line in move.line_ids: |
||||
|
# Account code |
||||
|
self.sheet.write_string(self.row_pos, 2, |
||||
|
line.account_id.code or '') |
||||
|
# Account name |
||||
|
self.sheet.write_string(self.row_pos, 3, |
||||
|
line.account_id.name or '') |
||||
|
# Line description |
||||
|
self.sheet.write_string(self.row_pos, 4, line.name or '') |
||||
|
# Debit |
||||
|
self.sheet.write_number(self.row_pos, 5, line.debit or 0) |
||||
|
# Credit |
||||
|
self.sheet.write_number(self.row_pos, 6, line.credit or 0) |
||||
|
self.row_pos += 1 |
||||
|
|
||||
|
def generate_xlsx_report(self, workbook, data, objects): |
||||
|
date_start = data.get('date_start') |
||||
|
date_end = data.get('date_end') |
||||
|
journal_ids = data.get('journal_ids', []) |
||||
|
|
||||
|
report_data = self.env['account.move'].search( |
||||
|
[('date', '<=', date_end), |
||||
|
('date', '>=', date_start), |
||||
|
('journal_id', 'in', journal_ids), |
||||
|
('state', '!=', 'draft')], |
||||
|
order=data.get('sort_selection', 'date') + ', id') |
||||
|
|
||||
|
# Initial row |
||||
|
self.row_pos = 0 |
||||
|
|
||||
|
# Load formats to workbook |
||||
|
self._define_formats(workbook) |
||||
|
|
||||
|
# Set report name |
||||
|
report_name = _('Journal Ledger') + ' - ' + \ |
||||
|
self.env.user.company_id.name |
||||
|
self.sheet = workbook.add_worksheet(report_name[:31]) |
||||
|
if data.get('landscape'): |
||||
|
self.sheet.set_landscape() |
||||
|
self.sheet.fit_to_pages(1, 0) |
||||
|
self.sheet.set_zoom(80) |
||||
|
self._write_report_title(report_name) |
||||
|
self._write_report_range(date_start, date_end) |
||||
|
|
||||
|
# Set headers |
||||
|
self._set_headers() |
||||
|
|
||||
|
# Generate data |
||||
|
self._generate_report_content(report_data) |
||||
|
|
||||
|
|
||||
|
if ReportXlsx != object: |
||||
|
JournalLedgerXlsx( |
||||
|
'report.account_journal_report.journal_ledger_xlsx', |
||||
|
'account.journal', parser=report_sxw.rml_parse |
||||
|
) |
@ -0,0 +1,40 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<!-- Account Journal Ledger Report --> |
||||
|
<report id="account_journal_ledger_report" |
||||
|
string="Journal Ledger" |
||||
|
model="account.journal" |
||||
|
report_type="qweb-pdf" |
||||
|
name="account_journal_report.journal_ledger" |
||||
|
file="account_journal_report.journal_ledger"/> |
||||
|
|
||||
|
<record id="action_account_journal_ledger_xlsx" model="ir.actions.report.xml"> |
||||
|
<field name="name">Journal Ledger</field> |
||||
|
<field name="model">account.journal</field> |
||||
|
<field name="type">ir.actions.report.xml</field> |
||||
|
<field name="report_name">account_journal_report.journal_ledger_xlsx</field> |
||||
|
<field name="report_type">xlsx</field> |
||||
|
<field name="auto" eval="False"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="account_journal_ledger_paperformat" |
||||
|
model="report.paperformat"> |
||||
|
<field name="name">Account Journal Ledger</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="format">A4</field> |
||||
|
<field name="orientation"/> |
||||
|
<field name="margin_top">10</field> |
||||
|
<field name="margin_bottom">10</field> |
||||
|
<field name="margin_left">7</field> |
||||
|
<field name="margin_right">7</field> |
||||
|
<field name="header_spacing">0</field> |
||||
|
<field name="dpi">90</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="account_journal_ledger_report" |
||||
|
model="ir.actions.report.xml"> |
||||
|
<field name="paperformat_id" |
||||
|
ref="account_journal_ledger_paperformat"/> |
||||
|
</record> |
||||
|
|
||||
|
</odoo> |
After Width: 256 | Height: 256 | Size: 15 KiB |
@ -0,0 +1,6 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
from . import test_account_journal_report |
@ -0,0 +1,114 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from openerp import fields |
||||
|
from openerp.tests.common import SavepointCase |
||||
|
|
||||
|
|
||||
|
class TestAccountJournalReport(SavepointCase): |
||||
|
""" |
||||
|
Tests for Account Journal Report. |
||||
|
""" |
||||
|
def setUp(self): |
||||
|
super(TestAccountJournalReport, self).setUp() |
||||
|
|
||||
|
self.report_model = \ |
||||
|
self.env['report.account_journal_report.journal_ledger'] |
||||
|
self.wiz = self.env['account.journal.entries.report'] |
||||
|
self.report_name = 'account_journal_report.journal_ledger' |
||||
|
self.action_name = 'account_journal_report.' \ |
||||
|
'account_journal_ledger_report' |
||||
|
self.report_xlsx_name = 'account_journal_report.journal_ledger_xlsx' |
||||
|
self.action_xlsx_name = 'account_journal_report.' \ |
||||
|
'action_account_journal_ledger_xlsx' |
||||
|
self.report_title = 'Journal Ledger' |
||||
|
|
||||
|
self.today = fields.Date.today() |
||||
|
|
||||
|
self.account_type = self.env['account.account.type'].create({ |
||||
|
'name': 'Test account type', |
||||
|
'type': 'other', |
||||
|
}) |
||||
|
self.account = self.env['account.account'].create({ |
||||
|
'name': 'Test account', |
||||
|
'code': 'TEST', |
||||
|
'user_type_id': self.account_type.id, |
||||
|
}) |
||||
|
self.journal = self.env['account.journal'].create({ |
||||
|
'name': 'Test journal', |
||||
|
'code': 'TEST', |
||||
|
'type': 'general', |
||||
|
}) |
||||
|
self.move = self.env['account.move'].create({ |
||||
|
'journal_id': self.journal.id, |
||||
|
'date': fields.Date.today(), |
||||
|
'line_ids': [ |
||||
|
(0, 0, { |
||||
|
'name': 'Debit line', |
||||
|
'account_id': self.account.id, |
||||
|
'debit': 100, |
||||
|
}), |
||||
|
(0, 0, { |
||||
|
'name': 'Credit line', |
||||
|
'account_id': self.account.id, |
||||
|
'credit': 100, |
||||
|
}), |
||||
|
], |
||||
|
}) |
||||
|
self.move.post() |
||||
|
|
||||
|
def test_account_journal_report(self): |
||||
|
|
||||
|
wiz_id = self.wiz.create({ |
||||
|
'journal_ids': [(6, 0, self.journal.ids)], |
||||
|
'date_start': self.today, |
||||
|
'date_end': self.today, |
||||
|
}) |
||||
|
report = wiz_id.print_report() |
||||
|
|
||||
|
self.assertDictContainsSubset( |
||||
|
{ |
||||
|
'type': 'ir.actions.report.xml', |
||||
|
'report_name': self.report_name, |
||||
|
'report_type': 'qweb-pdf', |
||||
|
}, |
||||
|
report, |
||||
|
'There was an error and the PDF report was not generated.' |
||||
|
) |
||||
|
|
||||
|
data = wiz_id.read()[0] |
||||
|
report = self.env.ref(self.action_name).\ |
||||
|
render_report( |
||||
|
wiz_id.ids, self.report_name, data |
||||
|
) |
||||
|
self.assertGreaterEqual(len(report[0]), 1) |
||||
|
self.assertEqual(report[1], 'html') |
||||
|
|
||||
|
def test_account_journal_report_xlsx(self): |
||||
|
|
||||
|
wiz_id = self.wiz.create({ |
||||
|
'journal_ids': [(6, 0, self.journal.ids)], |
||||
|
'date_start': self.today, |
||||
|
'date_end': self.today, |
||||
|
}) |
||||
|
report = wiz_id.print_report_xlsx() |
||||
|
|
||||
|
self.assertDictContainsSubset( |
||||
|
{ |
||||
|
'type': 'ir.actions.report.xml', |
||||
|
'report_type': 'xlsx', |
||||
|
'report_name': self.report_xlsx_name, |
||||
|
}, |
||||
|
report, |
||||
|
'There was an error and the XLSX report was not generated.' |
||||
|
) |
||||
|
|
||||
|
data = wiz_id.read()[0] |
||||
|
report_xlsx = self.env.ref(self.action_xlsx_name).\ |
||||
|
render_report( |
||||
|
wiz_id.ids, self.report_xlsx_name, data |
||||
|
) |
||||
|
|
||||
|
self.assertGreaterEqual(len(report_xlsx[0]), 1) |
||||
|
self.assertEqual(report_xlsx[1], 'xlsx') |
@ -0,0 +1,85 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Account Journal Ledger Template --> |
||||
|
<template id="journal_ledger"> |
||||
|
<t t-call="report.html_container"> |
||||
|
<div class="page"> |
||||
|
<h2 class="text-center">Journal Ledger - |
||||
|
<t t-esc="res_company.name"/> |
||||
|
</h2> |
||||
|
From <span t-esc="date_start"/> to <span t-esc="date_end"/>: |
||||
|
<table class="table table-condensed"> |
||||
|
<thead> |
||||
|
<th>Entry</th> |
||||
|
<th>Date</th> |
||||
|
<th> |
||||
|
<div>Journal</div> |
||||
|
<em>Account</em> |
||||
|
</th> |
||||
|
<th> |
||||
|
<div>Partner</div> |
||||
|
<em>Account name</em> |
||||
|
</th> |
||||
|
<th> |
||||
|
<div>Reference</div> |
||||
|
<em>Description</em> |
||||
|
</th> |
||||
|
<th class="text-right">Debit</th> |
||||
|
<th class="text-right">Credit</th> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<t t-foreach="docs" t-as="o"> |
||||
|
<tr style="border-top: 2px solid black;"> |
||||
|
<td> |
||||
|
<span t-field="o.name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="o.date"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="o.journal_id.code"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="o.partner_id.name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="o.ref"/> |
||||
|
</td> |
||||
|
<td class="text-right"> |
||||
|
<span t-field="o.amount" |
||||
|
t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/> |
||||
|
</td> |
||||
|
<td class="text-right"> |
||||
|
<span t-field="o.amount" |
||||
|
t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr t-foreach="o.line_ids" t-as="l" |
||||
|
style="border: 0;"> |
||||
|
<td/> |
||||
|
<td/> |
||||
|
<td> |
||||
|
<span t-field="l.account_id.code"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="l.account_id.name"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<span t-field="l.name"/> |
||||
|
</td> |
||||
|
<td class="text-right"> |
||||
|
<span t-field="l.debit" |
||||
|
t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/> |
||||
|
</td> |
||||
|
<td class="text-right"> |
||||
|
<span t-field="l.credit" |
||||
|
t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
@ -0,0 +1,11 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa S.L. (http://www.tecnativa.com) |
||||
|
# Pedro M. Baeza <pedro.baeza@tecnativa.com> |
||||
|
# Copyright 2017 RGB Consulting S.L. (http://www.rgbconsulting.com) |
||||
|
# Copyright 2017 Eficent Business and IT Consulting Services S.L. |
||||
|
# (http://www.eficent.com) |
||||
|
# Miquel Raich <miquel.raich@eficent.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from . import wizard_print_journal_ledger |
@ -0,0 +1,86 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2013 Joaquin Gutierrez (http://www.gutierrezweb.es) |
||||
|
# Copyright 2015 Tecnativa - Pedro M. Baeza |
||||
|
# Copyright 2017 RGB Consulting |
||||
|
# Copyright 2017 Eficent - Miquel Raich |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from datetime import date, timedelta |
||||
|
from openerp import api, fields, models, exceptions, _ |
||||
|
|
||||
|
|
||||
|
class AccountJournalLedgerReport(models.TransientModel): |
||||
|
_name = "account.journal.entries.report" |
||||
|
_description = "Print Journal Ledger" |
||||
|
|
||||
|
@api.model |
||||
|
def _default_journal_ids(self): |
||||
|
return self.env['account.journal'].search([]) |
||||
|
|
||||
|
journal_ids = fields.Many2many( |
||||
|
comodel_name='account.journal', |
||||
|
relation="account_journal_entries_report_journals_rel", |
||||
|
string='Journals', required=True, default=_default_journal_ids, |
||||
|
) |
||||
|
date_start = fields.Date(required=True, |
||||
|
default=fields.Date.to_string( |
||||
|
date.today()-timedelta(days=90))) |
||||
|
date_end = fields.Date(required=True, |
||||
|
default=fields.Date.to_string(date.today())) |
||||
|
sort_selection = fields.Selection( |
||||
|
[('date', 'By date'), |
||||
|
('name', 'By entry number'), |
||||
|
('ref', 'By reference number')], |
||||
|
string='Entries Sorted By', required=True, default='name', |
||||
|
) |
||||
|
landscape = fields.Boolean(string='Landscape mode', default=True) |
||||
|
|
||||
|
@api.multi |
||||
|
def _check_data(self): |
||||
|
if not self.journal_ids: |
||||
|
return False |
||||
|
journal_obj = self.env['account.journal'] |
||||
|
for journal in self.journal_ids: |
||||
|
ids_journal = journal_obj.search( |
||||
|
[('id', '=', journal.id)]) |
||||
|
if ids_journal: |
||||
|
return True |
||||
|
return False |
||||
|
|
||||
|
@api.multi |
||||
|
def print_report(self): |
||||
|
"""Print report PDF""" |
||||
|
|
||||
|
# Check data |
||||
|
if not self._check_data(): |
||||
|
raise exceptions.Warning( |
||||
|
_('No data available'), |
||||
|
_('No records found for your selection!')) |
||||
|
|
||||
|
report_name = 'account_journal_report.journal_ledger' |
||||
|
|
||||
|
# Call report |
||||
|
data = self.read()[0] |
||||
|
return self.env['report'].with_context( |
||||
|
{'landscape': self.landscape}).get_action(self, |
||||
|
report_name=report_name, |
||||
|
data=data) |
||||
|
|
||||
|
@api.multi |
||||
|
def print_report_xlsx(self): |
||||
|
"""Print report XLSX""" |
||||
|
|
||||
|
# Check data |
||||
|
if not self._check_data(): |
||||
|
raise exceptions.Warning( |
||||
|
_('No data available'), |
||||
|
_('No records found for your selection!')) |
||||
|
|
||||
|
# Call report |
||||
|
data = self.read()[0] |
||||
|
report_name = 'account_journal_report.journal_ledger_xlsx' |
||||
|
return { |
||||
|
'type': 'ir.actions.report.xml', |
||||
|
'report_name': report_name, |
||||
|
'report_type': 'xlsx', |
||||
|
'datas': data} |
@ -0,0 +1,51 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<record id="account_journal_ledger_report_view" model="ir.ui.view"> |
||||
|
<field name="name">Print journal ledger</field> |
||||
|
<field name="model">account.journal.entries.report</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Print journal ledger"> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="sort_selection"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="landscape"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<group name="dates"> |
||||
|
<field name="date_start"/> |
||||
|
<field name="date_end"/> |
||||
|
</group> |
||||
|
<group/> |
||||
|
<label for="journal_ids"/> |
||||
|
<field name="journal_ids" nolabel="1" options="{'no_create': True}"/> |
||||
|
<group/> |
||||
|
<footer> |
||||
|
<button name="print_report" string="Print" type="object" |
||||
|
default_focus="1" class="oe_highlight"/> |
||||
|
or<button name="print_report_xlsx" string="Export" |
||||
|
type="object"/> |
||||
|
<button special="cancel" string="Cancel" |
||||
|
class="oe_link"/> |
||||
|
</footer> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="wizard_account_journal_ledger_report_new" |
||||
|
model="ir.actions.act_window"> |
||||
|
<field name="name">Print Journal Ledger</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">account.journal.entries.report</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="view_id" ref="account_journal_ledger_report_view"/> |
||||
|
<field name="target">new</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem name="Journal Ledger" |
||||
|
parent="account.menu_finance_legal_statement" |
||||
|
action="wizard_account_journal_ledger_report_new" |
||||
|
id="menu_journal_ledger_report"/> |
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue