122 lines
3.6 KiB
Python
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())
|