Files
AWatch-rus/clickhouse-1c/ai/refresh_company_registry_bindings.py
T

122 lines
3.6 KiB
Python

#!/usr/bin/env python3
from __future__ import annotations
import argparse
import os
from datetime import UTC, datetime
from typing import Any
import clickhouse_connect
def parse_args() -> argparse.Namespace:
p = argparse.ArgumentParser(description="Refresh technical company->registry bindings for analytics_1c")
p.add_argument("--host", default=os.getenv("CLICKHOUSE_HOST", "localhost"))
p.add_argument("--port", type=int, default=int(os.getenv("CLICKHOUSE_PORT", "8123")))
p.add_argument("--user", default=os.getenv("CLICKHOUSE_USER", "default"))
p.add_argument("--password", default=os.getenv("CLICKHOUSE_PASSWORD", ""))
p.add_argument("--database", default=os.getenv("CLICKHOUSE_DB", "analytics_1c"))
return p.parse_args()
def ch_client(args: argparse.Namespace):
return clickhouse_connect.get_client(
host=args.host,
port=args.port,
username=args.user,
password=args.password,
database=args.database,
)
def query_rows(client, sql: str) -> list[dict[str, Any]]:
result = client.query(sql)
return [dict(zip(result.column_names, row)) for row in result.result_rows]
def main() -> int:
args = parse_args()
client = ch_client(args)
generated_at = datetime.now(UTC).replace(tzinfo=None, microsecond=0)
current_bindings = {
str(row["company_entity_key"]): row
for row in query_rows(
client,
"""
SELECT
company_entity_key,
registry_company_key,
registry_company_name,
binding_source
FROM analytics_1c.v_company_registry_bindings_current
""",
)
}
candidates = query_rows(
client,
"""
SELECT
company_entity_key,
infobase,
base_id,
base_path,
ifNull(base_path_key, '') AS base_path_key,
registry_company_key,
company_name,
registry_match_mode
FROM analytics_1c.v_company_portfolio_overview
WHERE registry_match_mode IN ('direct', 'alias', 'manual')
AND registry_company_key != ''
AND company_entity_key != ''
"""
)
inserts: list[list[Any]] = []
for row in candidates:
entity_key = str(row["company_entity_key"])
registry_key = str(row["registry_company_key"])
current = current_bindings.get(entity_key)
if current and str(current.get("registry_company_key") or "") == registry_key:
continue
inserts.append(
[
generated_at,
str(row["infobase"] or ""),
entity_key,
str(row["base_id"] or ""),
str(row["base_path"] or ""),
str(row["base_path_key"] or ""),
registry_key,
str(row["company_name"] or ""),
f"bootstrap_{row['registry_match_mode']}",
"autobound_from_portfolio",
]
)
if inserts:
client.insert(
"analytics_1c.company_registry_bindings",
inserts,
column_names=[
"ts",
"infobase",
"company_entity_key",
"base_id",
"base_path",
"base_path_key",
"registry_company_key",
"registry_company_name",
"binding_source",
"note",
],
)
print(f"company registry bindings refreshed: inserted={len(inserts)} generated_at={generated_at.isoformat()}")
return 0
if __name__ == "__main__":
raise SystemExit(main())