worker-automate-hub 0.5.9__py3-none-any.whl → 0.5.12__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of worker-automate-hub might be problematic. Click here for more details.

@@ -0,0 +1,38 @@
1
+ import asyncio
2
+ import aiohttp
3
+ from rich.console import Console
4
+ from worker_automate_hub.config.settings import load_env_config
5
+ from worker_automate_hub.utils.logger import logger
6
+
7
+ console = Console()
8
+
9
+ async def send_rdp_action(uuid_robo: str, action: str):
10
+ env_config, _ = load_env_config()
11
+
12
+ body = {
13
+ "uuidRobo": uuid_robo,
14
+ "action": action
15
+ }
16
+
17
+ headers_basic = {"Authorization": f"Basic {env_config['API_AUTHORIZATION']}"}
18
+ url = f"{env_config['API_BASE_URL']}/robo/api/manage"
19
+
20
+ try:
21
+ async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=True)) as session:
22
+ async with session.post(url, json=body, headers=headers_basic) as response:
23
+ if response.status == 200:
24
+ data = await response.json()
25
+ logger.info(f"Ação '{action}' enviada com sucesso: {data}")
26
+ console.print(f"Ação '{action}' enviada com sucesso.", style="bold green")
27
+ return data
28
+ else:
29
+ err_msg = f"Erro ao enviar ação '{action}': {response.status} - {await response.text()}"
30
+ logger.error(err_msg)
31
+ console.print(err_msg, style="bold red")
32
+ return {"error": err_msg}
33
+
34
+ except Exception as e:
35
+ err_msg = f"Erro ao comunicar com o endpoint RDP: {e}"
36
+ logger.error(err_msg)
37
+ console.print(err_msg, style="bold red")
38
+ return {"error": str(e)}
@@ -1,30 +1,34 @@
1
- from worker_automate_hub.config.settings import load_env_config
2
- from worker_automate_hub.utils.logger import logger
1
+ import aiohttp
3
2
  from rich.console import Console
4
3
 
5
- import aiohttp
4
+ from worker_automate_hub.config.settings import load_env_config
5
+ from worker_automate_hub.models.dao.rpa_fila import RpaFila
6
+ from worker_automate_hub.utils.logger import logger
6
7
 
7
8
  console = Console()
8
9
 
9
10
 
10
11
  async def burn_queue(id_fila: str):
11
12
  env_config, _ = load_env_config()
12
- try:
13
+ try:
13
14
 
14
15
  headers_basic = {"Authorization": f"Basic {env_config["API_AUTHORIZATION"]}"}
15
-
16
16
 
17
- async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=True)) as session:
17
+ async with aiohttp.ClientSession(
18
+ connector=aiohttp.TCPConnector(verify_ssl=True)
19
+ ) as session:
18
20
  async with session.delete(
19
21
  f"{env_config["API_BASE_URL"]}/fila/burn-queue/{id_fila}",
20
22
  headers=headers_basic,
21
23
  ) as response:
22
24
  if response.status == 200:
23
25
  logger.info("Fila excluida com sucesso.")
24
- console.print("\nFila excluida com sucesso.\n", style="bold green")
26
+ console.print("\nFila excluida com sucesso.\n", style="bold green")
25
27
  else:
26
- logger.error(f"Erro ao excluir a fila: {response.content}")
27
- console.print(f"Erro ao excluir a fila: {response.content}", style="bold red")
28
+ logger.error(f"Erro ao excluir a fila: {response.content}")
29
+ console.print(
30
+ f"Erro ao excluir a fila: {response.content}", style="bold red"
31
+ )
28
32
 
29
33
  except Exception as e:
30
34
  err_msg = f"Erro remover registro da fila: {e}"
@@ -34,16 +38,18 @@ async def burn_queue(id_fila: str):
34
38
  style="bold red",
35
39
  )
36
40
  return None
37
-
41
+
42
+
38
43
  async def unlock_queue(id: str):
39
44
  env_config, _ = load_env_config()
40
- try:
41
- headers_basic = {"Authorization": f"Basic {env_config["API_AUTHORIZATION"]}"}
42
-
45
+ try:
46
+ headers_basic = {"Authorization": f"Basic {env_config["API_AUTHORIZATION"]}"}
43
47
 
44
- async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=True)) as session:
48
+ async with aiohttp.ClientSession(
49
+ connector=aiohttp.TCPConnector(verify_ssl=True)
50
+ ) as session:
45
51
  async with session.get(
46
- f"{env_config["API_BASE_URL"]}/fila/unlock-queue/{id}",
52
+ f"{env_config["API_BASE_URL"]}/fila/unlock-queue/{id}",
47
53
  headers=headers_basic,
48
54
  ) as response:
49
55
  return await response.text()
@@ -55,4 +61,4 @@ async def unlock_queue(id: str):
55
61
  f"{err_msg}\n",
56
62
  style="bold red",
57
63
  )
58
- return None
64
+ return None
@@ -1,12 +1,147 @@
1
+ from datetime import datetime
2
+
1
3
  import aiohttp
4
+ from pytz import timezone
5
+ from rich.console import Console
2
6
 
3
7
  from worker_automate_hub.config.settings import load_env_config
4
8
  from worker_automate_hub.models.dao.rpa_historico import RpaHistorico
9
+ from worker_automate_hub.models.dao.rpa_processo import RpaProcesso
5
10
  from worker_automate_hub.models.dto.rpa_historico_request_dto import (
6
11
  RpaHistoricoRequestDTO,
12
+ RpaHistoricoStatusEnum,
13
+ RpaRetornoProcessoDTO,
14
+ )
15
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
16
+ RpaProcessoEntradaDTO,
7
17
  )
8
18
  from worker_automate_hub.utils.logger import logger
9
19
 
20
+ console = Console()
21
+
22
+
23
+ async def create_store_historico(
24
+ task: RpaProcessoEntradaDTO,
25
+ processo: RpaProcesso,
26
+ status: RpaHistoricoStatusEnum,
27
+ retorno_processo: RpaRetornoProcessoDTO = None,
28
+ ) -> RpaHistorico:
29
+ """
30
+ Salva o histórico de um processo com status Processando.
31
+
32
+ Recebe um RpaProcessoEntradaDTO e um RpaProcesso como parâmetro e salva o
33
+ histórico com status Processando. Retorna um dicionário com o uuid do
34
+ histórico salvo.
35
+
36
+ Args:
37
+ task (RpaProcessoEntradaDTO): O processo a ser salvo.
38
+ processo (RpaProcesso): O processo que está sendo executado.
39
+
40
+ Returns:
41
+ RpaHistorico: Dicionário com o uuid do histórico salvo.
42
+ """
43
+ try:
44
+ from worker_automate_hub.config.settings import load_worker_config
45
+
46
+ worker_config = load_worker_config()
47
+ tz = timezone("America/Sao_Paulo")
48
+ start_time = datetime.now(tz).isoformat()
49
+
50
+ identificador_processo = (
51
+ task.configEntrada.get("nfe") or task.configEntrada.get("empresa") or ""
52
+ )
53
+
54
+ # Armazenar início da operação no histórico
55
+ start_data = RpaHistoricoRequestDTO(
56
+ uuidProcesso=task.uuidProcesso,
57
+ uuidRobo=worker_config["UUID_ROBO"],
58
+ prioridade=processo.prioridade,
59
+ desStatus=status,
60
+ configEntrada=task.configEntrada,
61
+ datInicioExecucao=start_time,
62
+ datEntradaFila=task.datEntradaFila,
63
+ identificador=identificador_processo,
64
+ retorno=retorno_processo,
65
+ )
66
+
67
+ store_response: RpaHistorico = await store(start_data)
68
+ console.print(
69
+ f"\nHistorico salvo com o uuid: {store_response.uuidHistorico}\n",
70
+ style="green",
71
+ )
72
+ return store_response
73
+ except Exception as e:
74
+ err_msg = f"Erro ao salvar o registro no histórico: {e}"
75
+ console.print(f"\n{err_msg}\n", style="red")
76
+ logger.error(f"{err_msg}")
77
+
78
+
79
+ async def create_update_historico(
80
+ historico_uuid: str,
81
+ task: RpaProcessoEntradaDTO,
82
+ retorno_processo: RpaRetornoProcessoDTO,
83
+ processo: RpaProcesso,
84
+ ):
85
+ """
86
+ Atualiza o histórico de um processo com o status de sucesso ou falha.
87
+
88
+ Recebe o uuid do histórico, o RpaProcessoEntradaDTO do processo, um booleano
89
+ indicando se o processo foi um sucesso ou não, o RpaRetornoProcessoDTO do
90
+ processo e o RpaProcesso do processo como parâmetro e atualiza o histórico
91
+ com o status de sucesso ou falha. Retorna um dicionário com o uuid do
92
+ histórico atualizado.
93
+
94
+ Args:
95
+ historico_uuid (str): O uuid do histórico.
96
+ task (RpaProcessoEntradaDTO): O RpaProcessoEntradaDTO do processo.
97
+ sucesso (bool): Um booleano indicando se o processo foi um sucesso ou não.
98
+ retorno_processo (RpaRetornoProcessoDTO): O RpaRetornoProcessoDTO do processo.
99
+ processo (RpaProcesso): O RpaProcesso do processo.
100
+
101
+ Returns:
102
+ RpaHistorico: Dicionário com o uuid do histórico atualizado.
103
+ """
104
+
105
+ try:
106
+ from worker_automate_hub.config.settings import load_worker_config
107
+
108
+ worker_config = load_worker_config()
109
+ tz = timezone("America/Sao_Paulo")
110
+ des_status: RpaHistoricoStatusEnum = retorno_processo.status
111
+ end_time = datetime.now(tz).isoformat()
112
+
113
+ identificador_processo = (
114
+ task.configEntrada.get("nfe") or task.configEntrada.get("empresa") or ""
115
+ )
116
+ if not retorno_processo.tags:
117
+ retorno_processo.tags = []
118
+
119
+ # Armazenar fim da operação no histórico
120
+ end_data = RpaHistoricoRequestDTO(
121
+ uuidHistorico=historico_uuid,
122
+ uuidProcesso=task.uuidProcesso,
123
+ uuidRobo=worker_config["UUID_ROBO"],
124
+ prioridade=processo.prioridade,
125
+ desStatus=des_status,
126
+ configEntrada=task.configEntrada,
127
+ retorno=retorno_processo,
128
+ datFimExecucao=end_time,
129
+ identificador=identificador_processo,
130
+ tags=retorno_processo.tags,
131
+ )
132
+
133
+ update_response: RpaHistorico = await update(end_data)
134
+ console.print(
135
+ f"\nHistorico atualizado com o uuid: {update_response.uuidHistorico}\n",
136
+ style="green",
137
+ )
138
+ return update_response
139
+
140
+ except Exception as e:
141
+ err_msg = f"Erro ao atualizar o histórico do processo: {e}"
142
+ console.print(f"\n{err_msg}\n", style="red")
143
+ logger.error(err_msg)
144
+
10
145
 
11
146
  async def store(data: RpaHistoricoRequestDTO) -> dict:
12
147
  """
@@ -0,0 +1,18 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+
7
+ class RpaFila(BaseModel):
8
+ uuidFila: Optional[str] = Field(None, alias="uuidFila")
9
+ uuidRobo: Optional[str] = Field(None, alias="uuidRobo")
10
+ uuidProcesso: str = Field(..., alias="uuidProcesso")
11
+ prioridade: int = Field(..., alias="prioridade")
12
+ configEntrada: Optional[dict] = Field(None, alias="configEntrada")
13
+ dtLeituraFila: Optional[datetime] = Field(None, alias="dtLeituraFila")
14
+ lock: Optional[bool] = Field(None, alias="lock")
15
+ mutarNotificacao: Optional[int] = Field(None, alias="mutarNotificacao")
16
+
17
+ class Config:
18
+ populate_by_name = True
@@ -0,0 +1,131 @@
1
+ import asyncio
2
+ import platform
3
+ import subprocess
4
+ import socket
5
+ import pyautogui
6
+ import pygetwindow as gw
7
+ from rich.console import Console
8
+ from pywinauto import Application
9
+ from worker_automate_hub.api.rdp_service import send_rdp_action
10
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import RpaHistoricoStatusEnum, RpaRetornoProcessoDTO
11
+ from worker_automate_hub.models.dto.rpa_processo_rdp_dto import RpaProcessoRdpDTO
12
+ from worker_automate_hub.utils.logger import logger
13
+ from worker_automate_hub.utils.util import worker_sleep
14
+
15
+ console = Console()
16
+
17
+ class RDPConnection:
18
+ def __init__(self, task: RpaProcessoRdpDTO):
19
+ self.task = task
20
+ self.ip = task.configEntrada.get("ip")
21
+ self.user = task.configEntrada.get("user")
22
+ self.password = task.configEntrada.get("password")
23
+ self.processo = task.configEntrada.get("processo")
24
+ self.uuid_robo = task.configEntrada.get("uuidRobo")
25
+
26
+ async def verificar_conexao(self) -> bool:
27
+ """
28
+ Verifica a conectividade com o host remoto via ping e verificação da porta RDP (3389).
29
+ """
30
+ sistema_operacional = platform.system().lower()
31
+ console.print(f"Sistema operacional detectado: {sistema_operacional}")
32
+
33
+ comando_ping = (
34
+ ["ping", "-n", "1", "-w", "1000", self.ip] if sistema_operacional == "windows" else ["ping", "-c", "1", "-W", "1", self.ip]
35
+ )
36
+ console.print(f"Executando comando de ping: {' '.join(comando_ping)}")
37
+
38
+ try:
39
+ resposta_ping = subprocess.run(comando_ping, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
40
+ ping_alcancado = resposta_ping.returncode == 0
41
+ console.print(f"Ping {'sucesso' if ping_alcancado else 'falhou'}")
42
+ except Exception as e:
43
+ console.print(f"Erro ao executar ping: {e}")
44
+ ping_alcancado = False
45
+
46
+ porta_aberta = False
47
+ try:
48
+ with socket.create_connection((self.ip, 3389), timeout=10):
49
+ console.print(f"Porta 3389 aberta em {self.ip}")
50
+ porta_aberta = True
51
+ except (socket.timeout, OSError) as e:
52
+ console.print(f"Erro ao verificar a porta RDP: {e}")
53
+
54
+ return ping_alcancado and porta_aberta
55
+
56
+ async def desligar(self):
57
+ """
58
+ Fecha a conexão RDP interagindo com a janela do cliente RDP.
59
+ """
60
+ janelas_rdp = [
61
+ win
62
+ for win in gw.getAllTitles()
63
+ if self.ip in win
64
+ ]
65
+
66
+ if not janelas_rdp:
67
+ console.print(f"Nenhuma janela RDP encontrada para o IP: {self.ip}")
68
+ return
69
+
70
+ for titulo in janelas_rdp:
71
+ janela = gw.getWindowsWithTitle(titulo)[0]
72
+ if not janela:
73
+ console.print(f"Erro ao localizar a janela: {titulo}")
74
+ continue
75
+
76
+ try:
77
+ janela = gw.getWindowsWithTitle(titulo)[0]
78
+ console.print(f"Processando janela: {titulo}")
79
+
80
+ app = Application(backend="uia").connect(title=titulo)
81
+ app_window = app.window(title=titulo)
82
+ console.print(f"Janela encontrada: {titulo}")
83
+
84
+ if not app or not app_window:
85
+ raise Exception("Nenhuma janela com título correspondente foi encontrada.")
86
+
87
+ app_window.set_focus()
88
+ console.print("Janela RDP ativada.")
89
+
90
+ x, y = janela.left, janela.top
91
+
92
+ pyautogui.moveTo(x + 2, y + 2)
93
+ pyautogui.hotkey("alt", "space")
94
+ await worker_sleep(2)
95
+ pyautogui.press("down", presses=10, interval=0.1)
96
+ await worker_sleep(2)
97
+ pyautogui.press("enter")
98
+ await worker_sleep(2)
99
+ pyautogui.press("enter")
100
+ break
101
+
102
+ except Exception as e:
103
+ console.print(f"Erro ao interagir com a janela {titulo}: {e}")
104
+ raise(e)
105
+
106
+ async def fechar_conexao_rdp(task: RpaProcessoRdpDTO) -> RpaRetornoProcessoDTO:
107
+ """
108
+ Gerencia o processo de fechamento da conexão RDP e retorna um status do processo.
109
+ """
110
+ try:
111
+ rdp_connection = RDPConnection(task)
112
+ console.print("Iniciando o fechamento da conexão RDP.")
113
+ conectado = await rdp_connection.verificar_conexao()
114
+
115
+ if not conectado:
116
+ msg = f"A máquina informada não está ligada. Verifique o IP: {rdp_connection.ip} e a disponibilidade da porta."
117
+ logger.warning(msg)
118
+ return RpaRetornoProcessoDTO(sucesso=False, retorno=msg, status=RpaHistoricoStatusEnum.Falha)
119
+
120
+ await rdp_connection.desligar()
121
+ await send_rdp_action(rdp_connection.uuid_robo, "stop")
122
+
123
+ return RpaRetornoProcessoDTO(
124
+ sucesso=True,
125
+ retorno="Conexão RDP encerrada com sucesso.",
126
+ status=RpaHistoricoStatusEnum.Sucesso,
127
+ )
128
+ except Exception as ex:
129
+ err_msg = f"Erro ao executar o fechamento da conexão RDP para a máquina {rdp_connection.ip}: {ex}"
130
+ console.print(err_msg)
131
+ return RpaRetornoProcessoDTO(sucesso=False, retorno=err_msg, status=RpaHistoricoStatusEnum.Falha)
@@ -4,6 +4,7 @@ from worker_automate_hub.tasks.jobs.coleta_dje_process import (
4
4
  coleta_dje_start_update,
5
5
  )
6
6
  from worker_automate_hub.tasks.jobs.conexao_rdp import conexao_rdp
7
+ from worker_automate_hub.tasks.jobs.fechar_conexao_rdp import fechar_conexao_rdp
7
8
  from worker_automate_hub.tasks.jobs.descartes import descartes
8
9
  from worker_automate_hub.tasks.jobs.ecac_estadual_main import (
9
10
  ecac_estadual_main,
@@ -61,6 +62,7 @@ task_definitions = {
61
62
  "abcfa1ba-d580-465a-aefb-c15ac4514407": descartes,
62
63
  "2c8ee738-7447-4517-aee7-ce2c9d25cea9": transferencias,
63
64
  "855f9e0f-e972-4f52-bc1a-60d1fc244e79": conexao_rdp,
65
+ "d36b0c83-9cc3-465f-ac80-934099a0e661": fechar_conexao_rdp,
64
66
  "81785803-0594-4bba-9aa0-7f220c200296": coleta_dje_start_update,
65
67
  "3907c8d4-d05b-4d92-b19a-2c4e934f1d78": ecac_estadual_main,
66
68
  "81d2d6e6-e9eb-414d-a939-d220476d2bab": ecac_federal,
@@ -1,19 +1,17 @@
1
- from datetime import datetime
2
-
3
1
  from pytz import timezone
4
- from worker_automate_hub.api.webhook_service import send_to_webhook
5
2
  from rich.console import Console
6
3
 
7
- from worker_automate_hub.api.client import (
8
- get_processo,
9
- send_gchat_message,
4
+ from worker_automate_hub.api.client import get_processo, send_gchat_message
5
+ from worker_automate_hub.api.rpa_fila_service import burn_queue
6
+ from worker_automate_hub.api.rpa_historico_service import (
7
+ create_store_historico,
8
+ create_update_historico,
10
9
  )
11
- from worker_automate_hub.api.rpa_fila_service import unlock_queue
12
- from worker_automate_hub.api.rpa_historico_service import store, update
10
+ from worker_automate_hub.api.webhook_service import send_to_webhook
11
+ from worker_automate_hub.config.settings import load_worker_config
13
12
  from worker_automate_hub.models.dao.rpa_historico import RpaHistorico
14
13
  from worker_automate_hub.models.dao.rpa_processo import RpaProcesso
15
14
  from worker_automate_hub.models.dto.rpa_historico_request_dto import (
16
- RpaHistoricoRequestDTO,
17
15
  RpaHistoricoStatusEnum,
18
16
  RpaRetornoProcessoDTO,
19
17
  )
@@ -24,9 +22,6 @@ from worker_automate_hub.tasks.task_definitions import task_definitions
24
22
  from worker_automate_hub.utils.logger import logger
25
23
  from worker_automate_hub.utils.toast import show_toast
26
24
  from worker_automate_hub.utils.util import capture_and_send_screenshot
27
- from worker_automate_hub.config.settings import (
28
- load_worker_config,
29
- )
30
25
 
31
26
  console = Console()
32
27
 
@@ -52,7 +47,9 @@ async def perform_task(task: RpaProcessoEntradaDTO):
52
47
  registrar_historico = True
53
48
 
54
49
  if registrar_historico:
55
- historico: RpaHistorico = await _store_historico(task, processo)
50
+ historico: RpaHistorico = await create_store_historico(
51
+ task, processo, RpaHistoricoStatusEnum.Processando
52
+ )
56
53
  try:
57
54
  if task_uuid in task_definitions:
58
55
  # Executar a task
@@ -61,7 +58,7 @@ async def perform_task(task: RpaProcessoEntradaDTO):
61
58
 
62
59
  result: RpaRetornoProcessoDTO = await task_definitions[task_uuid](task)
63
60
  if registrar_historico:
64
- await _update_historico(
61
+ await create_update_historico(
65
62
  historico_uuid=historico.uuidHistorico,
66
63
  task=task,
67
64
  retorno_processo=result,
@@ -87,19 +84,21 @@ async def perform_task(task: RpaProcessoEntradaDTO):
87
84
  show_toast("Erro", err_msg)
88
85
 
89
86
  if registrar_historico:
90
- await _update_historico(
87
+ await create_update_historico(
91
88
  historico_uuid=historico.uuidHistorico,
92
89
  task=task,
93
90
  retorno_processo=RpaRetornoProcessoDTO(
94
91
  sucesso=False,
95
92
  retorno=err_msg,
96
- status=RpaHistoricoStatusEnum.Falha,
93
+ status=RpaHistoricoStatusEnum.Descartado,
97
94
  ),
98
95
  processo=processo,
99
96
  )
100
- await unlock_queue(task.uuidFila)
97
+ await burn_queue(task.uuidFila)
101
98
  if url_retorno is not None:
102
- await send_to_webhook(url_retorno, RpaHistoricoStatusEnum.Falha, err_msg)
99
+ await send_to_webhook(
100
+ url_retorno, RpaHistoricoStatusEnum.Descartado, err_msg
101
+ )
103
102
  return None
104
103
  except Exception as e:
105
104
  err_msg = f"Erro ao performar o processo: {e}"
@@ -108,7 +107,7 @@ async def perform_task(task: RpaProcessoEntradaDTO):
108
107
  show_toast("Erro", err_msg)
109
108
 
110
109
  if registrar_historico:
111
- await _update_historico(
110
+ await create_update_historico(
112
111
  historico_uuid=historico.uuidHistorico,
113
112
  task=task,
114
113
  retorno_processo=RpaRetornoProcessoDTO(
@@ -121,127 +120,3 @@ async def perform_task(task: RpaProcessoEntradaDTO):
121
120
  )
122
121
  if url_retorno is not None:
123
122
  await send_to_webhook(url_retorno, RpaHistoricoStatusEnum.Falha, err_msg)
124
-
125
-
126
- async def _store_historico(
127
- task: RpaProcessoEntradaDTO, processo: RpaProcesso
128
- ) -> RpaHistorico:
129
- """
130
- Salva o histórico de um processo com status Processando.
131
-
132
- Recebe um RpaProcessoEntradaDTO e um RpaProcesso como parâmetro e salva o
133
- histórico com status Processando. Retorna um dicionário com o uuid do
134
- histórico salvo.
135
-
136
- Args:
137
- task (RpaProcessoEntradaDTO): O processo a ser salvo.
138
- processo (RpaProcesso): O processo que está sendo executado.
139
-
140
- Returns:
141
- RpaHistorico: Dicionário com o uuid do histórico salvo.
142
- """
143
- try:
144
- from worker_automate_hub.config.settings import load_worker_config
145
-
146
- worker_config = load_worker_config()
147
- tz = timezone("America/Sao_Paulo")
148
- start_time = datetime.now(tz).isoformat()
149
-
150
- identificador_processo = (
151
- task.configEntrada.get("nfe") or
152
- task.configEntrada.get("empresa") or
153
- ""
154
- )
155
-
156
-
157
- # Armazenar início da operação no histórico
158
- start_data = RpaHistoricoRequestDTO(
159
- uuidProcesso=task.uuidProcesso,
160
- uuidRobo=worker_config["UUID_ROBO"],
161
- prioridade=processo.prioridade,
162
- desStatus=RpaHistoricoStatusEnum.Processando,
163
- configEntrada=task.configEntrada,
164
- datInicioExecucao=start_time,
165
- datEntradaFila=task.datEntradaFila,
166
- identificador=identificador_processo,
167
- )
168
-
169
- store_response: RpaHistorico = await store(start_data)
170
- console.print(
171
- f"\nHistorico salvo com o uuid: {store_response.uuidHistorico}\n",
172
- style="green",
173
- )
174
- return store_response
175
- except Exception as e:
176
- err_msg = f"Erro ao salvar o registro no histórico: {e}"
177
- console.print(f"\n{err_msg}\n", style="red")
178
- logger.error(f"{err_msg}")
179
-
180
-
181
- async def _update_historico(
182
- historico_uuid: str,
183
- task: RpaProcessoEntradaDTO,
184
- retorno_processo: RpaRetornoProcessoDTO,
185
- processo: RpaProcesso,
186
- ):
187
- """
188
- Atualiza o histórico de um processo com o status de sucesso ou falha.
189
-
190
- Recebe o uuid do histórico, o RpaProcessoEntradaDTO do processo, um booleano
191
- indicando se o processo foi um sucesso ou não, o RpaRetornoProcessoDTO do
192
- processo e o RpaProcesso do processo como parâmetro e atualiza o histórico
193
- com o status de sucesso ou falha. Retorna um dicionário com o uuid do
194
- histórico atualizado.
195
-
196
- Args:
197
- historico_uuid (str): O uuid do histórico.
198
- task (RpaProcessoEntradaDTO): O RpaProcessoEntradaDTO do processo.
199
- sucesso (bool): Um booleano indicando se o processo foi um sucesso ou não.
200
- retorno_processo (RpaRetornoProcessoDTO): O RpaRetornoProcessoDTO do processo.
201
- processo (RpaProcesso): O RpaProcesso do processo.
202
-
203
- Returns:
204
- RpaHistorico: Dicionário com o uuid do histórico atualizado.
205
- """
206
-
207
- try:
208
- from worker_automate_hub.config.settings import load_worker_config
209
-
210
- worker_config = load_worker_config()
211
- tz = timezone("America/Sao_Paulo")
212
- des_status: RpaHistoricoStatusEnum = retorno_processo.status
213
- end_time = datetime.now(tz).isoformat()
214
-
215
- identificador_processo = (
216
- task.configEntrada.get("nfe") or
217
- task.configEntrada.get("empresa") or
218
- ""
219
- )
220
- if not retorno_processo.tags:
221
- retorno_processo.tags = []
222
-
223
- # Armazenar fim da operação no histórico
224
- end_data = RpaHistoricoRequestDTO(
225
- uuidHistorico=historico_uuid,
226
- uuidProcesso=task.uuidProcesso,
227
- uuidRobo=worker_config["UUID_ROBO"],
228
- prioridade=processo.prioridade,
229
- desStatus=des_status,
230
- configEntrada=task.configEntrada,
231
- retorno=retorno_processo,
232
- datFimExecucao=end_time,
233
- identificador=identificador_processo,
234
- tags=retorno_processo.tags,
235
- )
236
-
237
- update_response: RpaHistorico = await update(end_data)
238
- console.print(
239
- f"\nHistorico atualizado com o uuid: {update_response.uuidHistorico}\n",
240
- style="green",
241
- )
242
- return update_response
243
-
244
- except Exception as e:
245
- err_msg = f"Erro ao atualizar o histórico do processo: {e}"
246
- console.print(f"\n{err_msg}\n", style="red")
247
- logger.error(err_msg)
@@ -3,19 +3,30 @@ import os
3
3
  import threading
4
4
  from pathlib import Path
5
5
 
6
- from worker_automate_hub.api.rpa_fila_service import burn_queue, unlock_queue
7
6
  import pyfiglet
8
7
  from rich.console import Console
9
8
 
10
9
  from worker_automate_hub.api.client import (
11
10
  get_new_task,
11
+ get_processo,
12
12
  notify_is_alive,
13
13
  send_gchat_message,
14
14
  )
15
+ from worker_automate_hub.api.rpa_fila_service import burn_queue
16
+ from worker_automate_hub.api.rpa_historico_service import (
17
+ create_store_historico,
18
+ )
15
19
  from worker_automate_hub.config.settings import (
16
20
  load_env_config,
17
21
  load_worker_config,
18
22
  )
23
+ from worker_automate_hub.models.dao.rpa_processo import RpaProcesso
24
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
25
+ RpaHistoricoStatusEnum,
26
+ RpaRetornoProcessoDTO,
27
+ RpaTagDTO,
28
+ RpaTagEnum,
29
+ )
19
30
  from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
20
31
  RpaProcessoEntradaDTO,
21
32
  )
@@ -40,15 +51,29 @@ async def check_and_execute_tasks(stop_event: threading.Event):
40
51
  worker_config = load_worker_config()
41
52
  if task is not None:
42
53
  processo_existe = await is_uuid_in_tasks(task.uuidProcesso)
54
+ await burn_queue(task.uuidFila)
43
55
  if processo_existe:
44
- await burn_queue(task.uuidFila)
45
56
  logger.info(f"Executando a task: {task.nomProcesso}")
46
57
  await perform_task(task)
47
58
  else:
48
- await unlock_queue(task.uuidFila)
49
- log_message = f"O processo [{task.nomProcesso}] não existe no Worker [{worker_config['NOME_ROBO']}] e foi devolvido para a fila."
59
+ log_message = f"O processo [{task.nomProcesso}] não existe no Worker [{worker_config['NOME_ROBO']}] e foi removido da fila."
50
60
  console.print(f"\n{log_message}\n", style="yellow")
51
61
  logger.error(log_message)
62
+ try:
63
+ processo: RpaProcesso = await get_processo(task.uuidProcesso)
64
+ await create_store_historico(
65
+ task,
66
+ processo,
67
+ RpaHistoricoStatusEnum.Descartado,
68
+ retorno_processo=RpaRetornoProcessoDTO(
69
+ sucesso=False,
70
+ retorno=log_message,
71
+ status=RpaHistoricoStatusEnum.Descartado,
72
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
73
+ ),
74
+ )
75
+ except Exception as e:
76
+ console.print(f"Erro ao salvar histórico de processo não implementado: {e}", style="bold red")
52
77
  await send_gchat_message(log_message)
53
78
  else:
54
79
  await asyncio.sleep(5)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: worker-automate-hub
3
- Version: 0.5.9
3
+ Version: 0.5.12
4
4
  Summary: Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta.
5
5
  Author: Joel Paim
6
6
  Requires-Python: >=3.12,<4.0
@@ -4,8 +4,9 @@ worker_automate_hub/api/ahead_service.py,sha256=0tX-i1ACRg3_yOI-_AfFEZ6FNU3L8Zb3
4
4
  worker_automate_hub/api/client.py,sha256=tFrIr4mpjvUJ1uU--BCiWa3NT2Ru_yliBsWmfiGt1LA,19720
5
5
  worker_automate_hub/api/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  worker_automate_hub/api/helpers/api_helpers.py,sha256=SkheO2fXexeh-a4shr8Qzsz_kZhuSG0DJ7kbODctRbM,3696
7
- worker_automate_hub/api/rpa_fila_service.py,sha256=K_8EL5P6Y_CHs-f9ZGTsuUUjMd2fu4wN4NieHvMijKs,2100
8
- worker_automate_hub/api/rpa_historico_service.py,sha256=GZ3umxvSGNecQsffIRwgfmgpXHDFWq8EiBuAYqtrMNQ,4761
7
+ worker_automate_hub/api/rdp_service.py,sha256=cDG3RP59U1m2rRX51IMqqKwkQ2-Rgl0PRJ8e4cXyhjs,1547
8
+ worker_automate_hub/api/rpa_fila_service.py,sha256=6RyzCvj2qODifz3cIwOg5kuUpk8cyN_yFmLV5YOJAoQ,2186
9
+ worker_automate_hub/api/rpa_historico_service.py,sha256=wQw8_k8i0S-r7qrrn4BSoztkgtiuH_bHRSEytbZebDg,9690
9
10
  worker_automate_hub/api/webhook_service.py,sha256=9KvTv1U02CSYpf_vLnqs4RZqZzR7Mn0v1OVOI451yOM,1762
10
11
  worker_automate_hub/cli.py,sha256=JB45pjPJ8_E-4xw0OjqDMcAw-tpDV0mjmvwJRTnTzY0,6862
11
12
  worker_automate_hub/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -22,6 +23,7 @@ worker_automate_hub/decorators/timeit.py,sha256=lL2bK8TbF4GE5Ma3LI5N5iJxGF1vwlZ4
22
23
  worker_automate_hub/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
24
  worker_automate_hub/models/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
25
  worker_automate_hub/models/dao/rpa_configuracao.py,sha256=pftPsgbqsDjN8pRrzcjBKKfXaHPFA7KkJx9gl8LW7lk,328
26
+ worker_automate_hub/models/dao/rpa_fila.py,sha256=ZV-0ykAPKjMRTvgmts3WwPQQlCRv6h4mYr6Ki8IeoEE,699
25
27
  worker_automate_hub/models/dao/rpa_historico.py,sha256=zKo_Wz_qMdB-cmFkJY1ckFx63wBPUumir37OxFijhes,1071
26
28
  worker_automate_hub/models/dao/rpa_processo.py,sha256=AfOUhJKL-AAOyjON4g7f6B7Bxa174FNC1Eh7oItK2kA,1233
27
29
  worker_automate_hub/models/dto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -53,14 +55,15 @@ worker_automate_hub/tasks/jobs/entrada_de_notas_505.py,sha256=jIml8gjXPdI6_x7S9V
53
55
  worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py,sha256=oxH2CUJj3UyhYoSxEY2hUr_6wFgZPLcHswEbApIu8VY,15558
54
56
  worker_automate_hub/tasks/jobs/entrada_de_notas_9.py,sha256=Urt_7dZNuyUkSyG9fYb2ArBXzEONXlrqWIesoXeL1EI,50984
55
57
  worker_automate_hub/tasks/jobs/exemplo_processo.py,sha256=3-zxbb-9YHPmSA_K1Qgxp_FwSqg2QDjGBRCLxDZ8QoQ,3451
58
+ worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py,sha256=80FnDN6n_NMmDdQn6mmXEExRpK4BiYPrF0-C48Y1MBc,5445
56
59
  worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py,sha256=mZ6mCaz1lYmyFxwC8MVLXPsgynE1VkNKlEzYGsciDiY,10179
57
60
  worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py,sha256=QBGm6eS5JghgNWNqZlk1g2a2iV8LnBLiOTBBL3Giet0,4181
58
61
  worker_automate_hub/tasks/jobs/login_emsys.py,sha256=IoGCIvO4UwmuxOZEn3cvYJlKyhsWvtHvbFk8vwjTroQ,5620
59
62
  worker_automate_hub/tasks/jobs/playground.py,sha256=bdnXv3C7WLQUxt4edGZDfAbRJJ2-q4zuIQaK3GLnaUc,1765
60
63
  worker_automate_hub/tasks/jobs/sped_fiscal.py,sha256=_byvD7i_N3pgPjQd1lc0XNKCFONIPbmvX3_jq5AnbKY,26707
61
64
  worker_automate_hub/tasks/jobs/transferencias.py,sha256=zwCbVTwX15SCeLtvYgAyENeUSIuETx4Z9Cysr1Es8Jo,38013
62
- worker_automate_hub/tasks/task_definitions.py,sha256=2Jp1H4_qJZqqGyaP6MA87KLt4QNrtWBYWbXu-2gymFo,4459
63
- worker_automate_hub/tasks/task_executor.py,sha256=3haqLIb5ZPOpr1g20SED0b6sm_pGFinmZMpE4AJRrlo,9582
65
+ worker_automate_hub/tasks/task_definitions.py,sha256=KG84tDaTlCpthdYmdR1193BOudELGcoglmIpQpd2PLQ,4606
66
+ worker_automate_hub/tasks/task_executor.py,sha256=tVmuU-MWDkgbGg3uSK5IBEb_tJqGSnYZpwszdGUofOM,5150
64
67
  worker_automate_hub/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
68
  worker_automate_hub/utils/env.py,sha256=TacQjGRO7PUNpttrhTAc5Gnegaiysl2Knsv1P8qfkfs,57
66
69
  worker_automate_hub/utils/get_creds_gworkspace.py,sha256=ZJ0IIEjM4IXIV9rwfbOZ1V1wiaMoJAGZeSy0D37sYdU,2212
@@ -69,8 +72,8 @@ worker_automate_hub/utils/toast.py,sha256=xPHc5r5uOxB_cZlCzm13Kt2qSKLLFZALncU6Qg
69
72
  worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbVlwDl49Y,7972
70
73
  worker_automate_hub/utils/util.py,sha256=3XNBaYVbJ-KgWyHDKY2jIFuQzgBQs-w1d5iEQZv1D4U,125867
71
74
  worker_automate_hub/utils/utils_nfe_entrada.py,sha256=p5r_L5k7gqCBvV8v6dbLFM6INKiSpGc4Gegid0_YAh4,29017
72
- worker_automate_hub/worker.py,sha256=tftQpX8liC-_0_bOUf1YYzXSCvloMQBvjmQ6lzfEE-c,4816
73
- worker_automate_hub-0.5.9.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
74
- worker_automate_hub-0.5.9.dist-info/METADATA,sha256=epLf1egEW1wK7rqtYA-5isr6KMSPGRRsu7yb0m0TFls,2893
75
- worker_automate_hub-0.5.9.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
76
- worker_automate_hub-0.5.9.dist-info/RECORD,,
75
+ worker_automate_hub/worker.py,sha256=ojfBsKdCuUAQS5_F3eZVMLV015GmtrasVvxKsmo2rx8,5942
76
+ worker_automate_hub-0.5.12.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
77
+ worker_automate_hub-0.5.12.dist-info/METADATA,sha256=VEzm6fiv2ZT3qD3obSxZdLPWw2Hza8yzOnlszMui0JE,2894
78
+ worker_automate_hub-0.5.12.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
79
+ worker_automate_hub-0.5.12.dist-info/RECORD,,