worker-automate-hub 0.5.806__tar.gz → 0.5.808__tar.gz

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.
Files changed (108) hide show
  1. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/pyproject.toml +1 -1
  3. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +63 -112
  4. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/opex_capex.py +97 -22
  5. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/util.py +21 -3
  6. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/README.md +0 -0
  7. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/__init__.py +0 -0
  8. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/__init__.py +0 -0
  9. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/ahead_service.py +0 -0
  10. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/client.py +0 -0
  11. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/datalake_service.py +0 -0
  12. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/helpers/__init__.py +0 -0
  13. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  14. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/rdp_service.py +0 -0
  15. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/rpa_fila_service.py +0 -0
  16. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  17. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/api/webhook_service.py +0 -0
  18. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/cli.py +0 -0
  19. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/config/__init__.py +0 -0
  20. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/config/settings.py +0 -0
  21. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/config.py +0 -0
  22. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/core/so_manipulation.py +0 -0
  23. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/__init__.py +0 -0
  24. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/deprecation.py +0 -0
  25. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/rate_limit.py +0 -0
  26. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/repeat.py +0 -0
  27. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/retry.py +0 -0
  28. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/singleton.py +0 -0
  29. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/decorators/timeit.py +0 -0
  30. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/__init__.py +0 -0
  31. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/__init__.py +0 -0
  32. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  33. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
  34. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  35. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  36. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
  37. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/__init__.py +0 -0
  38. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  39. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  40. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
  41. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
  42. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  43. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/__init__.py +0 -0
  44. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  45. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  46. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  47. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
  48. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
  49. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  50. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
  51. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
  52. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +0 -0
  53. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  54. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  55. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  56. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  57. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  58. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  59. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
  60. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
  61. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  62. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  63. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  64. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_22.py +0 -0
  65. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  66. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  67. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  68. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  69. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_37.py +0 -0
  70. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  71. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  72. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
  73. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  74. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  75. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
  76. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
  77. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  78. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
  79. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
  80. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +0 -0
  81. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +0 -0
  82. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
  83. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
  84. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  85. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  86. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
  87. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
  88. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
  89. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
  90. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
  91. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
  92. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
  93. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  94. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
  95. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
  96. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  97. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  98. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  99. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/task_definitions.py +0 -0
  100. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/tasks/task_executor.py +0 -0
  101. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/__init__.py +0 -0
  102. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/env.py +0 -0
  103. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  104. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/logger.py +0 -0
  105. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/toast.py +0 -0
  106. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/updater.py +0 -0
  107. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  108. {worker_automate_hub-0.5.806 → worker_automate_hub-0.5.808}/worker_automate_hub/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: worker-automate-hub
3
- Version: 0.5.806
3
+ Version: 0.5.808
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.806"
3
+ version = "0.5.808"
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"
@@ -67,17 +67,6 @@ async def wait_aguarde_window_closed(app, timeout=60):
67
67
  console.log("Timeout esperando a janela Aguarde...")
68
68
 
69
69
 
70
- def click_desconfirmar():
71
- cords = (675, 748)
72
- pyautogui.click(x=cords[0], y=cords[1])
73
-
74
-
75
- def ctrl_c():
76
- pyautogui.press("tab", presses=12) # verificar
77
- pyautogui.hotkey("ctrl", "c")
78
- return pyperclip.paste()
79
-
80
-
81
70
  async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
82
71
  try:
83
72
  config = await get_config_by_name("login_emsys_fiscal")
@@ -365,10 +354,10 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
365
354
  info_window.child_window(
366
355
  class_name="Button", found_index=0
367
356
  ).click_input()
368
- except Exception as e:
369
- print(f"Erro ao clicar em 'Sim' na janela Informação: {e}")
370
- except Exception as e:
371
- print(f"[Erro ao procurar imagem]: {e}")
357
+ except:
358
+ pass
359
+ except:
360
+ pass
372
361
 
373
362
  # Verifica se a janela TMsgBox de aviso está aberta
374
363
  try:
@@ -378,25 +367,49 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
378
367
  box.set_focus()
379
368
  box.child_window(class_name="TBitBtn", found_index=0).click_input()
380
369
  print("Clicou no botão 'TBitBtn'.")
381
- except ElementNotFoundError:
370
+ except:
382
371
  pass
383
- except Exception as e:
384
- print(f"[Erro ao procurar/clicar na TMessageForm]: {e}")
385
372
 
386
373
  # 2. Verifica e trata janela de confirmação TMessageForm
387
374
  try:
388
- app_msg = Application().connect(
389
- class_name="TMessageForm", timeout=2
390
- )
391
- form = app_msg["TMessageForm"]
392
- console.print("Janela de confirmação 'TMessageForm' encontrada.")
393
- form.set_focus()
394
- form.child_window(class_name="TButton", found_index=0).click_input()
395
- print("Clicou no botão de confirmação.")
396
- except ElementNotFoundError:
375
+ # img_dialog = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\notas_rejeitadas.png"
376
+ img_dialog = "assets\\abertura_livros\\notas_rejeitadas.png"
377
+ if os.path.exists(img_dialog):
378
+ caixa = pyautogui.locateOnScreen(img_dialog, confidence=0.86, grayscale=True)
379
+ if caixa:
380
+ print("Janela 'notas rejeitadas' detectada por imagem.")
381
+ region = (caixa.left, caixa.top, caixa.width, caixa.height)
382
+
383
+ app_msg = Application().connect(
384
+ class_name="TMessageForm", timeout=2
385
+ )
386
+ form = app_msg["TMessageForm"]
387
+ console.print("Janela de confirmação 'TMessageForm' encontrada.")
388
+ form.set_focus()
389
+ form.child_window(class_name="TButton", found_index=1).click_input()
390
+ print("Clicou no botão de confirmação.")
391
+
392
+ await worker_sleep(5)
393
+
394
+ # img_dialog = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\gerar_rel_notas_rejeitadas.png"
395
+ img_dialog = "assets\\abertura_livros\\gerar_rel_notas_rejeitadas.png"
396
+ if os.path.exists(img_dialog):
397
+ caixa = pyautogui.locateOnScreen(img_dialog, confidence=0.86, grayscale=True)
398
+ if caixa:
399
+ print("Janela 'notas rejeitadas' detectada por imagem.")
400
+ region = (caixa.left, caixa.top, caixa.width, caixa.height)
401
+
402
+ app_msg = Application().connect(
403
+ class_name="TMessageForm", timeout=2
404
+ )
405
+ form = app_msg["TMessageForm"]
406
+ console.print("Janela de confirmação 'TMessageForm' encontrada.")
407
+ form.set_focus()
408
+ form.child_window(class_name="TButton", found_index=0).click_input()
409
+ print("Clicou no botão de confirmação.")
410
+ except:
397
411
  pass
398
- except Exception as e:
399
- print(f"[Erro ao procurar/clicar na TMessageForm]: {e}")
412
+
400
413
 
401
414
  # 3. Verifica se a janela do relatório está aberta
402
415
  try:
@@ -406,10 +419,9 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
406
419
  janela = app_report["TFrmPreviewRelatorio"]
407
420
  print("Janela 'TFrmPreviewRelatorio' encontrada.")
408
421
  janela_aberta = True
409
- except ElementNotFoundError:
422
+ except:
410
423
  pass
411
- except Exception as e:
412
- print(f"[Erro ao procurar TFrmPreviewRelatorio]: {e}")
424
+
413
425
 
414
426
  # Se encontrou a janela de relatório, sai
415
427
  if janela_aberta:
@@ -444,9 +456,27 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
444
456
  main_window = app["TFrmPreviewRelatorio"]
445
457
  main_window.set_focus()
446
458
 
459
+ # Verificando se a foi confirmado os livres
460
+ console.print("Verificando se os livros foram confirmados")
461
+
462
+ # imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\confirmado_livros.png"
463
+ imagem = "assets\\abertura_livros\\confirmado_livros.png"
464
+ if os.path.exists(imagem):
465
+ caixa = pyautogui.locateOnScreen(imagem, confidence=0.9, grayscale=True)
466
+ else:
467
+ console.print("Imagem confirmada não encontrada")
468
+ return RpaRetornoProcessoDTO(
469
+ sucesso=False,
470
+ retorno=f"Erro na Abertura de Livro Fiscal: Imagem confirmada não encontrada",
471
+ status=RpaHistoricoStatusEnum.Falha,
472
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
473
+ )
474
+
447
475
  # Clicar em fechar
448
476
  main_window.close()
449
477
 
478
+ console.print("Livros confirmados")
479
+
450
480
  await worker_sleep(5)
451
481
 
452
482
  # Conecta na janela principal
@@ -577,86 +607,6 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
577
607
 
578
608
  await worker_sleep(2)
579
609
 
580
- # flag para controlar se é a primeira vez
581
- primeira_confirmacao = True
582
-
583
- while True:
584
- janela_aberta = False
585
-
586
- # 1. Verifica se a imagem apareceu e clica em 'Sim' na janela "Informação"
587
- try:
588
- if pyautogui.locateOnScreen(imagem, confidence=0.9):
589
- print("Imagem 'livros_incluidos' apareceu na tela.")
590
- try:
591
- app_info = Application().connect(title="Informação", timeout=5)
592
- info_window = app_info["Informação"]
593
- info_window.set_focus()
594
- console.print("Clicando em 'Sim' na janela Informação...")
595
- info_window.child_window(class_name="Button", found_index=0).click_input()
596
- except Exception as e:
597
- print(f"Erro ao clicar em 'Sim' na janela Informação: {e}")
598
- except Exception as e:
599
- print(f"[Erro ao procurar imagem]: {e}")
600
-
601
- # Verifica se a janela TMsgBox de aviso está aberta
602
- try:
603
- app_msgbox = Application().connect(class_name="TMsgBox", timeout=10)
604
- box = app_msgbox["TMsgBox"]
605
- print("Janela 'TMsgBox' encontrada.")
606
- box.set_focus()
607
- box.child_window(class_name="TBitBtn", found_index=0).click_input()
608
- print("Clicou no botão 'TBitBtn'.")
609
- except ElementNotFoundError:
610
- pass
611
- except Exception as e:
612
- print(f"[Erro ao procurar/clicar na TMsgBox]: {e}")
613
-
614
- # 2. Verifica e trata janela de confirmação TMessageForm
615
- try:
616
- app_msg = Application().connect(class_name="TMessageForm", timeout=2)
617
- form = app_msg["TMessageForm"]
618
- console.print("Janela de confirmação 'TMessageForm' encontrada.")
619
- form.set_focus()
620
-
621
- idx = 1 if primeira_confirmacao else 0
622
- try:
623
- form.child_window(class_name="TButton", found_index=idx).click_input()
624
- print(f"Clicou no botão de confirmação (found_index={idx}).")
625
- primeira_confirmacao = False # nas próximas vezes será 0
626
- except Exception as e:
627
- print(f"[Falha ao clicar no botão found_index={idx}]: {e}")
628
-
629
- except ElementNotFoundError:
630
- pass
631
- except Exception as e:
632
- print(f"[Erro ao procurar/clicar na TMessageForm]: {e}")
633
-
634
- await worker_sleep(5)
635
-
636
- # 3. Verifica se a janela do relatório está aberta
637
- try:
638
- app_report = Application().connect(class_name="TFrmPreviewRelatorio", timeout=2)
639
- janela = app_report["TFrmPreviewRelatorio"]
640
- print("Janela 'TFrmPreviewRelatorio' encontrada.")
641
- janela_aberta = True
642
- except ElementNotFoundError:
643
- pass
644
- except Exception as e:
645
- print(f"[Erro ao procurar TFrmPreviewRelatorio]: {e}")
646
-
647
- # Se encontrou a janela de relatório, sai
648
- if janela_aberta:
649
- print("Relatório carregado. Saindo do loop.")
650
- break
651
-
652
- # Verifica tempo limite
653
- if time.time() - inicio > tempo_limite:
654
- print("Tempo esgotado. Relatório não carregado.")
655
- break
656
-
657
- print("Aguardando janela de relatório... (verificando novas confirmações se houver)")
658
- time.sleep(intervalo)
659
-
660
610
 
661
611
  # === 5) Se não houve 'Aviso' com erro mapeado, considera sucesso ===
662
612
  console.print("Nenhum erro confirmado. Fluxo OK.")
@@ -682,3 +632,4 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
682
632
  status=RpaHistoricoStatusEnum.Falha,
683
633
  tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
684
634
  )
635
+
@@ -12,7 +12,7 @@ import win32clipboard
12
12
  from PIL import Image, ImageEnhance
13
13
  from pywinauto.application import Application
14
14
  from pywinauto.keyboard import send_keys
15
- from pywinauto.timings import wait_until
15
+ from pywinauto.timings import TimeoutError as PywTimeout, wait_until
16
16
  from pywinauto_recorder.player import set_combobox
17
17
  from rich.console import Console
18
18
  import sys
@@ -471,6 +471,7 @@ async def opex_capex(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
471
471
 
472
472
  # Clicar em itens da nota
473
473
  imagem = "assets\\entrada_notas\\itens_nota.png"
474
+ # imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\entrada_notas\itens_nota.png"
474
475
 
475
476
  # Tenta localizar a imagem na tela
476
477
  while True:
@@ -547,6 +548,11 @@ async def opex_capex(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
547
548
  send_keys("{ENTER}")
548
549
  except Exception as e:
549
550
  print(f"Erro ao selecionar opção: {e}")
551
+ # Localize o combobox pelo class_name
552
+ combo = main_window.child_window(class_name="TDBIComboBox", found_index=4)
553
+
554
+ # Seleciona diretamente o texto
555
+ combo.select("IPI 0%")
550
556
 
551
557
  # Clicar em alterar
552
558
  main_window.child_window(class_name="TDBIBitBtn", found_index=3).click()
@@ -585,27 +591,99 @@ async def opex_capex(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
585
591
 
586
592
  panel_TabPagamento = panel_TTabSheet.child_window(title="Pagamento")
587
593
 
588
- tipo_cobranca = panel_TTabSheet.child_window(
589
- class_name="TDBIComboBox", found_index=0
590
- )
591
- tipo_cobranca.click()
592
- # Lista de opções em ordem de prioridade
594
+ # Combo alvo (ajuste found_index se precisar)
595
+ tipo_cobranca = panel_TTabSheet.child_window(class_name="TDBIComboBox", found_index=0)
596
+
597
+ # Ordem de preferência
593
598
  opcoes = [
594
599
  "BANCO DO BRASIL BOLETO FIDC",
595
600
  "BANCO DO BRASIL BOLETO",
596
- "BOLETO"
601
+ "BOLETO",
597
602
  ]
598
603
 
599
- # Vamos percorrer o combo com setas
600
- max_tentativas = 20 # evita loop infinito
601
- for _ in range(max_tentativas):
602
- texto_atual = tipo_cobranca.window_text().strip()
603
- if any(opcao.lower() == texto_atual.lower() for opcao in opcoes):
604
- send_keys("{ENTER}")
605
- break
606
- send_keys("{DOWN}")
607
-
608
- await worker_sleep(3)
604
+ # 1) Tenta .select() direto (não digita nada)
605
+ selecionado = None
606
+ for alvo in opcoes:
607
+ try:
608
+ tipo_cobranca.select(alvo)
609
+ if tipo_cobranca.window_text().strip().lower() == alvo.lower():
610
+ selecionado = alvo
611
+ break
612
+ except Exception:
613
+ pass
614
+
615
+ # 2) Abre a LISTA e seleciona o item exato (sem digitar)
616
+ if not selecionado:
617
+ tipo_cobranca.set_focus()
618
+ tipo_cobranca.click_input()
619
+ send_keys('%{DOWN}') # ALT+DOWN para abrir o dropdown
620
+ # tenta achar a janela da lista (Delphi/Win32)
621
+ lista = None
622
+ app = tipo_cobranca.app
623
+ for crit in (dict(title="||List"), dict(class_name="ComboLBox"), dict(class_name_re=".*(List|Combo).*")):
624
+ try:
625
+ cand = app.window(**crit)
626
+ if cand.exists(timeout=0.5):
627
+ lista = cand
628
+ break
629
+ except Exception:
630
+ pass
631
+
632
+ if lista:
633
+ # tenta selecionar por índice (texto exato)
634
+ try:
635
+ itens = [t.strip() for t in lista.texts() if str(t).strip()]
636
+ except Exception:
637
+ itens = []
638
+
639
+ idx_alvo = -1
640
+ alvo_escolhido = None
641
+ for alvo in opcoes:
642
+ for i, t in enumerate(itens):
643
+ if t.lower() == alvo.lower():
644
+ idx_alvo = i
645
+ alvo_escolhido = alvo
646
+ break
647
+ if idx_alvo >= 0:
648
+ break
649
+
650
+ if idx_alvo >= 0:
651
+ try:
652
+ lista.select(idx_alvo)
653
+ except Exception:
654
+ # fallback por teclas sem digitar texto do item
655
+ send_keys('{HOME}')
656
+ for _ in range(idx_alvo):
657
+ send_keys('{DOWN}')
658
+ send_keys('{ENTER}')
659
+ try:
660
+ wait_until(2, 0.2, lambda: tipo_cobranca.window_text().strip() != "")
661
+ except PywTimeout:
662
+ pass
663
+ if tipo_cobranca.window_text().strip().lower() == alvo_escolhido.lower():
664
+ selecionado = alvo_escolhido
665
+ else:
666
+ # fallback só com setas (sem digitar): vai ao topo e desce checando
667
+ send_keys('{HOME}')
668
+ vistos = set()
669
+ for _ in range(60):
670
+ atual = tipo_cobranca.window_text().strip()
671
+ if atual.lower() in (o.lower() for o in opcoes):
672
+ send_keys('{ENTER}')
673
+ selecionado = atual
674
+ break
675
+ if atual.lower() in vistos:
676
+ # deu a volta
677
+ send_keys('{ESC}')
678
+ break
679
+ vistos.add(atual.lower())
680
+ send_keys('{DOWN}')
681
+
682
+ # (opcional) validação dura
683
+ if not selecionado or selecionado.lower() not in (o.lower() for o in opcoes):
684
+ raise RuntimeError(f"Não consegui selecionar uma opção válida. Ficou: '{tipo_cobranca.window_text().strip()}'")
685
+
686
+ print("Selecionado:", selecionado)
609
687
 
610
688
  dt_vencimento_nota = nota.get("dataVencimento") # vem como '2025-09-26'
611
689
  data_atual = datetime.now().date()
@@ -634,10 +712,8 @@ async def opex_capex(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
634
712
 
635
713
  console.print(f"Incluindo registro...\n")
636
714
  try:
637
- ASSETS_PATH = "assets"
638
- inserir_registro = pyautogui.locateOnScreen(
639
- "assets\\entrada_notas\\IncluirRegistro.png", confidence=0.8
640
- )
715
+ inserir_registro = pyautogui.locateOnScreen("assets\entrada_notas\IncluirRegistro.png", confidence=0.8)
716
+ # inserir_registro = pyautogui.locateOnScreen(r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\entrada_notas\IncluirRegistro.png", confidence=0.8)
641
717
  pyautogui.click(inserir_registro)
642
718
  except Exception as e:
643
719
  console.print(
@@ -830,4 +906,3 @@ async def opex_capex(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
830
906
  # Deleta o xml
831
907
  await delete_xml(numero_nota)
832
908
 
833
-
@@ -339,9 +339,27 @@ async def login_emsys_fiscal(
339
339
  message="32-bit application should be automated using 32-bit Python",
340
340
  )
341
341
  await worker_sleep(2)
342
- filial_cod = task.configEntrada.get("empresa")
343
- if filial_cod == None:
344
- filial_cod = task.configEntrada.get("filialEmpresaOrigem")
342
+ filial_cod = (
343
+ task.configEntrada.get("empresa")
344
+ or task.configEntrada.get("filialEmpresaOrigem")
345
+ or task.configEntrada.get("descricaoFilial")
346
+ )
347
+
348
+ # Extrai apenas os dígitos iniciais da string
349
+ num = None
350
+ if filial_cod is not None:
351
+ s = str(filial_cod).strip()
352
+ m = re.match(r'^(\d+)', s) # pega o número do INÍCIO
353
+ if not m:
354
+ m = re.search(r'\d+', s) # fallback: primeiro número que aparecer
355
+ if m:
356
+ num = m.group(1)
357
+
358
+ if num is None:
359
+ raise ValueError(f"Não foi possível extrair número de: {filial_cod!r}")
360
+
361
+ filial_cod = num
362
+
345
363
  console.print(f"Empresa a ser processada: {filial_cod}")
346
364
 
347
365
  try: