worker-automate-hub 0.5.9__tar.gz → 0.5.12__tar.gz

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.

Files changed (80) hide show
  1. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/pyproject.toml +1 -1
  3. worker_automate_hub-0.5.12/worker_automate_hub/api/rdp_service.py +38 -0
  4. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/rpa_fila_service.py +22 -16
  5. worker_automate_hub-0.5.12/worker_automate_hub/api/rpa_historico_service.py +258 -0
  6. worker_automate_hub-0.5.12/worker_automate_hub/models/dao/rpa_fila.py +18 -0
  7. worker_automate_hub-0.5.12/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +131 -0
  8. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/task_definitions.py +2 -0
  9. worker_automate_hub-0.5.12/worker_automate_hub/tasks/task_executor.py +122 -0
  10. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/worker.py +29 -4
  11. worker_automate_hub-0.5.9/worker_automate_hub/api/rpa_historico_service.py +0 -123
  12. worker_automate_hub-0.5.9/worker_automate_hub/tasks/task_executor.py +0 -247
  13. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/README.md +0 -0
  14. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/__init__.py +0 -0
  15. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/__init__.py +0 -0
  16. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/ahead_service.py +0 -0
  17. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/client.py +0 -0
  18. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/helpers/__init__.py +0 -0
  19. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  20. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/api/webhook_service.py +0 -0
  21. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/cli.py +0 -0
  22. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/config/__init__.py +0 -0
  23. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/config/settings.py +0 -0
  24. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/config.py +0 -0
  25. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/core/so_manipulation.py +0 -0
  26. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/__init__.py +0 -0
  27. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/deprecation.py +0 -0
  28. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/rate_limit.py +0 -0
  29. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/repeat.py +0 -0
  30. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/retry.py +0 -0
  31. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/singleton.py +0 -0
  32. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/decorators/timeit.py +0 -0
  33. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/__init__.py +0 -0
  34. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dao/__init__.py +0 -0
  35. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  36. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  37. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  38. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dto/__init__.py +0 -0
  39. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  40. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  41. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
  42. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  43. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/__init__.py +0 -0
  44. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  45. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  46. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  47. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  48. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  49. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  50. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  51. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  52. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  53. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  54. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  55. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  56. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  57. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  58. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  59. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  60. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  61. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  62. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  63. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  64. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  65. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
  66. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  67. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  68. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  69. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  70. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  71. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  72. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  73. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/__init__.py +0 -0
  74. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/env.py +0 -0
  75. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  76. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/logger.py +0 -0
  77. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/toast.py +0 -0
  78. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/updater.py +0 -0
  79. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/util.py +0 -0
  80. {worker_automate_hub-0.5.9 → worker_automate_hub-0.5.12}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
@@ -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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "worker-automate-hub"
3
- version = "0.5.9"
3
+ version = "0.5.12"
4
4
  description = "Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta."
5
5
  authors = ["Joel Paim"]
6
6
  readme = "README.md"
@@ -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
@@ -0,0 +1,258 @@
1
+ from datetime import datetime
2
+
3
+ import aiohttp
4
+ from pytz import timezone
5
+ from rich.console import Console
6
+
7
+ from worker_automate_hub.config.settings import load_env_config
8
+ from worker_automate_hub.models.dao.rpa_historico import RpaHistorico
9
+ from worker_automate_hub.models.dao.rpa_processo import RpaProcesso
10
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
11
+ RpaHistoricoRequestDTO,
12
+ RpaHistoricoStatusEnum,
13
+ RpaRetornoProcessoDTO,
14
+ )
15
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
16
+ RpaProcessoEntradaDTO,
17
+ )
18
+ from worker_automate_hub.utils.logger import logger
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
+
145
+
146
+ async def store(data: RpaHistoricoRequestDTO) -> dict:
147
+ """
148
+ Armazena o histórico de um processo com status Processando.
149
+
150
+ Recebe um RpaHistoricoRequestDTO como parâmetro e salva o
151
+ histórico com status Processando. Retorna um dicionário com o uuid do
152
+ histórico salvo.
153
+
154
+ Args:
155
+ data (RpaHistoricoRequestDTO): O histórico a ser salvo.
156
+
157
+ Returns:
158
+ RpaHistorico: Dicionário com o uuid do histórico salvo.
159
+ """
160
+ env_config, _ = load_env_config()
161
+
162
+ if not data:
163
+ raise ValueError("Parâmetro data deve ser informado")
164
+
165
+ if not isinstance(data, RpaHistoricoRequestDTO):
166
+ raise TypeError("Parâmetro data deve ser do tipo RpaHistoricoRequestDTO")
167
+
168
+ headers_basic = {
169
+ "Authorization": f"Basic {env_config["API_AUTHORIZATION"]}",
170
+ "Content-Type": "application/json",
171
+ }
172
+ try:
173
+ async with aiohttp.ClientSession(
174
+ connector=aiohttp.TCPConnector(verify_ssl=True)
175
+ ) as session:
176
+ payload = data.model_dump_json()
177
+
178
+ async with session.post(
179
+ f"{env_config["API_BASE_URL"]}/historico",
180
+ data=payload,
181
+ headers=headers_basic,
182
+ ) as response:
183
+ response_text = await response.text()
184
+ logger.info(f"Resposta store: {response_text}")
185
+
186
+ if response.status == 200:
187
+ try:
188
+ response_data = await response.json()
189
+ return RpaHistorico(**response_data)
190
+ except aiohttp.ContentTypeError:
191
+ return {
192
+ "error": "Resposta não é JSON",
193
+ "status_code": response.status,
194
+ }
195
+ else:
196
+ return {"error": response_text, "status_code": response.status}
197
+ except aiohttp.ClientError as e:
198
+ logger.error(f"Erro de cliente aiohttp: {str(e)}")
199
+ return {"error": str(e), "status_code": 500}
200
+ except Exception as e:
201
+ logger.error(f"Erro inesperado: {str(e)}")
202
+ return {"error": str(e), "status_code": 500}
203
+
204
+
205
+ async def update(data: RpaHistoricoRequestDTO) -> dict:
206
+ """
207
+ Atualiza um registro de histórico com base no uuidHistorico informado.
208
+
209
+ Args:
210
+ data (RpaHistoricoRequestDTO): Os dados do histórico a ser atualizado.
211
+
212
+ Returns:
213
+ RpaHistorico: O histórico atualizado.
214
+ """
215
+ env_config, _ = load_env_config()
216
+ headers_basic = {
217
+ "Authorization": f"Basic {env_config["API_AUTHORIZATION"]}",
218
+ "Content-Type": "application/json",
219
+ }
220
+ if not data or not isinstance(data, RpaHistoricoRequestDTO):
221
+ raise TypeError("Parâmetro data deve ser do tipo RpaHistoricoRequestDTO")
222
+ try:
223
+ async with aiohttp.ClientSession(
224
+ connector=aiohttp.TCPConnector(verify_ssl=True)
225
+ ) as session:
226
+ if not data.uuidHistorico:
227
+ raise ValueError("Parâmetro uuidHistorico deve ser informado")
228
+
229
+ payload = data.model_dump_json()
230
+
231
+ async with session.put(
232
+ f"{env_config["API_BASE_URL"]}/historico",
233
+ data=payload,
234
+ headers=headers_basic,
235
+ ) as response:
236
+ response_text = await response.text()
237
+ logger.info(f"Resposta update: {response_text}")
238
+
239
+ if response.status == 200:
240
+ try:
241
+ response_data = await response.json()
242
+ return RpaHistorico(**response_data)
243
+ except aiohttp.ContentTypeError:
244
+ return {
245
+ "error": "Resposta não é JSON",
246
+ "status_code": response.status,
247
+ }
248
+ else:
249
+ return {"error": response_text, "status_code": response.status}
250
+ except aiohttp.ClientError as e:
251
+ logger.error(f"Erro de cliente aiohttp: {str(e)}")
252
+ return {"error": str(e), "status_code": 500}
253
+ except ValueError as e:
254
+ logger.error(f"Erro de valor: {str(e)}")
255
+ return {"error": str(e), "status_code": 400}
256
+ except Exception as e:
257
+ logger.error(f"Erro inesperado: {str(e)}")
258
+ return {"error": str(e), "status_code": 500}
@@ -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,
@@ -0,0 +1,122 @@
1
+ from pytz import timezone
2
+ from rich.console import Console
3
+
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,
9
+ )
10
+ from worker_automate_hub.api.webhook_service import send_to_webhook
11
+ from worker_automate_hub.config.settings import load_worker_config
12
+ from worker_automate_hub.models.dao.rpa_historico import RpaHistorico
13
+ from worker_automate_hub.models.dao.rpa_processo import RpaProcesso
14
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
15
+ RpaHistoricoStatusEnum,
16
+ RpaRetornoProcessoDTO,
17
+ )
18
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
19
+ RpaProcessoEntradaDTO,
20
+ )
21
+ from worker_automate_hub.tasks.task_definitions import task_definitions
22
+ from worker_automate_hub.utils.logger import logger
23
+ from worker_automate_hub.utils.toast import show_toast
24
+ from worker_automate_hub.utils.util import capture_and_send_screenshot
25
+
26
+ console = Console()
27
+
28
+
29
+ async def perform_task(task: RpaProcessoEntradaDTO):
30
+ log_msg = f"Processo a ser executado: {task.nomProcesso}"
31
+ show_toast("Info", f"Processo a ser executado: {task.nomProcesso}")
32
+
33
+ console.print(f"\n{log_msg}\n", style="green")
34
+ logger.info(log_msg)
35
+ task_uuid = task.uuidProcesso
36
+ url_retorno = task.configEntrada.get("urlRetorno", None)
37
+ processo: RpaProcesso = await get_processo(task_uuid)
38
+ if processo is None:
39
+ worker_config = load_worker_config()
40
+ err_msg = f"[WORKER] [{worker_config['NOME_ROBO']}] Falha ao obter o processo [{task.nomProcesso}] uuid [{task_uuid}] da API, não foi possivel registrar o historico, mas o processo será executado."
41
+ console.print(err_msg, style="yellow")
42
+ logger.error(err_msg)
43
+ show_toast("Erro", err_msg)
44
+ await send_gchat_message(err_msg)
45
+ registrar_historico = False
46
+ else:
47
+ registrar_historico = True
48
+
49
+ if registrar_historico:
50
+ historico: RpaHistorico = await create_store_historico(
51
+ task, processo, RpaHistoricoStatusEnum.Processando
52
+ )
53
+ try:
54
+ if task_uuid in task_definitions:
55
+ # Executar a task
56
+ if task_uuid == "276d0c41-0b7c-4446-ae0b-dd5d782917cc":
57
+ task.historico_id = historico.uuidHistorico
58
+
59
+ result: RpaRetornoProcessoDTO = await task_definitions[task_uuid](task)
60
+ if registrar_historico:
61
+ await create_update_historico(
62
+ historico_uuid=historico.uuidHistorico,
63
+ task=task,
64
+ retorno_processo=result,
65
+ processo=processo,
66
+ )
67
+
68
+ if result.sucesso == False:
69
+ show_toast("Erro", f"Processo executado com falha: {result}")
70
+
71
+ await capture_and_send_screenshot(
72
+ uuidRelacao=historico.uuidHistorico, desArquivo=result.retorno
73
+ )
74
+ else:
75
+ show_toast("Sucesso", f"Processo executado com sucesso: {result}")
76
+
77
+ if url_retorno is not None and result.sucesso == False:
78
+ await send_to_webhook(url_retorno, result.status, result.retorno)
79
+ return result
80
+ else:
81
+ err_msg = f"Processo não encontrado: {task_uuid}"
82
+ console.print(err_msg, style="yellow")
83
+ logger.error(err_msg)
84
+ show_toast("Erro", err_msg)
85
+
86
+ if registrar_historico:
87
+ await create_update_historico(
88
+ historico_uuid=historico.uuidHistorico,
89
+ task=task,
90
+ retorno_processo=RpaRetornoProcessoDTO(
91
+ sucesso=False,
92
+ retorno=err_msg,
93
+ status=RpaHistoricoStatusEnum.Descartado,
94
+ ),
95
+ processo=processo,
96
+ )
97
+ await burn_queue(task.uuidFila)
98
+ if url_retorno is not None:
99
+ await send_to_webhook(
100
+ url_retorno, RpaHistoricoStatusEnum.Descartado, err_msg
101
+ )
102
+ return None
103
+ except Exception as e:
104
+ err_msg = f"Erro ao performar o processo: {e}"
105
+ console.print(f"\n{err_msg}\n", style="red")
106
+ logger.error(err_msg)
107
+ show_toast("Erro", err_msg)
108
+
109
+ if registrar_historico:
110
+ await create_update_historico(
111
+ historico_uuid=historico.uuidHistorico,
112
+ task=task,
113
+ retorno_processo=RpaRetornoProcessoDTO(
114
+ sucesso=False, retorno=err_msg, status=RpaHistoricoStatusEnum.Falha
115
+ ),
116
+ processo=processo,
117
+ )
118
+ await capture_and_send_screenshot(
119
+ uuidRelacao=historico.uuidHistorico, desArquivo=err_msg
120
+ )
121
+ if url_retorno is not None:
122
+ await send_to_webhook(url_retorno, RpaHistoricoStatusEnum.Falha, err_msg)