Merge pull request #489 from Eficent/11.0-imp-account_financial_report-multicompany-2

11.0 imp account financial report multicompany 2
pull/498/head
Jordi Ballester Alomar 2019-01-08 17:09:04 +01:00 committed by GitHub
commit cfab16090c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 300 additions and 156 deletions

View File

@ -97,6 +97,7 @@ Contributors
* Akim Juillerat <akim.juillerat@camptocamp.com> * Akim Juillerat <akim.juillerat@camptocamp.com>
* Alexis de Lattre <alexis@via.ecp.fr> * Alexis de Lattre <alexis@via.ecp.fr>
* Mihai Fekete <feketemihai@gmail.com> * Mihai Fekete <feketemihai@gmail.com>
* Miquel Raïch <miquel.raich@eficent.com>
Much of the work in this module was done at a sprint in Sorrento, Italy in Much of the work in this module was done at a sprint in Sorrento, Italy in
April 2016. April 2016.

View File

@ -4,7 +4,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{ {
'name': 'Account Financial Reports', 'name': 'Account Financial Reports',
'version': '11.0.2.3.1', 'version': '11.0.2.4.0',
'category': 'Reporting', 'category': 'Reporting',
'summary': 'OCA Financial Reports', 'summary': 'OCA Financial Reports',
'author': 'Camptocamp SA,' 'author': 'Camptocamp SA,'

View File

@ -14,6 +14,7 @@
* Akim Juillerat <akim.juillerat@camptocamp.com> * Akim Juillerat <akim.juillerat@camptocamp.com>
* Alexis de Lattre <alexis@via.ecp.fr> * Alexis de Lattre <alexis@via.ecp.fr>
* Mihai Fekete <feketemihai@gmail.com> * Mihai Fekete <feketemihai@gmail.com>
* Miquel Raïch <miquel.raich@eficent.com>
Much of the work in this module was done at a sprint in Sorrento, Italy in Much of the work in this module was done at a sprint in Sorrento, Italy in
April 2016. April 2016.

View File

@ -41,7 +41,7 @@ class AbstractReportXslx(models.AbstractModel):
self._define_formats(workbook) self._define_formats(workbook)
report_name = self._get_report_name() report_name = self._get_report_name(objects)
report_footer = self._get_report_footer() report_footer = self._get_report_footer()
filters = self._get_report_filters(report) filters = self._get_report_filters(report)
self.columns = self._get_report_columns(report) self.columns = self._get_report_columns(report)
@ -349,7 +349,7 @@ class AbstractReportXslx(models.AbstractModel):
""" """
raise NotImplementedError() raise NotImplementedError()
def _get_report_name(self): def _get_report_name(self, objects):
""" """
Allow to define the report name. Allow to define the report name.
Report name will be used as sheet name and as report title. Report name will be used as sheet name and as report title.

View File

@ -10,8 +10,10 @@ class AgedPartnerBalanceXslx(models.AbstractModel):
_name = 'report.a_f_r.report_aged_partner_balance_xlsx' _name = 'report.a_f_r.report_aged_partner_balance_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('Aged Partner Balance') report = objects
return _('Aged Partner Balance - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
if not report.show_move_line_details: if not report.show_move_line_details:

View File

@ -11,8 +11,10 @@ class GeneralLedgerXslx(models.AbstractModel):
_name = 'report.a_f_r.report_general_ledger_xlsx' _name = 'report.a_f_r.report_general_ledger_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('General Ledger') report = objects
return _('General Ledger - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
res = { res = {

View File

@ -10,8 +10,10 @@ class JournalLedgerXslx(models.AbstractModel):
_name = 'report.a_f_r.report_journal_ledger_xlsx' _name = 'report.a_f_r.report_journal_ledger_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('Journal Ledger') report = objects
return _('Journal Ledger - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
columns = [ columns = [

View File

@ -9,8 +9,10 @@ class OpenItemsXslx(models.AbstractModel):
_name = 'report.a_f_r.report_open_items_xlsx' _name = 'report.a_f_r.report_open_items_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('Open Items') report = objects
return _('Open Items - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
res = { res = {

View File

@ -14,12 +14,13 @@
<template id="report_aged_partner_balance_base"> <template id="report_aged_partner_balance_base">
<!-- Saved flag fields into variables, used to define columns display --> <!-- Saved flag fields into variables, used to define columns display -->
<t t-set="show_move_line_details" t-value="o.show_move_line_details"/> <t t-set="show_move_line_details" t-value="o.show_move_line_details"/>
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">Aged Partner Balance</t> <t t-set="title">Aged Partner Balance - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<div class="page data_table">
<div class="page"> <div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div>
<!-- Display filters --> <!-- Display filters -->
<t t-call="account_financial_report.report_aged_partner_balance_filters"/> <t t-call="account_financial_report.report_aged_partner_balance_filters"/>

View File

@ -17,13 +17,14 @@
<t t-set="show_cost_center" t-value="o.show_cost_center"/> <t t-set="show_cost_center" t-value="o.show_cost_center"/>
<t t-set="foreign_currency" t-value="o.foreign_currency"/> <t t-set="foreign_currency" t-value="o.foreign_currency"/>
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">General Ledger</t> <t t-set="title">General Ledger - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<div class="page data_table">
<div class="page"> <div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div>
<!-- Display filters --> <!-- Display filters -->
<t t-call="account_financial_report.report_general_ledger_filters"/> <t t-call="account_financial_report.report_general_ledger_filters"/>
<t t-foreach="o.account_ids" t-as="account"> <t t-foreach="o.account_ids" t-as="account">
<div class="page_break"> <div class="page_break">
<!-- Display account header --> <!-- Display account header -->

View File

@ -12,12 +12,14 @@
</template> </template>
<template id="report_journal_ledger_base"> <template id="report_journal_ledger_base">
<t t-set="title">Journal Ledger</t>
<t t-set="company_name" t-value="o.company_id.name"/>
<t t-set="display_currency" t-value="o.foreign_currency"/> <t t-set="display_currency" t-value="o.foreign_currency"/>
<t t-set="display_account_name" t-value="o.with_account_name"/> <t t-set="display_account_name" t-value="o.with_account_name"/>
<t t-set="title">Journal Ledger - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<div class="page"> <t t-set="company_name" t-value="o.company_id.name"/>
<div class="page data_table">
<div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div>
<t t-if="o.group_option == 'none'"> <t t-if="o.group_option == 'none'">
<div class="page_break"> <div class="page_break">
<t t-call="account_financial_report.report_journal_all"/> <t t-call="account_financial_report.report_journal_all"/>

View File

@ -2,16 +2,6 @@
<odoo> <odoo>
<template id="account_financial_report.internal_layout"> <template id="account_financial_report.internal_layout">
<div class="header">
<div class="row">
<div class="col-xs-6">
<span t-esc="title"/>
</div>
<div class="col-xs-6 text-right">
<span t-esc="company_name"/>
</div>
</div>
</div>
<div class="article"> <div class="article">
<link href="/account_financial_report/static/src/css/report.css" rel="stylesheet"/> <link href="/account_financial_report/static/src/css/report.css" rel="stylesheet"/>
<t t-raw="0" /> <t t-raw="0" />

View File

@ -14,13 +14,13 @@
<template id="account_financial_report.report_open_items_base"> <template id="account_financial_report.report_open_items_base">
<!-- Saved flag fields into variables, used to define columns display --> <!-- Saved flag fields into variables, used to define columns display -->
<t t-set="foreign_currency" t-value="o.foreign_currency"/> <t t-set="foreign_currency" t-value="o.foreign_currency"/>
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">Open Items</t> <t t-set="title">Open Items - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<div class="page data_table">
<div class="page"> <div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div>
<!-- Display filters --> <!-- Display filters -->
<t t-call="account_financial_report.report_open_items_filters"/> <t t-call="account_financial_report.report_open_items_filters"/>

View File

@ -15,93 +15,95 @@
<!-- Saved flag fields into variables, used to define columns display --> <!-- Saved flag fields into variables, used to define columns display -->
<t t-set="show_partner_details" t-value="o.show_partner_details"/> <t t-set="show_partner_details" t-value="o.show_partner_details"/>
<t t-set="foreign_currency" t-value="o.foreign_currency"/> <t t-set="foreign_currency" t-value="o.foreign_currency"/>
<!-- Defines global variables used by internal layout --> <!-- Defines global variables used by internal layout -->
<t t-set="title">Trial Balance</t> <t t-set="title">Trial Balance - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<t t-set="company_name" t-value="o.company_id.name"/> <t t-set="company_name" t-value="o.company_id.name"/>
<t t-set="res_company" t-value="o.company_id"/> <t t-set="res_company" t-value="o.company_id"/>
<div class="page data_table">
<div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div>
<!-- Display filters -->
<t t-call="account_financial_report.report_trial_balance_filters"/>
<div class="act_as_table list_table" style="margin-top: 10px;"/>
<div class="page"> <!-- Display account lines -->
<!-- Display filters --> <t t-if="not show_partner_details">
<t t-call="account_financial_report.report_trial_balance_filters"/> <div class="act_as_table data_table" style="width: 100%;">
<div class="act_as_table list_table" style="margin-top: 10px;"/> <!-- Display account header -->
<t t-call="account_financial_report.report_trial_balance_lines_header"/>
<!-- Display account lines --> <!-- Display each lines -->
<t t-if="not show_partner_details"> <t t-foreach="o.account_ids.filtered(lambda a: not a.hide_line)" t-as="line">
<div class="act_as_table data_table" style="width: 100%;"> <t t-set="type" t-value='"account_type"'/>
<!-- Display account header --> <!-- Adapt -->
<t t-call="account_financial_report.report_trial_balance_lines_header"/> <t t-set="style" t-value="'font-size:8px;'"/>
<t t-set="padding" t-value="line.level * 4"/>
<!-- Display each lines --> <t t-if="o.hide_account_at_0">
<t t-foreach="o.account_ids.filtered(lambda a: not a.hide_line)" t-as="line"> <t t-set="style" t-value="'font-size: 14px;'"/>
<t t-set="type" t-value='"account_type"'/>
<!-- Adapt -->
<t t-set="style" t-value="'font-size:8px;'"/>
<t t-set="padding" t-value="line.level * 4"/>
<t t-if="o.hide_account_at_0">
<t t-set="style" t-value="'font-size: 14px;'"/>
</t>
<t t-if="o.hierarchy_on != 'none'">
<t t-set="style" t-value="'font-size: ' + str(14 - line.level) + 'px; margin-left: ' + str(line.level * 4) + 'px;'"/>
</t>
<t t-if="line.account_group_id">
<t t-set="style" t-value="style + 'font-weight: bold; color: blue;'"/>
</t>
<!-- Display account lines -->
<t t-call="account_financial_report.report_trial_balance_line"/>
<!-- Adapt style -->
</t> </t>
<t t-if="o.hierarchy_on != 'none'">
<t t-set="style" t-value="'font-size: ' + str(14 - line.level) + 'px; margin-left: ' + str(line.level * 4) + 'px;'"/>
</t>
<t t-if="line.account_group_id">
<t t-set="style" t-value="style + 'font-weight: bold; color: blue;'"/>
</t>
<!-- Display account lines -->
<t t-call="account_financial_report.report_trial_balance_line"/>
<!-- Adapt style -->
</t>
</div>
</t>
<!-- Display partner lines -->
<t t-if="show_partner_details">
<t t-set="padding" t-value="0"/>
<t t-foreach="o.account_ids" t-as="account">
<div class="page_break">
<t t-set="style" t-value="'font-size:8px;'"/>
<t t-set="padding" t-value="account.level * 4"/>
<t t-set="style" t-value="'font-size: ' + str(14 - account.level) + 'px; margin-left: ' + str(account.level * 4) + 'px;'"/>
<!-- Display account header -->
<div class="act_as_table list_table" style="margin-top: 10px;"/>
<div class="act_as_caption account_title"
style="width: 100%;">
<t t-set="res_model" t-value="'account.account'"/>
<span>
<a t-att-data-active-id="account.account_id.id"
t-att-data-res-model="res_model"
class="o_account_financial_reports_web_action"
t-att-style="style">
<t t-raw="account.code"/> - <t t-raw="account.name"/></a>
</span>
</div>
<div class="act_as_table data_table"
style="width: 100%;">
<!-- Display account/partner header -->
<t t-call="account_financial_report.report_trial_balance_lines_header"/>
<!-- Adapt style -->
<t t-set="padding" t-value="padding+4"/>
<!-- Display each partners -->
<t t-foreach="account.partner_ids" t-as="line">
<t t-set="type" t-value='"partner_type"'/>
<!-- Display partner line -->
<t t-call="account_financial_report.report_trial_balance_line"/>
</t>
<t t-set="padding" t-value="padding-4"/>
</div>
<!-- Display account footer -->
<t t-set="type" t-value='"account_type"'/>
<t t-call="account_financial_report.report_trial_balance_account_footer"/>
</div> </div>
</t> </t>
</t>
<!-- Display partner lines --> </div>
<t t-if="show_partner_details">
<t t-set="padding" t-value="0"/>
<t t-foreach="o.account_ids" t-as="account">
<div class="page_break">
<t t-set="style" t-value="'font-size:8px;'"/>
<t t-set="padding" t-value="account.level * 4"/>
<t t-set="style" t-value="'font-size: ' + str(14 - account.level) + 'px; margin-left: ' + str(account.level * 4) + 'px;'"/>
<!-- Display account header -->
<div class="act_as_table list_table" style="margin-top: 10px;"/>
<div class="act_as_caption account_title"
style="width: 100%;">
<t t-set="res_model" t-value="'account.account'"/>
<span>
<a t-att-data-active-id="account.account_id.id"
t-att-data-res-model="res_model"
class="o_account_financial_reports_web_action"
t-att-style="style">
<t t-raw="account.code"/> - <t t-raw="account.name"/></a>
</span>
</div>
<div class="act_as_table data_table"
style="width: 100%;">
<!-- Display account/partner header -->
<t t-call="account_financial_report.report_trial_balance_lines_header"/>
<!-- Adapt style -->
<t t-set="padding" t-value="padding+4"/>
<!-- Display each partners -->
<t t-foreach="account.partner_ids" t-as="line">
<t t-set="type" t-value='"partner_type"'/>
<!-- Display partner line -->
<t t-call="account_financial_report.report_trial_balance_line"/>
</t>
<t t-set="padding" t-value="padding-4"/>
</div>
<!-- Display account footer -->
<t t-set="type" t-value='"account_type"'/>
<t t-call="account_financial_report.report_trial_balance_account_footer"/>
</div>
</t>
</t>
</div>
</template> </template>
<template id="account_financial_report.report_trial_balance_filters"> <template id="account_financial_report.report_trial_balance_filters">
<div class="act_as_table data_table" style="width: 100%;"> <div class="act_as_table data_table" style="width: 100%;">

View File

@ -12,15 +12,15 @@
</template> </template>
<template id="account_financial_report.report_vat_report_base"> <template id="account_financial_report.report_vat_report_base">
<t t-set="title">VAT Report - <t t-raw="o.company_id.name"/> - <t t-raw="o.company_id.currency_id.name"/></t>
<t t-set="company_name" t-value="o.company_id.name"/>
<div class="page data_table"> <div class="page data_table">
<t t-set="title">VAT Report</t>
<div class="row"> <div class="row">
<h4 class="mt0" t-esc="title or 'Odoo Report'"/> <h4 class="mt0" t-esc="title or 'Odoo Report'"/>
</div> </div>
<!-- Display filters --> <!-- Display filters -->
<t t-call="account_financial_report.report_vat_report_filters"/> <t t-call="account_financial_report.report_vat_report_filters"/>
<div class="page_break"/> <div class="page_break"/>
<div class="act_as_table data_table" style="width: 100%;"> <div class="act_as_table data_table" style="width: 100%;">
<!-- Display table headers for lines --> <!-- Display table headers for lines -->
<div class="act_as_thead"> <div class="act_as_thead">

View File

@ -10,8 +10,10 @@ class TrialBalanceXslx(models.AbstractModel):
_name = 'report.a_f_r.report_trial_balance_xlsx' _name = 'report.a_f_r.report_trial_balance_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('Trial Balance') report = objects
return _('Trial Balance - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
if not report.show_partner_details: if not report.show_partner_details:

View File

@ -8,8 +8,10 @@ class VATReportXslx(models.AbstractModel):
_name = 'report.a_f_r.report_vat_report_xlsx' _name = 'report.a_f_r.report_vat_report_xlsx'
_inherit = 'report.account_financial_report.abstract_report_xlsx' _inherit = 'report.account_financial_report.abstract_report_xlsx'
def _get_report_name(self): def _get_report_name(self, objects):
return _('VAT Report') report = objects
return _('VAT Report - %s - %s') % (
report.company_id.name, report.company_id.currency_id.name)
def _get_report_columns(self, report): def _get_report_columns(self, report):
return { return {

View File

@ -48,22 +48,27 @@ class TestVATReport(common.TransactionCase):
def setUp(self): def setUp(self):
super(TestVATReport, self).setUp() super(TestVATReport, self).setUp()
self.date_from = time.strftime('%Y-%m-01'), self.date_from = time.strftime('%Y-%m-01')
self.date_to = time.strftime('%Y-%m-28'), self.date_to = time.strftime('%Y-%m-28')
self.company = self.env.ref('base.main_company')
self.receivable_account = self.env['account.account'].search([ self.receivable_account = self.env['account.account'].search([
('company_id', '=', self.company.id),
('user_type_id.name', '=', 'Receivable') ('user_type_id.name', '=', 'Receivable')
], limit=1) ], limit=1)
self.income_account = self.env['account.account'].search([ self.income_account = self.env['account.account'].search([
('company_id', '=', self.company.id),
('user_type_id.name', '=', 'Income') ('user_type_id.name', '=', 'Income')
], limit=1) ], limit=1)
self.tax_account = self.env['account.account'].search([ self.tax_account = self.env['account.account'].search([
('company_id', '=', self.company.id),
('user_type_id', ('user_type_id',
'=', '=',
self.env.ref( self.env.ref(
'account.data_account_type_non_current_liabilities').id 'account.data_account_type_non_current_liabilities').id)
)], limit=1) ], limit=1)
self.bank_journal = self.env['account.journal'].search( self.bank_journal = self.env['account.journal'].search([
[('type', '=', 'bank')], limit=1) ('type', '=', 'bank'), ('company_id', '=', self.company.id)
], limit=1)
self.tax_tag_01 = self.env['account.account.tag'].create({ self.tax_tag_01 = self.env['account.account.tag'].create({
'name': 'Tag 01', 'name': 'Tag 01',
'applicability': 'taxes' 'applicability': 'taxes'
@ -90,6 +95,7 @@ class TestVATReport(common.TransactionCase):
'amount_type': 'percent', 'amount_type': 'percent',
'type_tax_use': 'sale', 'type_tax_use': 'sale',
'account_id': self.tax_account.id, 'account_id': self.tax_account.id,
'company_id': self.company.id,
'refund_account_id': self.tax_account.id, 'refund_account_id': self.tax_account.id,
'tax_group_id': self.tax_group_10.id, 'tax_group_id': self.tax_group_10.id,
'tag_ids': [(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])] 'tag_ids': [(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])]
@ -102,6 +108,7 @@ class TestVATReport(common.TransactionCase):
'type_tax_use': 'sale', 'type_tax_use': 'sale',
'tax_exigibility': 'on_payment', 'tax_exigibility': 'on_payment',
'account_id': self.tax_account.id, 'account_id': self.tax_account.id,
'company_id': self.company.id,
'refund_account_id': self.tax_account.id, 'refund_account_id': self.tax_account.id,
'cash_basis_account': self.tax_account.id, 'cash_basis_account': self.tax_account.id,
'tax_group_id': self.tax_group_20.id, 'tax_group_id': self.tax_group_20.id,
@ -111,6 +118,7 @@ class TestVATReport(common.TransactionCase):
invoice = self.env['account.invoice'].create({ invoice = self.env['account.invoice'].create({
'partner_id': self.env.ref('base.res_partner_2').id, 'partner_id': self.env.ref('base.res_partner_2').id,
'account_id': self.receivable_account.id, 'account_id': self.receivable_account.id,
'company_id': self.company.id,
'date_invoice': time.strftime('%Y-%m-03'), 'date_invoice': time.strftime('%Y-%m-03'),
'type': 'out_invoice', 'type': 'out_invoice',
}) })
@ -130,6 +138,7 @@ class TestVATReport(common.TransactionCase):
self.cbinvoice = self.env['account.invoice'].create({ self.cbinvoice = self.env['account.invoice'].create({
'partner_id': self.env.ref('base.res_partner_2').id, 'partner_id': self.env.ref('base.res_partner_2').id,
'account_id': self.receivable_account.id, 'account_id': self.receivable_account.id,
'company_id': self.company.id,
'date_invoice': time.strftime('%Y-%m-05'), 'date_invoice': time.strftime('%Y-%m-05'),
'type': 'out_invoice', 'type': 'out_invoice',
}) })
@ -147,13 +156,12 @@ class TestVATReport(common.TransactionCase):
self.cbinvoice.action_invoice_open() self.cbinvoice.action_invoice_open()
def _get_report_lines(self): def _get_report_lines(self):
company = self.env.ref('base.main_company')
self.cbinvoice.pay_and_reconcile( self.cbinvoice.pay_and_reconcile(
self.bank_journal.id, 300, time.strftime('%Y-%m-10')) self.bank_journal.id, 300, time.strftime('%Y-%m-10'))
vat_report = self.env['report_vat_report'].create({ vat_report = self.env['report_vat_report'].create({
'date_from': self.date_from, 'date_from': self.date_from,
'date_to': self.date_to, 'date_to': self.date_to,
'company_id': company.id, 'company_id': self.company.id,
'based_on': 'taxtags', 'based_on': 'taxtags',
'tax_detail': True, 'tax_detail': True,
}) })
@ -238,11 +246,10 @@ class TestVATReport(common.TransactionCase):
self.assertEqual(lines['tax_group_20'].tax, 50) self.assertEqual(lines['tax_group_20'].tax, 50)
def test_get_report_html(self): def test_get_report_html(self):
company = self.env.ref('base.main_company')
vat_report = self.env['report_vat_report'].create({ vat_report = self.env['report_vat_report'].create({
'date_from': self.date_from, 'date_from': self.date_from,
'date_to': self.date_to, 'date_to': self.date_to,
'company_id': company.id, 'company_id': self.company.id,
'tax_detail': True, 'tax_detail': True,
}) })
vat_report.compute_data_for_report() vat_report.compute_data_for_report()

View File

@ -17,6 +17,7 @@ class AgedPartnerBalanceWizard(models.TransientModel):
company_id = fields.Many2one( company_id = fields.Many2one(
comodel_name='res.company', comodel_name='res.company',
default=lambda self: self.env.user.company_id, default=lambda self: self.env.user.company_id,
required=True,
string='Company' string='Company'
) )
date_at = fields.Date(required=True, date_at = fields.Date(required=True,
@ -38,11 +39,22 @@ class AgedPartnerBalanceWizard(models.TransientModel):
) )
show_move_line_details = fields.Boolean() show_move_line_details = fields.Boolean()
@api.onchange('company_id')
def onchange_company_id(self):
"""Handle company change."""
if self.company_id and self.partner_ids:
self.partner_ids = self.partner_ids.filtered(
lambda p: p.company_id == self.company_id or
not p.company_id)
if self.company_id and self.account_ids:
self.account_ids = self.account_ids.filtered(
lambda a: a.company_id == self.company_id)
@api.onchange('receivable_accounts_only', 'payable_accounts_only') @api.onchange('receivable_accounts_only', 'payable_accounts_only')
def onchange_type_accounts_only(self): def onchange_type_accounts_only(self):
"""Handle receivable/payable accounts only change.""" """Handle receivable/payable accounts only change."""
if self.receivable_accounts_only or self.payable_accounts_only: if self.receivable_accounts_only or self.payable_accounts_only:
domain = [] domain = [('company_id', '=', self.company_id.id)]
if self.receivable_accounts_only and self.payable_accounts_only: if self.receivable_accounts_only and self.payable_accounts_only:
domain += [('internal_type', 'in', ('receivable', 'payable'))] domain += [('internal_type', 'in', ('receivable', 'payable'))]
elif self.receivable_accounts_only: elif self.receivable_accounts_only:

View File

@ -21,15 +21,21 @@
</group> </group>
<group name="partner_filter" col="1"> <group name="partner_filter" col="1">
<label for="partner_ids"/> <label for="partner_ids"/>
<field name="partner_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}"/> <field name="partner_ids" nolabel="1"
widget="many2many_tags"
options="{'no_create': True}"
domain="['|',('company_id','=',company_id), ('company_id','=',False)]"/>
</group> </group>
<group name="account_filter" col="4"> <group name="account_filter" col="4">
<label for="account_ids" colspan="4"/> <label for="account_ids" colspan="4"/>
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/> <field name="payable_accounts_only"/>
<field name="account_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}" colspan="4"/> <field name="account_ids" nolabel="1"
widget="many2many_tags"
options="{'no_create': True}"
domain="[('company_id','=',company_id)]"
colspan="4"/>
</group> </group>
<field name="account_ids" nolabel="1" options="{'no_create': True}"/>
<footer> <footer>
<button name="button_export_html" string="View" <button name="button_export_html" string="View"
type="object" default_focus="1" class="oe_highlight"/> type="object" default_focus="1" class="oe_highlight"/>

View File

@ -7,9 +7,10 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
from odoo.exceptions import ValidationError
class GeneralLedgerReportWizard(models.TransientModel): class GeneralLedgerReportWizard(models.TransientModel):
@ -21,6 +22,7 @@ class GeneralLedgerReportWizard(models.TransientModel):
company_id = fields.Many2one( company_id = fields.Many2one(
comodel_name='res.company', comodel_name='res.company',
default=lambda self: self.env.user.company_id, default=lambda self: self.env.user.company_id,
required=True,
string='Company' string='Company'
) )
date_range_id = fields.Many2one( date_range_id = fields.Many2one(
@ -98,6 +100,19 @@ class GeneralLedgerReportWizard(models.TransientModel):
('company_id', '=', self.company_id.id) ('company_id', '=', self.company_id.id)
]) ])
self.not_only_one_unaffected_earnings_account = count != 1 self.not_only_one_unaffected_earnings_account = count != 1
if self.company_id and self.date_range_id.company_id and \
self.date_range_id.company_id != self.company_id:
self.date_range_id = False
if self.company_id and self.partner_ids:
self.partner_ids = self.partner_ids.filtered(
lambda p: p.company_id == self.company_id or
not p.company_id)
if self.company_id and self.account_ids:
self.account_ids = self.account_ids.filtered(
lambda a: a.company_id == self.company_id)
if self.company_id and self.cost_center_ids:
self.cost_center_ids = self.cost_center_ids.filtered(
lambda c: c.company_id == self.company_id)
@api.onchange('date_range_id') @api.onchange('date_range_id')
def onchange_date_range_id(self): def onchange_date_range_id(self):
@ -105,11 +120,21 @@ class GeneralLedgerReportWizard(models.TransientModel):
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains('company_id', 'date_range_id')
def _check_company_id_date_range_id(self):
for rec in self.sudo():
if rec.company_id and rec.date_range_id.company_id and\
rec.company_id != rec.date_range_id.company_id:
raise ValidationError(
_('The Company in the General Ledger Report Wizard and in '
'Date Range must be the same.'))
@api.onchange('receivable_accounts_only', 'payable_accounts_only') @api.onchange('receivable_accounts_only', 'payable_accounts_only')
def onchange_type_accounts_only(self): def onchange_type_accounts_only(self):
"""Handle receivable/payable accounts only change.""" """Handle receivable/payable accounts only change."""
if self.receivable_accounts_only or self.payable_accounts_only: if self.receivable_accounts_only or self.payable_accounts_only:
domain = [] domain = [('company_id', '=', self.company_id.id)]
if self.receivable_accounts_only and self.payable_accounts_only: if self.receivable_accounts_only and self.payable_accounts_only:
domain += [('internal_type', 'in', ('receivable', 'payable'))] domain += [('internal_type', 'in', ('receivable', 'payable'))]
elif self.receivable_accounts_only: elif self.receivable_accounts_only:

View File

@ -13,7 +13,8 @@
<div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', True)]}"> <div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', True)]}">
<group name="filters"> <group name="filters">
<group name="date_range"> <group name="date_range">
<field name="date_range_id" domain="['|',('company_id','=',company_id), ('company_id','=',False)]"/> <field name="date_range_id"
domain="['|',('company_id','=',company_id), ('company_id','=',False)]"/>
<field name="date_from"/> <field name="date_from"/>
<field name="date_to"/> <field name="date_to"/>
<field name="fy_start_date" invisible="1"/> <field name="fy_start_date" invisible="1"/>
@ -32,13 +33,23 @@
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/> <field name="payable_accounts_only"/>
</group> </group>
<field name="account_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}"/> <field name="account_ids"
nolabel="1"
widget="many2many_tags"
options="{'no_create': True}"
domain="[('company_id','=',company_id)]"/>
</page> </page>
<page string="Filter partners"> <page string="Filter partners">
<field name="partner_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}"/> <field name="partner_ids" nolabel="1"
widget="many2many_tags"
domain="['|',('company_id','=',company_id), ('company_id','=',False)]"
options="{'no_create': True}"/>
</page> </page>
<page string="Filter cost centers" groups="analytic.group_analytic_accounting"> <page string="Filter cost centers" groups="analytic.group_analytic_accounting">
<field name="cost_center_ids" nolabel="1" options="{'no_create': True}" groups="analytic.group_analytic_accounting"/> <field name="cost_center_ids" nolabel="1"
options="{'no_create': True}"
domain="[('company_id','=',company_id)]"
groups="analytic.group_analytic_accounting"/>
</page> </page>
<page string="Filter analytic tags"> <page string="Filter analytic tags">
<field name="analytic_tag_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/> <field name="analytic_tag_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/>

View File

@ -17,6 +17,7 @@ class OpenItemsReportWizard(models.TransientModel):
company_id = fields.Many2one( company_id = fields.Many2one(
comodel_name='res.company', comodel_name='res.company',
default=lambda self: self.env.user.company_id, default=lambda self: self.env.user.company_id,
required=True,
string='Company' string='Company'
) )
date_at = fields.Date(required=True, date_at = fields.Date(required=True,
@ -51,11 +52,22 @@ class OpenItemsReportWizard(models.TransientModel):
'will display initial and final balance in that currency.' 'will display initial and final balance in that currency.'
) )
@api.onchange('company_id')
def onchange_company_id(self):
"""Handle company change."""
if self.company_id and self.partner_ids:
self.partner_ids = self.partner_ids.filtered(
lambda p: p.company_id == self.company_id or
not p.company_id)
if self.company_id and self.account_ids:
self.account_ids = self.account_ids.filtered(
lambda a: a.company_id == self.company_id)
@api.onchange('receivable_accounts_only', 'payable_accounts_only') @api.onchange('receivable_accounts_only', 'payable_accounts_only')
def onchange_type_accounts_only(self): def onchange_type_accounts_only(self):
"""Handle receivable/payable accounts only change.""" """Handle receivable/payable accounts only change."""
if self.receivable_accounts_only or self.payable_accounts_only: if self.receivable_accounts_only or self.payable_accounts_only:
domain = [] domain = [('company_id', '=', self.company_id.id)]
if self.receivable_accounts_only and self.payable_accounts_only: if self.receivable_accounts_only and self.payable_accounts_only:
domain += [('internal_type', 'in', ('receivable', 'payable'))] domain += [('internal_type', 'in', ('receivable', 'payable'))]
elif self.receivable_accounts_only: elif self.receivable_accounts_only:

View File

@ -22,13 +22,21 @@
</group> </group>
<group name="partner_filter" col="1"> <group name="partner_filter" col="1">
<label for="partner_ids"/> <label for="partner_ids"/>
<field name="partner_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}"/> <field name="partner_ids"
nolabel="1"
domain="['|',('company_id','=',company_id), ('company_id','=',False)]"
widget="many2many_tags"
options="{'no_create': True}"/>
</group> </group>
<group name="account_filter" col="4"> <group name="account_filter" col="4">
<label for="account_ids" colspan="4"/>
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/> <field name="payable_accounts_only"/>
<field name="account_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}" colspan="4"/> <field name="account_ids"
nolabel="1"
widget="many2many_tags"
domain="[('company_id','=',company_id)]"
options="{'no_create': True}"
colspan="4"/>
</group> </group>
<footer> <footer>
<button name="button_export_html" string="View" <button name="button_export_html" string="View"

View File

@ -7,7 +7,7 @@
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
from odoo.exceptions import UserError from odoo.exceptions import UserError, ValidationError
class TrialBalanceReportWizard(models.TransientModel): class TrialBalanceReportWizard(models.TransientModel):
@ -19,6 +19,7 @@ class TrialBalanceReportWizard(models.TransientModel):
company_id = fields.Many2one( company_id = fields.Many2one(
comodel_name='res.company', comodel_name='res.company',
default=lambda self: self.env.user.company_id, default=lambda self: self.env.user.company_id,
required=True,
string='Company' string='Company'
) )
date_range_id = fields.Many2one( date_range_id = fields.Many2one(
@ -107,6 +108,16 @@ class TrialBalanceReportWizard(models.TransientModel):
('company_id', '=', self.company_id.id) ('company_id', '=', self.company_id.id)
]) ])
self.not_only_one_unaffected_earnings_account = count != 1 self.not_only_one_unaffected_earnings_account = count != 1
if self.company_id and self.date_range_id.company_id and \
self.date_range_id.company_id != self.company_id:
self.date_range_id = False
if self.company_id and self.partner_ids:
self.partner_ids = self.partner_ids.filtered(
lambda p: p.company_id == self.company_id or
not p.company_id)
if self.company_id and self.account_ids:
self.account_ids = self.account_ids.filtered(
lambda a: a.company_id == self.company_id)
@api.onchange('date_range_id') @api.onchange('date_range_id')
def onchange_date_range_id(self): def onchange_date_range_id(self):
@ -114,11 +125,21 @@ class TrialBalanceReportWizard(models.TransientModel):
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains('company_id', 'date_range_id')
def _check_company_id_date_range_id(self):
for rec in self.sudo():
if rec.company_id and rec.date_range_id.company_id and\
rec.company_id != rec.date_range_id.company_id:
raise ValidationError(
_('The Company in the Trial Balance Report Wizard and in '
'Date Range must be the same.'))
@api.onchange('receivable_accounts_only', 'payable_accounts_only') @api.onchange('receivable_accounts_only', 'payable_accounts_only')
def onchange_type_accounts_only(self): def onchange_type_accounts_only(self):
"""Handle receivable/payable accounts only change.""" """Handle receivable/payable accounts only change."""
if self.receivable_accounts_only or self.payable_accounts_only: if self.receivable_accounts_only or self.payable_accounts_only:
domain = [] domain = [('company_id', '=', self.company_id.id)]
if self.receivable_accounts_only and self.payable_accounts_only: if self.receivable_accounts_only and self.payable_accounts_only:
domain += [('internal_type', 'in', ('receivable', 'payable'))] domain += [('internal_type', 'in', ('receivable', 'payable'))]
elif self.receivable_accounts_only: elif self.receivable_accounts_only:

View File

@ -30,17 +30,31 @@
</group> </group>
<group name="partner_filter" attrs="{'invisible':[('show_partner_details','!=',True)]}" col="1"> <group name="partner_filter" attrs="{'invisible':[('show_partner_details','!=',True)]}" col="1">
<label for="partner_ids"/> <label for="partner_ids"/>
<field name="partner_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}"/> <field name="partner_ids"
nolabel="1"
domain="['|',('company_id','=',company_id), ('company_id','=',False)]"
widget="many2many_tags"
options="{'no_create': True}"/>
</group> </group>
<label for="journal_ids"/> <label for="journal_ids"/>
<field name="journal_ids" widget="many2many_tags" nolabel="1" options="{'no_create': True}"/> <field name="journal_ids"
widget="many2many_tags"
domain="[('company_id','=',company_id)]"
nolabel="1"
options="{'no_create': True}"
/>
<group attrs="{'invisible':[('show_partner_details','!=',True)]}"/> <group attrs="{'invisible':[('show_partner_details','!=',True)]}"/>
<div/> <div/>
<group name="account_filter" col="4"> <group name="account_filter" col="4">
<label for="account_ids" colspan="4"/> <label for="account_ids" colspan="4"/>
<field name="receivable_accounts_only"/> <field name="receivable_accounts_only"/>
<field name="payable_accounts_only"/> <field name="payable_accounts_only"/>
<field name="account_ids" nolabel="1" widget="many2many_tags" options="{'no_create': True}" colspan="4"/> <field name="account_ids"
nolabel="1"
widget="many2many_tags"
domain="[('company_id','=',company_id)]"
options="{'no_create': True}"
colspan="4"/>
</group> </group>
</div> </div>
<div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', False)]}"> <div attrs="{'invisible': [('not_only_one_unaffected_earnings_account', '=', False)]}">

View File

@ -1,9 +1,10 @@
# Copyright 2018 Forest and Biomass Romania # Copyright 2018 Forest and Biomass Romania
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
from odoo.tools import pycompat from odoo.tools import pycompat
from odoo.exceptions import ValidationError
class VATReportWizard(models.TransientModel): class VATReportWizard(models.TransientModel):
@ -12,6 +13,7 @@ class VATReportWizard(models.TransientModel):
company_id = fields.Many2one( company_id = fields.Many2one(
comodel_name='res.company', comodel_name='res.company',
default=lambda self: self.env.user.company_id, default=lambda self: self.env.user.company_id,
required=True,
string='Company' string='Company'
) )
date_range_id = fields.Many2one( date_range_id = fields.Many2one(
@ -27,12 +29,28 @@ class VATReportWizard(models.TransientModel):
default='taxtags') default='taxtags')
tax_detail = fields.Boolean('Detail Taxes') tax_detail = fields.Boolean('Detail Taxes')
@api.onchange('company_id')
def onchange_company_id(self):
if self.company_id and self.date_range_id.company_id and \
self.date_range_id.company_id != self.company_id:
self.date_range_id = False
@api.onchange('date_range_id') @api.onchange('date_range_id')
def onchange_date_range_id(self): def onchange_date_range_id(self):
"""Handle date range change.""" """Handle date range change."""
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains('company_id', 'date_range_id')
def _check_company_id_date_range_id(self):
for rec in self.sudo():
if rec.company_id and rec.date_range_id.company_id and\
rec.company_id != rec.date_range_id.company_id:
raise ValidationError(
_('The Company in the Vat Report Wizard and in '
'Date Range must be the same.'))
@api.multi @api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()