worker-automate-hub 0.5.52__py3-none-any.whl → 0.5.54__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,7 +8,8 @@ console = Console()
8
8
  async def send_to_webhook(
9
9
  url_retorno: str,
10
10
  status: str,
11
- observacao: str
11
+ observacao: str,
12
+ identificador_webhook: str = None
12
13
  ) -> None:
13
14
  """
14
15
  Envia uma notificacao para o endpoint do webhook passado como parametro.
@@ -35,6 +36,9 @@ async def send_to_webhook(
35
36
  "observacao": observacao,
36
37
  }
37
38
 
39
+ if identificador_webhook:
40
+ data["identificador"] = identificador_webhook
41
+
38
42
  try:
39
43
  async with aiohttp.ClientSession(
40
44
  connector=aiohttp.TCPConnector(verify_ssl=False)
@@ -35,6 +35,7 @@ from worker_automate_hub.utils.util import (
35
35
  e_ultimo_dia_util,
36
36
  delete_xml,
37
37
  ocr_warnings,
38
+ ocr_by_class,
38
39
  nf_busca_nf_saida,
39
40
  pessoas_ativa_cliente_fornecedor,
40
41
  nf_devolucao_liquidar_cupom,
@@ -210,6 +211,10 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
210
211
  btn_ir_para_nota = pyautogui.locateOnScreen(ASSETS_PATH + "\\notas_saida\\ir_para_nota_a_fatura_esmaecido.png", confidence=0.8)
211
212
  if btn_ir_para_nota:
212
213
  console.print("Botão 'Ir para nota de faturar' inativo, seguindo com o processo...\n")
214
+ app = Application().connect(class_name="TFrmNotaFiscalSaida", timeout=60)
215
+ main_window = app["TFrmNotaFiscalSaida"]
216
+ main_window.set_focus()
217
+ main_window.close()
213
218
  else:
214
219
  retorno = f"Botão [Ir para nota de faturar] está ativo, impossibilitando realizar a devolução \nEtapas Executadas:\n{steps}"
215
220
  return RpaRetornoProcessoDTO(
@@ -754,9 +759,7 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
754
759
  console.print(f"Imagem preparada com sucesso...\n")
755
760
  console.print(f"Realizando OCR...\n")
756
761
  captured_text = pytesseract.image_to_string(Image.open(path_to_png))
757
- console.print(
758
- f"Texto Full capturado {captured_text}...\n"
759
- )
762
+ console.print(f"Texto Full capturado {captured_text}...\n")
760
763
  os.remove(path_to_png)
761
764
  pattern = r"sequ[êe]ncia:\s*(\d+)"
762
765
  match = re.search(pattern, captured_text)
@@ -765,6 +768,9 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
765
768
  numero_nota_fiscal = match.group(1)
766
769
 
767
770
 
771
+ app = Application().connect(title="Information", timeout=180)
772
+ main_window = app["Information"]
773
+ main_window.set_focus()
768
774
  btn_ok = main_window.child_window(class_name="TButton", found_index=0)
769
775
  btn_ok.click()
770
776
  await worker_sleep(3)
@@ -815,17 +821,37 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
815
821
 
816
822
  while i < max_attempts:
817
823
  try:
818
- app = Application().connect(class_name="TFrmProcessamentoFEe2", timeout=60)
824
+ app = Application().connect(class_name="TFrmProcessamentoFEe2", timeout=10)
819
825
  main_window = app["TFrmProcessamentoFEe2"]
820
826
 
821
- await worker_sleep(15)
822
-
823
- information_operacao_concluida = main_window.child_window(class_name="TMessageForm")
824
- btn_ok = information_operacao_concluida.child_window(class_name="TButton")
825
- btn_ok.click()
826
- await worker_sleep(4)
827
- main_window.close()
828
- break
827
+ await worker_sleep(5)
828
+ information_pop_up = await is_window_open_by_class("TMessageForm", "TMessageForm")
829
+ if information_pop_up["IsOpened"] == True:
830
+ msg_pop_up = await ocr_by_class(numero_nota_fiscal, "TMessageForm", "TMessageForm")
831
+ if msg_pop_up.sucesso:
832
+ if 'operação concl' in msg_pop_up or 'operacao concl' in msg_pop_up:
833
+ information_operacao_concluida = main_window.child_window(class_name="TMessageForm")
834
+ btn_ok = information_operacao_concluida.child_window(class_name="TButton")
835
+ btn_ok.click()
836
+ await worker_sleep(4)
837
+ main_window.close()
838
+ break
839
+ else:
840
+ retorno = f"Pop up nao mapeado para seguimento do robo {msg_pop_up} \nEtapas Executadas:\n{steps}"
841
+ return RpaRetornoProcessoDTO(
842
+ sucesso=False,
843
+ retorno=retorno,
844
+ status=RpaHistoricoStatusEnum.Falha,
845
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
846
+ )
847
+ else:
848
+ retorno = f"Não foi possivel realizar a confirmação do msg do OCR \nEtapas Executadas:\n{steps}"
849
+ return RpaRetornoProcessoDTO(
850
+ sucesso=False,
851
+ retorno=retorno,
852
+ status=RpaHistoricoStatusEnum.Falha,
853
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
854
+ )
829
855
  except Exception as e:
830
856
  pass
831
857
 
@@ -36,6 +36,7 @@ async def perform_task(task: RpaProcessoEntradaDTO):
36
36
  logger.info(log_msg)
37
37
  task_uuid = task.uuidProcesso
38
38
  url_retorno = task.configEntrada.get("urlRetorno", None)
39
+ identificador_webhook = task.configEntrada.get("identificador", None)
39
40
  processo: RpaProcesso = await get_processo(task_uuid)
40
41
  if processo is None:
41
42
  worker_config = load_worker_config()
@@ -77,7 +78,10 @@ async def perform_task(task: RpaProcessoEntradaDTO):
77
78
  show_toast("Sucesso", f"Processo executado com sucesso: {result}")
78
79
 
79
80
  if url_retorno is not None and result.sucesso == False:
80
- await send_to_webhook(url_retorno, result.status, result.retorno)
81
+ if identificador_webhook:
82
+ await send_to_webhook(url_retorno, result.status, result.retorno, identificador_webhook)
83
+ else:
84
+ await send_to_webhook(url_retorno, result.status, result.retorno)
81
85
  return result
82
86
  else:
83
87
  err_msg = f"Processo não encontrado: {task_uuid}"
@@ -3437,6 +3437,60 @@ async def ocr_warnings(numero_nota: str)-> RpaRetornoProcessoDTO:
3437
3437
  pass
3438
3438
 
3439
3439
 
3440
+ async def ocr_by_class(numero_nota: str, windows_class: str, app_class: str)-> RpaRetornoProcessoDTO:
3441
+ try:
3442
+ app = Application().connect(class_name=windows_class)
3443
+ main_window = app[app_class]
3444
+ main_window.set_focus()
3445
+
3446
+ console.print(f"Obtendo texto da Janela...\n")
3447
+ console.print(f"Tirando print da janela do warning para realização do OCR...\n")
3448
+
3449
+ window_rect = main_window.rectangle()
3450
+ screenshot = pyautogui.screenshot(
3451
+ region=(
3452
+ window_rect.left,
3453
+ window_rect.top,
3454
+ window_rect.width(),
3455
+ window_rect.height(),
3456
+ )
3457
+ )
3458
+ username = getpass.getuser()
3459
+ path_to_png = f"C:\\Users\\{username}\\Downloads\\ocr_bt_class_popup_{numero_nota}.png"
3460
+ screenshot.save(path_to_png)
3461
+ console.print(f"Print salvo em {path_to_png}...\n")
3462
+
3463
+ console.print(
3464
+ f"Preparando a imagem para maior resolução e assertividade no OCR...\n"
3465
+ )
3466
+ image = Image.open(path_to_png)
3467
+ image = image.convert("L")
3468
+ enhancer = ImageEnhance.Contrast(image)
3469
+ image = enhancer.enhance(2.0)
3470
+ image.save(path_to_png)
3471
+ console.print(f"Imagem preparada com sucesso...\n")
3472
+ console.print(f"Realizando OCR...\n")
3473
+ captured_text = pytesseract.image_to_string(Image.open(path_to_png))
3474
+ console.print(f"Texto Full capturado {captured_text}...\n")
3475
+ return RpaRetornoProcessoDTO(
3476
+ sucesso=True,
3477
+ retorno=captured_text,
3478
+ status=RpaHistoricoStatusEnum.Sucesso,
3479
+ )
3480
+ except Exception as e:
3481
+ return RpaRetornoProcessoDTO(
3482
+ sucesso=False,
3483
+ retorno=f"Erro ao realizar a extração do texto vinculado ao warning, erro - {e}",
3484
+ status=RpaHistoricoStatusEnum.Falha,
3485
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3486
+ )
3487
+ finally:
3488
+ try:
3489
+ os.remove(path_to_png)
3490
+ except:
3491
+ pass
3492
+
3493
+
3440
3494
  async def nf_busca_nf_saida(num_nota_fiscal: str) -> RpaRetornoProcessoDTO:
3441
3495
  try:
3442
3496
  app = Application().connect(class_name="TFrmNotaFiscalSaida", timeout=60)
@@ -3561,7 +3615,7 @@ async def nf_devolucao_liquidar_cupom(num_nota_fiscal: str, data_atual: str) ->
3561
3615
 
3562
3616
  main_window.set_focus()
3563
3617
 
3564
- page_control = main_window.child_window(class_name="TPageControl")
3618
+ page_control = main_window.child_window(class_name="TPageControl", found_index=0)
3565
3619
  # Navegar até a aba TabSheetLiquidacao
3566
3620
  tab_sheet_liquidacao = page_control.child_window(title="TabSheetLiquidacao")
3567
3621
  panel_liquidacao = tab_sheet_liquidacao.child_window(class_name="TPanel", found_index=0)
@@ -3592,30 +3646,54 @@ async def nf_devolucao_liquidar_cupom(num_nota_fiscal: str, data_atual: str) ->
3592
3646
  await worker_sleep(3)
3593
3647
  confirm_pop_up = await is_window_open_by_class("TMessageForm","TMessageForm")
3594
3648
  if confirm_pop_up["IsOpened"] == True:
3595
- app_confirm = Application().connect(class_name="TMessageForm")
3596
- main_window_confirm = app_confirm["TMessageForm"]
3597
-
3598
- btn_yes = main_window_confirm["&Yes"]
3599
- try:
3600
- btn_yes.click()
3601
- await worker_sleep(3)
3602
- console.print("O botão Yes foi clicado com sucesso.", style="green")
3603
- #main_window.close()
3604
- except:
3605
- return RpaRetornoProcessoDTO(
3606
- sucesso=False,
3607
- retorno=f"Não foi possivel clicar em Yes durante para a confirmação da liquidação do titulo",
3608
- status=RpaHistoricoStatusEnum.Falha,
3609
- tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3610
- )
3649
+ capture_text_ocr = await ocr_by_class(num_nota_fiscal,"TMessageForm","TMessageForm")
3650
+ if capture_text_ocr.sucesso == True:
3651
+ msg_result = capture_text_ocr.retorno
3652
+ if "deseja realmente" in msg_result.lower():
3653
+ app_confirm = Application().connect(class_name="TMessageForm")
3654
+ main_window_confirm = app_confirm["TMessageForm"]
3655
+
3656
+ btn_yes = main_window_confirm["&Yes"]
3657
+ try:
3658
+ btn_yes.click()
3659
+ await worker_sleep(3)
3660
+ console.print("O botão Yes foi clicado com sucesso.", style="green")
3661
+ #main_window.close()
3662
+ except:
3663
+ return RpaRetornoProcessoDTO(
3664
+ sucesso=False,
3665
+ retorno=f"Não foi possivel clicar em Yes durante para a confirmação da liquidação do titulo",
3666
+ status=RpaHistoricoStatusEnum.Falha,
3667
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3668
+ )
3669
+ else:
3670
+ return RpaRetornoProcessoDTO(
3671
+ sucesso=False,
3672
+ retorno=f"POP não mapeado: {msg_result}",
3673
+ status=RpaHistoricoStatusEnum.Falha,
3674
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3675
+ )
3611
3676
 
3612
3677
  console.print('Aguardando a confirmação de Liquidação realizado com sucesso')
3613
3678
  try:
3614
3679
  app = Application().connect(title="Informação", timeout=60)
3615
3680
  main_window = app["Informação"]
3616
3681
  main_window.set_focus()
3617
- btn_ok = main_window.child_window(class_name="Button")
3618
- btn_ok.click()
3682
+ msg_pop_up = await ocr_by_class(num_nota_fiscal,"TMessageForm","TMessageForm")
3683
+ if msg_pop_up.sucesso == True:
3684
+ msg_result = msg_pop_up.retorno
3685
+ if "sucesso" in msg_result.lower():
3686
+ btn_ok = main_window.child_window(class_name="Button")
3687
+ btn_ok.click()
3688
+ pyautogui.press('enter')
3689
+ await worker_sleep(1)
3690
+ else:
3691
+ return RpaRetornoProcessoDTO(
3692
+ sucesso=False,
3693
+ retorno=f"Não foi possivel obter a confirmação de titulo liquidado com sucesso, pop_up nao mepeado: {msg_result}",
3694
+ status=RpaHistoricoStatusEnum.Falha,
3695
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3696
+ )
3619
3697
  except Exception as e:
3620
3698
  return RpaRetornoProcessoDTO(
3621
3699
  sucesso=False,
@@ -3624,6 +3702,10 @@ async def nf_devolucao_liquidar_cupom(num_nota_fiscal: str, data_atual: str) ->
3624
3702
  tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
3625
3703
  )
3626
3704
 
3705
+
3706
+ app = Application().connect(class_name="TFrmTituloReceber", timeout=60)
3707
+ main_window = app["TFrmTituloReceber"]
3708
+ main_window.set_focus()
3627
3709
  console.print('Confirmando se o titulo alterou para Liquidado')
3628
3710
  panel_TPage = main_window.child_window(class_name="TcxTreeView")
3629
3711
  panel_TTabSheet = panel_TPage.child_window(class_name="TcxCustomInnerTreeView")
@@ -3638,6 +3720,9 @@ async def nf_devolucao_liquidar_cupom(num_nota_fiscal: str, data_atual: str) ->
3638
3720
 
3639
3721
  if radio_liquidado.is_checked():
3640
3722
  console.print("Botão 'Liquidado' está selecionado, seguindo com o processo...\n")
3723
+ app = Application().connect(class_name="TFrmTituloReceber", timeout=60)
3724
+ main_window = app["TFrmTituloReceber"]
3725
+ main_window.set_focus()
3641
3726
  main_window.close()
3642
3727
  else:
3643
3728
  return RpaRetornoProcessoDTO(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: worker-automate-hub
3
- Version: 0.5.52
3
+ Version: 0.5.54
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
@@ -7,7 +7,7 @@ worker_automate_hub/api/helpers/api_helpers.py,sha256=SkheO2fXexeh-a4shr8Qzsz_kZ
7
7
  worker_automate_hub/api/rdp_service.py,sha256=L7orr60FkJr6zjETtA4me8tRYCW9m1g-i5pq6AILUFo,1647
8
8
  worker_automate_hub/api/rpa_fila_service.py,sha256=qa9JLuX6kL9Bv_PyPE_CzIikKwy0WdOf2FrIpFdMcYI,2125
9
9
  worker_automate_hub/api/rpa_historico_service.py,sha256=wQw8_k8i0S-r7qrrn4BSoztkgtiuH_bHRSEytbZebDg,9690
10
- worker_automate_hub/api/webhook_service.py,sha256=1VgkcOF0vY3cpV7-UOgrUj0qRuK9joDCvLhJkBBT0sQ,1751
10
+ worker_automate_hub/api/webhook_service.py,sha256=S1a8IIS5LYY16I5E2pPPczaUnUz-_CwmD9_1QBdQD2g,1879
11
11
  worker_automate_hub/cli.py,sha256=JB45pjPJ8_E-4xw0OjqDMcAw-tpDV0mjmvwJRTnTzY0,6862
12
12
  worker_automate_hub/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  worker_automate_hub/config/settings.py,sha256=4BkIYV0C9C_tl68WNfw3aoywr1-_bRJsKysSnSRALT0,2450
@@ -37,7 +37,7 @@ worker_automate_hub/tasks/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
37
37
  worker_automate_hub/tasks/jobs/coleta_dje_process.py,sha256=UkLWTC5Ub2qBb0yY-8IZ0DLLOVJOfNTq_z9krx_t25Q,29476
38
38
  worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=lNjD-JxpPTXdvFEJAkajC_Ltyw81rIEJeu7FUfRf2qI,9586
39
39
  worker_automate_hub/tasks/jobs/descartes.py,sha256=0bMCJ0xIcK8TLSgjF6taAbGFLMU-sGDVFIhUYSRtrbg,41092
40
- worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py,sha256=U8KfzVIIoVW4mi39EUUPqjOYEXd358RQ731W59ECG1s,77239
40
+ worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py,sha256=PErDGphh75kc5SGJKI90L26qPJKl0BAkk8eRgjwmRvA,79240
41
41
  worker_automate_hub/tasks/jobs/ecac_estadual_go.py,sha256=dKkf22nH5gp3RErq5u0UzRsKyJ81fc6ZZ4vLtUuMwHA,21002
42
42
  worker_automate_hub/tasks/jobs/ecac_estadual_main.py,sha256=8WmKe4-MRtzHobXz2S4YBDNN8alfawkC-BBlRY-mn1g,1726
43
43
  worker_automate_hub/tasks/jobs/ecac_estadual_mt.py,sha256=C26zmpGQGUq6sP9lU9nanM3Fje-rkyx5tjwmRy4lyL8,25300
@@ -66,17 +66,17 @@ worker_automate_hub/tasks/jobs/playground.py,sha256=7vWDg9DwToHwGJ6_XOa8TQ6LmfRV
66
66
  worker_automate_hub/tasks/jobs/sped_fiscal.py,sha256=uHA5zQmAqqb-L_jdbBKiqINV4vXI58CL3wAI-2Xt_oQ,28938
67
67
  worker_automate_hub/tasks/jobs/transferencias.py,sha256=i3fCanHZ_pSwPW03THpQPqlzrDjbV4QbKkXpUqV3dxM,39272
68
68
  worker_automate_hub/tasks/task_definitions.py,sha256=yNu2GSC1PxjblcMgT7UOFhEUq4CMaQqDfN3hAF4yz_U,4954
69
- worker_automate_hub/tasks/task_executor.py,sha256=Hup_C2LeOkn7GEHQaEDqo8MIPdSPuaJ4hzHOOK7nqZU,5311
69
+ worker_automate_hub/tasks/task_executor.py,sha256=1ZBVW2QS0io-gVyR4VNnbpaLJnSpTxtHIbRlnuQuj1Y,5566
70
70
  worker_automate_hub/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  worker_automate_hub/utils/env.py,sha256=TacQjGRO7PUNpttrhTAc5Gnegaiysl2Knsv1P8qfkfs,57
72
72
  worker_automate_hub/utils/get_creds_gworkspace.py,sha256=ZJ0IIEjM4IXIV9rwfbOZ1V1wiaMoJAGZeSy0D37sYdU,2212
73
73
  worker_automate_hub/utils/logger.py,sha256=FYV9fg0_RAYJF_ZOCJEbqQAiCXlXk2gMpvUU1rzT_xs,671
74
74
  worker_automate_hub/utils/toast.py,sha256=xPHc5r5uOxB_cZlCzm13Kt2qSKLLFZALncU6Qg3Ft68,1162
75
75
  worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbVlwDl49Y,7972
76
- worker_automate_hub/utils/util.py,sha256=rdVHmKPxu61PO2rHKfBz2Tn6aK73MXdZ9pE1fZVwQag,155604
76
+ worker_automate_hub/utils/util.py,sha256=ch8qDZfKBHCYKKjblVSQ4X07m9AsYpOPD5RflaipDm0,159514
77
77
  worker_automate_hub/utils/utils_nfe_entrada.py,sha256=iYpOs7fb7C3bY61QHySr00xlDNzrrCP0zaexOpBPuaQ,31930
78
78
  worker_automate_hub/worker.py,sha256=CT-poyP1ZYvubArYsnnNd9oJ53SPaDwgr6p6keS3nI4,6248
79
- worker_automate_hub-0.5.52.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
80
- worker_automate_hub-0.5.52.dist-info/METADATA,sha256=aOtr4WesBRC7X4d8jJLFXFYBsx8-uL9UoyMp-HSDn0g,2894
81
- worker_automate_hub-0.5.52.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
82
- worker_automate_hub-0.5.52.dist-info/RECORD,,
79
+ worker_automate_hub-0.5.54.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
80
+ worker_automate_hub-0.5.54.dist-info/METADATA,sha256=MpWKhIzCV_6rKtJD-Vfn7LYwGeqXpIfixLPCPDN-vjo,2894
81
+ worker_automate_hub-0.5.54.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
82
+ worker_automate_hub-0.5.54.dist-info/RECORD,,