mirror of
https://github.com/OCA/intrastat-extrastat.git
synced 2025-02-16 17:13:41 +02:00
193 lines
6.6 KiB
Python
193 lines
6.6 KiB
Python
# Copyright 2021 ACSONE SA/NV
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
import xlrd
|
|
from werkzeug.urls import url_encode
|
|
|
|
from odoo.addons.intrastat_base.tests.common import IntrastatCommon
|
|
|
|
|
|
class IntrastatProductCommon(IntrastatCommon):
|
|
@classmethod
|
|
def _init_products(cls):
|
|
# Create category - don't init intrastat values, do it in tests
|
|
vals = {
|
|
"name": "Robots",
|
|
"parent_id": cls.category_saleable.id,
|
|
}
|
|
cls.categ_robots = cls.category_obj.create(vals)
|
|
|
|
vals = {
|
|
"name": "C3PO",
|
|
"categ_id": cls.categ_robots.id,
|
|
"origin_country_id": cls.env.ref("base.us").id,
|
|
"weight": 300,
|
|
# Computer - C3PO is one of them
|
|
"hs_code_id": cls.hs_code_computer.id,
|
|
}
|
|
cls.product_c3po = cls.product_template_obj.create(vals)
|
|
|
|
@classmethod
|
|
def _init_company(cls):
|
|
# Default transport for company is Road
|
|
cls.demo_company.intrastat_transport_id = cls.transport_road
|
|
|
|
@classmethod
|
|
def _init_fiscal_position(cls):
|
|
vals = {
|
|
"name": "Intrastat Fiscal Position",
|
|
"intrastat": True,
|
|
}
|
|
cls.position = cls.position_obj.create(vals)
|
|
|
|
@classmethod
|
|
def _init_regions(cls):
|
|
# Create Belgium Region
|
|
cls._create_region()
|
|
|
|
vals = {
|
|
"code": "DE",
|
|
"name": "Germany",
|
|
"country_id": cls.env.ref("base.de").id,
|
|
"description": "Germany",
|
|
}
|
|
cls._create_region(vals)
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.region_obj = cls.env["intrastat.region"]
|
|
cls.transaction_obj = cls.env["intrastat.transaction"]
|
|
cls.transport_mode_obj = cls.env["intrastat.transport_mode"]
|
|
cls.partner_obj = cls.env["res.partner"]
|
|
cls.category_saleable = cls.env.ref("product.product_category_1")
|
|
cls.category_obj = cls.env["product.category"]
|
|
cls.product_template_obj = cls.env["product.template"]
|
|
cls.declaration_obj = cls.env["intrastat.product.declaration"]
|
|
cls.position_obj = cls.env["account.fiscal.position"]
|
|
cls.hs_code_computer = cls.env.ref("product_harmonized_system.84715000")
|
|
cls.report_obj = cls.env["ir.actions.report"]
|
|
cls.xls_declaration = cls.env[
|
|
"report.intrastat_product.product_declaration_xls"
|
|
]
|
|
|
|
cls.transport_rail = cls.env.ref("intrastat_product.intrastat_transport_2")
|
|
cls.transport_road = cls.env.ref("intrastat_product.intrastat_transport_3")
|
|
|
|
cls._init_regions()
|
|
cls._init_company()
|
|
cls._init_fiscal_position()
|
|
cls._init_products()
|
|
|
|
@classmethod
|
|
def _create_xls(cls, declaration=False):
|
|
"""
|
|
Prepare the Excel report to be tested
|
|
|
|
:return: The Excel file
|
|
:rtype: bytes
|
|
"""
|
|
report = cls.declaration.with_context(
|
|
active_ids=cls.declaration.ids
|
|
).create_xls()
|
|
report_name = report.get("report_name")
|
|
cls.report = cls.report_obj._get_report_from_name(report_name)
|
|
datas = {
|
|
"context": {
|
|
"active_ids": [cls.declaration.id],
|
|
}
|
|
}
|
|
data = {}
|
|
encoded_data = "report/report_xlsx/" + report_name + "?" + url_encode(data)
|
|
datas["data"] = encoded_data
|
|
context = {
|
|
"active_model": cls.declaration._name,
|
|
}
|
|
if not declaration:
|
|
context.update({"computation_lines": True})
|
|
else:
|
|
context.update({"declaration_lines": True})
|
|
file_data = cls.xls_declaration.with_context(context).create_xlsx_report(
|
|
None, datas
|
|
)
|
|
return file_data
|
|
|
|
def check_xls(self, xls, declaration=False):
|
|
"""
|
|
Check that the xls content correspond to computation/declaration
|
|
lines values
|
|
|
|
:param xls: the Excel file content
|
|
:type xls: bytes
|
|
:param declaration: By default, check computation lines, either declaration ones
|
|
:type declaration: bool, optional
|
|
"""
|
|
book = xlrd.open_workbook(file_contents=xls)
|
|
sheet = book.sheet_by_index(0)
|
|
# Get the template used to build the Excel file lines
|
|
template = self.xls_declaration._get_template(self.declaration)
|
|
# Get the declaration lines or the computation ones
|
|
if not declaration:
|
|
declaration_lines = self.declaration.computation_line_ids
|
|
line_fields = self.declaration._xls_computation_line_fields()
|
|
else:
|
|
declaration_lines = self.declaration.declaration_line_ids
|
|
line_fields = self.declaration._xls_declaration_line_fields()
|
|
i = 0
|
|
# Iterate on each row beginning on third one (two headers)
|
|
for rx in range(3, sheet.nrows):
|
|
line = declaration_lines[i]
|
|
row = sheet.row(rx)
|
|
j = 0
|
|
dict_compare = dict()
|
|
for line_field in line_fields:
|
|
column_spec = template.get(line_field)
|
|
dict_compare.update(
|
|
{row[j].value: column_spec.get("line").get("value")}
|
|
)
|
|
j += 1
|
|
for key, value in dict_compare.items():
|
|
value_eval = self.xls_declaration._eval(value, {"line": line})
|
|
self.assertEqual(key, value_eval)
|
|
i += 1
|
|
|
|
@classmethod
|
|
def _create_region(cls, vals=None):
|
|
values = {
|
|
"code": "BE_w",
|
|
"country_id": cls.env.ref("base.be").id,
|
|
"company_id": cls.env.company.id,
|
|
"description": "Belgium Walloon Region",
|
|
"name": "Walloon Region",
|
|
}
|
|
if vals is not None:
|
|
values.update(vals)
|
|
cls.region = cls.region_obj.create(values)
|
|
|
|
@classmethod
|
|
def _create_transaction(cls, vals=None):
|
|
values = {
|
|
"code": "11",
|
|
"company_id": cls.env.company.id,
|
|
"description": "Sale / Purchase",
|
|
}
|
|
if vals is not None:
|
|
values.update(vals)
|
|
cls.transaction = cls.transaction_obj.create(values)
|
|
|
|
@classmethod
|
|
def _create_transport_mode(cls, vals=None):
|
|
values = {}
|
|
if vals is not None:
|
|
values.update(vals)
|
|
cls.transport_mode = cls.transport_mode_obj.create(values)
|
|
|
|
@classmethod
|
|
def _create_declaration(cls, vals=None):
|
|
values = {
|
|
"company_id": cls.env.company.id,
|
|
"declaration_type": "dispatches",
|
|
}
|
|
if vals is not None:
|
|
values.update(vals)
|
|
cls.declaration = cls.declaration_obj.create(values)
|