Files
trueconf_bot/lk/documents_service.py
T

115 lines
5.5 KiB
Python

# /opt/trueconf_bot/lk/documents_service.py
import smtplib
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from datetime import datetime
import config.config as config
logger = logging.getLogger(__name__)
def get_user_info_for_docs(cursor, card_id: str) -> dict:
"""Извлекает кадровые данные сотрудника по CARD_ID для оформления бланков справок"""
current_date = datetime.now().strftime('%Y-%m-%d')
query = """
select e.TAB_N, a.NAME, d.NAME, hr.FULL_NAME, hr.EMAIL, f.SNAME, pr.EMAIL as workBookEmail
from (select e.TAB_N, e.FIRM_ID, c.F_NAME, c.L_NAME, e.ID, c.M_NAME
from UOV_SELFSERVICE_PR_EMP e
join UOV_SELFSERVICE_PR_CARD c on c.ID=e.CARD_ID
where c.ID = %s
group by e.ID, e.FIRM_ID, c.F_NAME, c.L_NAME, c.M_NAME, e.TAB_N ) as e
join UOV_SELFSERVICE_PR_TRANS t on t.EMP_ID = e.ID
join UOV_SELFSERVICE_ST_APPOINT a on a.ID = t.APPOINT_ID
join UOV_SELFSERVICE_HR_DEPT d on d.ID = t.DEPT_ID
join UOV_SELFSERVICE_HR_S_USER_SL hr on hr.FIRM_ID = e.FIRM_ID
join UOV_SELFSERVICE_HR_FIRM f on e.FIRM_ID=f.ID
left join UOV_SELFSERVICE_HR_S_USER_PR pr on (pr.DEPT_ISOL_ID = d.DEPT_ISOL_ID or pr.FIRM_ID = f.ID)
where ((t.D_FROM <= %s and t.D_TO >= %s)
or (t.D_FROM <= %s and t.D_TO = '1999-12-31'))
and e.FIRM_ID = f.ID
"""
cursor.execute(query, (card_id, current_date, current_date, current_date))
row = cursor.fetchone()
if not row:
raise Exception("Не удалось найти кадровые данные сотрудника для заказа справки.")
return {
'tab_n': str(row[0]) if row[0] else "Не указан",
'job': str(row[1]) if row[1] else "",
'dept': str(row[2]) if row[2] else "",
'hr_fio': str(row[3]) if row[3] else "",
'hr_email': str(row[4]) if row[4] else "",
'firm': str(row[5]) if row[5] else "",
'wb_email': str(row[6]) if row[6] else ""
}
def generate_mail_message(doc_name: str, quantity: int, user_info: dict, period: str = "", attachment_path: str = "") -> bool:
"""Формирует и отправляет HTML-письмо заявки на справку в отдел кадров СибЦема"""
# Извлекаем оригинальные адреса кадровиков из структуры БД
orig_to = user_info.get('hr_email', '').strip()
# Копия уходит на ящик трудовых книжек только если заказывают пункт 7
orig_cc = user_info.get('wb_email', '').strip() if doc_name == "Копия трудовой книжки" else ""
to_email = orig_to
cc_list = [orig_cc] if orig_cc else []
# Если включен DOCUMENTS_TEST_MODE, жестко перехватываем поток писем
if getattr(config, 'DOCUMENTS_TEST_MODE', False):
test_email = getattr(config, 'DOCUMENTS_TARGET_EMAIL', 'mailonline@sibcem.ru')
to_email = test_email
cc_list = []
subject = f"Запрос документа {doc_name} из Личного кабинета"
period_str = f" {period}" if period else ""
messageBody = (
f"Необходимо оформить документ {doc_name} в количестве {quantity} шт. "
f"на сотрудника предприятия {user_info['firm']} с табельным номером - "
f"\"{user_info['tab_n']}\"{period_str}.<br/><br/>"
f"Данное письмо отправлено автоматически, отвечать на него не стоит."
)
message = MIMEMultipart()
message['From'] = getattr(config, 'DEFAULT_EMAIL_FROM', 'mailonline@sibcem.ru')
message['To'] = to_email
message['Subject'] = subject
if cc_list:
message['Cc'] = ", ".join(cc_list)
message.attach(MIMEText(messageBody, 'html', 'utf-8'))
if attachment_path:
try:
with open(attachment_path, 'rb') as attachment:
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition", f"attachment; filename={attachment_path}")
message.attach(part)
except Exception as e:
logger.error(f"Не удалось прикрепить файл к письму: {e}")
recipients = [to_email] + cc_list
smtp_server = getattr(config, 'SMTP_SERVER', 'srvkem-mail.sibcem.ru')
smtp_port = int(getattr(config, 'SMTP_PORT', 25))
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
# Если в конфигурации Passwork лежат логин/пароль для SMTP — авторизуемся
if getattr(config, 'SMTP_USER', None):
server.login(config.SMTP_USER, config.SMTP_PASSWORD)
server.sendmail(message['From'], recipients, message.as_string())
server.quit()
return True
except Exception as e:
logger.error(f"Ошибка SMTP при отправке письма: {e}")
return False