forked from Mapan/odoo17e
99 lines
4.0 KiB
Python
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
|