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

99 lines
4.0 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError, RedirectWarning
class IntrastatReportCustomHandler(models.AbstractModel):
_inherit = 'account.intrastat.report.handler'
def _custom_options_initializer(self, report, options, previous_options):
super()._custom_options_initializer(report, options, previous_options)
if self.env.company.partner_id.country_id.code != 'LT':
return
xml_button = {
'name': _('XML'),
'sequence': 30,
'action': 'export_file',
'action_param': 'lt_intrastat_export_to_xml',
'file_export_type': _('XML'),
}
options['buttons'].append(xml_button)
def _show_region_code(self):
# The region code is irrelevant for the Lithuania and will always be an empty column, with
# this function we can conditionally exclude it from the report.
if self.env.company.account_fiscal_country_id.code == 'LT':
return False
return super()._show_region_code()
@api.model
def lt_intrastat_export_to_xml(self, options):
# Generate XML content
date_1 = fields.Date.to_date(options['date']['date_from'])
date_2 = fields.Date.to_date(options['date']['date_to'])
final_day_month = date_1 + relativedelta(day=31)
if date_1.day != 1 or date_2 != final_day_month:
raise UserError(_('Wrong date range selected. The intrastat declaration export has to be done monthly.'))
date = date_1.strftime('%Y-%m')
company = self.env.company
user = self.env.user
if not company.company_registry:
error_msg = _('Missing company registry information on the company')
action_error = {
'name': _('company %s', company.name),
'type': 'ir.actions.act_window',
'res_model': 'res.company',
'views': [[False, 'form']],
'target': 'new',
'res_id': company.id,
}
raise RedirectWarning(error_msg, action_error, _('Add company registry'))
query, params = self._prepare_query(options)
self._cr.execute(query, params) # pylint: disable=sql-injection
query_res = self._cr.dictfetchall()
query_res = self._fill_missing_values(query_res)
query_res = self._prepare_values_for_export(query_res)
version = f'Odoo {self.sudo().env.ref("base.module_base").latest_version}'
total_invoiced_amount = sum([item['value'] for item in query_res])
today = datetime.today()
envelopeId = f"VK{today.strftime('%Y%m%d%H%M%S')}"
file_content = self.env['ir.qweb']._render('l10n_lt_intrastat.intrastat_report_export_xml', {
'company': company,
'envelopeId': envelopeId,
'user': user,
'in_vals': [elem for elem in query_res if elem['type'] == 'Arrival'],
'out_vals': [elem for elem in query_res if elem['type'] == 'Dispatch'],
'total_invoiced_amount': round(total_invoiced_amount),
'extended': options.get('intrastat_extended'),
'date': date,
'sending_date': today,
'is_test': False,
'version': version,
'number_of_declarations': len(query_res),
})
return {
'file_name': self.env['account.report'].browse(options['report_id']).get_default_report_filename(options, 'xml'),
'file_content': file_content,
'file_type': 'xml',
}
@api.model
def _prepare_values_for_export(self, vals_list):
for count, vals in enumerate(vals_list, start=1):
vals['weight'] = f'{round(vals["weight"]*1000):>06}'
vals['value'] = round(vals['value'])
vals['itemNumber'] = count
return vals_list