Untitled
unknown
plain_text
2 years ago
10 kB
8
Indexable
from jupytercloud.library import get_secret
import requests
import json
import pandas as pd
import numpy as np
from openpyxl import load_workbook
from io import BytesIO
import ast
# Получение токена из секрета
TrackerOauthToken = get_secret('sec-01hbdac4pph2h48dwacme1x15h')
TOKEN = TrackerOauthToken.get('TOKEN')
# Параметры запроса
HEADERS = {
'Authorization': f'OAuth {TOKEN}',
'Content-Type': 'application/json'}
URL = 'https://st-api.yandex-team.ru/v2/issues/'
# Фильтрация тикетов через query
start_date = "01.09.2023"
end_date = "30.09.2023"
query = f'Queue: Заявки ("Новая Зарплата": notEmpty() OR Теги:Массовое_повышение OR "Новая тарифная ставка":notEmpty()) (Статус: ! "Отмена заявки" Статус: !"В работе" Статус: !Проверка Статус: !"Ждем подтверждения" Статус: !"Согласование в HR") Резолюция: !Некорректный Резолюция: ! "Не будет исправлено" Резолюция: ! Duplicate Резолюция: ! "Дубликат (подзадача)" "Дата повышения": >= {start_date} "Дата повышения": < {end_date}'
filter = {
"filter": {
},
"query": f'{query}'
}
data = []
# Первый запрос
response_scroll = requests.post(f'{URL}_search?scrollType=unsorted&perScroll=1000', headers=HEADERS, data=json.dumps(filter))
# Cледующие запросы
if response_scroll.status_code == 200:
try:
while True:
response_data = response_scroll.json()
data.extend(response_data)
# Если прокрутка еще не закончена, возвращаются заголовки X-Scroll-Id и X-Scroll-Token,
# значения которых можно передать в параметрах scrollId и scrollToken соответственно для получения следующей страницы результатов.
X_Scroll_Id = response_scroll.headers.get('X-Scroll-Id')
X_Scroll_Token = response_scroll.headers.get('X-Scroll-Token')
if not X_Scroll_Id or not X_Scroll_Token:
break
# Последующие запросы, состаленные используюя scrollId и scrollToken из заголовков предыдущих запросов
response_scroll = requests.post(f'{URL}_search?scrollId={X_Scroll_Id}&scrollToken={X_Scroll_Token}', headers=HEADERS, data=json.dumps(filter))
except json.JSONDecodeError as e:
print(f'Failed to decode JSON: {e}')
except:
print(f'Request error: {response_scroll.status_code}')
# Данные для выгрузки из SALARY
keys = []
employees = []
logins = []
summaries = []
statuses = []
assignees = []
dates = []
bp_numbers = []
current_tariff_rates = []
new_tariff_rates = []
current_salaries = []
new_salaries = []
organizations = []
entities = []
transactions = []
systems = []
currencies = []
components = []
# Данные для выгрузки из SALARY по тикетам с массовым повышением
mass = []
for ticket in data:
tag = [tag for tag in ticket.get('tags', {})]
if "Массовое_повышение" not in tag:
key = ticket.get('key', {})
employee = ticket.get('employee', {}).get('display', {})
login = ticket.get('employee', {}).get('id', {})
summary = ticket.get('summary', {})
status = ticket.get('status', {}).get('display', {})
assignee = ticket.get('assignee', {}).get('display', {})
date = ticket.get('raiseDate', {})
bp_number = ticket.get('bpNumber', {})
current_tariff_rate = ticket.get('urrentTariffRate', {})
new_tariff_rate = ticket.get('rateTariff', {})
current_salary = ticket.get('currentSalary', {})
new_salary = ticket.get('newSalary', {})
organization = ticket.get('organization', {})
entity = ticket.get('legalEntity2', {}).get('display', {})
transaction = ticket.get('5fedc3773bcd8c3a56eb7ef5--priznakSdelka', {})
system = ticket.get('salarySystem', {})
currency = ticket.get('currency', {})
component = [component['display'] for component in ticket.get('components', {})]
keys.append(key)
employees.append(employee)
logins.append(login)
summaries.append(summary)
statuses.append(status)
assignees.append(assignee)
dates.append(date)
bp_numbers.append(bp_number)
current_tariff_rates.append(current_tariff_rate)
new_tariff_rates.append(new_tariff_rate)
current_salaries.append(current_salary)
new_salaries.append(new_salary)
organizations.append(organization)
entities.append(entity)
transactions.append(transaction)
systems.append(system)
currencies.append(currency)
components.append(component)
else:
key_mass = ticket.get('key', {})
summary_mass = ticket.get('summary', {})
status_mass = ticket.get('status', {}).get('display', {})
assignee_mass = ticket.get('assignee', {}).get('display', {})
date_mass = ticket.get('raiseDate', {})
component_mass = [component['display'] for component in ticket.get('components', {})]
# Создаём словарь с данными по тикетам с массовым повышением
dict = {'key': key_mass, 'summary': summary_mass, 'status': status_mass, 'assignee': assignee_mass, 'date': date_mass, 'component': component_mass}
mass.append(dict)
with pd.ExcelWriter('Кадровая сверка.xlsx', engine='xlsxwriter') as writer:
df_main = pd.DataFrame({'Ключ тикета': keys, 'Сотрудник': employees, 'Логин': logins, 'Задача': summaries, 'Статус': statuses, 'Исполнитель': assignees, 'Дата повышения': dates, 'Номер БП': bp_numbers, 'Текущая тарифная ставка': current_tariff_rates, 'Новая тарифная ставка': new_tariff_rates, 'Текущая зарплата': current_salaries, 'Новая зарплата': new_salaries, 'Оклад': None, 'Валюта': None, 'Ставка': None, 'Организация': organizations, 'Юридическое лицо 2.0': entities, 'Признак сделка': transactions, 'Система оплаты труда': systems, 'Компоненты': components})
df_main['Оклад'] = df_main['Новая зарплата'].str.extract(r'(\d+)')
df_main['Валюта'] = df_main['Новая зарплата'].str.extract(r'([A-Z]+)').fillna('')
df_main['Ставка'] = df_main['Новая зарплата'].str.extract(r'\(([^)]+)\)')
df_main['Ставка'] = df_main['Ставка'].apply(lambda x: None if x == 'None' else x)
df_main['Компоненты'] = df_main['Компоненты'].apply(lambda x: ', '.join(map(str, x)))
df_main = df_main.replace([{}], value=np.NaN)
df_main.fillna('', inplace=True)
df_main.index = pd.RangeIndex(1, len(df_main)+1, name='№')
df_main.to_excel(writer, sheet_name='Выгрузка', index=True, header=True)
for mass_ticket in mass:
key = mass_ticket.get('key')
summary = mass_ticket.get('summary')
status = mass_ticket.get('status')
assignee = mass_ticket.get('assignee')
date = mass_ticket.get('date')
component = [component for component in mass_ticket.get('component')]
response_mass = requests.get(f'{URL}{key}/attachments', headers=HEADERS)
attach_id = response_mass.json()[0].get('id')
attach_name = response_mass.json()[0].get('name')
response_attach = requests.get(f'{URL}{key}/attachments/{attach_id}/{attach_name}', headers=HEADERS)
try:
content = response_attach.content
df_mass = pd.read_excel(BytesIO(content), skiprows=[0], header=0)
df_mass['Ссылка на тикет'] = key
df_mass.insert(1, 'Задача', summary)
df_mass.insert(2, 'Исполнитель', assignee)
df_mass.insert(3, 'Статус', status)
df_mass.insert(4, 'Дата повышения', date)
df_mass.insert(5, 'Компоненты', str(component))
df_mass['Компоненты'] = df_mass['Компоненты'].apply(lambda x: ', '.join(map(str, ast.literal_eval(x))))
df_mass.index = pd.RangeIndex(1, len(df_mass)+1, name='№')
df_mass.to_excel(writer, sheet_name=f'Mass_{key}', index=True)
except Exception as e:
print(f"Ошибка при чтении прикрепленного файла: {e}")
response_comment = requests.get(f'{URL}{key}/comments', headers=HEADERS)
try:
comment_list = []
comments = response_comment.json()
for comment in comments:
author = comment.get('createdBy', {}).get('display', {})
date = comment.get('createdAt', {})
text = comment.get('text', {})
dict = {'Автор': author, 'Создан': date, 'Текст': text}
comment_list.append(dict)
df_comm = pd.DataFrame(comment_list)
df_comm.index = pd.RangeIndex(1, len(df_comm)+1, name='№')
df_comm.to_excel(writer, sheet_name=f'Comments_{key}', index=True)
except Exception as e:
print(f"Ошибка при чтении комментариев: {e}")Editor is loading...