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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,,