forked from Mapan/odoo17e
98 lines
4.3 KiB
Python
98 lines
4.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from collections import defaultdict
|
|
|
|
from odoo import api, models, _
|
|
|
|
|
|
class DutchECSalesReportCustomHandler(models.AbstractModel):
|
|
_name = 'l10n_nl.ec.sales.report.handler'
|
|
_inherit = 'account.ec.sales.report.handler'
|
|
_description = 'Dutch EC Sales Report Custom Handler'
|
|
|
|
def _dynamic_lines_generator(self, report, options, all_column_groups_expression_totals, warnings=None):
|
|
lines = []
|
|
|
|
totals_by_column_group = {
|
|
key: {
|
|
column['expression_label']: 0.0 if column['figure_type'] == 'monetary' else ''
|
|
for column in options['columns']
|
|
} for key in options['column_groups']
|
|
}
|
|
|
|
for partner, results in self._query_partners(report, options):
|
|
partner_values = defaultdict(dict)
|
|
|
|
for column_group_key in options['column_groups']:
|
|
partner_sum = results.get(column_group_key, {})
|
|
country_code = partner_sum.get('country_code', 'UNKNOWN')
|
|
|
|
# Since this is a european report, we need the European Union code.
|
|
if country_code == 'GR':
|
|
country_code = 'EL'
|
|
|
|
line_total = partner_sum.get('goods', 0.0) + partner_sum.get('services', 0.0) + partner_sum.get('triangular', 0.0)
|
|
|
|
partner_values[column_group_key].update({
|
|
'country_code': country_code,
|
|
'partner_name': '',
|
|
'vat': self._format_vat(partner_sum.get('full_vat_number'), country_code),
|
|
'amount_product': partner_sum.get('goods', 0.0),
|
|
'amount_service': partner_sum.get('services', 0.0),
|
|
'amount_triangular': partner_sum.get('triangular', 0.0),
|
|
'total': line_total,
|
|
})
|
|
|
|
totals_by_column_group[column_group_key]['amount_product'] += partner_sum.get('goods', 0.0)
|
|
totals_by_column_group[column_group_key]['amount_service'] += partner_sum.get('services', 0.0)
|
|
totals_by_column_group[column_group_key]['amount_triangular'] += partner_sum.get('triangular', 0.0)
|
|
totals_by_column_group[column_group_key]['total'] += line_total
|
|
|
|
lines.append((0, self._get_report_line_partner(report, options, partner, partner_values)))
|
|
|
|
lines.append((0, self._get_report_line_total(report, options, totals_by_column_group)))
|
|
return lines
|
|
|
|
def _caret_options_initializer(self):
|
|
"""
|
|
Add custom caret option for the report to link to the partner and allow cleaner overrides.
|
|
"""
|
|
return {
|
|
'nl_icp_partner': [
|
|
{'name': _("View Partner"), 'action': 'caret_option_open_record_form'},
|
|
],
|
|
}
|
|
|
|
def _custom_options_initializer(self, report, options, previous_options=None):
|
|
super()._custom_options_initializer(report, options, previous_options)
|
|
goods_tag = self.env.ref('l10n_nl.tax_report_rub_3bg_tag', raise_if_not_found=False)
|
|
services_tag = self.env.ref('l10n_nl.tax_report_rub_3bs_tag', raise_if_not_found=False)
|
|
if goods_tag and services_tag:
|
|
options.get('sales_report_taxes', {}).update({
|
|
'goods': goods_tag._get_matching_tags().ids,
|
|
'services': services_tag._get_matching_tags().ids,
|
|
'triangular': self.env.ref('l10n_nl.tax_report_rub_3bt_tag')._get_matching_tags().ids,
|
|
'use_taxes_instead_of_tags': False,
|
|
})
|
|
else:
|
|
company_id = self.env.company.id
|
|
|
|
options.get('sales_report_taxes', {}).update({
|
|
'goods': (self.env.ref(f'l10n_nl.{company_id}_btw_X0_producten').id,),
|
|
'services': (self.env.ref(f'l10n_nl.{company_id}_btw_X0_diensten').id,),
|
|
'triangular': (self.env.ref(f'l10n_nl.{company_id}_btw_X0_ABC_levering').id,),
|
|
'use_taxes_instead_of_tags': True,
|
|
})
|
|
|
|
@api.model
|
|
def _format_vat(self, vat, country_code):
|
|
""" VAT numbers must be reported without country code, and grouped by 4
|
|
characters, with a space between each pair of groups.
|
|
"""
|
|
if vat:
|
|
if vat[:2].lower() == country_code.lower():
|
|
vat = vat[2:]
|
|
return vat
|
|
return None
|