Fix: correct AD→CARD_ID→EMP_ID chain (no EMAIL column query)
This commit is contained in:
+20
-59
@@ -1,12 +1,12 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Проверка подключения к SQL Server и загрузки данных табеля
|
Проверка подключения к SQL Server и загрузки данных табеля
|
||||||
за последние 5 месяцев для конкретного сотрудника.
|
за последние 5 месяцев для ds.krivochenko@sibcem.ru.
|
||||||
|
|
||||||
Поиск сотрудника:
|
Цепочка поиска сотрудника (как в LK модуле бота):
|
||||||
1. Ищем в AD по email (ds.krivochenko@sibcem.ru) → получаем extensionAttribute2 = CARD_ID
|
1. AD: search_by_user_id(email) → extensionAttribute2 = CARD_ID
|
||||||
2. По CARD_ID ищем в SQL (UOV_SELFSERVICE_PR_EMP) → получаем EMP_ID
|
2. SQL: SELECT ID FROM UOV_SELFSERVICE_PR_EMP WHERE CARD_ID = %s → EMP_ID
|
||||||
3. По EMP_ID загружаем табель (UOV_SELFSERVICE_TB_TABEL) за 5 месяцев
|
3. SQL: SELECT ... FROM UOV_SELFSERVICE_TB_TABEL WHERE EMP_ID = %s → табель
|
||||||
|
|
||||||
Запуск:
|
Запуск:
|
||||||
cd /opt/trueconf_bot
|
cd /opt/trueconf_bot
|
||||||
@@ -81,7 +81,6 @@ except ImportError:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"⚠️ Ошибка Passwork: {e}")
|
print(f"⚠️ Ошибка Passwork: {e}")
|
||||||
|
|
||||||
# Фоллбэк на переменные окружения
|
|
||||||
if not DB_PASSWORD:
|
if not DB_PASSWORD:
|
||||||
DB_PASSWORD = os.getenv("DB_PASSWORD", "").strip()
|
DB_PASSWORD = os.getenv("DB_PASSWORD", "").strip()
|
||||||
DB_USER = os.getenv("DB_USER", DB_USER).strip()
|
DB_USER = os.getenv("DB_USER", DB_USER).strip()
|
||||||
@@ -139,26 +138,23 @@ except Exception as e:
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 6. Поиск сотрудника в AD по email → CARD_ID
|
# 6. Поиск сотрудника в AD по email → CARD_ID (как в LK модуле)
|
||||||
# ============================================================
|
# ============================================================
|
||||||
print()
|
print()
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
print(" Поиск сотрудника в Active Directory")
|
print(" Поиск сотрудника в Active Directory")
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
|
|
||||||
# Email для поиска
|
|
||||||
TARGET_EMAIL = "ds.krivochenko@sibcem.ru"
|
TARGET_EMAIL = "ds.krivochenko@sibcem.ru"
|
||||||
print(f" Ищем: {TARGET_EMAIL}")
|
print(f" Ищем: {TARGET_EMAIL}")
|
||||||
|
|
||||||
# Импортируем ldap3 и ищем
|
|
||||||
try:
|
try:
|
||||||
from ldap3 import Server, Connection, ALL
|
from ldap3 import Server, Connection, ALL
|
||||||
from ldap3.utils.conv import escape_filter_chars
|
|
||||||
|
|
||||||
server = Server(AD_SERVER, get_info=ALL)
|
server = Server(AD_SERVER, get_info=ALL)
|
||||||
ldap_conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True)
|
ldap_conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True)
|
||||||
|
|
||||||
# Строим фильтр как в ad_search.py
|
# Как в ad_search.py: ищем по mail, userPrincipalName, sAMAccountName
|
||||||
short_username = TARGET_EMAIL.split("@")[0] if "@" in TARGET_EMAIL else TARGET_EMAIL
|
short_username = TARGET_EMAIL.split("@")[0] if "@" in TARGET_EMAIL else TARGET_EMAIL
|
||||||
|
|
||||||
or_parts = [
|
or_parts = [
|
||||||
@@ -173,7 +169,6 @@ try:
|
|||||||
print(f" LDAP-фильтр: {search_filter}")
|
print(f" LDAP-фильтр: {search_filter}")
|
||||||
|
|
||||||
card_id_from_ad = None
|
card_id_from_ad = None
|
||||||
ldap_entry = None
|
|
||||||
|
|
||||||
for base in AD_BASES:
|
for base in AD_BASES:
|
||||||
ldap_conn.search(
|
ldap_conn.search(
|
||||||
@@ -182,17 +177,17 @@ try:
|
|||||||
attributes=["cn", "sAMAccountName", "mail", "userPrincipalName", "extensionAttribute2"],
|
attributes=["cn", "sAMAccountName", "mail", "userPrincipalName", "extensionAttribute2"],
|
||||||
)
|
)
|
||||||
if ldap_conn.entries:
|
if ldap_conn.entries:
|
||||||
ldap_entry = ldap_conn.entries[0]
|
entry = ldap_conn.entries[0]
|
||||||
print(f" ✅ Найден в OU: {base}")
|
print(f" ✅ Найден в OU: {base}")
|
||||||
print(f" CN : {ldap_entry.cn}")
|
print(f" CN : {entry.cn}")
|
||||||
print(f" sAMAccountName: {ldap_entry.sAMAccountName}")
|
print(f" sAMAccountName : {entry.sAMAccountName}")
|
||||||
print(f" mail : {ldap_entry.mail}")
|
print(f" mail : {entry.mail}")
|
||||||
ext2 = str(ldap_entry.extensionAttribute2) if hasattr(ldap_entry, 'extensionAttribute2') and ldap_entry.extensionAttribute2 else "(не задан)"
|
ext2 = str(entry.extensionAttribute2) if hasattr(entry, 'extensionAttribute2') and entry.extensionAttribute2 else "(не задан)"
|
||||||
print(f" extensionAttribute2: {ext2}")
|
print(f" extensionAttribute2: {ext2}")
|
||||||
card_id_from_ad = ext2
|
card_id_from_ad = ext2
|
||||||
break
|
break
|
||||||
|
|
||||||
if not ldap_entry:
|
if not ldap_conn.entries:
|
||||||
print(f" ❌ Сотрудник не найден в AD по email {TARGET_EMAIL}")
|
print(f" ❌ Сотрудник не найден в AD по email {TARGET_EMAIL}")
|
||||||
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@@ -203,11 +198,11 @@ except Exception as e:
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 7. Поиск EMP_ID по CARD_ID в SQL
|
# 7. Поиск EMP_ID по CARD_ID в SQL (как в LK модуле)
|
||||||
# ============================================================
|
# ============================================================
|
||||||
print()
|
print()
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
print(" Поиск сотрудника в SQL Server")
|
print(" Поиск EMP_ID по CARD_ID в SQL")
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
|
|
||||||
emp_id = None
|
emp_id = None
|
||||||
@@ -216,49 +211,15 @@ card_id = None
|
|||||||
if card_id_from_ad:
|
if card_id_from_ad:
|
||||||
card_id = card_id_from_ad
|
card_id = card_id_from_ad
|
||||||
print(f" CARD_ID из AD: {card_id}")
|
print(f" CARD_ID из AD: {card_id}")
|
||||||
cursor.execute("SELECT e.ID, e.CARD_ID FROM UOV_SELFSERVICE_PR_EMP e WHERE e.CARD_ID = %s", (card_id,))
|
|
||||||
|
# Как в info_service.py: SELECT e.ID FROM UOV_SELFSERVICE_PR_EMP e WHERE e.CARD_ID = %s
|
||||||
|
cursor.execute("SELECT e.ID FROM UOV_SELFSERVICE_PR_EMP e WHERE e.CARD_ID = %s", (card_id,))
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
if row:
|
if row:
|
||||||
emp_id = row[0]
|
emp_id = row[0]
|
||||||
print(f" ✅ Найден: emp_id={emp_id}, CARD_ID={row[1]}")
|
print(f" ✅ Найден: emp_id={emp_id}")
|
||||||
else:
|
else:
|
||||||
print(f" ⚠️ Сотрудник с CARD_ID={card_id} не найден в UOV_SELFSERVICE_PR_EMP")
|
print(f" ❌ Сотрудник с CARD_ID={card_id} не найден в UOV_SELFSERVICE_PR_EMP")
|
||||||
|
|
||||||
# Если не нашли по CARD_ID из AD — пробуем по email через SQL
|
|
||||||
if not emp_id:
|
|
||||||
print(f" ⚠️ Пробуем поиск по email через SQL...")
|
|
||||||
cursor.execute(
|
|
||||||
"SELECT e.ID, e.CARD_ID, e.EMAIL FROM UOV_SELFSERVICE_PR_EMP e WHERE e.EMAIL LIKE %s OR e.EMAIL LIKE %s ORDER BY e.ID LIMIT 1",
|
|
||||||
(f"%{TARGET_EMAIL}%", f"%{short_username}@%")
|
|
||||||
)
|
|
||||||
row = cursor.fetchone()
|
|
||||||
if row:
|
|
||||||
emp_id = row[0]
|
|
||||||
card_id = row[1]
|
|
||||||
print(f" ✅ Найден: emp_id={emp_id}, CARD_ID={card_id}")
|
|
||||||
else:
|
|
||||||
print(f" ❌ Сотрудник не найден")
|
|
||||||
|
|
||||||
# Если нашли — выводим инфу
|
|
||||||
if emp_id:
|
|
||||||
cursor.execute(
|
|
||||||
"SELECT f.SNAME, d.NAME, appoint.NAME, e.EMAIL "
|
|
||||||
"FROM UOV_SELFSERVICE_PR_EMP e "
|
|
||||||
"JOIN UOV_SELFSERVICE_PR_TRANS t ON t.EMP_ID = e.ID "
|
|
||||||
"JOIN UOV_SELFSERVICE_HR_FIRM f ON f.ID = e.FIRM_ID "
|
|
||||||
"JOIN UOV_SELFSERVICE_HR_DEPT d ON d.ID = t.DEPT_ID "
|
|
||||||
"JOIN UOV_SELFSERVICE_ST_APPOINT appoint ON appoint.ID = t.APPOINT_ID "
|
|
||||||
"WHERE e.CARD_ID = %s AND t.D_FROM <= CAST(GETDATE() AS DATE) "
|
|
||||||
"AND (t.D_TO >= CAST(GETDATE() AS DATE) OR t.D_TO = CAST('1999-12-31' AS DATE))",
|
|
||||||
(card_id,)
|
|
||||||
)
|
|
||||||
row = cursor.fetchone()
|
|
||||||
if row:
|
|
||||||
print(f"\n 📋 Информация о сотруднике:")
|
|
||||||
print(f" Компания : {row[0]}")
|
|
||||||
print(f" Отдел : {row[1]}")
|
|
||||||
print(f" Должность: {row[2]}")
|
|
||||||
print(f" Email : {row[3]}")
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 8. Загрузка табеля за последние 5 месяцев
|
# 8. Загрузка табеля за последние 5 месяцев
|
||||||
|
|||||||
Reference in New Issue
Block a user