automatic update repo with commit - 'Update .gitlab-ci.yml' from project dadata_connector
This commit is contained in:
commit
5ec2d7a228
2
README.md
Normal file
2
README.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# DaData Connector
|
||||||
|
Obtaining data on legal entities from the DaData service.
|
2
__init__.py
Normal file
2
__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
from . import wizard
|
21
__manifest__.py
Normal file
21
__manifest__.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "DaData Connector",
|
||||||
|
"summary": """Obtaining data on legal entities from the DaData service""",
|
||||||
|
"author": "RYDLAB",
|
||||||
|
"website": "http://rydlab.ru",
|
||||||
|
"category": "Marketing",
|
||||||
|
"version": "17.0.1.0.0",
|
||||||
|
"depends": ["base", "web", "contacts", "account", "l10n_ru_doc"],
|
||||||
|
"external_dependencies": {"python": ["dadata==21.10.1"]},
|
||||||
|
"data": [
|
||||||
|
"security/ir.model.access.csv",
|
||||||
|
"views/res_partner_views.xml",
|
||||||
|
"wizard/res_partner_auto_data_wizard_views.xml",
|
||||||
|
"views/res_config_settings_view.xml",
|
||||||
|
],
|
||||||
|
"assets": {
|
||||||
|
"web.assets_backend": [
|
||||||
|
"dadata_connector/static/src/views/fields/search/*",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
225
i18n/ru.po
Normal file
225
i18n/ru.po
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * dadata_connector
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 16.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-07-18 05:07+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-07-18 05:07+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__status__active
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Действующая"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__status__bankrupt
|
||||||
|
msgid "Bankrupt"
|
||||||
|
msgstr "Банкротство"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model,name:dadata_connector.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "Конфигурационные настройки"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model,name:dadata_connector.model_res_partner
|
||||||
|
msgid "Contact"
|
||||||
|
msgstr "Контакт"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_config_settings__dadata_token
|
||||||
|
msgid "DaData token"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/dadata_connector/static/src/views/fields/search/search_field.js:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/static/src/views/fields/search/search_field.js:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Data updated."
|
||||||
|
msgstr "Данные обновлены."
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"Failed to connect to DaData server. The token in the settings may be "
|
||||||
|
"incorrect."
|
||||||
|
msgstr ""
|
||||||
|
"Не удалось подключиться к серверу DaData. Возможно, токен в настройках "
|
||||||
|
"указан не верно."
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__full_address
|
||||||
|
msgid "Full legal address"
|
||||||
|
msgstr "Юридический адрес"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__name
|
||||||
|
msgid "Full name"
|
||||||
|
msgstr "Наименование"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__vat
|
||||||
|
msgid "Identification Number"
|
||||||
|
msgstr "ИНН"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,help:dadata_connector.field_res_partner_auto_data_wizard__vat
|
||||||
|
msgid "Identification Number for selected type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__organization_type__individual
|
||||||
|
msgid "Individual entrepreneur"
|
||||||
|
msgstr "Индивидуальный предприниматель"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__organization_type__legal
|
||||||
|
msgid "Legal entity"
|
||||||
|
msgstr "Юридическое лицо"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,help:dadata_connector.field_res_partner_auto_data_wizard__organization_type
|
||||||
|
msgid "Legal entity or individual entrepreneur"
|
||||||
|
msgstr "Юридическое лицо или индивидуальный предприниматель"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__status__liquidated
|
||||||
|
msgid "Liquidated"
|
||||||
|
msgstr "Ликвидирована"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__status__liquidating
|
||||||
|
msgid "Liquidating"
|
||||||
|
msgstr "Ликвидируется"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model_terms:ir.ui.view,arch_db:dadata_connector.res_partner_auto_data_wizard_view_form
|
||||||
|
msgid "No"
|
||||||
|
msgstr "Нет"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No data found for the organization"
|
||||||
|
msgstr "Не найдены данные для организации"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__partner_id
|
||||||
|
msgid "Partner"
|
||||||
|
msgstr "Контакт"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields.selection,name:dadata_connector.selection__res_partner_auto_data_wizard__status__reorganizing
|
||||||
|
msgid "Reorganizing"
|
||||||
|
msgstr ""
|
||||||
|
"В процессе присоединения к другому юр. лицу, с последующей ликвидацией"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/dadata_connector/static/src/views/fields/search/search_field.js:0
|
||||||
|
#: code:addons/dadata_connector/static/src/views/fields/search/search_field.xml:0
|
||||||
|
#: code:addons/dadata_connector/static/src/views/fields/search/search_field.xml:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/static/src/views/fields/search/search_field.js:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/static/src/views/fields/search/search_field.xml:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/static/src/views/fields/search/search_field.xml:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Поиск"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Set these details for the current contact?"
|
||||||
|
msgstr "Установить данные реквизиты для текущего контакта?"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__status
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Статус"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"The token for DaData is not specified in the settings. (Settings - General "
|
||||||
|
"settings - Integrations - DaData token)"
|
||||||
|
msgstr ""
|
||||||
|
"В настройках не указан токен для DaData. (Настройки - Общие настройки - "
|
||||||
|
"Интеграции - DaData token)"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model.fields,field_description:dadata_connector.field_res_partner_auto_data_wizard__organization_type
|
||||||
|
msgid "Type of organization"
|
||||||
|
msgstr "Тип организации"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#: code:addons/local_addons/dadata_connector/models/res_partner.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Unknown organization type"
|
||||||
|
msgstr "Неизвестный тип организации"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model:ir.model,name:dadata_connector.model_res_partner_auto_data_wizard
|
||||||
|
msgid "Wizard for autofilling partner"
|
||||||
|
msgstr "Визард для автозаполнения контактов"
|
||||||
|
|
||||||
|
#. module: dadata_connector
|
||||||
|
#: model_terms:ir.ui.view,arch_db:dadata_connector.res_partner_auto_data_wizard_view_form
|
||||||
|
msgid "Yes"
|
||||||
|
msgstr "Да"
|
2
models/__init__.py
Normal file
2
models/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import res_config_settings
|
||||||
|
from . import res_partner
|
10
models/res_config_settings.py
Normal file
10
models/res_config_settings.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = "res.config.settings"
|
||||||
|
|
||||||
|
dadata_token = fields.Char(
|
||||||
|
string="DaData token",
|
||||||
|
config_parameter="dadata_connector.dadata_token",
|
||||||
|
)
|
162
models/res_partner.py
Normal file
162
models/res_partner.py
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
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
|
2
security/ir.model.access.csv
Normal file
2
security/ir.model.access.csv
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||||
|
"access_res_partner_auto_data_wizard","res_partner_auto_data_wizard user","model_res_partner_auto_data_wizard",,1,1,1,1
|
|
121
static/src/views/fields/search/search_field.js
Normal file
121
static/src/views/fields/search/search_field.js
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { registry } from "@web/core/registry";
|
||||||
|
import { _lt } from "@web/core/l10n/translation";
|
||||||
|
import { useInputField } from "@web/views/fields/input_field_hook";
|
||||||
|
import { standardFieldProps } from "@web/views/fields/standard_field_props";
|
||||||
|
|
||||||
|
import { Component } from "@odoo/owl";
|
||||||
|
|
||||||
|
export class SearchField extends Component {
|
||||||
|
setup() {
|
||||||
|
useInputField({ getValue: () => this.props.record.data[this.props.name] || "" });
|
||||||
|
this.action = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async search() {
|
||||||
|
this.action = await this.env.services.orm.call(
|
||||||
|
"res.partner",
|
||||||
|
"get_legal_entity_data",
|
||||||
|
[this.env.model.root.data.id],
|
||||||
|
{
|
||||||
|
vat: this.props.record.data[this.props.name],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
await this.env.services.action.doAction(this.action, {
|
||||||
|
onClose: async (closeInfo) => {
|
||||||
|
if (closeInfo && closeInfo.update) {
|
||||||
|
// Creates record
|
||||||
|
const record = this.props.record;
|
||||||
|
const { management, ...newRecordData } = this.action.context;
|
||||||
|
await record.update({
|
||||||
|
...newRecordData,
|
||||||
|
company_type: "company",
|
||||||
|
});
|
||||||
|
await record.save();
|
||||||
|
|
||||||
|
const recordChildren = record.data.child_ids.records;
|
||||||
|
if (
|
||||||
|
management &&
|
||||||
|
!this._checkManagerExists(recordChildren, management)
|
||||||
|
) {
|
||||||
|
await this._createManager(management);
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.env.model.load({
|
||||||
|
resId: record._config.resId,
|
||||||
|
mode: record.mode,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
this.env.services.notification.add(_lt("Data updated."), {
|
||||||
|
type: "info",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_checkManagerExists(recordChildren, management) {
|
||||||
|
const managerName = management.manager_name;
|
||||||
|
const managerFunction = management.manager_position;
|
||||||
|
for (let record of recordChildren) {
|
||||||
|
if (
|
||||||
|
record.data.name.toUpperCase() === managerName.toUpperCase() &&
|
||||||
|
record.data.function.toUpperCase() === managerFunction.toUpperCase()
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async _createManager(management) {
|
||||||
|
const record = this.props.record;
|
||||||
|
const point = this.env.model;
|
||||||
|
|
||||||
|
const paren_id = record._config.resId
|
||||||
|
const params = {
|
||||||
|
resModel: "res.partner",
|
||||||
|
resIds: [],
|
||||||
|
fields: record.data.child_ids.fields,
|
||||||
|
activeFields: record.data.child_ids.activeFields,
|
||||||
|
context: {
|
||||||
|
default_name: management.manager_name,
|
||||||
|
default_function: management.manager_position,
|
||||||
|
default_parent_id: paren_id,
|
||||||
|
default_type: "contact",
|
||||||
|
},
|
||||||
|
mode: "edit",
|
||||||
|
viewType: "form",
|
||||||
|
isMonoRecord: true,
|
||||||
|
groupBy: [],
|
||||||
|
};
|
||||||
|
const newRecordData = await point._loadNewRecord(params);
|
||||||
|
const newRecord = await point._createRoot(params, newRecordData);
|
||||||
|
await newRecord.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SearchField.template = "dadata_connector.SearchField";
|
||||||
|
SearchField.props = {
|
||||||
|
...standardFieldProps,
|
||||||
|
placeholder: { type: String, optional: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
SearchField.displayName = _lt("Search");
|
||||||
|
SearchField.supportedTypes = ["char"];
|
||||||
|
|
||||||
|
SearchField.extractProps = ({ attrs }) => {
|
||||||
|
return {
|
||||||
|
placeholder: attrs.placeholder,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class FormSearchField extends SearchField { }
|
||||||
|
FormSearchField.template = "dadata_connector.FormSearchField";
|
||||||
|
|
||||||
|
registry.category("fields").add("search", { component: SearchField });
|
||||||
|
registry.category("fields").add("form.search", { component: FormSearchField });
|
||||||
|
|
4
static/src/views/fields/search/search_field.scss
Normal file
4
static/src/views/fields/search/search_field.scss
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.o_search_content small {
|
||||||
|
overflow-wrap: normal;
|
||||||
|
word-break: normal;
|
||||||
|
}
|
31
static/src/views/fields/search/search_field.xml
Normal file
31
static/src/views/fields/search/search_field.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t t-name="dadata_connector.SearchField" owl="1">
|
||||||
|
<div class="o_search_content d-inline-flex w-100">
|
||||||
|
<t t-if="props.readonly">
|
||||||
|
<a t-if="props.record.data[props.name]" class="o_form_uri" t-att-href="searchHref" t-esc="props.record.data[props.name]" />
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<input class="o_input"
|
||||||
|
t-att-id="props.id"
|
||||||
|
type="text"
|
||||||
|
autocomplete="off"
|
||||||
|
t-att-placeholder="props.placeholder"
|
||||||
|
t-ref="input" />
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<t t-name="dadata_connector.FormSearchField" t-inherit="dadata_connector.SearchField" t-inherit-mode="primary">
|
||||||
|
<xpath expr="//input" position="after">
|
||||||
|
<button
|
||||||
|
t-if="props.record.data[props.name]"
|
||||||
|
class="btn btn-secondary fa fa-search o_select_file_button"
|
||||||
|
data-tooltip="Search"
|
||||||
|
aria-label="Search"
|
||||||
|
t-on-click="() => this.search()"/>
|
||||||
|
</xpath>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
16
views/res_config_settings_view.xml
Normal file
16
views/res_config_settings_view.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="dadata_res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.view.form.inherit.dadata</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="priority" eval="15" />
|
||||||
|
<field name="inherit_id" ref="base.res_config_settings_view_form" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//setting[@id='recaptcha']" position="after">
|
||||||
|
<setting id="dadata_token" help="Dadata token value">
|
||||||
|
<field name="dadata_token" />
|
||||||
|
</setting>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
30
views/res_partner_views.xml
Normal file
30
views/res_partner_views.xml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="partner_with_auto_data_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">Partner with auto data view form</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="inherit_id" ref="l10n_ru_doc.view_partner_ru_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='ogrn']" position="attributes">
|
||||||
|
<attribute name="widget">search</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='psrn_sp']" position="attributes">
|
||||||
|
<attribute name="widget">search</attribute>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="partner_with_auto_data_view_form2" model="ir.ui.view">
|
||||||
|
<field name="name">Partner with auto data view form 2</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="priority">2</field>
|
||||||
|
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='vat']" position="attributes">
|
||||||
|
<attribute name="widget">search</attribute>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
1
wizard/__init__.py
Normal file
1
wizard/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from . import res_partner_auto_data_wizard
|
40
wizard/res_partner_auto_data_wizard.py
Normal file
40
wizard/res_partner_auto_data_wizard.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ResPartnerAutoDataWizard(models.TransientModel):
|
||||||
|
_name = "res.partner.auto_data.wizard"
|
||||||
|
_description = "Wizard for autofilling partner"
|
||||||
|
|
||||||
|
partner_id = fields.Many2one(
|
||||||
|
string="Partner",
|
||||||
|
comodel_name="res.partner",
|
||||||
|
)
|
||||||
|
|
||||||
|
vat = fields.Char(
|
||||||
|
string="Identification Number", help="Identification Number for selected type"
|
||||||
|
)
|
||||||
|
|
||||||
|
status = fields.Selection(
|
||||||
|
string="Status",
|
||||||
|
selection=[
|
||||||
|
("active", "Active"),
|
||||||
|
("liquidating", "Liquidating"),
|
||||||
|
("liquidated", "Liquidated"),
|
||||||
|
("bankrupt", "Bankrupt"),
|
||||||
|
("reorganizing", "Reorganizing"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
organization_type = fields.Selection(
|
||||||
|
string="Type of organization",
|
||||||
|
selection=[
|
||||||
|
("legal", "Legal entity"),
|
||||||
|
("individual", "Individual entrepreneur"),
|
||||||
|
],
|
||||||
|
help="Legal entity or individual entrepreneur",
|
||||||
|
)
|
||||||
|
name = fields.Char(string="Full name")
|
||||||
|
|
||||||
|
full_address = fields.Text(string="Full legal address")
|
||||||
|
|
||||||
|
def button_yes(self):
|
||||||
|
return {"type": "ir.actions.act_window_close", "infos": {"update": True}}
|
23
wizard/res_partner_auto_data_wizard_views.xml
Normal file
23
wizard/res_partner_auto_data_wizard_views.xml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="res_partner_auto_data_wizard_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">Partner with auto data wizard view form</field>
|
||||||
|
<field name="model">res.partner.auto_data.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form create="0" delete="0" edit="0">
|
||||||
|
<group>
|
||||||
|
<field name="status"
|
||||||
|
decoration-success="status == 'active'"
|
||||||
|
decoration-danger="status != 'active'"/>
|
||||||
|
<field name="organization_type"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="full_address"/>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button string="Yes" class="oe_highlight" name="button_yes" type="object"/>
|
||||||
|
<button string="No" class="btn btn-secondary" special="cancel"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
Loading…
x
Reference in New Issue
Block a user