worker-automate-hub 0.4.448__py3-none-any.whl → 0.4.450__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ import platform
3
3
  import subprocess
4
4
  import socket
5
5
  import pyautogui
6
+ import os
6
7
  import pygetwindow as gw
7
8
  from rich.console import Console
8
9
  import pygetwindow as gw
@@ -55,16 +56,10 @@ class RDPConnection:
55
56
  return ping_alcancado and porta_aberta
56
57
 
57
58
  async def clicar_no_titulo(self):
58
- """
59
- Função para clicar no título das janelas de Conexão de Área de Trabalho Remota
60
- com o botão direito do mouse e executar comandos.
61
- """
62
59
  janelas_rdp = [
63
60
  win
64
61
  for win in gw.getAllTitles()
65
- if "Ligação ao Ambiente de Trabalho Remoto" in win
66
- or "Remote Desktop Connection" in win
67
- or "Conexão de Área de Trabalho Remota" in win
62
+ if self.ip in win
68
63
  ]
69
64
 
70
65
  for titulo in janelas_rdp:
@@ -74,88 +69,98 @@ class RDPConnection:
74
69
  continue
75
70
 
76
71
  console.print(f"Processando janela: {titulo}")
77
-
78
- # Obtém as coordenadas da janela
79
72
  x, y = janela.left, janela.top
80
73
 
81
74
  try:
82
- # Move o mouse para o título da janela e clica com o botão direito
83
- pyautogui.moveTo(x + 10, y + 10) # Ajuste para alinhar ao título da janela
84
- pyautogui.click(button="right")
85
-
86
- await worker_sleep(5)
87
- pyautogui.press("down", presses=7, interval=0.1)
88
- await worker_sleep(5)
75
+ pyautogui.moveTo(x + 2, y + 2)
76
+ pyautogui.hotkey("alt", "space")
77
+ await worker_sleep(2)
78
+ pyautogui.press("down", presses=6, interval=0.1)
79
+ await worker_sleep(2)
89
80
  pyautogui.hotkey("enter")
90
- await worker_sleep(5)
81
+ await worker_sleep(2)
91
82
  pyautogui.hotkey("enter")
92
83
  break
93
84
 
94
85
  except Exception as e:
95
86
  console.print(f"Erro ao interagir com a janela {titulo}: {e}")
96
-
87
+
88
+ async def open_rdp(self):
89
+ base_path = os.path.join("worker_automate_hub", "tasks", "jobs")
90
+ rdp_file_path = os.path.join(base_path, "connection.rdp")
91
+ os.makedirs(base_path, exist_ok=True)
92
+
93
+ rdp_content = f"""screen mode id:i:1
94
+ desktopwidth:i:1920
95
+ desktopheight:i:1080
96
+ use multimon:i:0
97
+ session bpp:i:32
98
+ compression:i:1
99
+ keyboardhook:i:2
100
+ displayconnectionbar:i:1
101
+ disable wallpaper:i:0
102
+ allow font smoothing:i:1
103
+ allow desktop composition:i:1
104
+ disable full window drag:i:0
105
+ disable menu anims:i:0
106
+ disable themes:i:0
107
+ disable cursor setting:i:0
108
+ bitmapcachepersistenable:i:1
109
+ full address:s:{self.ip}
110
+ username:s:{self.user}
111
+ winposstr:s:0,1,{(1920 // 4)},{(1080 // 4)},{(1920 // 4) + (1920 // 2)},{(1080 // 4) + (1080 // 2)}
112
+ """
113
+
114
+ try:
115
+ with open(rdp_file_path, "w") as file:
116
+ file.write(rdp_content)
117
+ print(f"Arquivo RDP criado: {rdp_file_path}")
118
+ except Exception as error:
119
+ print(f"Erro ao montar o arquivo RDP: {error}")
120
+ return
121
+
122
+ try:
123
+ subprocess.Popen(["mstsc", rdp_file_path], close_fds=True, start_new_session=True)
124
+ console.print("Conexão RDP iniciada.")
125
+ except Exception as error:
126
+ console.print(f"Erro ao abrir a conexão RDP: {error}")
127
+
97
128
  async def conectar(self):
98
129
  console.print(f"Iniciando cliente RDP para {self.ip}")
99
130
  try:
100
- pyautogui.hotkey("win", "d")
101
- await worker_sleep(5) # Tempo para garantir que todas as janelas sejam minimizadas
102
- console.print("Todas as janelas minimizadas com sucesso.")
103
-
104
- subprocess.Popen(["mstsc", f"/v:{self.ip}"], close_fds=True, start_new_session=True)
105
- await worker_sleep(10) # Tempo aumentado para garantir abertura
106
-
107
- console.print("Procurando janela 'Ligação ao ambiente de trabalho remoto'")
108
- try:
109
- windows = gw.getWindowsWithTitle("Ligação ao ambiente de trabalho remoto")
110
- except:
111
- windows = gw.getWindowsWithTitle("Conexão de Área de Trabalho Remota")
112
-
113
- if not windows:
114
- logger.warning("Tentando encontrar janela com título em inglês 'Remote Desktop Connection'")
115
- windows = gw.getWindowsWithTitle("Remote Desktop Connection")
116
-
117
- if not windows:
118
- logger.error("Janela de RDP não encontrada.")
119
- return False
120
-
121
- rdp_window = windows[0]
122
- console.print(f"Janela '{rdp_window.title}' encontrada. Focando na janela.")
123
-
124
- # Restaurar janela se estiver minimizada
125
- if rdp_window.isMinimized:
126
- rdp_window.restore()
127
- await worker_sleep(5)
128
-
129
- # Redimensionar para 50% da tela
130
- screen_width, screen_height = pyautogui.size()
131
- new_width = screen_width // 2
132
- new_height = screen_height // 2
133
- rdp_window.resizeTo(new_width, new_height)
134
- rdp_window.moveTo(screen_width // 4, screen_height // 4)
135
- console.print(f"Janela redimensionada para {new_width}x{new_height}.")
136
-
137
- rdp_window.activate()
138
- await worker_sleep(5) # Tempo extra para garantir que a janela está ativa
139
-
140
- # Clique para garantir o foco
141
- pyautogui.click(rdp_window.left + 50, rdp_window.top + 50)
142
131
  await worker_sleep(3)
132
+ await self.open_rdp()
133
+ await worker_sleep(5)
143
134
 
144
- # Inserir credenciais
145
-
135
+ console.print("Procurando janela RDP")
146
136
  try:
147
- app = Application(backend="uia").connect(title="Segurança do Windows")
148
- dialog = app.window(title="Segurança do Windows")
149
-
150
- edit_field = dialog.child_window(auto_id="EditField_1", control_type="Edit")
151
-
152
- if edit_field.exists():
153
- console.print("Inserindo usuário.")
154
- pyautogui.write(self.user, interval=0.1)
155
- pyautogui.press("tab")
156
- await worker_sleep(5)
157
- except:
158
- pass
137
+ possible_titles = ["Conexão de Área de Trabalho Remota", "Ligação ao ambiente de trabalho remoto"]
138
+ app = None
139
+ app_window = None
140
+
141
+ for title in possible_titles:
142
+ try:
143
+ app = Application(backend="uia").connect(title=title)
144
+ app_window = app.window(title=title)
145
+ console.print(f"Janela encontrada: {title}")
146
+ break
147
+ except Exception:
148
+ continue
149
+
150
+ if not app or not app_window:
151
+ raise Exception("Nenhuma janela com título correspondente foi encontrada.")
152
+
153
+ app_window.set_focus()
154
+ console.print("Janela RDP ativada.")
155
+
156
+ pyautogui.press("left")
157
+ await worker_sleep(1)
158
+ pyautogui.hotkey("enter")
159
+ await worker_sleep(3)
160
+
161
+ except Exception as e:
162
+ console.print(f"Erro ao ativar a janela RDP: {e}", style="bold red")
163
+
159
164
 
160
165
  console.print("Inserindo senha.")
161
166
  pyautogui.write(self.password, interval=0.1)
@@ -165,9 +170,18 @@ class RDPConnection:
165
170
  await worker_sleep(5)
166
171
  pyautogui.press("enter")
167
172
  console.print("Credenciais inseridas.")
168
- await worker_sleep(5) # Tempo para conexão ser concluída
173
+ await worker_sleep(5)
169
174
 
170
175
  console.print("Conexão RDP ativa. Mantendo o script em execução.")
176
+
177
+ try:
178
+ base_path = os.path.join("worker_automate_hub", "tasks", "jobs")
179
+ rdp_file_path = os.path.join(base_path, "connection.rdp")
180
+ if os.path.exists(rdp_file_path):
181
+ os.remove(rdp_file_path)
182
+ except Exception as error:
183
+ console.print(f"Erro ao deletar arquivo 'connection.rdp'. Error: {error}")
184
+
171
185
  return True
172
186
  except Exception as e:
173
187
  logger.error(f"Erro ao tentar conectar via RDP: {e}")
@@ -191,7 +205,6 @@ async def conexao_rdp(task: RpaProcessoRdpDTO) -> RpaRetornoProcessoDTO:
191
205
 
192
206
  await rdp.clicar_no_titulo()
193
207
 
194
- # Mantém o script ativo para manter a conexão RDP aberta
195
208
  return RpaRetornoProcessoDTO(
196
209
  sucesso=True,
197
210
  retorno="Conexão RDP estabelecida com sucesso.",
@@ -331,7 +331,6 @@ async def entrada_de_notas_15(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
331
331
 
332
332
  # Verifica se a info 'Nota fiscal incluida' está na tela
333
333
  await worker_sleep(6)
334
- retorno = False
335
334
  try:
336
335
  app = Application().connect(class_name="TFrmNotaFiscalEntrada")
337
336
  main_window = app["Information"]
@@ -343,11 +342,8 @@ async def entrada_de_notas_15(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
343
342
 
344
343
  if btn_ok.exists():
345
344
  btn_ok.click()
346
- retorno = True
347
345
  else:
348
346
  console.print(f" botão OK Não enontrado")
349
- retorno = await verify_nf_incuded()
350
-
351
347
  except Exception as e:
352
348
  try:
353
349
  await worker_sleep(5)
@@ -366,92 +362,37 @@ async def entrada_de_notas_15(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
366
362
  status=RpaHistoricoStatusEnum.Falha,
367
363
  )
368
364
 
369
- try:
370
- max_attempts = 60
371
- i = 0
372
-
373
- while i < max_attempts:
374
- information_pop_up = await is_window_open("Information")
375
- if information_pop_up["IsOpened"] == True:
376
- break
377
- else:
378
- console.print(f"Aguardando confirmação de nota incluida...\n")
379
- await worker_sleep(5)
380
- i += 1
365
+ max_attempts = 60
366
+ i = 0
381
367
 
368
+ while i < max_attempts:
382
369
  information_pop_up = await is_window_open("Information")
383
370
  if information_pop_up["IsOpened"] == True:
384
- app = Application().connect(class_name="TFrmNotaFiscalEntrada")
385
- main_window = app["Information"]
386
-
387
- main_window.set_focus()
388
-
389
- console.print(f"Obtendo texto do Information...\n")
390
- console.print(f"Tirando print da janela do Information para realização do OCR...\n")
391
-
392
- window_rect = main_window.rectangle()
393
- screenshot = pyautogui.screenshot(
394
- region=(
395
- window_rect.left,
396
- window_rect.top,
397
- window_rect.width(),
398
- window_rect.height(),
399
- )
400
- )
401
- username = getpass.getuser()
402
- path_to_png = f"C:\\Users\\{username}\\Downloads\\information_popup_{nota.get("nfe")}.png"
403
- screenshot.save(path_to_png)
404
- console.print(f"Print salvo em {path_to_png}...\n")
405
-
406
- console.print(
407
- f"Preparando a imagem para maior resolução e assertividade no OCR...\n"
408
- )
409
- image = Image.open(path_to_png)
410
- image = image.convert("L")
411
- enhancer = ImageEnhance.Contrast(image)
412
- image = enhancer.enhance(2.0)
413
- image.save(path_to_png)
414
- console.print(f"Imagem preparada com sucesso...\n")
415
- console.print(f"Realizando OCR...\n")
416
- captured_text = pytesseract.image_to_string(Image.open(path_to_png))
417
- console.print(
418
- f"Texto Full capturado {captured_text}...\n"
419
- )
420
- os.remove(path_to_png)
421
- if 'nota fiscal inc' in captured_text.lower():
422
- console.print(f"Tentando clicar no Botão OK...\n")
423
- btn_ok = main_window.child_window(class_name="TButton")
424
-
425
- if btn_ok.exists():
426
- btn_ok.click()
427
- retorno = True
428
- else:
429
- return RpaRetornoProcessoDTO(
430
- sucesso=False,
431
- retorno=f"Pop_up Informantion não mapeado para andamento do robô, mensagem {captured_text}",
432
- status=RpaHistoricoStatusEnum.Falha,
433
- )
371
+ break
434
372
  else:
435
- console.print(f"Aba Information não encontrada")
436
- retorno = await verify_nf_incuded()
437
-
438
- except Exception as e:
439
- console.print(f"Erro ao conectar à janela Information: {e}\n")
373
+ console.print(f"Aguardando confirmação de nota incluida...\n")
374
+ await worker_sleep(5)
375
+ i += 1
376
+
377
+ await worker_sleep(15)
378
+ console.print("\nVerifica se a nota ja foi lançada...")
379
+ nf_chave_acesso = int(nota.get("nfe"))
380
+ status_nf_emsys = await get_status_nf_emsys(nf_chave_acesso)
381
+ if status_nf_emsys.get("status") != "Lançada":
440
382
  return RpaRetornoProcessoDTO(
441
383
  sucesso=False,
442
- retorno=f"Erro em obter o retorno, Nota inserida com sucesso, erro {e}",
384
+ retorno=f"Erro ao lançar nota",
443
385
  status=RpaHistoricoStatusEnum.Falha,
444
386
  )
445
-
446
- if retorno:
447
- console.print("\nNota lançada com sucesso...", style="bold green")
448
- await worker_sleep(6)
387
+ else:
449
388
  return RpaRetornoProcessoDTO(
450
- sucesso=True,
451
- retorno="Nota Lançada com sucesso!",
452
- status=RpaHistoricoStatusEnum.Sucesso,
453
- )
389
+ sucesso=True,
390
+ retorno="Nota Lançada com sucesso!",
391
+ status=RpaHistoricoStatusEnum.Sucesso,
392
+ )
393
+
454
394
 
395
+
455
396
  except Exception as ex:
456
397
  observacao = f"Erro Processo Entrada de Notas: {str(ex)}"
457
398
  logger.error(observacao)
@@ -710,6 +710,22 @@ async def entrada_de_notas_39(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
710
710
  send_keys("%o")
711
711
  await worker_sleep(7)
712
712
 
713
+
714
+ itens_by_supplier = await is_window_open_by_class("TFrmAguarde", "TMessageForm")
715
+ if itens_by_supplier["IsOpened"] == True:
716
+ console.print(
717
+ "Tela de POP-UP de Itens não localizados ou NCM encontrado ...\n"
718
+ )
719
+ itens_by_supplier_work = await itens_not_found_supplier(nota.get("nfe"))
720
+ if itens_by_supplier_work["window"] == "NCM" or itens_by_supplier_work["window"] == "MultiplasRef":
721
+ console.log(itens_by_supplier_work["retorno"], style="bold green")
722
+ else:
723
+ return RpaRetornoProcessoDTO(
724
+ sucesso=False,
725
+ retorno=itens_by_supplier_work["retorno"],
726
+ status=RpaHistoricoStatusEnum.Falha,
727
+ )
728
+
713
729
  # VERIFICANDO A EXISTENCIA DE ERRO
714
730
  erro_pop_up = await is_window_open("Erro")
715
731
  if erro_pop_up["IsOpened"] == True:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: worker-automate-hub
3
- Version: 0.4.448
3
+ Version: 0.4.450
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
@@ -32,7 +32,7 @@ worker_automate_hub/models/dto/rpa_sistema_dto.py,sha256=sLkmJei8x6sl-1-IXUKDmYQ
32
32
  worker_automate_hub/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  worker_automate_hub/tasks/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  worker_automate_hub/tasks/jobs/coleta_dje_process.py,sha256=rf4fW-FaHUl1MS7b03z4cwI3zHfNw8FWxvjvNY3Xn20,28773
35
- worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=4eEf3Hsm9TCGESn5cK-uSpHwbCYeCOBG44Q4cBYwmvc,9293
35
+ worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=vbbEsGdpgISBBVnJo8FI81zqzponqEPIAT1kNLsxizQ,9183
36
36
  worker_automate_hub/tasks/jobs/descartes.py,sha256=RIjrZIzkW77NiKeXbxFN9k872cz3fl9cG1m5TJpjmmY,40134
37
37
  worker_automate_hub/tasks/jobs/ecac_estadual_go.py,sha256=aPckQRlRozFS_OK3C9wNdMCmqO6AM4djwqY2uSSaPmo,20687
38
38
  worker_automate_hub/tasks/jobs/ecac_estadual_main.py,sha256=FFpAdtZLO4uelWZooCVpm4JePv_iDt5nwVKrk1ipZJQ,1599
@@ -40,14 +40,14 @@ worker_automate_hub/tasks/jobs/ecac_estadual_mt.py,sha256=4fe5Ri--lNIlRBSusbjyYt
40
40
  worker_automate_hub/tasks/jobs/ecac_estadual_sc.py,sha256=ZTjc4rS8J7VfWHPFLkJBcSj9sIfwToxTIC0D7p2rQTQ,13677
41
41
  worker_automate_hub/tasks/jobs/ecac_estadual_sp.py,sha256=iS6za_nGCzBRVCXYYuUTIyMWJznHp8l6BPahqwzc_5c,29102
42
42
  worker_automate_hub/tasks/jobs/ecac_federal.py,sha256=ORQbA4DCfyHJqjfvOCenc97QHvBCBlA3oMSzl59K6vg,55316
43
- worker_automate_hub/tasks/jobs/entrada_de_notas_15.py,sha256=31jRy_PpSjqx6O3oSk_tmqon3dfqtZtXkmX2JaVn38s,17848
43
+ worker_automate_hub/tasks/jobs/entrada_de_notas_15.py,sha256=6ySsrozk1IEc4y7lDaA5ck7lDOP5Hn3EUpo2lwZ2k8s,15037
44
44
  worker_automate_hub/tasks/jobs/entrada_de_notas_16.py,sha256=X4Hv2oWeIrD5eljIBtx_9lJWgpTV8dBx2BPTbRJbNc4,19917
45
45
  worker_automate_hub/tasks/jobs/entrada_de_notas_207.py,sha256=TfvGmH1__OGRx5oYordEJt-gpcETKA9OFhwHQD3yqs4,24928
46
46
  worker_automate_hub/tasks/jobs/entrada_de_notas_32.py,sha256=l8mAm_OIY2cg_ThdCUqlq9NYbIYJuiK6wVsarStRfG8,32487
47
47
  worker_automate_hub/tasks/jobs/entrada_de_notas_33.py,sha256=ktXc_kdMhlz9cbb7XjfMJhME29mgMFd_FnatxSZZU_s,31457
48
48
  worker_automate_hub/tasks/jobs/entrada_de_notas_34.py,sha256=iaSmtWTWlazHDtGp22yTV5J5rHDhUCbEaCAnpU7UWyM,31808
49
49
  worker_automate_hub/tasks/jobs/entrada_de_notas_36.py,sha256=vFkDcgJ9uxrMMLYdeONCMxh6_evnhgF1Sun5HEHAWa4,22716
50
- worker_automate_hub/tasks/jobs/entrada_de_notas_39.py,sha256=r4q3QRwho0GsX2Lo6HBenQyMIEQO6EaqlaQQ9ee80m8,32796
50
+ worker_automate_hub/tasks/jobs/entrada_de_notas_39.py,sha256=D0AjgqKFPyL_dTo4Ek5Z1sVVWoW35MAnbM6jw_dVvl4,33598
51
51
  worker_automate_hub/tasks/jobs/entrada_de_notas_500.py,sha256=MYPaYAP2iwdBYDZUf39f7yGibTME9uObEash_QTCmFA,32231
52
52
  worker_automate_hub/tasks/jobs/entrada_de_notas_505.py,sha256=jIml8gjXPdI6_x7S9VVV8IrKZRF7_PTNOMnhNmYMDTU,14490
53
53
  worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py,sha256=oxH2CUJj3UyhYoSxEY2hUr_6wFgZPLcHswEbApIu8VY,15558
@@ -70,7 +70,7 @@ worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbV
70
70
  worker_automate_hub/utils/util.py,sha256=JkSKFgnI6geDEIlpaJJ5Btd7XdPllfUSFcjvPAaG-bo,125954
71
71
  worker_automate_hub/utils/utils_nfe_entrada.py,sha256=p5r_L5k7gqCBvV8v6dbLFM6INKiSpGc4Gegid0_YAh4,29017
72
72
  worker_automate_hub/worker.py,sha256=tftQpX8liC-_0_bOUf1YYzXSCvloMQBvjmQ6lzfEE-c,4816
73
- worker_automate_hub-0.4.448.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
74
- worker_automate_hub-0.4.448.dist-info/METADATA,sha256=xolmgP4uWa1s6in1Ou0z7VzqrwKBwt5Ru_XiQqCzkZw,2895
75
- worker_automate_hub-0.4.448.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
76
- worker_automate_hub-0.4.448.dist-info/RECORD,,
73
+ worker_automate_hub-0.4.450.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
74
+ worker_automate_hub-0.4.450.dist-info/METADATA,sha256=xwGG6St35fxXYxUgkB9Ef_wmto-rdBlrsgh5HcKtuBY,2895
75
+ worker_automate_hub-0.4.450.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
76
+ worker_automate_hub-0.4.450.dist-info/RECORD,,