dadata_connector/models/res_partner.py

163 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from dadata import Dadata
from httpx import HTTPStatusError
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
okopf = {
"50102": "sp",
"11000": "pshp",
"11051": "pshp",
"11064": "pshp",
"20700": "pshp",
"20701": "pshp",
"20716": "pshp",
"30006": "pshp",
# "": "coop", # todo Cooperative
"12300": "plc",
"12200": "jsc",
"12247": "pc",
"12267": "сjsc",
# "": "ga", # todo Government agency
}
class ResPartner(models.Model):
_inherit = "res.partner"
def get_legal_entity_data(self, vat, widget=True):
token = self.get_dadata_token()
dadata = Dadata(token)
try:
result = dadata.find_by_id("party", vat, branch_type="MAIN")
except HTTPStatusError:
raise ValidationError(
_(
"Failed to connect to DaData server. The token in the settings may be incorrect."
)
)
if result:
wizard_data, new_data = self._parse_dadata_response(result)
if widget:
wizard = self.env["res.partner.auto_data.wizard"].create(wizard_data)
return {
"type": "ir.actions.act_window",
"target": "new",
"name": _("Set these details for the current contact?"),
"views": [(False, "form")],
"view_mode": "form",
"res_model": wizard._name,
"res_id": wizard.id,
"context": new_data,
}
else:
return new_data
else:
raise ValidationError(_("No data found for the organization"))
@api.model
def get_dadata_token(self):
token = (
self.env["ir.config_parameter"]
.sudo()
.get_param("dadata_connector.dadata_token")
)
if token:
return token
else:
raise ValidationError(
_(
"The token for DaData is not specified in the settings. (Settings - General settings - Integrations - DaData token)"
)
)
def _parse_dadata_response(self, data):
result = {}
wizard_data = {}
data = data[0]["data"]
# Data for widget
organization_type = data["type"].lower()
wizard_data["partner_id"] = self.id
wizard_data["status"] = data["state"]["status"].lower()
wizard_data["organization_type"] = organization_type
wizard_data["full_address"] = data["address"]["unrestricted_value"]
# Data for partner
result["vat"] = data["inn"]
result["okpo"] = data["okpo"]
result["arceat"] = data["okved"]
result["company_form"] = okopf.get(data["opf"]["code"])
if result["company_form"] == okopf["50102"]:
result["psrn_sp"] = data["ogrn"]
result["ogrn"] = ""
else:
result["psrn_sp"] = ""
result["ogrn"] = data["ogrn"]
if data["documents"] and data["documents"]["fts_registration"]:
result[
"sp_register_number"
] = f'{data["documents"]["fts_registration"]["series"]} {data["documents"]["fts_registration"]["number"]}'
result["sp_register_date"] = data["documents"]["fts_registration"][
"issue_date"
]
if organization_type == "legal":
result["kpp"] = data["kpp"]
# Name
if organization_type == "legal":
result["name"] = data["name"]["short_with_opf"]
wizard_data["name"] = data["name"]["short_with_opf"]
elif organization_type == "individual":
result[
"name"
] = f'{data["fio"]["surname"]} {data["fio"]["name"]} {data["fio"]["patronymic"]}'
wizard_data[
"name"
] = f'{data["fio"]["surname"]} {data["fio"]["name"]} {data["fio"]["patronymic"]}'
else:
raise ValidationError(_("Unknown organization type"))
# Address
address = data["address"]["data"]
country = self.env["res.country"].search(
[("code", "=", address["country_iso_code"])]
)
if country:
result["country_id"] = (country.id, country.name)
region = self.env["res.country.state"].search(
[
("code", "=", address["region_iso_code"].split("-")[-1]),
("country_id", "=", country.id),
]
)
if region:
result["state_id"] = (region.id, region.name)
result["city"] = address["city"]
street = []
for el in [
address["street_with_type"],
address["house_type_full"],
address["house"],
address["flat_type_full"],
address["flat"],
]:
if el:
street.append(el)
result["street"] = ", ".join(street)
result["zip"] = address["postal_code"]
if data.get("management"):
result["management"] = {
"manager_name": data["management"]["name"],
"manager_position": data["management"]["post"],
}
return wizard_data, result