# Implantação do framework na conta de destino

* Instalar python para todos os usuários, marcar "Add python.exe to PATH" nas opções de Instalação Personalizada:
  * instalar python para todos os usuários
  * Associar arquivos com Python (solicitar o lançador "py")
  * Criar atalhos para aplicativos instalados
  * Adicionar Python às variáveis de ambiente
  * Pré-compilar a biblioteca padrão
* Criar uma tarefa no Agendador de Tarefas do Windows com qualquer nome Geral:

  * "Executar apenas para usuários que estão logados"

  Gatilhos:

  * "No login" --> "Usuário" (especificar)
  * "Na conexão remota" --> "Conexão de um computador remoto" --> "Usuário" (especificar)

  Ações:

  * "Iniciar programa"
  * "Programa ou script" --> Caminho completo até SherpaPython.exe
  * "Pasta de trabalho" --> Caminho até a pasta onde está SherpaPython.exe, obrigatoriamente sem aspas, exemplo: D:\Sherpa\_RPA\PythonSherpa-framework\\
* Executar manualmente SherpaPython.exe uma vez
* Os logs do framework serão armazenados no caminho C:\Users\User\AppData\Roaming\Sherpa RPA Python
* O arquivo de configurações settings.txt será armazenado no caminho C:\Users\User\AppData\Roaming\Sherpa RPA Python

Conteúdo de settings.txt

* << Insira o guid do robô >> - substituir pelo GUID do robô
* << Insira o host do robô >> - inserir o host ou IP do orquestrador junto com o protocolo, por exemplo <https://orchestrator2.sherparpa.ru>
* << Insira o status de logoff do robô >> - um dígito (0 - não é realizado logoff automático após a conclusão do trabalho, 1 - é realizado logoff automático após a conclusão do trabalho, na ausência da terceira linha considera-se que o valor 1 está definido)

***

```
                    RobotsOrcFramework
```

***

```
Tratamento de parada suave dentro do robô python

import signal
import time
import sys

class TestProcess1():
    stop = False
    def __init__(self):
    # Captura do sinal de parada suave do framework
        signal.signal(signal.SIGBREAK, self.stop_process)

    # Tratamento do sinal como uma alternância de flag
    def stop_process(self, signal, frame):
        self.stop = True 

    def robot_work(self):
        for elem in range(10):
            time.sleep(1)
            # Se a flag estiver na posição correta, interromper o programa
            if self.stop:
	    sys.exit()

test = TestProcess1()
test.robot_work()
```

***

```
Obter e processar argumentos do framework dentro do robô python

# processar argumentos da linha de comando
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("|"))
```

***

```
Obter host e GUID do robô dentro do robô python

# obter configurações
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()
```

***

```
Caminho para scripts python dos robôs

No nome da versão do processo no orquestrador, indicar o caminho para o script python,
em relação ao arquivo do framework (RobotsOrcFramework.py)

Formato
pasta1\pasta2\nome do script sem extensão
```

***

```
                    Uso do TaskOrchestratorAPI
```

***

```
from TaskOrcAPI import TaskOrchestratorAPI # pasta OrchestratorAPI
TOA = TaskOrchestratorAPI(robot_guid, host, headers)
```

***

```
Adicionando tarefa à fila

param_task pode não ser especificado, por padrão {"":""}
name pode não ser especificado, por padrão "NewTask"

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

result = TOA.add_task(queue_GUID)

result['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
```

***

```
Obtendo tarefa da fila

status, pode não ser especificado, por padrão 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]> Código da requisição

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']       # comentário
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
```

***

```
Atualizando o status da tarefa obtida anteriormente

Tabela de status das tarefas
STATUS_NEW              = 0;  # Nova tarefa
STATUS_IN_PROGRESS      = 1;  # Tarefa em andamento
STATUS_SUCCESS          = 2;  # Tarefa concluída com sucesso
STATUS_FAILED           = 3;  # Tarefa falhou com Exceção de Aplicação
STATUS_FAILED_BUSINESS  = 4;  # Tarefa falhou com Exceção de Negócio
STATUS_POSTPONED        = 5;  # Tarefa adiada até o horário especificado
STATUS_ABANDONED        = 6;  # Tarefa abandonada (não processada a tempo)

status, pode não ser especificado, por padrão 0    

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

result = TOA.update_task_status(task_GUID, status)
result # <Response [200]> Código da requisição
```

***

```
Obtendo recurso (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']              # Recurso
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
```

***

```
Atualizando recurso

name pode não ser especificado, por padrão NewName
se o recurso for credenciais (credentials), especificamos password, então text = username, caso contrário, não especificamos

asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"
text = 'Novo recurso'
name = 'Recurso'
password = '777'

result = TOA.asset_update(asset_GUID, text, name, password)
result # <Response [200]> Código da requisição
```

***

```
Adicionando nova entrada ao log

Valores permitidos para Level: 'Info', 'Critical', 'Error', 'Warning', 'Debug'

level pode não ser especificado, por padrão 'Info'
message pode não ser especificado, por padrão ''

robot_guid = sys.argv[1]
process_version_guid = 'f7952815-a238-4870-b678-943b0119d0f4'
job_guid = '922d3cc6-99ec-44c2-b0a0-62114c9d2908'
level, message = 'Info', 'mensagem'

result = TOA.add_new_log_entry(
    robot_guid, process_version_guid, job_guid
)
result_dict = json.loads(result.text)

result                  # <Response [200]> Código da requisição
result_dict['guid']     # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
```

***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sherparpa.ru/pt/sherpa-rpa/sherpa-orchestrator/python-sherpa-framework/razvertyvanie-freimvorka-na-celevoi-uchetnoi-zapisi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
