Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
10 kB
1
Indexable
Never
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}")