115 lines
5.5 KiB
Python
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 |