1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/l10n_nl_intrastat/models/account_sales_report.py
2024-12-10 09:04:09 +07:00

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