From 5cb4fa1cf869396ca8144ad9929da5761c7ac6f8 Mon Sep 17 00:00:00 2001 From: "MH.Dmitrii" Date: Fri, 26 Dec 2025 16:55:15 +0300 Subject: [PATCH] api 1.3 --- env_example | 3 ++ server/backend/api/companies.py | 45 ++++++++++++++++++ .../api/{contragents.py => contractors.py} | 2 +- server/backend/api/nomenclature.py | 47 +++++++++++++++++++ server/backend/api/storages.py | 45 ++++++++++++++++++ server/backend/schemas/pydantic.py | 5 +- 6 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 server/backend/api/companies.py rename server/backend/api/{contragents.py => contractors.py} (96%) create mode 100644 server/backend/api/nomenclature.py create mode 100644 server/backend/api/storages.py diff --git a/env_example b/env_example index c26f221..d268cbb 100644 --- a/env_example +++ b/env_example @@ -6,6 +6,9 @@ PASSWORD = "..." URL_REPORT = "..." URL_REALISATION = "..." URL_CONTRAGENTS = "..." +URL_NOMENCLATURE="..." +URL_COMPANIES="..." +URL_STORAGES ="..." BUYER = "..." #Физические лица-розница COMPANY="..." #Организация_Key diff --git a/server/backend/api/companies.py b/server/backend/api/companies.py new file mode 100644 index 0000000..462c52b --- /dev/null +++ b/server/backend/api/companies.py @@ -0,0 +1,45 @@ +import requests +import xml.etree.ElementTree as ET +from base64 import b64encode +from server.backend.schemas.pydantic import settings +import pandas as pd + +auth_str = f"{settings.USERNAME}:{settings.PASSWORD}" +b64_auth_str = b64encode(auth_str.encode("utf-8")).decode("utf-8") + +session = requests.Session() +session.headers.update({ + "Authorization": f"Basic {b64_auth_str}", + "Accept": "application/xml", +}) + +def fetch_contragents(): + response = session.get(settings.URL_COMPANIES, timeout=10) + response.raise_for_status() + return response.text + +def parse_contragents(xml: str): + try: + NS = { + "atom": "http://www.w3.org/2005/Atom", + "m": "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", + "d": "http://schemas.microsoft.com/ado/2007/08/dataservices", + } + rows = [] + # Парсинг XML-ответа + root = ET.fromstring(xml) + # Извлечение конкретных данных + for entry in root.findall('atom:entry', NS): + properties = entry.find('atom:content',NS).find( + 'm:properties', NS) + rows.append({ + 'Ref_Key': properties.findtext('d:Ref_Key', default=None, namespaces=NS), + 'Description': properties.findtext('d:Description', default=None, namespaces=NS), + }) + df = pd.DataFrame(rows) + return df + except ET.ParseError: + raise +xml_data = fetch_contragents() +root = parse_contragents(xml_data) +print(root) \ No newline at end of file diff --git a/server/backend/api/contragents.py b/server/backend/api/contractors.py similarity index 96% rename from server/backend/api/contragents.py rename to server/backend/api/contractors.py index 35e5e68..f3d05f4 100644 --- a/server/backend/api/contragents.py +++ b/server/backend/api/contractors.py @@ -14,7 +14,7 @@ session.headers.update({ }) def fetch_contragents(): - response = session.get(settings.URL_CONTRAGENTS, timeout=10) + response = session.get(settings.URL_CONTRACTORS, timeout=10) response.raise_for_status() return response.text diff --git a/server/backend/api/nomenclature.py b/server/backend/api/nomenclature.py new file mode 100644 index 0000000..603e0d4 --- /dev/null +++ b/server/backend/api/nomenclature.py @@ -0,0 +1,47 @@ +import requests +import xml.etree.ElementTree as ET +from base64 import b64encode +from server.backend.schemas.pydantic import settings +import pandas as pd +auth_str = f"{settings.USERNAME}:{settings.PASSWORD}" +b64_auth_str = b64encode(auth_str.encode("utf-8")).decode("utf-8") + +session = requests.Session() +session.headers.update({ + "Authorization": f"Basic {b64_auth_str}", + "Accept": "application/xml", +}) + +def fetch_contragents(): + response = session.get(settings.URL_NOMENCLATURE, timeout=10) + response.raise_for_status() + return response.text + +def parse_contragents(xml: str): + try: + NS = { + "atom": "http://www.w3.org/2005/Atom", + "m": "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", + "d": "http://schemas.microsoft.com/ado/2007/08/dataservices", + } + rows = [] + # Парсинг XML-ответа + root = ET.fromstring(xml) + # Извлечение конкретных данных + for entry in root.findall('atom:entry', NS): + properties = entry.find('atom:content',NS).find( + 'm:properties', NS) + rows.append({ + 'Ref_Key': properties.findtext('d:Ref_Key', default=None, namespaces=NS), + 'Description': properties.findtext('d:Description', default=None, namespaces=NS), + 'Parent_Key': properties.findtext('d:Parent_Key', default=None, namespaces=NS) + }) + df = pd.DataFrame(rows) + df = df[df['Parent_Key'] == 'e0eb911c-03a0-11ef-95bd-fa163e7429d8'] + df['Description'] = df['Description'].str.extract(r'^([^\s(]+)') + return df + except ET.ParseError: + raise +xml_data = fetch_contragents() +root = parse_contragents(xml_data) +print(root) \ No newline at end of file diff --git a/server/backend/api/storages.py b/server/backend/api/storages.py new file mode 100644 index 0000000..d7841ed --- /dev/null +++ b/server/backend/api/storages.py @@ -0,0 +1,45 @@ +import requests +import xml.etree.ElementTree as ET +from base64 import b64encode +from server.backend.schemas.pydantic import settings +import pandas as pd + +auth_str = f"{settings.USERNAME}:{settings.PASSWORD}" +b64_auth_str = b64encode(auth_str.encode("utf-8")).decode("utf-8") + +session = requests.Session() +session.headers.update({ + "Authorization": f"Basic {b64_auth_str}", + "Accept": "application/xml", +}) + +def fetch_contragents(): + response = session.get(settings.URL_STORAGES, timeout=10) + response.raise_for_status() + return response.text + +def parse_contragents(xml: str): + try: + NS = { + "atom": "http://www.w3.org/2005/Atom", + "m": "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", + "d": "http://schemas.microsoft.com/ado/2007/08/dataservices", + } + rows = [] + # Парсинг XML-ответа + root = ET.fromstring(xml) + # Извлечение конкретных данных + for entry in root.findall('atom:entry', NS): + properties = entry.find('atom:content',NS).find( + 'm:properties', NS) + rows.append({ + 'Ref_Key': properties.findtext('d:Ref_Key', default=None, namespaces=NS), + 'Description': properties.findtext('d:Description', default=None, namespaces=NS), + }) + df = pd.DataFrame(rows) + return df + except ET.ParseError: + raise +xml_data = fetch_contragents() +root = parse_contragents(xml_data) +print(root) \ No newline at end of file diff --git a/server/backend/schemas/pydantic.py b/server/backend/schemas/pydantic.py index 1ac7043..02ca3fa 100644 --- a/server/backend/schemas/pydantic.py +++ b/server/backend/schemas/pydantic.py @@ -17,7 +17,10 @@ class Settings(BaseSettings): PASSWORD: str URL_REPORT:str URL_REALISATION:str - URL_CONTRAGENTS:str + URL_CONTRACTORS:str + URL_NOMENCLATURE:str + URL_COMPANIES:str + URL_STORAGES:str BUYER: str COMPANY: str STORE: str