@ -0,0 +1,46 @@
|
|||||||
|
====================================
|
||||||
|
Odoo 17 Accounting Financial Reports
|
||||||
|
====================================
|
||||||
|
|
||||||
|
This Module will provide all the financial reports for odoo 17
|
||||||
|
community edition
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to
|
||||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
|
||||||
|
list by clicking on the "Update Apps List" link. Now install the module by
|
||||||
|
clicking on the install button.
|
||||||
|
|
||||||
|
Upgrade
|
||||||
|
============
|
||||||
|
|
||||||
|
To upgrade this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Restart the server
|
||||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by
|
||||||
|
clicking on the upgrade button.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
There is Nothing to Configure
|
||||||
|
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Odoo Mates <odoomates@gmail.com>
|
||||||
|
|
||||||
|
|
||||||
|
Author & Maintainer
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This module is maintained by the Odoo Mates
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import wizard
|
||||||
|
from . import models
|
||||||
|
from . import report
|
||||||
|
|
||||||
|
|
||||||
|
def _pre_init_clean_m2m_models(env):
|
||||||
|
env.cr.execute("""DROP TABLE IF EXISTS account_journal_account_report_partner_ledger_rel""")
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Odoo 17 Accounting Financial Reports',
|
||||||
|
'version': '17.0.1.3',
|
||||||
|
'category': 'Invoicing Management',
|
||||||
|
'description': 'Accounting Reports For Odoo 17, Accounting Financial Reports, '
|
||||||
|
'Odoo 17 Financial Reports',
|
||||||
|
'summary': 'Accounting Reports For Odoo 17',
|
||||||
|
'sequence': '1',
|
||||||
|
'author': 'Odoo Mates, Odoo SA',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'company': 'Odoo Mates',
|
||||||
|
'maintainer': 'Odoo Mates',
|
||||||
|
'support': 'odoomates@gmail.com',
|
||||||
|
'website': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
|
||||||
|
'depends': ['account'],
|
||||||
|
'live_test_url': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
|
||||||
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'data/account_account_type.xml',
|
||||||
|
'views/menu.xml',
|
||||||
|
'views/ledger_menu.xml',
|
||||||
|
'views/financial_report.xml',
|
||||||
|
'views/settings.xml',
|
||||||
|
'wizard/account_report_common_view.xml',
|
||||||
|
'wizard/partner_ledger.xml',
|
||||||
|
'wizard/general_ledger.xml',
|
||||||
|
'wizard/trial_balance.xml',
|
||||||
|
'wizard/balance_sheet.xml',
|
||||||
|
'wizard/profit_and_loss.xml',
|
||||||
|
'wizard/tax_report.xml',
|
||||||
|
'wizard/aged_partner.xml',
|
||||||
|
'wizard/journal_audit.xml',
|
||||||
|
'report/report.xml',
|
||||||
|
'report/report_partner_ledger.xml',
|
||||||
|
'report/report_general_ledger.xml',
|
||||||
|
'report/report_trial_balance.xml',
|
||||||
|
'report/report_financial.xml',
|
||||||
|
'report/report_tax.xml',
|
||||||
|
'report/report_aged_partner.xml',
|
||||||
|
'report/report_journal_audit.xml',
|
||||||
|
'report/report_journal_entries.xml',
|
||||||
|
],
|
||||||
|
'pre_init_hook': '_pre_init_clean_m2m_models',
|
||||||
|
'images': ['static/description/banner.gif'],
|
||||||
|
}
|
||||||
|
|
||||||
|
# todo nys settings page
|
||||||
@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_receivable">
|
||||||
|
<field name="name">Receivable</field>
|
||||||
|
<field name="type">asset_receivable</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_payable">
|
||||||
|
<field name="name">Payable</field>
|
||||||
|
<field name="type">liability_payable</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_liquidity">
|
||||||
|
<field name="name">Bank and Cash</field>
|
||||||
|
<field name="type">asset_cash</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_credit_card">
|
||||||
|
<field name="name">Credit Card</field>
|
||||||
|
<field name="type">liability_credit_card</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_current_assets">
|
||||||
|
<field name="name">Current Assets</field>
|
||||||
|
<field name="type">asset_current</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_non_current_assets">
|
||||||
|
<field name="name">Non-current Assets</field>
|
||||||
|
<field name="type">asset_non_current</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_prepayments">
|
||||||
|
<field name="name">Prepayments</field>
|
||||||
|
<field name="type">asset_prepayments</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_fixed_assets">
|
||||||
|
<field name="name">Fixed Assets</field>
|
||||||
|
<field name="type">asset_fixed</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_current_liabilities">
|
||||||
|
<field name="name">Current Liabilities</field>
|
||||||
|
<field name="type">liability_current</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_non_current_liabilities">
|
||||||
|
<field name="name">Non-current Liabilities</field>
|
||||||
|
<field name="type">liability_non_current</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_equity">
|
||||||
|
<field name="name">Equity</field>
|
||||||
|
<field name="type">equity</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_unaffected_earnings">
|
||||||
|
<field name="name">Current Year Earnings</field>
|
||||||
|
<field name="type">equity_unaffected</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_revenue">
|
||||||
|
<field name="name">Income</field>
|
||||||
|
<field name="type">income</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_other_income">
|
||||||
|
<field name="name">Other Income</field>
|
||||||
|
<field name="type">income_other</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_expenses">
|
||||||
|
<field name="name">Expenses</field>
|
||||||
|
<field name="type">expense</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_depreciation">
|
||||||
|
<field name="name">Depreciation</field>
|
||||||
|
<field name="type">expense_depreciation</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_type_direct_costs">
|
||||||
|
<field name="name">Cost of Revenue</field>
|
||||||
|
<field name="type">expense_direct_cost</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="account.account.type" id="data_account_off_sheet">
|
||||||
|
<field name="name">Off-Balance Sheet</field>
|
||||||
|
<field name="type">off_balance</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
## Module <accounting_pdf_reports>
|
||||||
|
|
||||||
|
#### 10.11.2023
|
||||||
|
#### Version 17.0.1.0
|
||||||
|
##### IMP
|
||||||
|
- initial release
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
from . import account_account_type
|
||||||
|
from . import account_financial_report
|
||||||
|
from . import account_move_line
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAccountType(models.Model):
|
||||||
|
_name = "account.account.type"
|
||||||
|
_description = "Account Account Type"
|
||||||
|
|
||||||
|
name = fields.Char('Name', required=True, translate=True)
|
||||||
|
type = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
("asset_receivable", "Receivable"),
|
||||||
|
("asset_cash", "Bank and Cash"),
|
||||||
|
("asset_current", "Current Assets"),
|
||||||
|
("asset_non_current", "Non-current Assets"),
|
||||||
|
("asset_prepayments", "Prepayments"),
|
||||||
|
("asset_fixed", "Fixed Assets"),
|
||||||
|
("liability_payable", "Payable"),
|
||||||
|
("liability_credit_card", "Credit Card"),
|
||||||
|
("liability_current", "Current Liabilities"),
|
||||||
|
("liability_non_current", "Non-current Liabilities"),
|
||||||
|
("equity", "Equity"),
|
||||||
|
("equity_unaffected", "Current Year Earnings"),
|
||||||
|
("income", "Income"),
|
||||||
|
("income_other", "Other Income"),
|
||||||
|
("expense", "Expenses"),
|
||||||
|
("expense_depreciation", "Depreciation"),
|
||||||
|
("expense_direct_cost", "Cost of Revenue"),
|
||||||
|
("off_balance", "Off-Balance Sheet"),
|
||||||
|
],
|
||||||
|
string="Type",
|
||||||
|
help="These types are defined according to your country. The type contains more information " \
|
||||||
|
"about the account and its specificities."
|
||||||
|
)
|
||||||
|
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class AccountFinancialReport(models.Model):
|
||||||
|
_name = "account.financial.report"
|
||||||
|
_description = "Account Report"
|
||||||
|
|
||||||
|
@api.depends('parent_id', 'parent_id.level')
|
||||||
|
def _get_level(self):
|
||||||
|
'''Returns a dictionary with key=the ID of a record and value = the level of this
|
||||||
|
record in the tree structure.'''
|
||||||
|
for report in self:
|
||||||
|
level = 0
|
||||||
|
if report.parent_id:
|
||||||
|
level = report.parent_id.level + 1
|
||||||
|
report.level = level
|
||||||
|
|
||||||
|
def _get_children_by_order(self):
|
||||||
|
res = self
|
||||||
|
children = self.search([('parent_id', 'in', self.ids)], order='sequence ASC')
|
||||||
|
if children:
|
||||||
|
for child in children:
|
||||||
|
res += child._get_children_by_order()
|
||||||
|
return res
|
||||||
|
|
||||||
|
name = fields.Char('Report Name', required=True, translate=True)
|
||||||
|
parent_id = fields.Many2one('account.financial.report', 'Parent')
|
||||||
|
children_ids = fields.One2many('account.financial.report', 'parent_id', 'Account Report')
|
||||||
|
sequence = fields.Integer('Sequence')
|
||||||
|
level = fields.Integer(compute='_get_level', string='Level', store=True, recursive=True)
|
||||||
|
type = fields.Selection([
|
||||||
|
('sum', 'View'),
|
||||||
|
('accounts', 'Accounts'),
|
||||||
|
('account_type', 'Account Type'),
|
||||||
|
('account_report', 'Report Value'),
|
||||||
|
], 'Type', default='sum')
|
||||||
|
account_ids = fields.Many2many(
|
||||||
|
'account.account', 'account_account_financial_report',
|
||||||
|
'report_line_id', 'account_id', 'Accounts'
|
||||||
|
)
|
||||||
|
account_report_id = fields.Many2one('account.financial.report', 'Report Value')
|
||||||
|
account_type_ids = fields.Many2many(
|
||||||
|
'account.account.type', 'account_account_financial_report_type',
|
||||||
|
'report_id', 'account_type_id', 'Account Types'
|
||||||
|
)
|
||||||
|
report_domain = fields.Char(string="Report Domain")
|
||||||
|
sign = fields.Selection(
|
||||||
|
[('-1', 'Reverse balance sign'), ('1', 'Preserve balance sign')], 'Sign on Reports',
|
||||||
|
required=True, default='1',
|
||||||
|
help='For accounts that are typically more debited than credited and that you would '
|
||||||
|
'like to print as negative amounts in your reports, you should reverse the sign '
|
||||||
|
'of the balance; e.g.: Expense account. The same applies for accounts that are '
|
||||||
|
'typically more credited than debited and that you would like to print as positive '
|
||||||
|
'amounts in your reports; e.g.: Income account.'
|
||||||
|
)
|
||||||
|
display_detail = fields.Selection([
|
||||||
|
('no_detail', 'No detail'),
|
||||||
|
('detail_flat', 'Display children flat'),
|
||||||
|
('detail_with_hierarchy', 'Display children with hierarchy')
|
||||||
|
], 'Display details', default='detail_flat')
|
||||||
|
style_overwrite = fields.Selection([
|
||||||
|
('0', 'Automatic formatting'),
|
||||||
|
('1', 'Main Title 1 (bold, underlined)'),
|
||||||
|
('2', 'Title 2 (bold)'),
|
||||||
|
('3', 'Title 3 (bold, smaller)'),
|
||||||
|
('4', 'Normal Text'),
|
||||||
|
('5', 'Italic Text (smaller)'),
|
||||||
|
('6', 'Smallest Text'),
|
||||||
|
], 'Financial Report Style', default='0',
|
||||||
|
help="You can set up here the format you want this record to be displayed. "
|
||||||
|
"If you leave the automatic formatting, it will be computed based on the "
|
||||||
|
"financial reports hierarchy (auto-computed field 'level').")
|
||||||
|
children_ids = fields.One2many('account.financial.report', 'parent_id', string='Children')
|
||||||
|
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
import ast
|
||||||
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class AccountMoveLine(models.Model):
|
||||||
|
_inherit = "account.move.line"
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _query_get(self, domain=None):
|
||||||
|
self.check_access_rights('read')
|
||||||
|
|
||||||
|
context = dict(self._context or {})
|
||||||
|
domain = domain or []
|
||||||
|
if not isinstance(domain, (list, tuple)):
|
||||||
|
domain = ast.literal_eval(domain)
|
||||||
|
|
||||||
|
date_field = 'date'
|
||||||
|
if context.get('aged_balance'):
|
||||||
|
date_field = 'date_maturity'
|
||||||
|
if context.get('date_to'):
|
||||||
|
domain += [(date_field, '<=', context['date_to'])]
|
||||||
|
if context.get('date_from'):
|
||||||
|
if not context.get('strict_range'):
|
||||||
|
domain += ['|', (date_field, '>=', context['date_from']), ('account_id.include_initial_balance', '=', True)]
|
||||||
|
elif context.get('initial_bal'):
|
||||||
|
domain += [(date_field, '<', context['date_from'])]
|
||||||
|
else:
|
||||||
|
domain += [(date_field, '>=', context['date_from'])]
|
||||||
|
|
||||||
|
if context.get('journal_ids'):
|
||||||
|
domain += [('journal_id', 'in', context['journal_ids'])]
|
||||||
|
|
||||||
|
state = context.get('state')
|
||||||
|
if state and state.lower() != 'all':
|
||||||
|
domain += [('parent_state', '=', state)]
|
||||||
|
|
||||||
|
if context.get('company_id'):
|
||||||
|
domain += [('company_id', '=', context['company_id'])]
|
||||||
|
elif context.get('allowed_company_ids'):
|
||||||
|
domain += [('company_id', 'in', self.env.companies.ids)]
|
||||||
|
else:
|
||||||
|
domain += [('company_id', '=', self.env.company.id)]
|
||||||
|
|
||||||
|
if context.get('reconcile_date'):
|
||||||
|
domain += ['|', ('reconciled', '=', False), '|', ('matched_debit_ids.max_date', '>', context['reconcile_date']), ('matched_credit_ids.max_date', '>', context['reconcile_date'])]
|
||||||
|
|
||||||
|
if context.get('account_tag_ids'):
|
||||||
|
domain += [('account_id.tag_ids', 'in', context['account_tag_ids'].ids)]
|
||||||
|
|
||||||
|
if context.get('account_ids'):
|
||||||
|
domain += [('account_id', 'in', context['account_ids'].ids)]
|
||||||
|
|
||||||
|
if context.get('analytic_tag_ids'):
|
||||||
|
domain += [('analytic_tag_ids', 'in', context['analytic_tag_ids'].ids)]
|
||||||
|
|
||||||
|
if context.get('analytic_account_ids'):
|
||||||
|
domain += [('analytic_distribution', 'in', context['analytic_account_ids'].ids)]
|
||||||
|
|
||||||
|
if context.get('partner_ids'):
|
||||||
|
domain += [('partner_id', 'in', context['partner_ids'].ids)]
|
||||||
|
|
||||||
|
if context.get('partner_categories'):
|
||||||
|
domain += [('partner_id.category_id', 'in', context['partner_categories'].ids)]
|
||||||
|
|
||||||
|
where_clause = ""
|
||||||
|
where_clause_params = []
|
||||||
|
tables = ''
|
||||||
|
if domain:
|
||||||
|
domain.append(('display_type', 'not in', ('line_section', 'line_note')))
|
||||||
|
domain.append(('parent_state', '!=', 'cancel'))
|
||||||
|
|
||||||
|
query = self._where_calc(domain)
|
||||||
|
|
||||||
|
# Wrap the query with 'company_id IN (...)' to avoid bypassing company access rights.
|
||||||
|
self._apply_ir_rules(query)
|
||||||
|
|
||||||
|
tables, where_clause, where_clause_params = query.get_sql()
|
||||||
|
return tables, where_clause, where_clause_params
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
from . import report_partner_ledger
|
||||||
|
from . import report_general_ledger
|
||||||
|
from . import report_trial_balance
|
||||||
|
from . import report_tax
|
||||||
|
from . import report_aged_partner
|
||||||
|
from . import report_journal
|
||||||
|
from . import report_financial
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<record id="action_report_general_ledger" model="ir.actions.report">
|
||||||
|
<field name="name">General Ledger</field>
|
||||||
|
<field name="model">account.report.general.ledger</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_general_ledger</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_general_ledger</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_partnerledger" model="ir.actions.report">
|
||||||
|
<field name="name">Partner Ledger</field>
|
||||||
|
<field name="model">account.report.partner.ledger</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_partnerledger</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_partnerledger</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="action_report_trial_balance" model="ir.actions.report">
|
||||||
|
<field name="name">Trial Balance</field>
|
||||||
|
<field name="model">account.balance.report</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_trialbalance</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_trialbalance</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_financial" model="ir.actions.report">
|
||||||
|
<field name="name">Financial Report</field>
|
||||||
|
<field name="model">account.financial.report</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_financial</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_financial</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_account_tax" model="ir.actions.report">
|
||||||
|
<field name="name">Tax Report</field>
|
||||||
|
<field name="model">account.tax.report.wizard</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_tax</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_tax</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_aged_partner_balance" model="ir.actions.report">
|
||||||
|
<field name="name">Aged Partner Balance</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_agedpartnerbalance</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_agedpartnerbalance</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_journal" model="ir.actions.report">
|
||||||
|
<field name="name">Journals Audit</field>
|
||||||
|
<field name="model">account.common.journal.report</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_journal</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_journal</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_journal_entries" model="ir.actions.report">
|
||||||
|
<field name="name">Journals Entries</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">accounting_pdf_reports.report_journal_entries</field>
|
||||||
|
<field name="report_file">accounting_pdf_reports.report_journal_entries</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move"/>
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,263 @@
|
|||||||
|
import time
|
||||||
|
from odoo import api, models, fields, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
from odoo.tools import float_is_zero
|
||||||
|
from datetime import datetime
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
|
|
||||||
|
class ReportAgedPartnerBalance(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_agedpartnerbalance'
|
||||||
|
_description = 'Aged Partner Balance Report'
|
||||||
|
|
||||||
|
def _get_partner_move_lines(self, account_type, partner_ids,
|
||||||
|
date_from, target_move, period_length):
|
||||||
|
# This method can receive the context key 'include_nullified_amount' {Boolean}
|
||||||
|
# Do an invoice and a payment and unreconcile. The amount will be nullified
|
||||||
|
# By default, the partner wouldn't appear in this report.
|
||||||
|
# The context key allow it to appear
|
||||||
|
# In case of a period_length of 30 days as of 2019-02-08, we want the following periods:
|
||||||
|
# Name Stop Start
|
||||||
|
# 1 - 30 : 2019-02-07 - 2019-01-09
|
||||||
|
# 31 - 60 : 2019-01-08 - 2018-12-10
|
||||||
|
# 61 - 90 : 2018-12-09 - 2018-11-10
|
||||||
|
# 91 - 120 : 2018-11-09 - 2018-10-11
|
||||||
|
# +120 : 2018-10-10
|
||||||
|
periods = {}
|
||||||
|
start = datetime.strptime(str(date_from), "%Y-%m-%d")
|
||||||
|
date_from = datetime.strptime(str(date_from), "%Y-%m-%d").date()
|
||||||
|
for i in range(5)[::-1]:
|
||||||
|
stop = start - relativedelta(days=period_length)
|
||||||
|
period_name = str((5-(i+1)) * period_length + 1) + '-' + str((5-i) * period_length)
|
||||||
|
period_stop = (start - relativedelta(days=1)).strftime('%Y-%m-%d')
|
||||||
|
if i == 0:
|
||||||
|
period_name = '+' + str(4 * period_length)
|
||||||
|
periods[str(i)] = {
|
||||||
|
'name': period_name,
|
||||||
|
'stop': period_stop,
|
||||||
|
'start': (i!=0 and stop.strftime('%Y-%m-%d') or False),
|
||||||
|
}
|
||||||
|
start = stop
|
||||||
|
|
||||||
|
res = []
|
||||||
|
total = []
|
||||||
|
cr = self.env.cr
|
||||||
|
user_company = self.env.user.company_id
|
||||||
|
user_currency = user_company.currency_id
|
||||||
|
company_ids = self._context.get('company_ids') or [user_company.id]
|
||||||
|
move_state = ['draft', 'posted']
|
||||||
|
date = self._context.get('date') or fields.Date.today()
|
||||||
|
company = self.env['res.company'].browse(self._context.get('company_id')) or self.env.company
|
||||||
|
|
||||||
|
if target_move == 'posted':
|
||||||
|
move_state = ['posted']
|
||||||
|
arg_list = (tuple(move_state), tuple(account_type))
|
||||||
|
|
||||||
|
reconciliation_clause = '(l.reconciled IS FALSE)'
|
||||||
|
cr.execute('SELECT debit_move_id, credit_move_id FROM account_partial_reconcile where max_date > %s', (date_from,))
|
||||||
|
reconciled_after_date = []
|
||||||
|
for row in cr.fetchall():
|
||||||
|
reconciled_after_date += [row[0], row[1]]
|
||||||
|
if reconciled_after_date:
|
||||||
|
reconciliation_clause = '(l.reconciled IS FALSE OR l.id IN %s)'
|
||||||
|
arg_list += (tuple(reconciled_after_date),)
|
||||||
|
arg_list += (date_from, tuple(company_ids))
|
||||||
|
query = '''
|
||||||
|
SELECT DISTINCT l.partner_id, UPPER(res_partner.name)
|
||||||
|
FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am
|
||||||
|
WHERE (l.account_id = account_account.id)
|
||||||
|
AND (l.move_id = am.id)
|
||||||
|
AND (am.state IN %s)
|
||||||
|
AND (account_account.account_type IN %s)
|
||||||
|
AND ''' + reconciliation_clause + '''
|
||||||
|
AND (l.date <= %s)
|
||||||
|
AND l.company_id IN %s
|
||||||
|
ORDER BY UPPER(res_partner.name)'''
|
||||||
|
cr.execute(query, arg_list)
|
||||||
|
partners = cr.dictfetchall()
|
||||||
|
# put a total of 0
|
||||||
|
for i in range(7):
|
||||||
|
total.append(0)
|
||||||
|
|
||||||
|
# Build a string like (1,2,3) for easy use in SQL query
|
||||||
|
if not partner_ids:
|
||||||
|
partner_ids = [partner['partner_id'] for partner in partners if partner['partner_id']]
|
||||||
|
lines = dict((partner['partner_id'] or False, []) for partner in partners)
|
||||||
|
if not partner_ids:
|
||||||
|
return [], [], {}
|
||||||
|
|
||||||
|
# This dictionary will store the not due amount of all partners
|
||||||
|
undue_amounts = {}
|
||||||
|
query = '''SELECT l.id
|
||||||
|
FROM account_move_line AS l, account_account, account_move am
|
||||||
|
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
|
||||||
|
AND (am.state IN %s)
|
||||||
|
AND (account_account.account_type IN %s)
|
||||||
|
AND (COALESCE(l.date_maturity,l.date) >= %s)\
|
||||||
|
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
|
||||||
|
AND (l.date <= %s)
|
||||||
|
AND l.company_id IN %s'''
|
||||||
|
cr.execute(query, (tuple(move_state), tuple(account_type), date_from,
|
||||||
|
tuple(partner_ids), date_from, tuple(company_ids)))
|
||||||
|
aml_ids = cr.fetchall()
|
||||||
|
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
|
||||||
|
for line in self.env['account.move.line'].browse(aml_ids):
|
||||||
|
partner_id = line.partner_id.id or False
|
||||||
|
if partner_id not in undue_amounts:
|
||||||
|
undue_amounts[partner_id] = 0.0
|
||||||
|
line_amount = line.company_id.currency_id._convert(line.balance,
|
||||||
|
user_currency,
|
||||||
|
company, date)
|
||||||
|
if user_currency.is_zero(line_amount):
|
||||||
|
continue
|
||||||
|
for partial_line in line.matched_debit_ids:
|
||||||
|
if partial_line.max_date <= date_from:
|
||||||
|
line_currency = partial_line.company_id.currency_id
|
||||||
|
line_amount += line_currency._convert(partial_line.amount,
|
||||||
|
user_currency,
|
||||||
|
company, date)
|
||||||
|
for partial_line in line.matched_credit_ids:
|
||||||
|
if partial_line.max_date <= date_from:
|
||||||
|
line_currency = partial_line.company_id.currency_id
|
||||||
|
line_amount -= line_currency._convert(partial_line.amount,
|
||||||
|
user_currency,
|
||||||
|
company, date)
|
||||||
|
if not self.env.user.company_id.currency_id.is_zero(line_amount):
|
||||||
|
undue_amounts[partner_id] += line_amount
|
||||||
|
lines[partner_id].append({
|
||||||
|
'line': line,
|
||||||
|
'amount': line_amount,
|
||||||
|
'period': 6,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Use one query per period and store results in history (a list variable)
|
||||||
|
# Each history will contain: history[1] = {'<partner_id>': <partner_debit-credit>}
|
||||||
|
history = []
|
||||||
|
for i in range(5):
|
||||||
|
args_list = (tuple(move_state), tuple(account_type), tuple(partner_ids),)
|
||||||
|
dates_query = '(COALESCE(l.date_maturity,l.date)'
|
||||||
|
|
||||||
|
if periods[str(i)]['start'] and periods[str(i)]['stop']:
|
||||||
|
dates_query += ' BETWEEN %s AND %s)'
|
||||||
|
args_list += (periods[str(i)]['start'], periods[str(i)]['stop'])
|
||||||
|
elif periods[str(i)]['start']:
|
||||||
|
dates_query += ' >= %s)'
|
||||||
|
args_list += (periods[str(i)]['start'],)
|
||||||
|
else:
|
||||||
|
dates_query += ' <= %s)'
|
||||||
|
args_list += (periods[str(i)]['stop'],)
|
||||||
|
args_list += (date_from, tuple(company_ids))
|
||||||
|
|
||||||
|
query = '''SELECT l.id
|
||||||
|
FROM account_move_line AS l, account_account, account_move am
|
||||||
|
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
|
||||||
|
AND (am.state IN %s)
|
||||||
|
AND (account_account.account_type IN %s)
|
||||||
|
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
|
||||||
|
AND ''' + dates_query + '''
|
||||||
|
AND (l.date <= %s)
|
||||||
|
AND l.company_id IN %s'''
|
||||||
|
cr.execute(query, args_list)
|
||||||
|
partners_amount = {}
|
||||||
|
aml_ids = cr.fetchall()
|
||||||
|
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
|
||||||
|
for line in self.env['account.move.line'].browse(aml_ids):
|
||||||
|
partner_id = line.partner_id.id or False
|
||||||
|
if partner_id not in partners_amount:
|
||||||
|
partners_amount[partner_id] = 0.0
|
||||||
|
line_currency_id = line.company_id.currency_id
|
||||||
|
line_amount = line_currency_id._convert(line.balance, user_currency, company, date)
|
||||||
|
if user_currency.is_zero(line_amount):
|
||||||
|
continue
|
||||||
|
for partial_line in line.matched_debit_ids:
|
||||||
|
if partial_line.max_date <= date_from:
|
||||||
|
line_currency_id = partial_line.company_id.currency_id
|
||||||
|
line_amount += line_currency_id._convert(
|
||||||
|
partial_line.amount, user_currency, company, date)
|
||||||
|
for partial_line in line.matched_credit_ids:
|
||||||
|
if partial_line.max_date <= date_from:
|
||||||
|
line_currency_id = partial_line.company_id.currency_id
|
||||||
|
line_amount -= line_currency_id._convert(
|
||||||
|
partial_line.amount, user_currency, company, date)
|
||||||
|
if not self.env.user.company_id.currency_id.is_zero(line_amount):
|
||||||
|
partners_amount[partner_id] += line_amount
|
||||||
|
lines[partner_id].append({
|
||||||
|
'line': line,
|
||||||
|
'amount': line_amount,
|
||||||
|
'period': i + 1,
|
||||||
|
})
|
||||||
|
history.append(partners_amount)
|
||||||
|
|
||||||
|
for partner in partners:
|
||||||
|
if partner['partner_id'] is None:
|
||||||
|
partner['partner_id'] = False
|
||||||
|
at_least_one_amount = False
|
||||||
|
values = {}
|
||||||
|
undue_amt = 0.0
|
||||||
|
if partner['partner_id'] in undue_amounts: # Making sure this partner actually was found by the query
|
||||||
|
undue_amt = undue_amounts[partner['partner_id']]
|
||||||
|
|
||||||
|
total[6] = total[6] + undue_amt
|
||||||
|
values['direction'] = undue_amt
|
||||||
|
if not float_is_zero(values['direction'], precision_rounding=self.env.user.company_id.currency_id.rounding):
|
||||||
|
at_least_one_amount = True
|
||||||
|
|
||||||
|
for i in range(5):
|
||||||
|
during = False
|
||||||
|
if partner['partner_id'] in history[i]:
|
||||||
|
during = [history[i][partner['partner_id']]]
|
||||||
|
# Adding counter
|
||||||
|
total[(i)] = total[(i)] + (during and during[0] or 0)
|
||||||
|
values[str(i)] = during and during[0] or 0.0
|
||||||
|
if not float_is_zero(values[str(i)],
|
||||||
|
precision_rounding=self.env.user.company_id.currency_id.rounding):
|
||||||
|
at_least_one_amount = True
|
||||||
|
values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)])
|
||||||
|
## Add for total
|
||||||
|
total[(i + 1)] += values['total']
|
||||||
|
values['partner_id'] = partner['partner_id']
|
||||||
|
if partner['partner_id']:
|
||||||
|
browsed_partner = self.env['res.partner'].browse(partner['partner_id'])
|
||||||
|
values['name'] = browsed_partner.name and len(
|
||||||
|
browsed_partner.name) >= 45 and browsed_partner.name[
|
||||||
|
0:40] + '...' or browsed_partner.name
|
||||||
|
values['trust'] = browsed_partner.trust
|
||||||
|
else:
|
||||||
|
values['name'] = _('Unknown Partner')
|
||||||
|
values['trust'] = False
|
||||||
|
|
||||||
|
if at_least_one_amount or (self._context.get('include_nullified_amount') and lines[partner['partner_id']]):
|
||||||
|
res.append(values)
|
||||||
|
|
||||||
|
return res, total, lines
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
|
||||||
|
model = self.env.context.get('active_model')
|
||||||
|
docs = self.env[model].browse(self.env.context.get('active_id'))
|
||||||
|
|
||||||
|
target_move = data['form'].get('target_move', 'all')
|
||||||
|
date_from = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
|
||||||
|
|
||||||
|
if data['form']['result_selection'] == 'customer':
|
||||||
|
account_type = ['asset_receivable']
|
||||||
|
elif data['form']['result_selection'] == 'supplier':
|
||||||
|
account_type = ['liability_payable']
|
||||||
|
else:
|
||||||
|
account_type = ['asset_receivable', 'liability_payable']
|
||||||
|
partner_ids = data['form']['partner_ids']
|
||||||
|
movelines, total, dummy = self._get_partner_move_lines(
|
||||||
|
account_type, partner_ids, date_from, target_move, data['form']['period_length']
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
'doc_ids': self.ids,
|
||||||
|
'doc_model': model,
|
||||||
|
'data': data['form'],
|
||||||
|
'docs': docs,
|
||||||
|
'time': time,
|
||||||
|
'get_partner_lines': movelines,
|
||||||
|
'get_direction': total,
|
||||||
|
}
|
||||||
@ -0,0 +1,100 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_agedpartnerbalance">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h2>Aged Partner Balance</h2>
|
||||||
|
|
||||||
|
<div class="row mt32">
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Start Date:</strong>
|
||||||
|
<p t-esc="data['date_from']"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Period Length (days)</strong>
|
||||||
|
<p t-esc="data['period_length']"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb32">
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Partner's:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['result_selection'] == 'customer'">Receivable Accounts</span>
|
||||||
|
<span t-if="data['result_selection'] == 'supplier'">Payable Accounts</span>
|
||||||
|
<span t-if="data['result_selection'] == 'customer_supplier'">Receivable and Payable Accounts</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['target_move'] == 'all'">All Entries</span>
|
||||||
|
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Partners</th>
|
||||||
|
<th class="text-end">
|
||||||
|
<span>Not due</span>
|
||||||
|
</th>
|
||||||
|
<th class="text-end"><span t-esc="data['4']['name']"/></th>
|
||||||
|
<th class="text-end"><span t-esc="data['3']['name']"/></th>
|
||||||
|
<th class="text-end"><span t-esc="data['2']['name']"/></th>
|
||||||
|
<th class="text-end"><span t-esc="data['1']['name']"/></th>
|
||||||
|
<th class="text-end"><span t-esc="data['0']['name']"/></th>
|
||||||
|
<th class="text-end">Total</th>
|
||||||
|
</tr>
|
||||||
|
<tr t-if="get_partner_lines">
|
||||||
|
<th>Account Total</th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[6]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[4]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[3]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[2]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[1]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[0]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
<th class="text-end"><span t-esc="get_direction[5]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="get_partner_lines" t-as="partner">
|
||||||
|
<td>
|
||||||
|
<span t-esc="partner['name']"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['direction']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['4']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['3']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['2']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['1']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['0']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="partner['total']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_financial">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h2 t-esc="data['account_report_id'][1]"/>
|
||||||
|
|
||||||
|
<div class="row mt32 mb32">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['target_move'] == 'all'">All Entries</span>
|
||||||
|
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<p>
|
||||||
|
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
|
||||||
|
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports" t-if="data['debit_credit'] == 1">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th class="text-end">Debit</th>
|
||||||
|
<th class="text-end">Credit</th>
|
||||||
|
<th class="text-end">Balance</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="get_account_lines" t-as="a">
|
||||||
|
<t t-if="a['level'] != 0">
|
||||||
|
<t t-if="int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||||
|
<t t-if="not int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
|
||||||
|
<span t-att-style="style" t-esc="a.get('name')"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end" style="white-space: text-nowrap;">
|
||||||
|
<span t-att-style="style" t-esc="a.get('debit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end" style="white-space: text-nowrap;">
|
||||||
|
<span t-att-style="style" t-esc="a.get('credit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end" style="white-space: text-nowrap;">
|
||||||
|
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports" t-if="not data['enable_filter'] and not data['debit_credit']">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th class="text-end">Balance</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="get_account_lines" t-as="a">
|
||||||
|
<t t-if="a['level'] != 0">
|
||||||
|
<t t-if="int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||||
|
<t t-if="not int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
|
||||||
|
<span t-att-style="style" t-esc="a.get('name')"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end"><span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports" t-if="data['enable_filter'] == 1 and not data['debit_credit']">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th class="text-end">Balance</th>
|
||||||
|
<th class="text-end"><span t-esc="data['label_filter']"/></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="get_account_lines" t-as="a">
|
||||||
|
<t t-if="a['level'] != 0">
|
||||||
|
<t t-if="int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||||
|
<t t-if="not int(a.get('level')) > 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
|
||||||
|
<td>
|
||||||
|
<span style="color: white;" t-esc="'..'"/>
|
||||||
|
<span t-att-style="style" t-esc="a.get('name')"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-att-style="style" t-esc="a.get('balance_cmp')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,184 @@
|
|||||||
|
import time
|
||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportGeneralLedger(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_general_ledger'
|
||||||
|
_description = 'General Ledger Report'
|
||||||
|
|
||||||
|
def _get_account_move_entry(self, accounts, analytic_account_ids,
|
||||||
|
partner_ids, init_balance,
|
||||||
|
sortby, display_account):
|
||||||
|
"""
|
||||||
|
:param:
|
||||||
|
accounts: the recordset of accounts
|
||||||
|
analytic_account_ids: the recordset of analytic accounts
|
||||||
|
init_balance: boolean value of initial_balance
|
||||||
|
sortby: sorting by date or partner and journal
|
||||||
|
display_account: type of account(receivable, payable and both)
|
||||||
|
|
||||||
|
Returns a dictionary of accounts with following key and value {
|
||||||
|
'code': account code,
|
||||||
|
'name': account name,
|
||||||
|
'debit': sum of total debit amount,
|
||||||
|
'credit': sum of total credit amount,
|
||||||
|
'balance': total balance,
|
||||||
|
'amount_currency': sum of amount_currency,
|
||||||
|
'move_lines': list of move line
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
cr = self.env.cr
|
||||||
|
MoveLine = self.env['account.move.line']
|
||||||
|
move_lines = {x: [] for x in accounts.ids}
|
||||||
|
|
||||||
|
# Prepare initial sql query and Get the initial move lines
|
||||||
|
if init_balance:
|
||||||
|
context = dict(self.env.context)
|
||||||
|
context['date_from'] = self.env.context.get('date_from')
|
||||||
|
context['date_to'] = False
|
||||||
|
context['initial_bal'] = True
|
||||||
|
if analytic_account_ids:
|
||||||
|
context['analytic_account_ids'] = analytic_account_ids
|
||||||
|
if partner_ids:
|
||||||
|
context['partner_ids'] = partner_ids
|
||||||
|
init_tables, init_where_clause, init_where_params = MoveLine.with_context(context)._query_get()
|
||||||
|
init_wheres = [""]
|
||||||
|
if init_where_clause.strip():
|
||||||
|
init_wheres.append(init_where_clause.strip())
|
||||||
|
init_filters = " AND ".join(init_wheres)
|
||||||
|
filters = init_filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
|
||||||
|
sql = ("""SELECT 0 AS lid, l.account_id AS account_id, '' AS ldate,
|
||||||
|
'' AS lcode, 0.0 AS amount_currency,
|
||||||
|
'' AS analytic_account_id, '' AS lref,
|
||||||
|
'Initial Balance' AS lname, COALESCE(SUM(l.debit),0.0) AS debit,
|
||||||
|
COALESCE(SUM(l.credit),0.0) AS credit,
|
||||||
|
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) as balance,
|
||||||
|
'' AS lpartner_id,\
|
||||||
|
'' AS move_name, '' AS move_id, '' AS currency_code,\
|
||||||
|
NULL AS currency_id,\
|
||||||
|
'' AS invoice_id, '' AS invoice_type, '' AS invoice_number,\
|
||||||
|
'' AS partner_name\
|
||||||
|
FROM account_move_line l\
|
||||||
|
LEFT JOIN account_move m ON (l.move_id=m.id)\
|
||||||
|
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
|
||||||
|
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
|
||||||
|
JOIN account_journal j ON (l.journal_id=j.id)\
|
||||||
|
WHERE l.account_id IN %s""" + filters + ' GROUP BY l.account_id')
|
||||||
|
params = (tuple(accounts.ids),) + tuple(init_where_params)
|
||||||
|
cr.execute(sql, params)
|
||||||
|
for row in cr.dictfetchall():
|
||||||
|
move_lines[row.pop('account_id')].append(row)
|
||||||
|
|
||||||
|
sql_sort = 'l.date, l.move_id'
|
||||||
|
if sortby == 'sort_journal_partner':
|
||||||
|
sql_sort = 'j.code, p.name, l.move_id'
|
||||||
|
|
||||||
|
# Prepare sql query base on selected parameters from wizard
|
||||||
|
context = dict(self.env.context)
|
||||||
|
if analytic_account_ids:
|
||||||
|
context['analytic_account_ids'] = analytic_account_ids
|
||||||
|
if partner_ids:
|
||||||
|
context['partner_ids'] = partner_ids
|
||||||
|
tables, where_clause, where_params = MoveLine.with_context(context)._query_get()
|
||||||
|
wheres = [""]
|
||||||
|
if where_clause.strip():
|
||||||
|
wheres.append(where_clause.strip())
|
||||||
|
filters = " AND ".join(wheres)
|
||||||
|
filters = filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
|
||||||
|
|
||||||
|
# Get move lines base on sql query and Calculate the total balance of move lines
|
||||||
|
sql = ('''SELECT l.id AS lid, l.account_id AS account_id,
|
||||||
|
l.date AS ldate, j.code AS lcode, l.currency_id,
|
||||||
|
l.amount_currency, '' AS analytic_account_id,
|
||||||
|
l.ref AS lref, l.name AS lname, COALESCE(l.debit,0) AS debit,
|
||||||
|
COALESCE(l.credit,0) AS credit,
|
||||||
|
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) AS balance,\
|
||||||
|
m.name AS move_name, c.symbol AS currency_code,
|
||||||
|
p.name AS partner_name\
|
||||||
|
FROM account_move_line l\
|
||||||
|
JOIN account_move m ON (l.move_id=m.id)\
|
||||||
|
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
|
||||||
|
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
|
||||||
|
JOIN account_journal j ON (l.journal_id=j.id)\
|
||||||
|
JOIN account_account acc ON (l.account_id = acc.id) \
|
||||||
|
WHERE l.account_id IN %s ''' + filters + ''' GROUP BY l.id,
|
||||||
|
l.account_id, l.date, j.code, l.currency_id, l.amount_currency,
|
||||||
|
l.ref, l.name, m.name, c.symbol, p.name ORDER BY ''' + sql_sort)
|
||||||
|
params = (tuple(accounts.ids),) + tuple(where_params)
|
||||||
|
cr.execute(sql, params)
|
||||||
|
|
||||||
|
for row in cr.dictfetchall():
|
||||||
|
balance = 0
|
||||||
|
for line in move_lines.get(row['account_id']):
|
||||||
|
balance += line['debit'] - line['credit']
|
||||||
|
row['balance'] += balance
|
||||||
|
move_lines[row.pop('account_id')].append(row)
|
||||||
|
|
||||||
|
# Calculate the debit, credit and balance for Accounts
|
||||||
|
account_res = []
|
||||||
|
for account in accounts:
|
||||||
|
currency = account.currency_id and account.currency_id or account.company_id.currency_id
|
||||||
|
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
|
||||||
|
res['code'] = account.code
|
||||||
|
res['name'] = account.name
|
||||||
|
res['move_lines'] = move_lines[account.id]
|
||||||
|
for line in res.get('move_lines'):
|
||||||
|
res['debit'] += line['debit']
|
||||||
|
res['credit'] += line['credit']
|
||||||
|
res['balance'] = line['balance']
|
||||||
|
if display_account == 'all':
|
||||||
|
account_res.append(res)
|
||||||
|
if display_account == 'movement' and res.get('move_lines'):
|
||||||
|
account_res.append(res)
|
||||||
|
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
|
||||||
|
account_res.append(res)
|
||||||
|
return account_res
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form') or not self.env.context.get('active_model'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
model = self.env.context.get('active_model')
|
||||||
|
docs = self.env[model].browse(self.env.context.get('active_ids', []))
|
||||||
|
init_balance = data['form'].get('initial_balance', True)
|
||||||
|
sortby = data['form'].get('sortby', 'sort_date')
|
||||||
|
display_account = data['form']['display_account']
|
||||||
|
codes = []
|
||||||
|
if data['form'].get('journal_ids', False):
|
||||||
|
codes = [journal.code for journal in
|
||||||
|
self.env['account.journal'].search(
|
||||||
|
[('id', 'in', data['form']['journal_ids'])])]
|
||||||
|
analytic_account_ids = False
|
||||||
|
if data['form'].get('analytic_account_ids', False):
|
||||||
|
analytic_account_ids = self.env['account.analytic.account'].search(
|
||||||
|
[('id', 'in', data['form']['analytic_account_ids'])])
|
||||||
|
partner_ids = False
|
||||||
|
if data['form'].get('partner_ids', False):
|
||||||
|
partner_ids = self.env['res.partner'].search(
|
||||||
|
[('id', 'in', data['form']['partner_ids'])])
|
||||||
|
if model == 'account.account':
|
||||||
|
accounts = docs
|
||||||
|
else:
|
||||||
|
domain = []
|
||||||
|
if data['form'].get('account_ids', False):
|
||||||
|
domain.append(('id', 'in', data['form']['account_ids']))
|
||||||
|
accounts = self.env['account.account'].search(domain)
|
||||||
|
accounts_res = self.with_context(
|
||||||
|
data['form'].get('used_context', {}))._get_account_move_entry(
|
||||||
|
accounts,
|
||||||
|
analytic_account_ids,
|
||||||
|
partner_ids,
|
||||||
|
init_balance, sortby, display_account)
|
||||||
|
return {
|
||||||
|
'doc_ids': docids,
|
||||||
|
'doc_model': model,
|
||||||
|
'data': data['form'],
|
||||||
|
'docs': docs,
|
||||||
|
'time': time,
|
||||||
|
'Accounts': accounts_res,
|
||||||
|
'print_journal': codes,
|
||||||
|
'accounts': accounts,
|
||||||
|
'partner_ids': partner_ids,
|
||||||
|
'analytic_account_ids': analytic_account_ids,
|
||||||
|
}
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_general_ledger">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h2><span t-esc="res_company.name"/>: General ledger</h2>
|
||||||
|
|
||||||
|
<div class="row mt32">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Journals:</strong>
|
||||||
|
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
|
||||||
|
</div>
|
||||||
|
<t groups="analytic.group_analytic_accounting">
|
||||||
|
<t t-if="analytic_account_ids">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Analytic Accounts:</strong>
|
||||||
|
<p t-esc="', '.join([aa.name or '' for aa in analytic_account_ids ])"/>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Display Account</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['display_account'] == 'all'">All accounts'</span>
|
||||||
|
<span t-if="data['display_account'] == 'movement'">With movements</span>
|
||||||
|
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p t-if="data['target_move'] == 'all'">All Entries</p>
|
||||||
|
<p t-if="data['target_move'] == 'posted'">All Posted Entries</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb32">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Sorted By:</strong>
|
||||||
|
<p t-if="data['sortby'] == 'sort_date'">Date</p>
|
||||||
|
<p t-if="data['sortby'] == 'sort_journal_partner'">Journal and Partner</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
|
||||||
|
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr class="text-center">
|
||||||
|
<th>Date</th>
|
||||||
|
<th>JRNL</th>
|
||||||
|
<th>Partner</th>
|
||||||
|
<th>Ref</th>
|
||||||
|
<th>Move</th>
|
||||||
|
<t groups="analytic.group_analytic_accounting">
|
||||||
|
<th>Analytic Account</th>
|
||||||
|
</t>
|
||||||
|
<th>Entry Label</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
<th>Balance</th>
|
||||||
|
<th groups="base.group_multi_currency">Currency</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<t t-foreach="Accounts" t-as="account">
|
||||||
|
<tr style="font-weight: bold;">
|
||||||
|
<td colspan="6">
|
||||||
|
<span style="color: white;" t-esc="'..'"/>
|
||||||
|
<span t-esc="account['code']"/>
|
||||||
|
<span t-esc="account['name']"/>
|
||||||
|
</td>
|
||||||
|
<t groups="analytic.group_analytic_accounting">
|
||||||
|
<td></td>
|
||||||
|
</t>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td groups="base.group_multi_currency"/>
|
||||||
|
</tr>
|
||||||
|
<tr t-foreach="account['move_lines']" t-as="line">
|
||||||
|
<td><span t-esc="line['ldate']"/></td>
|
||||||
|
<td><span t-esc="line['lcode']"/></td>
|
||||||
|
<td><span t-esc="line['partner_name']"/></td>
|
||||||
|
<td><span t-if="line['lref']" t-esc="line['lref']"/></td>
|
||||||
|
<td><span t-esc="line['move_name']"/></td>
|
||||||
|
<t groups="analytic.group_analytic_accounting">
|
||||||
|
<td><span t-esc="line['analytic_account_id']"/></td>
|
||||||
|
</t>
|
||||||
|
<td><span t-esc="line['lname']"/></td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end" groups="base.group_multi_currency">
|
||||||
|
<span t-esc="line['amount_currency'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
|
||||||
|
<span t-esc="line['currency_code'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</t>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
import time
|
||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportJournal(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_journal'
|
||||||
|
_description = 'Journal Audit Report'
|
||||||
|
|
||||||
|
def lines(self, target_move, journal_ids, sort_selection, data):
|
||||||
|
if isinstance(journal_ids, int):
|
||||||
|
journal_ids = [journal_ids]
|
||||||
|
|
||||||
|
move_state = ['draft', 'posted']
|
||||||
|
if target_move == 'posted':
|
||||||
|
move_state = ['posted']
|
||||||
|
|
||||||
|
query_get_clause = self._get_query_get_clause(data)
|
||||||
|
params = [tuple(move_state), tuple(journal_ids)] + query_get_clause[2]
|
||||||
|
query = 'SELECT "account_move_line".id FROM ' + query_get_clause[0] + ', account_move am, account_account acc WHERE "account_move_line".account_id = acc.id AND "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ORDER BY '
|
||||||
|
if sort_selection == 'date':
|
||||||
|
query += '"account_move_line".date'
|
||||||
|
else:
|
||||||
|
query += 'am.name'
|
||||||
|
query += ', "account_move_line".move_id, acc.code'
|
||||||
|
self.env.cr.execute(query, tuple(params))
|
||||||
|
ids = (x[0] for x in self.env.cr.fetchall())
|
||||||
|
return self.env['account.move.line'].browse(ids)
|
||||||
|
|
||||||
|
def _sum_debit(self, data, journal_id):
|
||||||
|
move_state = ['draft', 'posted']
|
||||||
|
if data['form'].get('target_move', 'all') == 'posted':
|
||||||
|
move_state = ['posted']
|
||||||
|
|
||||||
|
query_get_clause = self._get_query_get_clause(data)
|
||||||
|
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
|
||||||
|
self.env.cr.execute('SELECT SUM(debit) FROM ' + query_get_clause[0] + ', account_move am '
|
||||||
|
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
|
||||||
|
tuple(params))
|
||||||
|
return self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
def _sum_credit(self, data, journal_id):
|
||||||
|
move_state = ['draft', 'posted']
|
||||||
|
if data['form'].get('target_move', 'all') == 'posted':
|
||||||
|
move_state = ['posted']
|
||||||
|
|
||||||
|
query_get_clause = self._get_query_get_clause(data)
|
||||||
|
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
|
||||||
|
self.env.cr.execute('SELECT SUM(credit) FROM ' + query_get_clause[0] + ', account_move am '
|
||||||
|
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
|
||||||
|
tuple(params))
|
||||||
|
return self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
def _get_taxes(self, data, journal_id):
|
||||||
|
move_state = ['draft', 'posted']
|
||||||
|
if data['form'].get('target_move', 'all') == 'posted':
|
||||||
|
move_state = ['posted']
|
||||||
|
|
||||||
|
query_get_clause = self._get_query_get_clause(data)
|
||||||
|
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
|
||||||
|
query = """
|
||||||
|
SELECT rel.account_tax_id, SUM("account_move_line".balance) AS base_amount
|
||||||
|
FROM account_move_line_account_tax_rel rel, """ + query_get_clause[0] + """
|
||||||
|
LEFT JOIN account_move am ON "account_move_line".move_id = am.id
|
||||||
|
WHERE "account_move_line".id = rel.account_move_line_id
|
||||||
|
AND am.state IN %s
|
||||||
|
AND "account_move_line".journal_id IN %s
|
||||||
|
AND """ + query_get_clause[1] + """
|
||||||
|
GROUP BY rel.account_tax_id"""
|
||||||
|
self.env.cr.execute(query, tuple(params))
|
||||||
|
ids = []
|
||||||
|
base_amounts = {}
|
||||||
|
for row in self.env.cr.fetchall():
|
||||||
|
ids.append(row[0])
|
||||||
|
base_amounts[row[0]] = row[1]
|
||||||
|
|
||||||
|
|
||||||
|
res = {}
|
||||||
|
for tax in self.env['account.tax'].browse(ids):
|
||||||
|
self.env.cr.execute('SELECT sum(debit - credit) FROM ' + query_get_clause[0] + ', account_move am '
|
||||||
|
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' AND tax_line_id = %s',
|
||||||
|
tuple(params + [tax.id]))
|
||||||
|
res[tax] = {
|
||||||
|
'base_amount': base_amounts[tax.id],
|
||||||
|
'tax_amount': self.env.cr.fetchone()[0] or 0.0,
|
||||||
|
}
|
||||||
|
if journal_id.type == 'sale':
|
||||||
|
#sales operation are credits
|
||||||
|
res[tax]['base_amount'] = res[tax]['base_amount'] * -1
|
||||||
|
res[tax]['tax_amount'] = res[tax]['tax_amount'] * -1
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _get_query_get_clause(self, data):
|
||||||
|
return self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
|
||||||
|
target_move = data['form'].get('target_move', 'all')
|
||||||
|
sort_selection = data['form'].get('sort_selection', 'date')
|
||||||
|
|
||||||
|
res = {}
|
||||||
|
for journal in data['form']['journal_ids']:
|
||||||
|
res[journal] = self.with_context(data['form'].get('used_context', {})).lines(target_move, journal, sort_selection, data)
|
||||||
|
return {
|
||||||
|
'doc_ids': data['form']['journal_ids'],
|
||||||
|
'doc_model': self.env['account.journal'],
|
||||||
|
'data': data,
|
||||||
|
'docs': self.env['account.journal'].browse(data['form']['journal_ids']),
|
||||||
|
'time': time,
|
||||||
|
'lines': res,
|
||||||
|
'sum_credit': self._sum_credit,
|
||||||
|
'sum_debit': self._sum_debit,
|
||||||
|
'get_taxes': self._get_taxes,
|
||||||
|
}
|
||||||
@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_journal">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h2><t t-esc="o.name"/> Journal</h2>
|
||||||
|
|
||||||
|
<div class="row mt32">
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Company:</strong>
|
||||||
|
<p t-esc="res_company.name"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Journal:</strong>
|
||||||
|
<p t-esc="o.name"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Entries Sorted By:</strong>
|
||||||
|
<p t-if="data['form'].get('sort_selection') != 'l.date'">Journal Entry Number</p>
|
||||||
|
<p t-if="data['form'].get('sort_selection') == 'l.date'">Date</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
|
||||||
|
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Move</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Account</th>
|
||||||
|
<th>Partner</th>
|
||||||
|
<th>Label</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
<th t-if="data['form']['amount_currency']">Currency</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="lines[o.id]" t-as="aml">
|
||||||
|
<td><span t-esc="aml.move_id.name != '/' and aml.move_id.name or ('*'+str(aml.move_id.id))"/></td>
|
||||||
|
<td><span t-field="aml.date"/></td>
|
||||||
|
<td><span t-field="aml.account_id.code"/></td>
|
||||||
|
<td><span t-esc="aml.sudo().partner_id and aml.sudo().partner_id.name and aml.sudo().partner_id.name[:23] or ''"/></td>
|
||||||
|
<td><span t-esc="aml.name and aml.name[:35]"/></td>
|
||||||
|
<td><span t-esc="aml.debit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
<td><span t-esc="aml.credit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
<td t-if="data['form']['amount_currency'] and aml.amount_currency">
|
||||||
|
<span t-esc="aml.amount_currency" t-options="{'widget': 'monetary', 'display_currency': aml.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 pull-right">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Total</strong></td>
|
||||||
|
<td><span t-esc="sum_debit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
<td><span t-esc="sum_credit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4">
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr><th colspan="3">Tax Declaration</th></tr>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Base Amount</th>
|
||||||
|
<th>Tax Amount</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<t t-set="taxes" t-value="get_taxes(data, o)"/>
|
||||||
|
<tr t-foreach="taxes" t-as="tax">
|
||||||
|
<td><span t-esc="tax.name"/></td>
|
||||||
|
<td><span t-esc="taxes[tax]['base_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
<td><span t-esc="taxes[tax]['tax_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_journal_entries">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-call="web.external_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<div class="page" style="font-size:15px;">
|
||||||
|
<div>
|
||||||
|
<h3>
|
||||||
|
<span t-field="o.name"/>
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
<br></br>
|
||||||
|
<div class="row">
|
||||||
|
<table width="100%" class="table-bordered">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>Journal:
|
||||||
|
<span t-field="o.journal_id.name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
Date:
|
||||||
|
<span t-field="o.date" t-options="{'widget': 'date'}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Partner:
|
||||||
|
<span t-field="o.partner_id.display_name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
Reference:
|
||||||
|
<span t-field="o.ref"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<br></br>
|
||||||
|
<table width="100%" class="table-bordered">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Account</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Partner</th>
|
||||||
|
<th>Label</th>
|
||||||
|
<th>Analytic Account</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<t t-set="total_credit" t-value="0"/>
|
||||||
|
<t t-set="total_debit" t-value="0"/>
|
||||||
|
<t t-foreach="o.line_ids" t-as="line">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.account_id.name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.date" t-options="{'widget': 'date'}"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.partner_id.display_name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.analytic_account_id.display_name"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-field="line.debit"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-field="line.credit"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<t t-set="total_credit" t-value="total_credit + line.credit"/>
|
||||||
|
<t t-set="total_debit" t-value="total_debit + line.debit"/>
|
||||||
|
</tr>
|
||||||
|
</t>
|
||||||
|
</tbody>
|
||||||
|
<tfooter>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="total_debit"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="total_credit"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tfooter>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,122 @@
|
|||||||
|
import time
|
||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportPartnerLedger(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_partnerledger'
|
||||||
|
_description = 'Partner Ledger Report'
|
||||||
|
|
||||||
|
def _lines(self, data, partner):
|
||||||
|
full_account = []
|
||||||
|
currency = self.env['res.currency']
|
||||||
|
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
|
||||||
|
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
|
||||||
|
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
|
||||||
|
query = """
|
||||||
|
SELECT "account_move_line".id, "account_move_line".date, j.code, acc.code as a_code, acc.name as a_name, "account_move_line".ref, m.name as move_name, "account_move_line".name, "account_move_line".debit, "account_move_line".credit, "account_move_line".amount_currency,"account_move_line".currency_id, c.symbol AS currency_code
|
||||||
|
FROM """ + query_get_data[0] + """
|
||||||
|
LEFT JOIN account_journal j ON ("account_move_line".journal_id = j.id)
|
||||||
|
LEFT JOIN account_account acc ON ("account_move_line".account_id = acc.id)
|
||||||
|
LEFT JOIN res_currency c ON ("account_move_line".currency_id=c.id)
|
||||||
|
LEFT JOIN account_move m ON (m.id="account_move_line".move_id)
|
||||||
|
WHERE "account_move_line".partner_id = %s
|
||||||
|
AND m.state IN %s
|
||||||
|
AND "account_move_line".account_id IN %s AND """ + query_get_data[1] + reconcile_clause + """
|
||||||
|
ORDER BY "account_move_line".date"""
|
||||||
|
self.env.cr.execute(query, tuple(params))
|
||||||
|
res = self.env.cr.dictfetchall()
|
||||||
|
sum = 0.0
|
||||||
|
lang_code = self.env.context.get('lang') or 'en_US'
|
||||||
|
lang = self.env['res.lang']
|
||||||
|
lang_id = lang._lang_get(lang_code)
|
||||||
|
date_format = lang_id.date_format
|
||||||
|
for r in res:
|
||||||
|
r['date'] = r['date']
|
||||||
|
r['displayed_name'] = '-'.join(
|
||||||
|
r[field_name] for field_name in ('move_name', 'ref', 'name')
|
||||||
|
if r[field_name] not in (None, '', '/')
|
||||||
|
)
|
||||||
|
sum += r['debit'] - r['credit']
|
||||||
|
r['progress'] = sum
|
||||||
|
r['currency_id'] = currency.browse(r.get('currency_id'))
|
||||||
|
full_account.append(r)
|
||||||
|
return full_account
|
||||||
|
|
||||||
|
def _sum_partner(self, data, partner, field):
|
||||||
|
if field not in ['debit', 'credit', 'debit - credit']:
|
||||||
|
return
|
||||||
|
result = 0.0
|
||||||
|
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
|
||||||
|
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
|
||||||
|
|
||||||
|
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
|
||||||
|
query = """SELECT sum(""" + field + """)
|
||||||
|
FROM """ + query_get_data[0] + """, account_move AS m
|
||||||
|
WHERE "account_move_line".partner_id = %s
|
||||||
|
AND m.id = "account_move_line".move_id
|
||||||
|
AND m.state IN %s
|
||||||
|
AND account_id IN %s
|
||||||
|
AND """ + query_get_data[1] + reconcile_clause
|
||||||
|
self.env.cr.execute(query, tuple(params))
|
||||||
|
|
||||||
|
contemp = self.env.cr.fetchone()
|
||||||
|
if contemp is not None:
|
||||||
|
result = contemp[0] or 0.0
|
||||||
|
return result
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
data['computed'] = {}
|
||||||
|
|
||||||
|
obj_partner = self.env['res.partner']
|
||||||
|
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
|
||||||
|
data['computed']['move_state'] = ['draft', 'posted']
|
||||||
|
if data['form'].get('target_move', 'all') == 'posted':
|
||||||
|
data['computed']['move_state'] = ['posted']
|
||||||
|
result_selection = data['form'].get('result_selection', 'customer')
|
||||||
|
if result_selection == 'supplier':
|
||||||
|
data['computed']['ACCOUNT_TYPE'] = ['liability_payable']
|
||||||
|
elif result_selection == 'customer':
|
||||||
|
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable']
|
||||||
|
else:
|
||||||
|
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable', 'liability_payable']
|
||||||
|
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT a.id
|
||||||
|
FROM account_account a
|
||||||
|
WHERE a.account_type IN %s
|
||||||
|
AND NOT a.deprecated""", (tuple(data['computed']['ACCOUNT_TYPE']),))
|
||||||
|
data['computed']['account_ids'] = [a for (a,) in self.env.cr.fetchall()]
|
||||||
|
params = [tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
|
||||||
|
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
|
||||||
|
query = """
|
||||||
|
SELECT DISTINCT "account_move_line".partner_id
|
||||||
|
FROM """ + query_get_data[0] + """, account_account AS account, account_move AS am
|
||||||
|
WHERE "account_move_line".partner_id IS NOT NULL
|
||||||
|
AND "account_move_line".account_id = account.id
|
||||||
|
AND am.id = "account_move_line".move_id
|
||||||
|
AND am.state IN %s
|
||||||
|
AND "account_move_line".account_id IN %s
|
||||||
|
AND NOT account.deprecated
|
||||||
|
AND """ + query_get_data[1] + reconcile_clause
|
||||||
|
self.env.cr.execute(query, tuple(params))
|
||||||
|
if data['form']['partner_ids']:
|
||||||
|
partner_ids = data['form']['partner_ids']
|
||||||
|
else:
|
||||||
|
partner_ids = [res['partner_id'] for res in
|
||||||
|
self.env.cr.dictfetchall()]
|
||||||
|
partners = obj_partner.browse(partner_ids)
|
||||||
|
partners = sorted(partners, key=lambda x: (x.ref or '', x.name or ''))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'doc_ids': partner_ids,
|
||||||
|
'doc_model': self.env['res.partner'],
|
||||||
|
'data': data,
|
||||||
|
'docs': partners,
|
||||||
|
'time': time,
|
||||||
|
'lines': self._lines,
|
||||||
|
'sum_partner': self._sum_partner,
|
||||||
|
}
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_partnerledger">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<div class="page">
|
||||||
|
<h2>Partner Ledger</h2>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Company:</strong>
|
||||||
|
<p t-esc="res_company.name"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<t t-if="data['form']['date_from']">
|
||||||
|
<strong>Date from :</strong>
|
||||||
|
<span t-esc="data['form']['date_from']"/>
|
||||||
|
<br/>
|
||||||
|
</t>
|
||||||
|
<t t-if="data['form']['date_to']">
|
||||||
|
<strong>Date to :</strong>
|
||||||
|
<span t-esc="data['form']['date_to']"/>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
|
||||||
|
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>JRNL</th>
|
||||||
|
<th>Account</th>
|
||||||
|
<th>Ref</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
<th>Balance</th>
|
||||||
|
<th t-if="data['form']['amount_currency']">Currency</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td colspan="4">
|
||||||
|
<strong t-esc="o.ref"/>
|
||||||
|
-
|
||||||
|
<strong t-esc="o.name"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<strong t-esc="sum_partner(data, o, 'debit')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<strong t-esc="sum_partner(data, o, 'credit')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<strong t-esc="sum_partner(data, o, 'debit - credit')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr t-foreach="lines(data, o)" t-as="line">
|
||||||
|
<td>
|
||||||
|
<span t-esc="line['date']"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-esc="line['code']"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-esc="line['a_code']"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-esc="line['displayed_name']"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['debit']"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['credit']"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-esc="line['progress']"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end" t-if="data['form']['amount_currency']">
|
||||||
|
<t t-if="line['currency_id']">
|
||||||
|
<span t-esc="line['amount_currency']"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': line['currency_id']}"/>
|
||||||
|
</t>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</t>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportTax(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_tax'
|
||||||
|
_description = 'Tax Report'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
return {
|
||||||
|
'data': data['form'],
|
||||||
|
'lines': self.get_lines(data.get('form')),
|
||||||
|
}
|
||||||
|
|
||||||
|
def _sql_from_amls_one(self):
|
||||||
|
sql = """SELECT "account_move_line".tax_line_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
|
||||||
|
FROM %s
|
||||||
|
WHERE %s GROUP BY "account_move_line".tax_line_id"""
|
||||||
|
return sql
|
||||||
|
|
||||||
|
def _sql_from_amls_two(self):
|
||||||
|
sql = """SELECT r.account_tax_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
|
||||||
|
FROM %s
|
||||||
|
INNER JOIN account_move_line_account_tax_rel r ON ("account_move_line".id = r.account_move_line_id)
|
||||||
|
INNER JOIN account_tax t ON (r.account_tax_id = t.id)
|
||||||
|
WHERE %s GROUP BY r.account_tax_id"""
|
||||||
|
return sql
|
||||||
|
|
||||||
|
def _compute_from_amls(self, options, taxes):
|
||||||
|
#compute the tax amount
|
||||||
|
sql = self._sql_from_amls_one()
|
||||||
|
tables, where_clause, where_params = self.env['account.move.line']._query_get()
|
||||||
|
query = sql % (tables, where_clause)
|
||||||
|
self.env.cr.execute(query, where_params)
|
||||||
|
results = self.env.cr.fetchall()
|
||||||
|
for result in results:
|
||||||
|
if result[0] in taxes:
|
||||||
|
taxes[result[0]]['tax'] = abs(result[1])
|
||||||
|
|
||||||
|
#compute the net amount
|
||||||
|
sql2 = self._sql_from_amls_two()
|
||||||
|
query = sql2 % (tables, where_clause)
|
||||||
|
self.env.cr.execute(query, where_params)
|
||||||
|
results = self.env.cr.fetchall()
|
||||||
|
for result in results:
|
||||||
|
if result[0] in taxes:
|
||||||
|
taxes[result[0]]['net'] = abs(result[1])
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def get_lines(self, options):
|
||||||
|
taxes = {}
|
||||||
|
for tax in self.env['account.tax'].search([('type_tax_use', '!=', 'none')]):
|
||||||
|
if tax.children_tax_ids:
|
||||||
|
for child in tax.children_tax_ids:
|
||||||
|
if child.type_tax_use != 'none':
|
||||||
|
continue
|
||||||
|
taxes[child.id] = {'tax': 0, 'net': 0, 'name': child.name, 'type': tax.type_tax_use}
|
||||||
|
else:
|
||||||
|
taxes[tax.id] = {'tax': 0, 'net': 0, 'name': tax.name, 'type': tax.type_tax_use}
|
||||||
|
self.with_context(date_from=options['date_from'], date_to=options['date_to'],
|
||||||
|
state=options['target_move'],
|
||||||
|
strict_range=True)._compute_from_amls(options, taxes)
|
||||||
|
groups = dict((tp, []) for tp in ['sale', 'purchase'])
|
||||||
|
for tax in taxes.values():
|
||||||
|
if tax['tax']:
|
||||||
|
groups[tax['type']].append(tax)
|
||||||
|
return groups
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_tax">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h3>Tax Report</h3>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Company:</strong>
|
||||||
|
<p t-esc="res_company.name"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<t>
|
||||||
|
<strong>Date from :</strong>
|
||||||
|
<span t-esc="data['date_from']"/>
|
||||||
|
</t>
|
||||||
|
<br/>
|
||||||
|
<t>
|
||||||
|
<strong>Date to :</strong>
|
||||||
|
<span t-esc="data['date_to']"/>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['target_move'] == 'all'">All Entries</span>
|
||||||
|
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr align="left">
|
||||||
|
<th>Sale</th>
|
||||||
|
<th>Net</th>
|
||||||
|
<th>Tax</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr align="left" t-foreach="lines['sale']" t-as="line">
|
||||||
|
<td>
|
||||||
|
<span t-esc="line.get('name')"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-att-style="style" t-esc="line.get('net')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-att-style="style" t-esc="line.get('tax')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<br/>
|
||||||
|
<tr align="left">
|
||||||
|
<td>
|
||||||
|
<strong>Purchase</strong>
|
||||||
|
</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr align="left" t-foreach="lines['purchase']" t-as="line">
|
||||||
|
<td>
|
||||||
|
<span t-esc="line.get('name')"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-att-style="style" t-esc="line.get('net')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-att-style="style" t-esc="line.get('tax')"
|
||||||
|
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
import time
|
||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportTrialBalance(models.AbstractModel):
|
||||||
|
_name = 'report.accounting_pdf_reports.report_trialbalance'
|
||||||
|
_description = 'Trial Balance Report'
|
||||||
|
|
||||||
|
def _get_accounts(self, accounts, display_account):
|
||||||
|
""" compute the balance, debit and credit for the provided accounts
|
||||||
|
:Arguments:
|
||||||
|
`accounts`: list of accounts record,
|
||||||
|
`display_account`: it's used to display either all accounts or those accounts which balance is > 0
|
||||||
|
:Returns a list of dictionary of Accounts with following key and value
|
||||||
|
`name`: Account name,
|
||||||
|
`code`: Account code,
|
||||||
|
`credit`: total amount of credit,
|
||||||
|
`debit`: total amount of debit,
|
||||||
|
`balance`: total amount of balance,
|
||||||
|
"""
|
||||||
|
|
||||||
|
account_result = {}
|
||||||
|
# Prepare sql query base on selected parameters from wizard
|
||||||
|
tables, where_clause, where_params = self.env['account.move.line']._query_get()
|
||||||
|
tables = tables.replace('"','')
|
||||||
|
if not tables:
|
||||||
|
tables = 'account_move_line'
|
||||||
|
wheres = [""]
|
||||||
|
if where_clause.strip():
|
||||||
|
wheres.append(where_clause.strip())
|
||||||
|
filters = " AND ".join(wheres)
|
||||||
|
# compute the balance, debit and credit for the provided accounts
|
||||||
|
request = ("SELECT account_id AS id, SUM(debit) AS debit, SUM(credit) AS credit, "
|
||||||
|
"(SUM(debit) - SUM(credit)) AS balance" +\
|
||||||
|
" FROM " + tables + " WHERE account_id IN %s " + filters + " GROUP BY account_id")
|
||||||
|
params = (tuple(accounts.ids),) + tuple(where_params)
|
||||||
|
self.env.cr.execute(request, params)
|
||||||
|
for row in self.env.cr.dictfetchall():
|
||||||
|
account_result[row.pop('id')] = row
|
||||||
|
|
||||||
|
account_res = []
|
||||||
|
for account in accounts:
|
||||||
|
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
|
||||||
|
currency = account.currency_id and account.currency_id or account.company_id.currency_id
|
||||||
|
res['code'] = account.code
|
||||||
|
res['name'] = account.name
|
||||||
|
if account.id in account_result:
|
||||||
|
res['debit'] = account_result[account.id].get('debit')
|
||||||
|
res['credit'] = account_result[account.id].get('credit')
|
||||||
|
res['balance'] = account_result[account.id].get('balance')
|
||||||
|
if display_account == 'all':
|
||||||
|
account_res.append(res)
|
||||||
|
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
|
||||||
|
account_res.append(res)
|
||||||
|
if display_account == 'movement' and (not currency.is_zero(res['debit']) or not currency.is_zero(res['credit'])):
|
||||||
|
account_res.append(res)
|
||||||
|
return account_res
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
if not data.get('form') or not self.env.context.get('active_model'):
|
||||||
|
raise UserError(_("Form content is missing, this report cannot be printed."))
|
||||||
|
|
||||||
|
model = self.env.context.get('active_model')
|
||||||
|
docs = self.env[model].browse(self.env.context.get('active_ids', []))
|
||||||
|
display_account = data['form'].get('display_account')
|
||||||
|
accounts = docs if model == 'account.account' else self.env['account.account'].search([])
|
||||||
|
context = data['form'].get('used_context')
|
||||||
|
analytic_accounts = []
|
||||||
|
if data['form'].get('analytic_account_ids'):
|
||||||
|
analytic_account_ids = self.env['account.analytic.account'].browse(data['form'].get('analytic_account_ids'))
|
||||||
|
context['analytic_account_ids'] = analytic_account_ids
|
||||||
|
analytic_accounts = [account.name for account in analytic_account_ids]
|
||||||
|
account_res = self.with_context(context)._get_accounts(accounts, display_account)
|
||||||
|
codes = []
|
||||||
|
if data['form'].get('journal_ids', False):
|
||||||
|
codes = [journal.code for journal in
|
||||||
|
self.env['account.journal'].search(
|
||||||
|
[('id', 'in', data['form']['journal_ids'])])]
|
||||||
|
return {
|
||||||
|
'doc_ids': self.ids,
|
||||||
|
'doc_model': model,
|
||||||
|
'data': data['form'],
|
||||||
|
'docs': docs,
|
||||||
|
'print_journal': codes,
|
||||||
|
'analytic_accounts': analytic_accounts,
|
||||||
|
'time': time,
|
||||||
|
'Accounts': account_res,
|
||||||
|
}
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_trialbalance">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-set="data_report_margin_top" t-value="12"/>
|
||||||
|
<t t-set="data_report_header_spacing" t-value="9"/>
|
||||||
|
<t t-set="data_report_dpi" t-value="110"/>
|
||||||
|
<t t-call="web.internal_layout">
|
||||||
|
<div class="page">
|
||||||
|
<h2><span t-esc="res_company.name"/>: Trial Balance</h2>
|
||||||
|
|
||||||
|
<div class="row mt32">
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Display Account:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['display_account'] == 'all'">All accounts</span>
|
||||||
|
<span t-if="data['display_account'] == 'movement'">With movements</span>
|
||||||
|
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<p>
|
||||||
|
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
|
||||||
|
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<strong>Target Moves:</strong>
|
||||||
|
<p>
|
||||||
|
<span t-if="data['target_move'] == 'all'">All Entries</span>
|
||||||
|
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt32">
|
||||||
|
<div class="col-6">
|
||||||
|
<strong>Journals:</strong>
|
||||||
|
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<t t-if="analytic_accounts">
|
||||||
|
<strong>Analytic Accounts:</strong>
|
||||||
|
<p t-esc="', '.join([ analytic_account or '' for analytic_account in analytic_accounts ])"/>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-sm table-reports">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Code</th>
|
||||||
|
<th>Account</th>
|
||||||
|
<th class="text-end">Debit</th>
|
||||||
|
<th class="text-end">Credit</th>
|
||||||
|
<th class="text-end">Balance</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="Accounts" t-as="account">
|
||||||
|
<td>
|
||||||
|
<span t-att-style="style" t-esc="account['code']"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span style="color: white;" t-esc="'..'"/>
|
||||||
|
<span t-att-style="style" t-esc="account['name']"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-att-style="style" t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-att-style="style" t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
<td class="text-end">
|
||||||
|
<span t-att-style="style" t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 911 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 34 KiB |
@ -0,0 +1,155 @@
|
|||||||
|
<section class="oe_container oe_dark">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h2 class="oe_slogan" style="font-size: 35px;color:#2C0091"><b>Accounting Reports Odoo 17</b></h2>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div style="align:center;">
|
||||||
|
<h1 style="text-align: center;">
|
||||||
|
<span align="center" style="color:#148963;">
|
||||||
|
<span class="fa fa-star fa-spin">
|
||||||
|
</span>
|
||||||
|
Added Financial Reports:</span>
|
||||||
|
</h1>
|
||||||
|
<div class="row" style="margin-top: 2rem;">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="mt-3">
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Partner Ledger Report.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Journals Audit.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">General Ledger.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Trial Balance.</span>
|
||||||
|
</p><br/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="mt-3">
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Aged Partner Balance.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Profit and Loss.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Balance Sheet.</span>
|
||||||
|
</p><br/>
|
||||||
|
<p class="fa fa-check" style="color:green;font-size: 15px;">
|
||||||
|
<span style="color:#000000;font-size: 15px;">Tax Report.</span>
|
||||||
|
</p><br/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="oe_centeralign oe_websiteonly">
|
||||||
|
<h4 class="oe_slogan"><a href="https://www.youtube.com/watch?v=yA4NLwOLZms" target="_blank" style="color: #FFFFFF !important; border-radius: 0; background-color: #9c676e; border-color: #005ca7; padding: 15px; font-weight: bold;">
|
||||||
|
<i class="fa fa-youtube">
|
||||||
|
Watch on YouTube
|
||||||
|
</i>
|
||||||
|
</a></h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container oe_dark">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan" style="color:olive;">Accounting Reports</h2>
|
||||||
|
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">All in one financial reports for odoo community edition</h3>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="account_reports.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan" style="color:#332c3c;font-size: 28px;">General Ledger</h3>
|
||||||
|
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">General ledger report with accounts, partners and analytic account filter</h3>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="general_ledger_filter.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="general_ledger_report.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container oe_dark">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan" style="color:#1b1d26;">Partner Ledger</h3>
|
||||||
|
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">Partner ledger report with partner filter.</h3>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="partner_ledger_filter.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="partner_ledger_report.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan" style="color:#1b1d26;">Aged Partner Balance</h3>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="aged_partner_balance_filter.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
<br/>
|
||||||
|
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
|
||||||
|
<div class="oe_demo oe_picture oe_screenshot">
|
||||||
|
<img src="aged_partner_balance_report.png" style="height:400px;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
|
||||||
|
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
|
||||||
|
<section class="oe_container oe_dark">
|
||||||
|
<div class="oe_row ">
|
||||||
|
<div class="oe_slogan text-center">
|
||||||
|
<img src="odoo_mates.png"/>
|
||||||
|
<div style="color:#269900;">
|
||||||
|
<h3 style="color:#2C0091;font-size: 25px;">If you need any support or want more features, just contact us:</h3><br>
|
||||||
|
<h3 style="color:#2C0091;font-size: 20px;">Email: <a href="odoomates@gmail.com">odoomates@gmail.com</a> <br></h3>
|
||||||
|
</div>
|
||||||
|
<div class="oe_slogan">
|
||||||
|
<h2>
|
||||||
|
<a target="_blank" href="https://www.facebook.com/odoomate/" target="new">
|
||||||
|
<i class="fa fa-facebook-square" style="font-size:38px;"></i>
|
||||||
|
</a>
|
||||||
|
<a target="_blank" href="https://twitter.com/odoomates/" target="new">
|
||||||
|
<i class="fa fa-twitter" style="font-size:38px;"></i>
|
||||||
|
</a>
|
||||||
|
<a href="#" target="_blank">
|
||||||
|
<i class="fa fa-linkedin" style="font-size:38px;"></i>
|
||||||
|
</a>
|
||||||
|
<a target="_blank" href="https://www.youtube.com/channel/UCVKlUZP7HAhdQgs-9iTJklQ">
|
||||||
|
<i class="fa fa-youtube-play" style="font-size:38px;"></i>
|
||||||
|
</a>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
|
||||||
|
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 87 KiB |
@ -0,0 +1,100 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<record id="view_account_financial_report_form" model="ir.ui.view">
|
||||||
|
<field name="name">account.financial.report.form</field>
|
||||||
|
<field name="model">account.financial.report</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Account Report">
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="parent_id"/>
|
||||||
|
<field name="sequence"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="sign"/>
|
||||||
|
<field name="style_overwrite"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page string="Report"
|
||||||
|
invisible="type not in ['accounts', 'account_type', 'account_report']">
|
||||||
|
<group>
|
||||||
|
<field name="display_detail"
|
||||||
|
invisible="type not in ['accounts', 'account_type', 'account_report']"/>
|
||||||
|
<field name="account_report_id"
|
||||||
|
invisible="type != 'account_report'"/>
|
||||||
|
</group>
|
||||||
|
<field name="account_ids" invisible="type != 'accounts'"/>
|
||||||
|
<field name="account_type_ids" invisible="type != 'account_type'"/>
|
||||||
|
</page>
|
||||||
|
<page string="Childrens">
|
||||||
|
<field name="children_ids" nolabel="1">
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_account_financial_report_tree" model="ir.ui.view">
|
||||||
|
<field name="name">account.financial.report.tree</field>
|
||||||
|
<field name="model">account.financial.report</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Account Report">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="parent_id" invisible="1"/>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="account_report_id"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_account_financial_report_search" model="ir.ui.view">
|
||||||
|
<field name="name">account.financial.report.search</field>
|
||||||
|
<field name="model">account.financial.report</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="Account Report">
|
||||||
|
<field name="name" string="Account Report"/>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="account_report_id"/>
|
||||||
|
<filter string="Reports" name="filter_parent_id" domain="[('parent_id','=', False)]"/>
|
||||||
|
<group expand="0" string="Group By">
|
||||||
|
<filter name="parent_report" string="Parent Report" domain=""
|
||||||
|
context="{'group_by':'parent_id'}"/>
|
||||||
|
<filter name="report_type" string="Report Type" domain="[]" context="{'group_by':'type'}"/>
|
||||||
|
</group>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_financial_report_tree" model="ir.actions.act_window">
|
||||||
|
<field name="name">Financial Reports</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">account.financial.report</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="context">{'search_default_filter_parent_id': True}</field>
|
||||||
|
<field name="search_view_id" ref="view_account_financial_report_search"/>
|
||||||
|
<field name="view_id" ref="view_account_financial_report_tree"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_finance_reports_settings"
|
||||||
|
name="Financial Reports"
|
||||||
|
sequence="9"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"
|
||||||
|
parent="account.menu_finance_configuration"/>
|
||||||
|
|
||||||
|
<menuitem id="menu_account_reports"
|
||||||
|
name="Account Reports"
|
||||||
|
action="action_account_financial_report_tree"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"
|
||||||
|
parent="menu_finance_reports_settings"/>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<record id="action_account_moves_ledger_general" model="ir.actions.act_window">
|
||||||
|
<field name="context">{'journal_type':'general', 'search_default_group_by_account': 1, 'search_default_posted':1}</field>
|
||||||
|
<field name="name">General Ledger</field>
|
||||||
|
<field name="res_model">account.move.line</field>
|
||||||
|
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
|
||||||
|
<field name="view_id" ref="account.view_move_line_tree_grouped_general"/>
|
||||||
|
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
|
||||||
|
<field name="view_mode">tree,pivot,graph</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_moves_ledger_partner" model="ir.actions.act_window">
|
||||||
|
<field name="context">{'journal_type':'general', 'search_default_group_by_partner': 1, 'search_default_posted':1, 'search_default_payable':1, 'search_default_receivable':1, 'search_default_unreconciled':1}</field>
|
||||||
|
<field name="name">Partner Ledger</field>
|
||||||
|
<field name="res_model">account.move.line</field>
|
||||||
|
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
|
||||||
|
<field name="view_id" ref="account.view_move_line_tree_grouped_partner"/>
|
||||||
|
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
|
||||||
|
<field name="view_mode">tree,pivot,graph</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_finance_entries_accounting_ledgers" name="Ledgers" parent="account.menu_finance_entries" sequence="3">
|
||||||
|
<menuitem id="menu_action_account_moves_ledger_general" action="action_account_moves_ledger_general" groups="account.group_account_readonly" sequence="1"/>
|
||||||
|
<menuitem id="menu_action_account_moves_ledger_partner" action="action_account_moves_ledger_partner" groups="account.group_account_readonly" sequence="2"/>
|
||||||
|
</menuitem>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<menuitem id="menu_finance_legal_statement"
|
||||||
|
name="Financial Reports"
|
||||||
|
sequence="10"
|
||||||
|
parent="account.menu_finance_reports"/>
|
||||||
|
|
||||||
|
<menuitem id="menu_finance_partner_reports"
|
||||||
|
name="Partner Reports"
|
||||||
|
sequence="20"
|
||||||
|
parent="account.menu_finance_reports"/>
|
||||||
|
|
||||||
|
<menuitem id="menu_finance_audit_reports"
|
||||||
|
name="Audit Reports"
|
||||||
|
sequence="30"
|
||||||
|
parent="account.menu_finance_reports"/>
|
||||||
|
|
||||||
|
<record id="account.account_reports_management_menu" model="ir.ui.menu">
|
||||||
|
<field name="sequence" eval="40"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.view.form.inherit.accountant</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<app name="account" position="inside">
|
||||||
|
<h2>Enhanced Financial Reports</h2>
|
||||||
|
<div>
|
||||||
|
<div class="row mt16 o_settings_container" name="report_setting_container">
|
||||||
|
<div class="col-6 col-lg-6 o_setting_box" id="enhanced_reports">
|
||||||
|
<div>
|
||||||
|
Preview financial reports without downloading
|
||||||
|
</div>
|
||||||
|
<div class="content-group">
|
||||||
|
<a target="_blank" href="https://apps.odoo.com/apps/modules/17.0/om_accounting_reports/"
|
||||||
|
style="text-decoration: underline;">Enhanced Financial Reports</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 col-lg-6 o_setting_box" id="excel_reports">
|
||||||
|
<div>
|
||||||
|
Financial Reports in Excel
|
||||||
|
</div>
|
||||||
|
<div class="content-group">
|
||||||
|
<a target="_blank" href="https://apps.odoo.com/apps/modules/17.0/accounting_excel_reports/"
|
||||||
|
style="text-decoration: underline;">Excel Reports</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</app>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
from . import account_report_common
|
||||||
|
from . import account_report_common_journal
|
||||||
|
from . import account_report_print_journal
|
||||||
|
from . import account_report
|
||||||
|
from . import account_report_common_partner
|
||||||
|
from . import account_report_common_account
|
||||||
|
from . import account_partner_ledger
|
||||||
|
from . import account_general_ledger
|
||||||
|
from . import account_trial_balance
|
||||||
|
from . import account_tax_report
|
||||||
|
from . import aged_partner
|
||||||
|
from . import account_journal_audit
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
from odoo import fields, models, api, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountReportGeneralLedger(models.TransientModel):
|
||||||
|
_name = "account.report.general.ledger"
|
||||||
|
_inherit = "account.common.account.report"
|
||||||
|
_description = "General Ledger Report"
|
||||||
|
|
||||||
|
initial_balance = fields.Boolean(
|
||||||
|
string='Include Initial Balances',
|
||||||
|
help='If you selected date, this field allow you to add a row '
|
||||||
|
'to display the amount of debit/credit/balance that precedes '
|
||||||
|
'the filter you have set.'
|
||||||
|
)
|
||||||
|
sortby = fields.Selection(
|
||||||
|
[('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')],
|
||||||
|
string='Sort by', required=True, default='sort_date'
|
||||||
|
)
|
||||||
|
journal_ids = fields.Many2many(
|
||||||
|
'account.journal', 'account_report_general_ledger_journal_rel',
|
||||||
|
'account_id', 'journal_id', string='Journals', required=True
|
||||||
|
)
|
||||||
|
|
||||||
|
def _get_report_data(self, data):
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
data['form'].update(self.read(['initial_balance', 'sortby'])[0])
|
||||||
|
if data['form'].get('initial_balance') and not data['form'].get('date_from'):
|
||||||
|
raise UserError(_("You must define a Start Date"))
|
||||||
|
records = self.env[data['model']].browse(data.get('ids', []))
|
||||||
|
return records, data
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
records, data = self._get_report_data(data)
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_general_ledger').with_context(landscape=True).report_action(records, data=data)
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, api
|
||||||
|
|
||||||
|
|
||||||
|
class AccountPrintJournal(models.TransientModel):
|
||||||
|
_name = "account.print.journal"
|
||||||
|
_inherit = "account.common.journal.report"
|
||||||
|
_description = "Account Print Journal"
|
||||||
|
|
||||||
|
sort_selection = fields.Selection([('date', 'Date'), ('move_name', 'Journal Entry Number')],
|
||||||
|
'Entries Sorted by', required=True, default='move_name')
|
||||||
|
journal_ids = fields.Many2many('account.journal', string='Journals', required=True,
|
||||||
|
default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])]))
|
||||||
|
|
||||||
|
def _get_report_data(self, data):
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
data['form'].update({'sort_selection': self.sort_selection})
|
||||||
|
return data
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
data = self._get_report_data(data)
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_journal').with_context(landscape=True).report_action(self, data=data)
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, api, _
|
||||||
|
|
||||||
|
|
||||||
|
class AccountPartnerLedger(models.TransientModel):
|
||||||
|
_name = "account.report.partner.ledger"
|
||||||
|
_inherit = "account.common.partner.report"
|
||||||
|
_description = "Account Partner Ledger"
|
||||||
|
|
||||||
|
amount_currency = fields.Boolean("With Currency",
|
||||||
|
help="It adds the currency column on "
|
||||||
|
"report if the currency differs from "
|
||||||
|
"the company currency.")
|
||||||
|
reconciled = fields.Boolean('Reconciled Entries')
|
||||||
|
|
||||||
|
def _get_report_data(self, data):
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
data['form'].update({'reconciled': self.reconciled,
|
||||||
|
'amount_currency': self.amount_currency})
|
||||||
|
return data
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
data = self._get_report_data(data)
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_partnerledger').with_context(landscape=True).\
|
||||||
|
report_action(self, data=data)
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountingReport(models.TransientModel):
|
||||||
|
_name = "accounting.report"
|
||||||
|
_inherit = "account.common.report"
|
||||||
|
_description = "Accounting Report"
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_account_report(self):
|
||||||
|
reports = []
|
||||||
|
if self._context.get('active_id'):
|
||||||
|
menu = self.env['ir.ui.menu'].browse(self._context.get('active_id')).name
|
||||||
|
reports = self.env['account.financial.report'].search([('name', 'ilike', menu)])
|
||||||
|
return reports and reports[0] or False
|
||||||
|
|
||||||
|
enable_filter = fields.Boolean(string='Enable Comparison')
|
||||||
|
account_report_id = fields.Many2one('account.financial.report', string='Account Reports',
|
||||||
|
required=True, default=_get_account_report)
|
||||||
|
label_filter = fields.Char(string='Column Label', help="This label will be displayed on report to "
|
||||||
|
"show the balance computed for the given comparison filter.")
|
||||||
|
filter_cmp = fields.Selection([('filter_no', 'No Filters'), ('filter_date', 'Date')],
|
||||||
|
string='Filter by', required=True, default='filter_no')
|
||||||
|
date_from_cmp = fields.Date(string='Date From')
|
||||||
|
date_to_cmp = fields.Date(string='Date To')
|
||||||
|
debit_credit = fields.Boolean(string='Display Debit/Credit Columns',
|
||||||
|
help="This option allows you to get more details about "
|
||||||
|
"the way your balances are computed."
|
||||||
|
" Because it is space consuming, we do not allow to"
|
||||||
|
" use it while doing a comparison.")
|
||||||
|
|
||||||
|
def _build_comparison_context(self, data):
|
||||||
|
result = {}
|
||||||
|
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
|
||||||
|
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
|
||||||
|
if data['form']['filter_cmp'] == 'filter_date':
|
||||||
|
result['date_from'] = data['form']['date_from_cmp']
|
||||||
|
result['date_to'] = data['form']['date_to_cmp']
|
||||||
|
result['strict_range'] = True
|
||||||
|
return result
|
||||||
|
|
||||||
|
def check_report(self):
|
||||||
|
res = super(AccountingReport, self).check_report()
|
||||||
|
data = {}
|
||||||
|
data['form'] = self.read(['account_report_id', 'date_from_cmp', 'date_to_cmp', 'journal_ids', 'filter_cmp', 'target_move'])[0]
|
||||||
|
for field in ['account_report_id']:
|
||||||
|
if isinstance(data['form'][field], tuple):
|
||||||
|
data['form'][field] = data['form'][field][0]
|
||||||
|
comparison_context = self._build_comparison_context(data)
|
||||||
|
res['data']['form']['comparison_context'] = comparison_context
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
data['form'].update(self.read(['date_from_cmp', 'debit_credit', 'date_to_cmp', 'filter_cmp', 'account_report_id', 'enable_filter', 'label_filter', 'target_move'])[0])
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_financial').report_action(self, data=data, config=False)
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.tools.misc import get_lang
|
||||||
|
|
||||||
|
|
||||||
|
class AccountCommonReport(models.TransientModel):
|
||||||
|
_name = "account.common.report"
|
||||||
|
_description = "Account Common Report"
|
||||||
|
|
||||||
|
company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, default=lambda self: self.env.company)
|
||||||
|
journal_ids = fields.Many2many(
|
||||||
|
comodel_name='account.journal',
|
||||||
|
string='Journals',
|
||||||
|
required=True,
|
||||||
|
default=lambda self: self.env['account.journal'].search([('company_id', '=', self.company_id.id)]),
|
||||||
|
domain="[('company_id', '=', company_id)]",
|
||||||
|
)
|
||||||
|
date_from = fields.Date(string='Start Date')
|
||||||
|
date_to = fields.Date(string='End Date')
|
||||||
|
target_move = fields.Selection([('posted', 'All Posted Entries'),
|
||||||
|
('all', 'All Entries'),
|
||||||
|
], string='Target Moves', required=True, default='posted')
|
||||||
|
|
||||||
|
@api.onchange('company_id')
|
||||||
|
def _onchange_company_id(self):
|
||||||
|
if self.company_id:
|
||||||
|
self.journal_ids = self.env['account.journal'].search(
|
||||||
|
[('company_id', '=', self.company_id.id)])
|
||||||
|
else:
|
||||||
|
self.journal_ids = self.env['account.journal'].search([])
|
||||||
|
|
||||||
|
def _build_contexts(self, data):
|
||||||
|
result = {}
|
||||||
|
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
|
||||||
|
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
|
||||||
|
result['date_from'] = data['form']['date_from'] or False
|
||||||
|
result['date_to'] = data['form']['date_to'] or False
|
||||||
|
result['strict_range'] = True if result['date_from'] else False
|
||||||
|
result['company_id'] = data['form']['company_id'][0] or False
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def check_report(self):
|
||||||
|
self.ensure_one()
|
||||||
|
data = {}
|
||||||
|
data['ids'] = self.env.context.get('active_ids', [])
|
||||||
|
data['model'] = self.env.context.get('active_model', 'ir.ui.menu')
|
||||||
|
data['form'] = self.read(['date_from', 'date_to', 'journal_ids', 'target_move', 'company_id'])[0]
|
||||||
|
used_context = self._build_contexts(data)
|
||||||
|
data['form']['used_context'] = dict(used_context, lang=get_lang(self.env).code)
|
||||||
|
return self.with_context(discard_logo_check=True)._print_report(data)
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountCommonAccountReport(models.TransientModel):
|
||||||
|
_name = 'account.common.account.report'
|
||||||
|
_inherit = "account.common.report"
|
||||||
|
_description = 'Account Common Account Report'
|
||||||
|
|
||||||
|
display_account = fields.Selection([('all', 'All'),
|
||||||
|
('movement', 'With movements'),
|
||||||
|
('not_zero', 'With balance is not equal to 0'), ],
|
||||||
|
string='Display Accounts',
|
||||||
|
required=True, default='movement')
|
||||||
|
analytic_account_ids = fields.Many2many('account.analytic.account',
|
||||||
|
string='Analytic Accounts')
|
||||||
|
account_ids = fields.Many2many('account.account', string='Accounts')
|
||||||
|
partner_ids = fields.Many2many('res.partner', string='Partners')
|
||||||
|
|
||||||
|
def pre_print_report(self, data):
|
||||||
|
data['form'].update(self.read(['display_account'])[0])
|
||||||
|
data['form'].update({
|
||||||
|
'analytic_account_ids': self.analytic_account_ids.ids,
|
||||||
|
'partner_ids': self.partner_ids.ids,
|
||||||
|
'account_ids': self.account_ids.ids,
|
||||||
|
})
|
||||||
|
return data
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountCommonJournalReport(models.TransientModel):
|
||||||
|
_name = 'account.common.journal.report'
|
||||||
|
_description = 'Common Journal Report'
|
||||||
|
_inherit = "account.common.report"
|
||||||
|
|
||||||
|
amount_currency = fields.Boolean('With Currency', help="Print Report with the currency column if the currency differs from the company currency.")
|
||||||
|
|
||||||
|
def pre_print_report(self, data):
|
||||||
|
data['form'].update({'amount_currency': self.amount_currency})
|
||||||
|
return data
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountingCommonPartnerReport(models.TransientModel):
|
||||||
|
_name = 'account.common.partner.report'
|
||||||
|
_inherit = "account.common.report"
|
||||||
|
_description = 'Account Common Partner Report'
|
||||||
|
|
||||||
|
result_selection = fields.Selection([('customer', 'Receivable Accounts'),
|
||||||
|
('supplier', 'Payable Accounts'),
|
||||||
|
('customer_supplier', 'Receivable and Payable Accounts')
|
||||||
|
], string="Partner's", required=True, default='customer')
|
||||||
|
partner_ids = fields.Many2many('res.partner', string='Partners')
|
||||||
|
|
||||||
|
def pre_print_report(self, data):
|
||||||
|
data['form'].update(self.read(['result_selection'])[0])
|
||||||
|
data['form'].update({'partner_ids': self.partner_ids.ids})
|
||||||
|
return data
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_common_report_view" model="ir.ui.view">
|
||||||
|
<field name="name">Common Report</field>
|
||||||
|
<field name="model">account.common.report</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Report Options">
|
||||||
|
<group col="4">
|
||||||
|
<field name="target_move" widget="radio"/>
|
||||||
|
<field name="date_from"/>
|
||||||
|
<field name="date_to"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="journal_ids" widget="many2many_tags" options="{'no_create': True}"/>
|
||||||
|
<field name="company_id" invisible="1"/>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
|
||||||
|
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z" />
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountPrintJournal(models.TransientModel):
|
||||||
|
_inherit = "account.common.journal.report"
|
||||||
|
_name = "account.print.journal"
|
||||||
|
_description = "Account Print Journal"
|
||||||
|
|
||||||
|
sort_selection = fields.Selection([('date', 'Date'), ('move_name', 'Journal Entry Number'),], 'Entries Sorted by', required=True, default='move_name')
|
||||||
|
journal_ids = fields.Many2many('account.journal', string='Journals', required=True, default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])]))
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
data['form'].update({'sort_selection': self.sort_selection})
|
||||||
|
return self.env.ref('account.action_report_journal').with_context(landscape=True).report_action(self, data=data)
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import models, api, fields
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
|
|
||||||
|
class AccountTaxReport(models.TransientModel):
|
||||||
|
_name = 'account.tax.report.wizard'
|
||||||
|
_inherit = "account.common.report"
|
||||||
|
_description = 'Tax Report'
|
||||||
|
|
||||||
|
date_from = fields.Date(string='Date From', required=True,
|
||||||
|
default=lambda self: fields.Date.to_string(date.today().replace(day=1)))
|
||||||
|
date_to = fields.Date(string='Date To', required=True,
|
||||||
|
default=lambda self: fields.Date.to_string(date.today()))
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_account_tax').report_action(self, data=data)
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, api
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBalanceReport(models.TransientModel):
|
||||||
|
_name = 'account.balance.report'
|
||||||
|
_inherit = "account.common.account.report"
|
||||||
|
_description = 'Trial Balance Report'
|
||||||
|
|
||||||
|
journal_ids = fields.Many2many('account.journal', 'account_balance_report_journal_rel',
|
||||||
|
'account_id', 'journal_id',
|
||||||
|
string='Journals', required=True, default=[])
|
||||||
|
analytic_account_ids = fields.Many2many('account.analytic.account',
|
||||||
|
'account_trial_balance_analytic_rel',
|
||||||
|
string='Analytic Accounts')
|
||||||
|
|
||||||
|
def _get_report_data(self, data):
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
records = self.env[data['model']].browse(data.get('ids', []))
|
||||||
|
return records, data
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
records, data = self._get_report_data(data)
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_trial_balance').report_action(records, data=data)
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import time
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAgedTrialBalance(models.TransientModel):
|
||||||
|
_name = 'account.aged.trial.balance'
|
||||||
|
_inherit = 'account.common.partner.report'
|
||||||
|
_description = 'Account Aged Trial balance Report'
|
||||||
|
|
||||||
|
period_length = fields.Integer(string='Period Length (days)', required=True, default=30)
|
||||||
|
journal_ids = fields.Many2many('account.journal', string='Journals', required=True)
|
||||||
|
date_from = fields.Date(default=lambda *a: time.strftime('%Y-%m-%d'))
|
||||||
|
|
||||||
|
def _get_report_data(self, data):
|
||||||
|
res = {}
|
||||||
|
data = self.pre_print_report(data)
|
||||||
|
data['form'].update(self.read(['period_length'])[0])
|
||||||
|
period_length = data['form']['period_length']
|
||||||
|
if period_length <= 0:
|
||||||
|
raise UserError(_('You must set a period length greater than 0.'))
|
||||||
|
if not data['form']['date_from']:
|
||||||
|
raise UserError(_('You must set a start date.'))
|
||||||
|
start = data['form']['date_from']
|
||||||
|
for i in range(5)[::-1]:
|
||||||
|
stop = start - relativedelta(days=period_length - 1)
|
||||||
|
res[str(i)] = {
|
||||||
|
'name': (i != 0 and (str((5 - (i + 1)) * period_length) + '-' + str((5 - i) * period_length)) or (
|
||||||
|
'+' + str(4 * period_length))),
|
||||||
|
'stop': start.strftime('%Y-%m-%d'),
|
||||||
|
'start': (i != 0 and stop.strftime('%Y-%m-%d') or False),
|
||||||
|
}
|
||||||
|
start = stop - relativedelta(days=1)
|
||||||
|
data['form'].update(res)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def _print_report(self, data):
|
||||||
|
data = self._get_report_data(data)
|
||||||
|
return self.env.ref('accounting_pdf_reports.action_report_aged_partner_balance').\
|
||||||
|
with_context(landscape=True).report_action(self, data=data)
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_aged_balance_view" model="ir.ui.view">
|
||||||
|
<field name="name">Aged Partner Balance</field>
|
||||||
|
<field name="model">account.aged.trial.balance</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Report Options">
|
||||||
|
<group col="4">
|
||||||
|
<field name="date_from"/>
|
||||||
|
<field name="period_length"/>
|
||||||
|
<field name="company_id" invisible="1"/>
|
||||||
|
<newline/>
|
||||||
|
<field name="result_selection" widget="radio"
|
||||||
|
invisible="context.get('hide_result_selection')"/>
|
||||||
|
<field name="target_move" widget="radio"/>
|
||||||
|
</group>
|
||||||
|
<field name="journal_ids" required="0" invisible="1"/>
|
||||||
|
<xpath expr="//field[@name='journal_ids']" position="before">
|
||||||
|
<group>
|
||||||
|
<field name="partner_ids" widget="many2many_tags"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</group>
|
||||||
|
</xpath>
|
||||||
|
<footer>
|
||||||
|
<button name="check_report" class="oe_highlight"
|
||||||
|
string="Print" type="object"/>
|
||||||
|
<button string="Cancel" class="btn btn-default" special="cancel"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_aged_balance_view" model="ir.actions.act_window">
|
||||||
|
<field name="name">Aged Partner Balance</field>
|
||||||
|
<field name="res_model">account.aged.trial.balance</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="view_id" ref="account_aged_balance_view"/>
|
||||||
|
<field name="context"></field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_aged_trial_balance"
|
||||||
|
name="Aged Partner Balance"
|
||||||
|
sequence="10"
|
||||||
|
action="action_account_aged_balance_view"
|
||||||
|
parent="menu_finance_partner_reports"/>
|
||||||
|
|
||||||
|
<record id="action_account_aged_receivable" model="ir.actions.act_window">
|
||||||
|
<field name="name">Aged Receivable</field>
|
||||||
|
<field name="res_model">account.aged.trial.balance</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="view_id" ref="account_aged_balance_view"/>
|
||||||
|
<field name="context">{'default_result_selection': 'customer',
|
||||||
|
'hide_result_selection': 1}</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_aged_receivable"
|
||||||
|
name="Aged Receivable"
|
||||||
|
sequence="20"
|
||||||
|
action="action_account_aged_receivable"
|
||||||
|
parent="menu_finance_partner_reports"/>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="action_account_aged_payable" model="ir.actions.act_window">
|
||||||
|
<field name="name">Aged Payable</field>
|
||||||
|
<field name="res_model">account.aged.trial.balance</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="view_id" ref="account_aged_balance_view"/>
|
||||||
|
<field name="context">{'default_result_selection': 'supplier',
|
||||||
|
'hide_result_selection': 1}</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_aged_payable"
|
||||||
|
name="Aged Payable"
|
||||||
|
sequence="30"
|
||||||
|
action="action_account_aged_payable"
|
||||||
|
parent="menu_finance_partner_reports"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_financial_report_profitandloss0" model="account.financial.report">
|
||||||
|
<field name="name">Profit and Loss</field>
|
||||||
|
<field name="sign">-1</field>
|
||||||
|
<field name="type">sum</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_income0" model="account.financial.report">
|
||||||
|
<field name="name">Income</field>
|
||||||
|
<field name="sign">-1</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
|
||||||
|
<field name="display_detail">detail_with_hierarchy</field>
|
||||||
|
<field name="type">account_type</field>
|
||||||
|
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_other_income')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_revenue'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_expense0" model="account.financial.report">
|
||||||
|
<field name="name">Expense</field>
|
||||||
|
<field name="sign">-1</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
|
||||||
|
<field name="display_detail">detail_with_hierarchy</field>
|
||||||
|
<field name="type">account_type</field>
|
||||||
|
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_expenses')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_direct_costs')), (4,ref('accounting_pdf_reports.data_account_type_depreciation'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_balancesheet0" model="account.financial.report">
|
||||||
|
<field name="name">Balance Sheet</field>
|
||||||
|
<field name="type">sum</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_assets0" model="account.financial.report">
|
||||||
|
<field name="name">Assets</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
|
||||||
|
<field name="display_detail">detail_with_hierarchy</field>
|
||||||
|
<field name="type">account_type</field>
|
||||||
|
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_receivable')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_liquidity')), (4,ref('accounting_pdf_reports.data_account_type_current_assets')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_non_current_assets'), (4,ref('accounting_pdf_reports.data_account_type_prepayments'))),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_fixed_assets'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_liabilitysum0" model="account.financial.report">
|
||||||
|
<field name="name">Liability</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
|
||||||
|
<field name="display_detail">no_detail</field>
|
||||||
|
<field name="type">sum</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_liability0" model="account.financial.report">
|
||||||
|
<field name="name">Liability</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
|
||||||
|
<field name="display_detail">detail_with_hierarchy</field>
|
||||||
|
<field name="type">account_type</field>
|
||||||
|
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_payable')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_equity')), (4,ref('accounting_pdf_reports.data_account_type_current_liabilities')),
|
||||||
|
(4,ref('accounting_pdf_reports.data_account_type_non_current_liabilities'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_financial_report_profitloss_toreport0" model="account.financial.report">
|
||||||
|
<field name="name">Profit (Loss) to report</field>
|
||||||
|
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
|
||||||
|
<field name="display_detail">no_detail</field>
|
||||||
|
<field name="type">account_report</field>
|
||||||
|
<field name="account_report_id" ref="account_financial_report_profitandloss0"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="accounting_report_view" model="ir.ui.view">
|
||||||
|
<field name="name">Accounting Report</field>
|
||||||
|
<field name="model">accounting.report</field>
|
||||||
|
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="target_move" position="before">
|
||||||
|
<field name="account_report_id" domain="[('parent_id','=',False)]"/>
|
||||||
|
</field>
|
||||||
|
<field name="target_move" position="after">
|
||||||
|
<field name="enable_filter"/>
|
||||||
|
<field name="debit_credit" invisible="enable_filter == True"/>
|
||||||
|
</field>
|
||||||
|
<field name="journal_ids" position="after">
|
||||||
|
<notebook tabpos="up" colspan="4">
|
||||||
|
<page string="Comparison" name="comparison" invisible="enable_filter == False">
|
||||||
|
<group>
|
||||||
|
<field name="label_filter" required="enable_filter == True"/>
|
||||||
|
<field name="filter_cmp"/>
|
||||||
|
</group>
|
||||||
|
<group string="Dates" invisible="filter_cmp != 'filter_date'">
|
||||||
|
<field name="date_from_cmp" required="filter_cmp == 'filter_date'"/>
|
||||||
|
<field name="date_to_cmp" required="filter_cmp == 'filter_date'"/>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_report_bs" model="ir.actions.act_window">
|
||||||
|
<field name="name">Balance Sheet</field>
|
||||||
|
<field name="res_model">accounting.report</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="accounting_report_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_balancesheet0')}"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_account_report_bs"
|
||||||
|
name="Balance Sheet"
|
||||||
|
sequence="5"
|
||||||
|
action="action_account_report_bs"
|
||||||
|
parent="menu_finance_legal_statement"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_report_general_ledger_view" model="ir.ui.view">
|
||||||
|
<field name="name">General Ledger</field>
|
||||||
|
<field name="model">account.report.general.ledger</field>
|
||||||
|
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<data>
|
||||||
|
<xpath expr="//field[@name='journal_ids']" position="after">
|
||||||
|
<field name="analytic_account_ids" widget="many2many_tags"
|
||||||
|
options="{'no_open': True, 'no_create': True}"
|
||||||
|
invisible="1"
|
||||||
|
groups="analytic.group_analytic_accounting"/>
|
||||||
|
<field name="account_ids" widget="many2many_tags"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="partner_ids" widget="many2many_tags"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='target_move']" position="after">
|
||||||
|
<field name="sortby" widget="radio"/>
|
||||||
|
<field name="display_account" widget="radio"/>
|
||||||
|
<field name="initial_balance"/>
|
||||||
|
<newline/>
|
||||||
|
</xpath>
|
||||||
|
</data>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_general_ledger_menu" model="ir.actions.act_window">
|
||||||
|
<field name="name">General Ledger</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">account.report.general.ledger</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account_report_general_ledger_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_account" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_general_ledger"
|
||||||
|
name="General Ledger"
|
||||||
|
sequence="10"
|
||||||
|
parent="menu_finance_audit_reports"
|
||||||
|
action="action_account_general_ledger_menu"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_report_print_journal_view" model="ir.ui.view">
|
||||||
|
<field name="name">Journals Audit</field>
|
||||||
|
<field name="model">account.print.journal</field>
|
||||||
|
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<data>
|
||||||
|
<xpath expr="//field[@name='target_move']" position="after">
|
||||||
|
<field name="amount_currency" groups="base.group_multi_currency"/>
|
||||||
|
<field name="sort_selection" widget="radio"/>
|
||||||
|
<newline/>
|
||||||
|
</xpath>
|
||||||
|
</data>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_print_journal_menu" model="ir.actions.act_window">
|
||||||
|
<field name="name">Journals Audit</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">account.print.journal</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account_report_print_journal_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_print_journal"
|
||||||
|
name="Journals Audit"
|
||||||
|
sequence="40"
|
||||||
|
parent="menu_finance_audit_reports"
|
||||||
|
action="action_account_print_journal_menu"
|
||||||
|
groups="account.group_account_manager,account.group_account_user"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_report_partner_ledger_view" model="ir.ui.view">
|
||||||
|
<field name="name">Partner Ledger</field>
|
||||||
|
<field name="model">account.report.partner.ledger</field>
|
||||||
|
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<data>
|
||||||
|
<xpath expr="//field[@name='journal_ids']" position="before">
|
||||||
|
<field name="partner_ids" widget="many2many_tags"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='target_move']" position="after">
|
||||||
|
<field name="result_selection"/>
|
||||||
|
<field name="amount_currency" groups="base.group_multi_currency"/>
|
||||||
|
<newline/>
|
||||||
|
<field name="reconciled"/>
|
||||||
|
<newline/>
|
||||||
|
</xpath>
|
||||||
|
</data>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_partner_ledger_menu" model="ir.actions.act_window">
|
||||||
|
<field name="name">Partner Ledger</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">account.report.partner.ledger</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account_report_partner_ledger_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_account" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_partner_ledger"
|
||||||
|
name="Partner Ledger"
|
||||||
|
sequence="5"
|
||||||
|
parent="menu_finance_partner_reports"
|
||||||
|
action="action_account_partner_ledger_menu"
|
||||||
|
groups="account.group_account_invoice"/>
|
||||||
|
|
||||||
|
<!-- Add to Partner Print button -->
|
||||||
|
<record id="action_partner_report_partnerledger" model="ir.actions.act_window">
|
||||||
|
<field name="name">Balance Statement (Partner Ledger)</field>
|
||||||
|
<field name="res_model">account.report.partner.ledger</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account_report_partner_ledger_view" />
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="binding_model_id" ref="base.model_res_partner" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
<field name="context">{
|
||||||
|
'default_partner_ids':active_ids,
|
||||||
|
'default_target_move': 'posted',
|
||||||
|
'default_result_selection': 'customer_supplier',
|
||||||
|
'default_reconciled': True,
|
||||||
|
'hide_partner':1,
|
||||||
|
}</field>
|
||||||
|
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="action_account_report_pl" model="ir.actions.act_window">
|
||||||
|
<field name="name">Profit and Loss</field>
|
||||||
|
<field name="res_model">accounting.report</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="accounting_report_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_profitandloss0')}"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_account_report_pl"
|
||||||
|
name="Profit and Loss"
|
||||||
|
sequence="6"
|
||||||
|
action="action_account_report_pl"
|
||||||
|
parent="accounting_pdf_reports.menu_finance_legal_statement"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="accounting_tax_report_view" model="ir.ui.view">
|
||||||
|
<field name="name">Tax Reports</field>
|
||||||
|
<field name="model">account.tax.report.wizard</field>
|
||||||
|
<field name="inherit_id" eval="False"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Report Options">
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="target_move" widget="radio"/>
|
||||||
|
<field name="date_from"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="company_id" invisible="1"/>
|
||||||
|
<field name="date_to" />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
|
||||||
|
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_tax_report" model="ir.actions.act_window">
|
||||||
|
<field name="name">Tax Reports</field>
|
||||||
|
<field name="res_model">account.tax.report.wizard</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="accounting_tax_report_view"/>
|
||||||
|
<field name="context">{}</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_account_report"
|
||||||
|
name="Tax Report"
|
||||||
|
sequence="30"
|
||||||
|
action="action_account_tax_report"
|
||||||
|
parent="menu_finance_audit_reports"
|
||||||
|
groups="account.group_account_manager,account.group_account_user"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="account_report_balance_view" model="ir.ui.view">
|
||||||
|
<field name="name">Trial Balance</field>
|
||||||
|
<field name="model">account.balance.report</field>
|
||||||
|
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<data>
|
||||||
|
<xpath expr="//field[@name='target_move']" position="after">
|
||||||
|
<field name="display_account" widget="radio"/>
|
||||||
|
<newline/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='journal_ids']" position="after">
|
||||||
|
<field name="analytic_account_ids" widget="many2many_tags"
|
||||||
|
invisible="1"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</xpath>
|
||||||
|
</data>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_account_balance_menu" model="ir.actions.act_window">
|
||||||
|
<field name="name">Trial Balance</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">account.balance.report</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account_report_balance_view"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_account" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_general_balance_report"
|
||||||
|
name="Trial Balance"
|
||||||
|
sequence="20"
|
||||||
|
parent="menu_finance_audit_reports"
|
||||||
|
action="action_account_balance_menu"
|
||||||
|
groups="account.group_account_user,account.group_account_manager"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||