----------------------------------------------------------------------------- 
                        Развертывание фреймворка на целевой учетной записи
-----------------------------------------------------------------------------

1) Установить python для всех пользователей, поставить галочку "Add python.exe to PATH"
    Галочки Customize Installation:
    1) install python for all users
    2) Associate files with Python (request the "py" launcher)
    3) Create shortcuts for installed applications
    4) Add Python to enviroment variables
    5) Precompile standard library

2) Создать задачу в планировщике заданий Windows с любым именем
    Общее:
    1) "Выполнить только для пользователей, вошедших в систему" 

    Тригерры:
    1) "При входе в систему" --> "Пользователь" (указать)
    2) "При удаленном подключении" --> "Подключение с удаленного компьютера" --> "Пользователь" (указать)

    Действия:
    1) "Запуск программы"
    2) "Программа или сценарий" --> Полный путь до SherpaPython.exe
    3) "Рабочая папка" --> Путь до папки в которой лежит SherpaPython.exe, обязательно без кавычек
	пример: D:\Sherpa_RPA\PythonSherpa-framework\

3) Один раз вручную запустить SherpaPython.exe
4) Логи фрейморка будут размещаться по пути С:\Users\User\AppData\Roaming\Sherpa RPA Python
5) Файл настроек settings.txt будет размещаться по пути С:\Users\User\AppData\Roaming\Sherpa RPA Python
    Содержимое settings.txt
    1) << Введите guid робота >> - заменить на GUID робота
    2) << Введите host робота >> - ввести хост или IP оркестратора вместе с протоколом, например https://orchestrator2.sherparpa.ru
    3) << Введите статус logoff робота >>  - одна цифра
       (0 - не производится автоматический logoff  после окончания работ, 1 - производится автоматический logoff после окончания работ, в случае отсутствия третьей строки считается установленным значение 1)

-----------------------------------------------------------------------------  
                        RobotsOrcFramework
-----------------------------------------------------------------------------   
    Обработка мягкой остановки внутри python-робота

    import signal
    import time
    import sys

    class TestProcess1():
        stop = False
        def __init__(self):
	    # Перехват сигнала мягкой остановки от фреймворка
            signal.signal(signal.SIGBREAK, self.stop_process)

        # Обработка сигнала в виде переключения флага
        def stop_process(self, signal, frame):
            self.stop = True 

        def robot_work(self):
            for elem in range(10):
                time.sleep(1)
                # Если флаг в нужной позиции, прервать программу
                if self.stop:
		    sys.exit()

    test = TestProcess1()
    test.robot_work()

-----------------------------------------------------------------------------
    Получить и обработать аргументы от фреймворка внутри python-робота

    # обработать аргументы командной строки
    def process_cmd_arguments(argv):
        process_version_guid = argv[0]
        job_guid = argv[1]
        settings_path = argv[3]

    process_cmd_arguments(sys.argv[1].split("|"))

-----------------------------------------------------------------------------
    Получить host и GUID робота внутри python-робота

    # получить настройки
    def get_settings():
        with open(settings_path, "r", encoding="utf-8") as file:
            settings = file.read()
        settings = [elem.replace("\n", "") for elem in settings.split("\n")]

        return settings[0], settings[1]

    robot_GUID, host = get_settings()

-----------------------------------------------------------------------------
    Путь к python-скриптам роботов

    В имени версии процесса в оркестраторе указать путь к python-скрипту,
    относительно файла фреймворка (RobotsOrcFramework.py)

    Формат
    папка1\папка2\имя скрипта без расширения

-----------------------------------------------------------------------------
                        Использование TaskOrchestratorAPI
-----------------------------------------------------------------------------

    from TaskOrcAPI import TaskOrchestratorAPI # папка OrchestratorAPI
    TOA = TaskOrchestratorAPI(robot_guid, host, headers)

-----------------------------------------------------------------------------
    Добавление задачи в очередь

    param_task можно не указывать, по умолчанию {"":""}
    name можно не указывать, по умолчанию "NewTask"

    queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
    param_task = {"param1": "1", "param2": "2", "param3": "3"}
    name = 'New Task'

    result = TOA.add_task(queue_GUID)
    
    result['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
    
-----------------------------------------------------------------------------
    Получаем задачу из очереди
    
    status, можно не указывать, по умолчанию 0

    queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
    status = 1

    result = TOA.get_task(queue_GUID, status)
    result_dict = json.loads(result.text)
    
    result                       # <Response [200]> Код запроса

    result_dict['id']            # 1171
    result_dict['guid']          # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
    result_dict['name']          # NewTask
    result_dict['status']        # 4
    result_dict['created']       # 2022-10-28 06:19:19
    result_dict['updated']       # 2022-10-28 09:45:45
    result_dict['comment']       # комментарий
    result_dict['priority']      # 1
    result_dict['deadline']      # 2022-10-28 06:19:19
    result_dict['postponed']     # 2022-10-28 09:45:45
    result_dict['parameters']    # {"param": "value"}
    result_dict['description']   # None
    
-----------------------------------------------------------------------------
    Обновляем статус полученной ранее задачи

    Справочник статусов задач
    STATUS_NEW              = 0;  # Новая задача
    STATUS_IN_PROGRESS      = 1;  # Задача в работе
    STATUS_SUCCESS          = 2;  # Задача успешно завершена
    STATUS_FAILED           = 3;  # Задача провалена с Application Exception
    STATUS_FAILED_BUSINESS  = 4;  # Задача провалена с Business Exception
    STATUS_POSTPONED        = 5;  # Задача отложена до указанного времени
    STATUS_ABANDONED        = 6;  # Задача заброшена (не взята в обработку вовремя)

    status, можно не указывать, по умолчанию 0    

    task_GUID = '4e9cb924-681a-4d1d-9420-e1dac677f3fa'
    status = 5

    result = TOA.update_task_status(task_GUID, status)
    result # <Response [200]> Код запроса
    
-----------------------------------------------------------------------------
    Получаем ресурс (asset)
    
    asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"

    result = TOA.get_asset(asset_GUID)
    
    result['id']                # 1171
    result['guid']              # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
    result['name']              # Ресурс
    result['text']              # 4
    result['type']              # 1
    result['created']           # 2022-10-28 06:19:19
    result['updated']           # 2022-10-28 06:19:19
    result['robot_id']          # None
    result['password']          # 2022-10-28 06:19:19
    result['is_deleted']        # 0
    result['account_id']        # 27
    result['robot_type']        # 3
    result['description']       # ''
    result['robot_group_id']    # None

-----------------------------------------------------------------------------
    Обновляем ресурс
    
    name можно не указывать, по умолчанию NewName
    если ресурс это реквизиты (credentials), указываем password, тогда text = username, иначе не указываем
    
    asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"
    text = 'Новый ресурс'
    name = 'Ресурс'
    password = '777'

    result = TOA.asset_update(asset_GUID, text, name, password)
    result # <Response [200]> Код запроса

-----------------------------------------------------------------------------
    Добавляем новую запись в лог

    Допустимые значения для Level: 'Info', 'Critical', 'Error', 'Warning', 'Debug'
    
    level можно не указывать, по умолчанию 'Info'
    message можно не указывать, по умолчанию ''
    
    robot_guid = sys.argv[1]
    process_version_guid = 'f7952815-a238-4870-b678-943b0119d0f4'
    job_guid = '922d3cc6-99ec-44c2-b0a0-62114c9d2908'
    level, message = 'Info', 'сообщение'

    result = TOA.add_new_log_entry(
        robot_guid, process_version_guid, job_guid
    )
    result_dict = json.loads(result.text)
    
    result                  # <Response [200]> Код запроса
    result_dict['guid']     # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d

-----------------------------------------------------------------------------
