Browse Source
Merge pull request #190 from oca-sorrento/add_account_tax_balance
Merge pull request #190 from oca-sorrento/add_account_tax_balance
Add account_tax_balancepull/221/merge
Pedro M. Baeza
8 years ago
committed by
GitHub
16 changed files with 947 additions and 0 deletions
-
60account_tax_balance/README.rst
-
6account_tax_balance/__init__.py
-
28account_tax_balance/__openerp__.py
-
261account_tax_balance/i18n/es.po
-
6account_tax_balance/models/__init__.py
-
42account_tax_balance/models/account_move.py
-
195account_tax_balance/models/account_tax.py
-
BINaccount_tax_balance/static/description/icon.png
-
BINaccount_tax_balance/static/description/tax_balance.png
-
6account_tax_balance/tests/__init__.py
-
145account_tax_balance/tests/test_account_tax_balance.py
-
40account_tax_balance/views/account_move_view.xml
-
71account_tax_balance/views/account_tax_view.xml
-
5account_tax_balance/wizard/__init__.py
-
40account_tax_balance/wizard/open_tax_balances.py
-
42account_tax_balance/wizard/open_tax_balances_view.xml
@ -0,0 +1,60 @@ |
|||
.. 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 |
|||
|
|||
============ |
|||
Tax Balances |
|||
============ |
|||
|
|||
This module allows to compute tax balances within a certain date range. |
|||
It depends on date_range module and exposes 'compute' methods that can be called by other modules (like localization ones) |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
Accounting --> Reporting --> Taxes Balance |
|||
|
|||
Select the company, the date range, the target moves and 'open taxes' |
|||
|
|||
.. figure:: /account_tax_balance/static/description/tax_balance.png |
|||
|
|||
.. 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 smashing it by providing a detailed and welcomed feedback. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Images |
|||
------ |
|||
|
|||
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Lorenzo Battistini <lorenzo.battistini@agilebg.com> |
|||
* Giovanni Capalbo <giovanni@therp.nl> |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://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,6 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import models |
|||
from . import wizard |
@ -0,0 +1,28 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# © 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
{ |
|||
"name": "Tax Balance", |
|||
"summary": "Compute tax balances based on date range", |
|||
"version": "9.0.1.0.0", |
|||
"category": "Accounting & Finance", |
|||
"website": "https://www.agilebg.com/", |
|||
"author": "Agile Business Group, Therp BV, Tecnativa, " |
|||
"Odoo Community Association (OCA)", |
|||
"license": "AGPL-3", |
|||
"application": False, |
|||
"installable": True, |
|||
"depends": [ |
|||
"account", |
|||
"date_range", |
|||
], |
|||
"data": [ |
|||
"wizard/open_tax_balances_view.xml", |
|||
"views/account_move_view.xml", |
|||
"views/account_tax_view.xml", |
|||
], |
|||
"images": [ |
|||
'images/tax_balance.png', |
|||
] |
|||
} |
@ -0,0 +1,261 @@ |
|||
# Translation of Odoo Server. |
|||
# This file contains the translation of the following modules: |
|||
# * account_tax_balance |
|||
# |
|||
msgid "" |
|||
msgstr "" |
|||
"Project-Id-Version: Odoo Server 9.0c\n" |
|||
"Report-Msgid-Bugs-To: \n" |
|||
"POT-Creation-Date: 2016-10-21 15:30+0000\n" |
|||
"PO-Revision-Date: 2016-10-21 15:30+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_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
msgid "Account" |
|||
msgstr "Cuenta" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model,name:account_tax_balance.model_account_move |
|||
msgid "Account Entry" |
|||
msgstr "Asiento contable" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "Account Tax" |
|||
msgstr "Cuenta de impuesto" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:wizard.open.tax.balances,target_move:0 |
|||
msgid "All Entries" |
|||
msgstr "Todos los asientos" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:wizard.open.tax.balances,target_move:0 |
|||
msgid "All Posted Entries" |
|||
msgstr "Todos los asientos asentados" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_balance_regular |
|||
msgid "Balance" |
|||
msgstr "Cuota" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_balance_refund |
|||
msgid "Balance Refund" |
|||
msgstr "Cuota devoluciones" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_base_balance_regular |
|||
msgid "Base Balance" |
|||
msgstr "Base imponible" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_base_balance_refund |
|||
msgid "Base Balance Refund" |
|||
msgstr "Base devoluciones" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "Base Total" |
|||
msgstr "Base total" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.wizard_open_tax_balances |
|||
msgid "Cancel" |
|||
msgstr "Cancelar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_company_id |
|||
msgid "Company" |
|||
msgstr "Compañía" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_create_uid |
|||
msgid "Created by" |
|||
msgstr "Creado por" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_create_date |
|||
msgid "Created on" |
|||
msgstr "Creado en" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_date_range_id |
|||
msgid "Date range" |
|||
msgstr "Periodo" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_display_name |
|||
msgid "Display Name" |
|||
msgstr "Nombre a mostrar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_from_date |
|||
msgid "From date" |
|||
msgstr "Desde" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
msgid "Group By" |
|||
msgstr "Agrupar por" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_id |
|||
msgid "ID" |
|||
msgstr "ID" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances___last_update |
|||
msgid "Last Modified on" |
|||
msgstr "Última modificación en" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_write_uid |
|||
msgid "Last Updated by" |
|||
msgstr "Última modificación por" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_write_date |
|||
msgid "Last Updated on" |
|||
msgstr "Última actualización en" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Liquidity" |
|||
msgstr "Liquidez" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_move_move_type |
|||
msgid "Move type" |
|||
msgstr "Tipo de operación" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.wizard_open_tax_balances |
|||
msgid "Open Taxes" |
|||
msgstr "Ver impuestos" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Other" |
|||
msgstr "Otro" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Payable" |
|||
msgstr "A pagar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Payable refund" |
|||
msgstr "Devoluciones a cobrar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Receivable" |
|||
msgstr "A cobrar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: selection:account.move,move_type:0 |
|||
msgid "Receivable refund" |
|||
msgstr "Devoluciones a pagar" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "Short Name" |
|||
msgstr "Nombre corto" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_target_move |
|||
msgid "Target Moves" |
|||
msgstr "Movimientos destino" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model,name:account_tax_balance.model_account_tax |
|||
msgid "Tax" |
|||
msgstr "Impuesto" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
msgid "Tax Group" |
|||
msgstr "Grupo del impuesto" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_search_balance |
|||
msgid "Tax Scope" |
|||
msgstr "Uso del impuesto" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.actions.act_window,name:account_tax_balance.action_open_tax_balances |
|||
#: model:ir.actions.act_window,name:account_tax_balance.action_tax_balances_tree |
|||
#: model:ir.ui.menu,name:account_tax_balance.menu_action_open_tax_balances |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.wizard_open_tax_balances |
|||
msgid "Taxes Balance" |
|||
msgstr "Tabla de impuestos" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_wizard_open_tax_balances_to_date |
|||
msgid "To date" |
|||
msgstr "Hasta" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "Total" |
|||
msgstr "Total" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_balance |
|||
msgid "Total Balance" |
|||
msgstr "Total cuota" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model.fields,field_description:account_tax_balance.field_account_tax_base_balance |
|||
msgid "Total Base Balance" |
|||
msgstr "Total base imponible" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View base lines" |
|||
msgstr "Ver líneas de base imponible" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View base refund lines" |
|||
msgstr "Ver líneas de base imponible de devoluciones" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View base regular lines" |
|||
msgstr "Ver líneas de base imponible de operaciones corrientes" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View tax lines" |
|||
msgstr "Ver líneas de cuota" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View tax refund lines" |
|||
msgstr "Ver líneas de cuota de devoluciones" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.view_tax_tree_balance |
|||
msgid "View tax regular lines" |
|||
msgstr "Ver líneas de cuota de operaciones corrientes" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.ui.view,arch_db:account_tax_balance.wizard_open_tax_balances |
|||
msgid "or" |
|||
msgstr "o" |
|||
|
|||
#. module: account_tax_balance |
|||
#: model:ir.model,name:account_tax_balance.model_wizard_open_tax_balances |
|||
msgid "wizard.open.tax.balances" |
|||
msgstr "wizard.open.tax.balances" |
@ -0,0 +1,6 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import account_move |
|||
from . import account_tax |
@ -0,0 +1,42 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from openerp import models, fields, api |
|||
|
|||
|
|||
class AccountMove(models.Model): |
|||
_inherit = 'account.move' |
|||
|
|||
move_type = fields.Selection( |
|||
string="Move type", selection=[ |
|||
('other', 'Other'), |
|||
('liquidity', 'Liquidity'), |
|||
('receivable', 'Receivable'), |
|||
('receivable_refund', 'Receivable refund'), |
|||
('payable', 'Payable'), |
|||
('payable_refund', 'Payable refund'), |
|||
], compute='_compute_move_type', store=True, readonly=True) |
|||
|
|||
@api.multi |
|||
@api.depends('line_ids.account_id.internal_type', 'line_ids.balance') |
|||
def _compute_move_type(self): |
|||
def _balance_get(line_ids, internal_type): |
|||
return sum(line_ids.filtered( |
|||
lambda x: x.account_id.internal_type == internal_type).mapped( |
|||
'balance')) |
|||
|
|||
for move in self: |
|||
internal_types = move.line_ids.mapped('account_id.internal_type') |
|||
if 'liquidity' in internal_types: |
|||
move.move_type = 'liquidity' |
|||
elif 'payable' in internal_types: |
|||
balance = _balance_get(move.line_ids, 'payable') |
|||
move.move_type = ( |
|||
'payable' if balance < 0 else 'payable_refund') |
|||
elif 'receivable' in internal_types: |
|||
balance = _balance_get(move.line_ids, 'receivable') |
|||
move.move_type = ( |
|||
'receivable' if balance > 0 else 'receivable_refund') |
|||
else: |
|||
move.move_type = 'other' |
@ -0,0 +1,195 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# © 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from openerp import models, fields, api |
|||
from openerp.tools.safe_eval import safe_eval |
|||
|
|||
|
|||
class AccountTax(models.Model): |
|||
_inherit = 'account.tax' |
|||
|
|||
balance = fields.Float( |
|||
string="Total Balance", compute="_compute_balance", |
|||
search='_search_balance') |
|||
base_balance = fields.Float( |
|||
string="Total Base Balance", compute="_compute_balance", |
|||
search='_search_base_balance') |
|||
balance_regular = fields.Float( |
|||
string="Balance", compute="_compute_balance", |
|||
search='_search_balance_regular') |
|||
base_balance_regular = fields.Float( |
|||
string="Base Balance", compute="_compute_balance", |
|||
search='_search_base_balance_regular') |
|||
balance_refund = fields.Float( |
|||
string="Balance Refund", compute="_compute_balance", |
|||
search='_search_balance_refund') |
|||
base_balance_refund = fields.Float( |
|||
string="Base Balance Refund", compute="_compute_balance", |
|||
search='_search_base_balance_refund') |
|||
|
|||
def _search_balance_field(self, field, operator, value): |
|||
operators = {'>', '<', '>=', '<=', '!=', '=', '<>'} |
|||
fields = { |
|||
'balance', 'base_balance', 'balance_regular', |
|||
'base_balance_regular', 'balance_refund', 'base_balance_refund', |
|||
} |
|||
domain = [] |
|||
if operator in operators and field in fields: |
|||
value = float(value) if value else 0 |
|||
taxes = self.search([]).filtered( |
|||
lambda x: safe_eval( |
|||
'%.2f %s %.2f' % (x[field], operator, value))) |
|||
domain.append(('id', 'in', taxes.ids)) |
|||
return domain |
|||
|
|||
def _search_balance(self, operator, value): |
|||
return self._search_balance_field('balance', operator, value) |
|||
|
|||
def _search_base_balance(self, operator, value): |
|||
return self._search_balance_field('base_balance', operator, value) |
|||
|
|||
def _search_balance_regular(self, operator, value): |
|||
return self._search_balance_field('balance_regular', operator, value) |
|||
|
|||
def _search_base_balance_regular(self, operator, value): |
|||
return self._search_balance_field( |
|||
'base_balance_regular', operator, value) |
|||
|
|||
def _search_balance_refund(self, operator, value): |
|||
return self._search_balance_field('balance_refund', operator, value) |
|||
|
|||
def _search_base_balance_refund(self, operator, value): |
|||
return self._search_balance_field( |
|||
'base_balance_refund', operator, value) |
|||
|
|||
def get_context_values(self): |
|||
context = self.env.context |
|||
return ( |
|||
context.get('from_date', fields.Date.context_today(self)), |
|||
context.get('to_date', fields.Date.context_today(self)), |
|||
context.get('company_id', self.env.user.company_id.id), |
|||
context.get('target_move', 'posted') |
|||
) |
|||
|
|||
def _compute_balance(self): |
|||
for tax in self: |
|||
tax.balance_regular = tax.compute_balance( |
|||
tax_or_base='tax', move_type='regular') |
|||
tax.base_balance_regular = tax.compute_balance( |
|||
tax_or_base='base', move_type='regular') |
|||
tax.balance_refund = tax.compute_balance( |
|||
tax_or_base='tax', move_type='refund') |
|||
tax.base_balance_refund = tax.compute_balance( |
|||
tax_or_base='base', move_type='refund') |
|||
tax.balance = tax.balance_regular + tax.balance_refund |
|||
tax.base_balance = ( |
|||
tax.base_balance_regular + tax.base_balance_refund) |
|||
|
|||
def get_target_type_list(self, move_type=None): |
|||
if move_type == 'refund': |
|||
return ['receivable_refund', 'payable_refund'] |
|||
elif move_type == 'regular': |
|||
return ['receivable', 'payable'] |
|||
return [] |
|||
|
|||
def get_target_state_list(self, target_move="posted"): |
|||
if target_move == 'posted': |
|||
state = ['posted'] |
|||
elif target_move == 'all': |
|||
state = ['posted', 'draft'] |
|||
else: |
|||
state = [] |
|||
return state |
|||
|
|||
def get_move_line_partial_domain(self, from_date, to_date, company_id): |
|||
return [ |
|||
('date', '<=', to_date), |
|||
('date', '>=', from_date), |
|||
('company_id', '=', company_id), |
|||
] |
|||
|
|||
def compute_balance(self, tax_or_base='tax', move_type=None): |
|||
self.ensure_one() |
|||
move_lines = self.get_move_lines_domain( |
|||
tax_or_base=tax_or_base, move_type=move_type) |
|||
# balance is debit - credit whereas on tax return you want to see what |
|||
# vat has to be paid so: |
|||
# VAT on sales (credit) - VAT on purchases (debit). |
|||
total = -sum([l.balance for l in move_lines]) |
|||
return total |
|||
|
|||
def get_balance_domain(self, state_list, type_list): |
|||
domain = [ |
|||
('move_id.state', 'in', state_list), |
|||
('tax_line_id', '=', self.id), |
|||
] |
|||
if type_list: |
|||
domain.append(('move_id.move_type', 'in', type_list)) |
|||
return domain |
|||
|
|||
def get_base_balance_domain(self, state_list, type_list): |
|||
domain = [ |
|||
('move_id.state', 'in', state_list), |
|||
('tax_ids', 'in', self.id), |
|||
] |
|||
if type_list: |
|||
domain.append(('move_id.move_type', 'in', type_list)) |
|||
return domain |
|||
|
|||
def get_move_lines_domain(self, tax_or_base='tax', move_type=None): |
|||
move_line_model = self.env['account.move.line'] |
|||
from_date, to_date, company_id, target_move = self.get_context_values() |
|||
state_list = self.get_target_state_list(target_move) |
|||
type_list = self.get_target_type_list(move_type) |
|||
domain = self.get_move_line_partial_domain( |
|||
from_date, to_date, company_id) |
|||
balance_domain = [] |
|||
if tax_or_base == 'tax': |
|||
balance_domain = self.get_balance_domain(state_list, type_list) |
|||
elif tax_or_base == 'base': |
|||
balance_domain = self.get_base_balance_domain( |
|||
state_list, type_list) |
|||
domain.extend(balance_domain) |
|||
return move_line_model.search(domain) |
|||
|
|||
def get_lines_action(self, tax_or_base='tax', move_type=None): |
|||
move_lines = self.get_move_lines_domain( |
|||
tax_or_base=tax_or_base, move_type=move_type) |
|||
move_line_ids = [l.id for l in move_lines] |
|||
action = self.env.ref('account.action_account_moves_all_tree') |
|||
vals = action.read()[0] |
|||
vals['context'] = {} |
|||
vals['domain'] = [('id', 'in', move_line_ids)] |
|||
return vals |
|||
|
|||
@api.multi |
|||
def view_tax_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='tax') |
|||
|
|||
@api.multi |
|||
def view_base_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='base') |
|||
|
|||
@api.multi |
|||
def view_tax_regular_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='tax', move_type='regular') |
|||
|
|||
@api.multi |
|||
def view_base_regular_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='base', move_type='regular') |
|||
|
|||
@api.multi |
|||
def view_tax_refund_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='tax', move_type='refund') |
|||
|
|||
@api.multi |
|||
def view_base_refund_lines(self): |
|||
self.ensure_one() |
|||
return self.get_lines_action(tax_or_base='base', move_type='refund') |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
After Width: 1143 | Height: 258 | Size: 25 KiB |
@ -0,0 +1,6 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# © 2016 Giovanni Capalbo |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import test_account_tax_balance |
@ -0,0 +1,145 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# © 2016 Giovanni Capalbo <giovanni@therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from openerp.tests.common import TransactionCase |
|||
from datetime import datetime |
|||
from dateutil.rrule import MONTHLY |
|||
|
|||
|
|||
class TestAccountTaxBalance(TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestAccountTaxBalance, self).setUp() |
|||
self.range_type = self.env['date.range.type'].create( |
|||
{'name': 'Fiscal year', |
|||
'company_id': False, |
|||
'allow_overlap': False}) |
|||
self.range_generator = self.env['date.range.generator'] |
|||
self.current_year = datetime.now().year |
|||
self.current_month = datetime.now().month |
|||
range_generator = self.range_generator.create({ |
|||
'date_start': '%s-01-01' % self.current_year, |
|||
'name_prefix': '%s-' % self.current_year, |
|||
'type_id': self.range_type.id, |
|||
'duration_count': 1, |
|||
'unit_of_time': MONTHLY, |
|||
'count': 12}) |
|||
range_generator.action_apply() |
|||
self.range = self.env['date.range'] |
|||
|
|||
def test_tax_balance(self): |
|||
tax_account_id = self.env['account.account'].search( |
|||
[('name', '=', 'Tax Paid')], limit=1).id |
|||
tax = self.env['account.tax'].create({ |
|||
'name': 'Tax 10.0%', |
|||
'amount': 10.0, |
|||
'amount_type': 'percent', |
|||
'account_id': tax_account_id, |
|||
}) |
|||
invoice_account_id = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.env.ref( |
|||
'account.data_account_type_receivable' |
|||
).id)], limit=1).id |
|||
invoice_line_account_id = self.env['account.account'].search( |
|||
[('user_type_id', '=', self.env.ref( |
|||
'account.data_account_type_expenses').id)], limit=1).id |
|||
invoice = self.env['account.invoice'].create({ |
|||
'partner_id': self.env.ref('base.res_partner_2').id, |
|||
'account_id': invoice_account_id, |
|||
'type': 'out_invoice', |
|||
}) |
|||
|
|||
self.env['account.invoice.line'].create({ |
|||
'product_id': self.env.ref('product.product_product_4').id, |
|||
'quantity': 1.0, |
|||
'price_unit': 100.0, |
|||
'invoice_id': invoice.id, |
|||
'name': 'product that cost 100', |
|||
'account_id': invoice_line_account_id, |
|||
'invoice_line_tax_ids': [(6, 0, [tax.id])], |
|||
}) |
|||
invoice._onchange_invoice_line_ids() |
|||
invoice._convert_to_write(invoice._cache) |
|||
self.assertEqual(invoice.state, 'draft') |
|||
|
|||
# change the state of invoice to open by clicking Validate button |
|||
invoice.signal_workflow('invoice_open') |
|||
|
|||
self.assertEquals(tax.base_balance, 100.) |
|||
self.assertEquals(tax.balance, 10.) |
|||
self.assertEquals(tax.base_balance_regular, 100.) |
|||
self.assertEquals(tax.balance_regular, 10.) |
|||
self.assertEquals(tax.base_balance_refund, 0.) |
|||
self.assertEquals(tax.balance_refund, 0.) |
|||
|
|||
# testing wizard |
|||
current_range = self.range.search([ |
|||
('date_start', '=', '%s-%s-01' % ( |
|||
self.current_year, self.current_month)) |
|||
]) |
|||
wizard = self.env['wizard.open.tax.balances'].new({}) |
|||
self.assertFalse(wizard.from_date) |
|||
self.assertFalse(wizard.to_date) |
|||
wizard = self.env['wizard.open.tax.balances'].new({ |
|||
'date_range_id': current_range[0].id, |
|||
}) |
|||
wizard.onchange_date_range_id() |
|||
wizard._convert_to_write(wizard._cache) |
|||
action = wizard.open_taxes() |
|||
self.assertEqual( |
|||
action['context']['from_date'], current_range[0].date_start) |
|||
self.assertEqual( |
|||
action['context']['to_date'], current_range[0].date_end) |
|||
self.assertEqual( |
|||
action['xml_id'], 'account_tax_balance.action_tax_balances_tree') |
|||
|
|||
# testing buttons |
|||
tax_action = tax.view_tax_lines() |
|||
base_action = tax.view_base_lines() |
|||
self.assertTrue( |
|||
tax_action['domain'][0][2][0] in |
|||
[l.id for l in invoice.move_id.line_ids]) |
|||
self.assertEqual( |
|||
tax_action['xml_id'], 'account.action_account_moves_all_tree') |
|||
self.assertTrue( |
|||
base_action['domain'][0][2][0] in |
|||
[l.id for l in invoice.move_id.line_ids]) |
|||
self.assertEqual( |
|||
base_action['xml_id'], 'account.action_account_moves_all_tree') |
|||
|
|||
# test specific method |
|||
state_list = tax.get_target_state_list(target_move='all') |
|||
self.assertEqual(state_list, ['posted', 'draft']) |
|||
state_list = tax.get_target_state_list(target_move='whatever') |
|||
self.assertEqual(state_list, []) |
|||
|
|||
refund = self.env['account.invoice'].create({ |
|||
'partner_id': self.env.ref('base.res_partner_2').id, |
|||
'account_id': invoice_account_id, |
|||
'type': 'out_refund', |
|||
}) |
|||
|
|||
self.env['account.invoice.line'].create({ |
|||
'product_id': self.env.ref('product.product_product_2').id, |
|||
'quantity': 1.0, |
|||
'price_unit': 25.0, |
|||
'invoice_id': refund.id, |
|||
'name': 'returned product that cost 25', |
|||
'account_id': invoice_line_account_id, |
|||
'invoice_line_tax_ids': [(6, 0, [tax.id])], |
|||
}) |
|||
refund._onchange_invoice_line_ids() |
|||
refund._convert_to_write(invoice._cache) |
|||
self.assertEqual(refund.state, 'draft') |
|||
|
|||
# change the state of refund to open by clicking Validate button |
|||
refund.signal_workflow('invoice_open') |
|||
|
|||
self.assertEquals(tax.base_balance, 75.) |
|||
self.assertEquals(tax.balance, 7.5) |
|||
self.assertEquals(tax.base_balance_regular, 100.) |
|||
self.assertEquals(tax.balance_regular, 10.) |
|||
self.assertEquals(tax.base_balance_refund, -25.) |
|||
self.assertEquals(tax.balance_refund, -2.5) |
@ -0,0 +1,40 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> |
|||
<odoo> |
|||
|
|||
|
|||
<record id="view_move_tree" model="ir.ui.view"> |
|||
<field name="name">Add move type column</field> |
|||
<field name="model">account.move</field> |
|||
<field name="inherit_id" ref="account.view_move_tree"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="state" position="after"> |
|||
<field name="move_type"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_move_form" model="ir.ui.view"> |
|||
<field name="name">Add move type field</field> |
|||
<field name="model">account.move</field> |
|||
<field name="inherit_id" ref="account.view_move_form"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="ref" position="after"> |
|||
<field name="move_type"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_account_move_filter" model="ir.ui.view"> |
|||
<field name="name">Add move type group by</field> |
|||
<field name="model">account.move</field> |
|||
<field name="inherit_id" ref="account.view_account_move_filter"/> |
|||
<field name="arch" type="xml"> |
|||
<group expand="0" position="inside"> |
|||
<filter string="Move type" domain="[]" context="{'group_by':'move_type'}"/> |
|||
</group> |
|||
</field> |
|||
</record> |
|||
|
|||
</odoo> |
@ -0,0 +1,71 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- Copyright 2016 Lorenzo Battistini - Agile Business Group |
|||
Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com> |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> |
|||
<odoo> |
|||
|
|||
<record id="view_tax_tree_balance" model="ir.ui.view"> |
|||
<field name="name">account.tax.tree.balance</field> |
|||
<field name="model">account.tax</field> |
|||
<field eval="100" name="priority"/> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Account Tax" create="false" delete="false"> |
|||
<field name="name"/> |
|||
<field name="description" string="Short Name"/> |
|||
<field name="account_id"/> |
|||
<field name="balance_regular" sum="Total"/> |
|||
<button type="object" name="view_tax_regular_lines" |
|||
string="View tax regular lines" icon="fa-search-plus"/> |
|||
<field name="base_balance_regular" sum="Base Total"/> |
|||
<button type="object" name="view_base_regular_lines" |
|||
string="View base regular lines" icon="fa-search-plus"/> |
|||
<field name="balance_refund" sum="Total"/> |
|||
<button type="object" name="view_tax_refund_lines" |
|||
string="View tax refund lines" icon="fa-search-plus"/> |
|||
<field name="base_balance_refund" sum="Base Total"/> |
|||
<button type="object" name="view_base_refund_lines" |
|||
string="View base refund lines" icon="fa-search-plus"/> |
|||
<field name="balance" sum="Total"/> |
|||
<button type="object" name="view_tax_lines" |
|||
string="View tax lines" icon="fa-search-plus"/> |
|||
<field name="base_balance" sum="Base Total"/> |
|||
<button type="object" name="view_base_lines" |
|||
string="View base lines" icon="fa-search-plus"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_tax_search_balance" model="ir.ui.view"> |
|||
<field name="name">account.tax.search.balance</field> |
|||
<field name="model">account.tax</field> |
|||
<field eval="100" name="priority"/> |
|||
<field name="arch" type="xml"> |
|||
<search string="Account Tax"> |
|||
<field name="name"/> |
|||
<field name="tag_ids"/> |
|||
<field name="description" string="Short Name"/> |
|||
<field name="type_tax_use"/> |
|||
<field name="account_id"/> |
|||
<group expand="0" string="Group By"> |
|||
<filter string="Tax Group" domain="[]" context="{'group_by':'tax_group_id'}"/> |
|||
<filter string="Tax Scope" domain="[]" context="{'group_by':'type_tax_use'}"/> |
|||
<filter string="Account" domain="[]" context="{'group_by':'account_id'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_tax_balances_tree" model="ir.actions.act_window"> |
|||
<field name="name">Taxes Balance</field> |
|||
<field name="res_model">account.tax</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree</field> |
|||
<field name="domain">[ |
|||
'|', '|', ('base_balance', '!=', 0), ('base_balance_regular', '!=', 0), |
|||
'|', '|', ('base_balance_refund', '!=', 0), ('balance', '!=', 0), |
|||
'|', ('balance_regular', '!=', 0), ('balance_refund', '!=', 0)]</field> |
|||
<field name="view_id" ref="view_tax_tree_balance"/> |
|||
<field name="search_view_id" ref="view_tax_search_balance"/> |
|||
</record> |
|||
|
|||
</odoo> |
@ -0,0 +1,5 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from . import open_tax_balances |
@ -0,0 +1,40 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Lorenzo Battistini - Agile Business Group |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from openerp import models, fields, api |
|||
|
|||
|
|||
class OpenTaxBalances(models.TransientModel): |
|||
_name = 'wizard.open.tax.balances' |
|||
company_id = fields.Many2one( |
|||
'res.company', 'Company', required=True, |
|||
default=lambda self: self.env.user.company_id) |
|||
from_date = fields.Date('From date', required=True) |
|||
to_date = fields.Date('To date', required=True) |
|||
date_range_id = fields.Many2one('date.range', 'Date range') |
|||
target_move = fields.Selection([ |
|||
('posted', 'All Posted Entries'), |
|||
('all', 'All Entries'), |
|||
], 'Target Moves', required=True, default='posted') |
|||
|
|||
@api.onchange('date_range_id') |
|||
def onchange_date_range_id(self): |
|||
if self.date_range_id: |
|||
self.from_date = self.date_range_id.date_start |
|||
self.to_date = self.date_range_id.date_end |
|||
else: |
|||
self.from_date = self.to_date = None |
|||
|
|||
@api.multi |
|||
def open_taxes(self): |
|||
self.ensure_one() |
|||
action = self.env.ref('account_tax_balance.action_tax_balances_tree') |
|||
vals = action.read()[0] |
|||
vals['context'] = { |
|||
'from_date': self.from_date, |
|||
'to_date': self.to_date, |
|||
'target_move': self.target_move, |
|||
'company_id': self.company_id.id, |
|||
} |
|||
return vals |
@ -0,0 +1,42 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- Copyright 2016 Lorenzo Battistini - Agile Business Group |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> |
|||
<odoo> |
|||
|
|||
<record id="wizard_open_tax_balances" model="ir.ui.view"> |
|||
<field name="name">wizard_open_tax_balances</field> |
|||
<field name="model">wizard.open.tax.balances</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Taxes Balance"> |
|||
<group> |
|||
<field name="company_id"/> |
|||
<field name="date_range_id"/> |
|||
<field name="from_date"></field> |
|||
<field name="to_date"></field> |
|||
<field name="target_move"></field> |
|||
</group> |
|||
<footer> |
|||
<button string="Open Taxes" name="open_taxes" type="object" class="oe_highlight"/> |
|||
or |
|||
<button string="Cancel" class="oe_link" special="cancel"/> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_open_tax_balances" model="ir.actions.act_window"> |
|||
<field name="name">Taxes Balance</field> |
|||
<field name="res_model">wizard.open.tax.balances</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="view_id" ref="wizard_open_tax_balances"/> |
|||
<field name="target">new</field> |
|||
</record> |
|||
|
|||
<menuitem |
|||
action="action_open_tax_balances" |
|||
id="menu_action_open_tax_balances" |
|||
parent="account.menu_finance_reports" |
|||
groups="account.group_account_user,account.group_account_manager"/> |
|||
|
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue