worker-automate-hub 0.5.767__tar.gz → 0.5.769__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 (106) hide show
  1. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/pyproject.toml +1 -1
  3. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +27 -4
  4. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +33 -14
  5. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/README.md +0 -0
  6. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/__init__.py +0 -0
  7. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/__init__.py +0 -0
  8. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/ahead_service.py +0 -0
  9. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/client.py +0 -0
  10. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/datalake_service.py +0 -0
  11. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/helpers/__init__.py +0 -0
  12. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  13. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/rdp_service.py +0 -0
  14. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/rpa_fila_service.py +0 -0
  15. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  16. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/api/webhook_service.py +0 -0
  17. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/cli.py +0 -0
  18. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/config/__init__.py +0 -0
  19. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/config/settings.py +0 -0
  20. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/config.py +0 -0
  21. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/core/so_manipulation.py +0 -0
  22. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/__init__.py +0 -0
  23. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/deprecation.py +0 -0
  24. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/rate_limit.py +0 -0
  25. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/repeat.py +0 -0
  26. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/retry.py +0 -0
  27. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/singleton.py +0 -0
  28. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/decorators/timeit.py +0 -0
  29. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/__init__.py +0 -0
  30. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/__init__.py +0 -0
  31. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  32. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
  33. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  34. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  35. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
  36. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/__init__.py +0 -0
  37. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  38. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  39. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
  40. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
  41. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  42. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/__init__.py +0 -0
  43. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  44. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +0 -0
  45. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  46. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  47. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
  48. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
  49. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  50. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
  51. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
  52. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +0 -0
  53. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  54. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  55. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  56. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  57. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  58. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  59. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
  60. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
  61. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  62. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  63. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  64. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  65. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  66. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  67. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  68. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  69. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  70. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
  71. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  72. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  73. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
  74. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  75. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
  76. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
  77. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +0 -0
  78. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
  79. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
  80. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  81. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  82. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
  83. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
  84. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
  85. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
  86. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
  87. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
  88. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
  89. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  90. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
  91. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
  92. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/opex_capex.py +0 -0
  93. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  94. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  95. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  96. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/task_definitions.py +0 -0
  97. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/tasks/task_executor.py +0 -0
  98. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/__init__.py +0 -0
  99. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/env.py +0 -0
  100. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  101. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/logger.py +0 -0
  102. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/toast.py +0 -0
  103. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/updater.py +0 -0
  104. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/util.py +0 -0
  105. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  106. {worker_automate_hub-0.5.767 → worker_automate_hub-0.5.769}/worker_automate_hub/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: worker-automate-hub
3
- Version: 0.5.767
3
+ Version: 0.5.769
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.767"
3
+ version = "0.5.769"
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"
@@ -974,7 +974,7 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
974
974
  recebimento_fisico = datetime.strptime(recebimento_fisico, "%d/%m/%Y")
975
975
 
976
976
  #se a data do aceite no Ahead ultrapassar dois dias após a emissão da nota, deve-se colocar o vencimento para a mesma data do “Receb. Físico”/Aceite.
977
- if ((recebimento_fisico >= dt_emissao + timedelta(days=2)) and ("vibra" in nota.get("nomeFornecedor").lower() or "ipiranga" in nota.get("nomeFornecedor").lower() or "raizen" in nota.get("nomeFornecedor").lower() or "charru" in nota.get("nomeFornecedor").lower())):
977
+ if ((recebimento_fisico >= dt_emissao + timedelta(days=2)) and ("vibra" in nota.get("nomeFornecedor").lower() or "ipiranga" in nota.get("nomeFornecedor").lower() or "raizen" in nota.get("nomeFornecedor").lower())): # or "charru" in nota.get("nomeFornecedor").lower())):
978
978
  recebimento_fisico = recebimento_fisico.strftime("%d/%m/%Y")
979
979
  console.print(f"Informando a data de vencimento, {recebimento_fisico}... \n")
980
980
  vencimento = panel_TabParcelamento.child_window(
@@ -987,6 +987,18 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
987
987
  )
988
988
  data_vencimento = nota.get("dataVencimento")
989
989
  vencimento.set_edit_text(data_vencimento)
990
+ elif "charru" in nota.get("nomeFornecedor").lower():
991
+ vencimento = panel_TabParcelamento.child_window(
992
+ class_name="TDBIEditDate"
993
+ )
994
+ data_vencimento = nota.get("dataEmissao")
995
+ # Converte string para datetime
996
+ data_dt = datetime.strptime(data_vencimento, "%d/%m/%Y")
997
+ # Soma 30 dias
998
+ data_dt_venc = data_dt + timedelta(days=30)
999
+ # Converte de volta para string no mesmo formato
1000
+ data_vencimento = data_dt_venc.strftime("%d/%m/%Y")
1001
+ vencimento.set_edit_text(data_vencimento)
990
1002
  else:
991
1003
  #Senão adicionar 1 dia a emissao
992
1004
  dt_emissao = nota.get("dataEmissao")
@@ -1027,7 +1039,7 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
1027
1039
  console.print(f"Processo de incluir pagamento realizado com sucesso... \n")
1028
1040
  else:
1029
1041
  data_vencimento = ""
1030
- if "vibra" in nota.get("nomeFornecedor").lower() or "ipiranga" in nota.get("nomeFornecedor").lower() or "raizen" in nota.get("nomeFornecedor").lower() or "charru" in nota.get("nomeFornecedor").lower():
1042
+ if "vibra" in nota.get("nomeFornecedor").lower() or "ipiranga" in nota.get("nomeFornecedor").lower() or "raizen" in nota.get("nomeFornecedor").lower(): #or "charru" in nota.get("nomeFornecedor").lower():
1031
1043
  dt_emissao = nota.get("dataEmissao")
1032
1044
  dt_emissao = datetime.strptime(dt_emissao, "%d/%m/%Y")
1033
1045
  pattern = r"(\d{2}/\d{2}/\d{4})"
@@ -1042,9 +1054,20 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
1042
1054
  dt_emissao = dt_emissao + timedelta(days=1)
1043
1055
  dt_emissao = dt_emissao.strftime("%d/%m/%Y")
1044
1056
  data_vencimento = dt_emissao
1057
+ elif "charru" in nota.get("nomeFornecedor").lower():
1058
+ vencimento = panel_TabParcelamento.child_window(
1059
+ class_name="TDBIEditDate"
1060
+ )
1061
+ data_vencimento = nota.get("dataEmissao")
1062
+ # Converte string para datetime
1063
+ data_dt = datetime.strptime(data_vencimento, "%d/%m/%Y")
1064
+ # Soma 30 dias
1065
+ data_dt_venc = data_dt + timedelta(days=30)
1066
+ # Converte de volta para string no mesmo formato
1067
+ data_vencimento = data_dt_venc.strftime("%d/%m/%Y")
1068
+ # vencimento.set_edit_text(data_vencimento)
1045
1069
  else:
1046
1070
  data_vencimento = nota.get("dataVencimento")
1047
-
1048
1071
  await worker_sleep(2)
1049
1072
  console.print(f"Removendo registro de parcelamento do pagamento... \n")
1050
1073
  btn_remove = panel_TabParcelamento.child_window(
@@ -1325,4 +1348,4 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
1325
1348
 
1326
1349
  finally:
1327
1350
  # Deleta o xml
1328
- await delete_xml(nota["nfe"])
1351
+ await delete_xml(nota["nfe"])
@@ -19,6 +19,7 @@ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
19
19
  )
20
20
  from rich.console import Console
21
21
  import re
22
+ import time
22
23
  from pywinauto.keyboard import send_keys
23
24
  import warnings
24
25
  from pywinauto.application import Application
@@ -60,7 +61,9 @@ async def extracao_saldo_estoque_fiscal(
60
61
  # Fecha a instancia do emsys - caso esteja aberta
61
62
  await kill_all_emsys()
62
63
 
63
- app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\EMSysFiscal.exe")
64
+ app = Application(backend="win32").start(
65
+ "C:\\Rezende\\EMSys3\\EMSysFiscal_38.exe"
66
+ )
64
67
  warnings.filterwarnings(
65
68
  "ignore",
66
69
  category=UserWarning,
@@ -119,7 +122,7 @@ async def extracao_saldo_estoque_fiscal(
119
122
  campo_data.click_input()
120
123
 
121
124
  # Limpa e digita
122
- keyboard.send_keys("^a{BACKSPACE}07/2025")
125
+ keyboard.send_keys("^a{BACKSPACE}" + periodo)
123
126
 
124
127
  # Seleciona inventário
125
128
  chk_inventario = main_window.child_window(
@@ -171,10 +174,9 @@ async def extracao_saldo_estoque_fiscal(
171
174
  ##### Janela Gerar Registros #####
172
175
  app = Application(backend="win32").connect(title="Gerar Registros")
173
176
  main_window = app.window(title="Gerar Registros")
174
- # Clicar em Sim
175
- btn_sim = main_window.child_window(
176
- class_name="Button", found_index=1
177
- ).click_input()
177
+
178
+ # Clicar no botão "Sim"
179
+ main_window.child_window(title="&Sim", class_name="Button").click_input()
178
180
 
179
181
  await worker_sleep(2)
180
182
 
@@ -185,21 +187,38 @@ async def extracao_saldo_estoque_fiscal(
185
187
  slc_01 = main_window.child_window(
186
188
  class_name="TDBIComboBoxValues", found_index=0
187
189
  ).click_input()
188
- await worker_sleep(0.1)
190
+ await worker_sleep(1)
189
191
  keyboard.send_keys("01" + "{ENTER}")
190
- await worker_sleep(0.2)
192
+ await worker_sleep(2)
191
193
 
192
194
  # Clicar em confirmar
193
195
  main_window.child_window(class_name="TBitBtn", found_index=0).click_input()
194
196
 
195
197
  await worker_sleep(5)
196
198
 
197
- ##### Conecta à janela Preview Relatorio #####
198
- app = Application(backend="win32").connect(class_name="TFrmPreviewRelatorio")
199
+ CLASS = "TFrmPreviewRelatorio"
200
+
201
+ # 1) Espera a janela aparecer (até 180s)
202
+ desk = Desktop(backend="win32")
203
+ deadline = time.time() + 180
204
+ win = None
205
+ while time.time() < deadline:
206
+ try:
207
+ w = desk.window(class_name=CLASS)
208
+ if w.exists(timeout=0.5):
209
+ w.wait("visible enabled ready", timeout=30)
210
+ win = w
211
+ break
212
+ except Exception:
213
+ pass
214
+ time.sleep(0.5)
215
+
216
+ if win is None:
217
+ raise TimeoutError(f"Janela '{CLASS}' não apareceu dentro do timeout.")
199
218
 
200
- # Espera até a janela aparecer e estar pronta
201
- main_window = app.window(class_name="TFrmPreviewRelatorio")
202
- main_window.wait("exists enabled visible ready", timeout=180)
219
+ # 2) Conecta ao app usando o handle da janela encontrada
220
+ app = Application(backend="win32").connect(handle=win.handle)
221
+ main_window = app.window(handle=win.handle)
203
222
 
204
223
  # Dá o foco na janela
205
224
  main_window.set_focus()
@@ -295,7 +314,7 @@ async def extracao_saldo_estoque_fiscal(
295
314
 
296
315
  # 1) Abrir o picker pelo botão (imagem)
297
316
  console.print("Procurando botão de salvar (imagem)...", style="bold cyan")
298
- caminho_img = r"assets\\extracao_relatorios\\btn_salvar.png"
317
+ caminho_img = r'assets\\extracao_relatorios\btn_salvar.png'
299
318
  if os.path.isfile(caminho_img):
300
319
  pos = pyautogui.locateCenterOnScreen(caminho_img, confidence=0.9)
301
320
  if pos: