worker-automate-hub 0.5.755__tar.gz → 0.5.757__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.755 → worker_automate_hub-0.5.757}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/pyproject.toml +1 -1
  3. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +1 -4
  4. worker_automate_hub-0.5.757/worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +403 -0
  5. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/task_definitions.py +3 -1
  6. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/util.py +4 -2
  7. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/README.md +0 -0
  8. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/__init__.py +0 -0
  9. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/__init__.py +0 -0
  10. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/ahead_service.py +0 -0
  11. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/client.py +0 -0
  12. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/datalake_service.py +0 -0
  13. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/helpers/__init__.py +0 -0
  14. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  15. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/rdp_service.py +0 -0
  16. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/rpa_fila_service.py +0 -0
  17. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  18. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/api/webhook_service.py +0 -0
  19. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/cli.py +0 -0
  20. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/config/__init__.py +0 -0
  21. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/config/settings.py +0 -0
  22. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/config.py +0 -0
  23. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/core/so_manipulation.py +0 -0
  24. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/__init__.py +0 -0
  25. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/deprecation.py +0 -0
  26. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/rate_limit.py +0 -0
  27. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/repeat.py +0 -0
  28. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/retry.py +0 -0
  29. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/singleton.py +0 -0
  30. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/decorators/timeit.py +0 -0
  31. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/__init__.py +0 -0
  32. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/__init__.py +0 -0
  33. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  34. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
  35. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  36. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  37. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
  38. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/__init__.py +0 -0
  39. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  40. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  41. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
  42. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
  43. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  44. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/__init__.py +0 -0
  45. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  46. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +0 -0
  47. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  48. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  49. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
  50. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
  51. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  52. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
  53. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
  54. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +0 -0
  55. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  56. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  57. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  58. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  59. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  60. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  61. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
  62. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
  63. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  64. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  65. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  66. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  67. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  68. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  69. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  70. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  71. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  72. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
  73. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  74. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  75. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
  76. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
  77. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  78. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
  79. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
  80. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
  81. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
  82. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  83. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  84. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
  85. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
  86. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
  87. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
  88. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
  89. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
  90. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
  91. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  92. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
  93. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
  94. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/opex_capex.py +0 -0
  95. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  96. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  97. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  98. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/tasks/task_executor.py +0 -0
  99. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/__init__.py +0 -0
  100. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/env.py +0 -0
  101. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  102. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/logger.py +0 -0
  103. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/toast.py +0 -0
  104. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/updater.py +0 -0
  105. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  106. {worker_automate_hub-0.5.755 → worker_automate_hub-0.5.757}/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.755
3
+ Version: 0.5.757
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.755"
3
+ version = "0.5.757"
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"
@@ -4,10 +4,7 @@ from datetime import datetime
4
4
  from pywinauto import Application, timings, findwindows
5
5
  import sys
6
6
  import io
7
-
8
- sys.path.append(
9
- os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
10
- )
7
+ # sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
11
8
 
12
9
  from worker_automate_hub.models.dto.rpa_historico_request_dto import (
13
10
  RpaHistoricoStatusEnum,
@@ -0,0 +1,403 @@
1
+ import asyncio
2
+ import os
3
+ from datetime import datetime
4
+ from pywinauto import Application, timings, findwindows, keyboard
5
+ import sys
6
+ import io
7
+
8
+ # sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
9
+
10
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
11
+ RpaHistoricoStatusEnum,
12
+ RpaRetornoProcessoDTO,
13
+ RpaTagDTO,
14
+ RpaTagEnum,
15
+ )
16
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
17
+ RpaProcessoEntradaDTO,
18
+ )
19
+ from rich.console import Console
20
+ import re
21
+ from pywinauto.keyboard import send_keys
22
+ import warnings
23
+ from pywinauto.application import Application
24
+ from worker_automate_hub.api.client import get_config_by_name, send_file
25
+ from worker_automate_hub.utils.util import (
26
+ kill_all_emsys,
27
+ login_emsys_fiscal,
28
+ set_variable,
29
+ type_text_into_field,
30
+ worker_sleep,
31
+ )
32
+ from pywinauto_recorder.player import set_combobox
33
+
34
+ from datetime import timedelta
35
+ import pyautogui
36
+ from worker_automate_hub.utils.logger import logger
37
+ from worker_automate_hub.utils.utils_nfe_entrada import EMSys
38
+
39
+ emsys = EMSys()
40
+
41
+ console = Console()
42
+ pyautogui.PAUSE = 0.5
43
+ pyautogui.FAILSAFE = False
44
+
45
+
46
+ async def extracao_saldo_estoque_fiscal(
47
+ task: RpaProcessoEntradaDTO,
48
+ ) -> RpaRetornoProcessoDTO:
49
+ try:
50
+ config = await get_config_by_name("login_emsys_fiscal")
51
+ periodo = task.configEntrada["periodo"]
52
+ periodo_format = periodo.replace("/", "")
53
+ filial = task.configEntrada["filialEmpresaOrigem"]
54
+ historico_id = task.historico_id
55
+ await kill_all_emsys()
56
+
57
+ config = await get_config_by_name("login_emsys_fiscal")
58
+
59
+ # Fecha a instancia do emsys - caso esteja aberta
60
+ await kill_all_emsys()
61
+
62
+ app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\EMSysFiscal.exe")
63
+ warnings.filterwarnings(
64
+ "ignore",
65
+ category=UserWarning,
66
+ message="32-bit application should be automated using 32-bit Python",
67
+ )
68
+
69
+ await worker_sleep(5)
70
+
71
+ try:
72
+ app = Application(backend="win32").connect(
73
+ class_name="TFrmLoginModulo", timeout=100
74
+ )
75
+ except:
76
+ return RpaRetornoProcessoDTO(
77
+ sucesso=False,
78
+ retorno="Erro ao abrir o EMSys Fiscal, tela de login não encontrada",
79
+ status=RpaHistoricoStatusEnum.Falha,
80
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
81
+ )
82
+ return_login = await login_emsys_fiscal(config.conConfiguracao, app, task)
83
+ if return_login.sucesso:
84
+ await worker_sleep(2)
85
+ type_text_into_field(
86
+ "Livros Fiscais", app["TFrmMenuPrincipal"]["Edit"], True, "50"
87
+ )
88
+ pyautogui.press("enter")
89
+ await worker_sleep(2)
90
+ pyautogui.press("down")
91
+ await worker_sleep(2)
92
+ pyautogui.press("enter")
93
+ console.print(
94
+ "\nPesquisa: 'Livros Fiscais' realizada com sucesso.",
95
+ style="bold green",
96
+ )
97
+
98
+ else:
99
+ logger.info(f"\nError Message: {return_login.retorno}")
100
+ console.print(f"\nError Message: {return_login.retorno}", style="bold red")
101
+ return return_login
102
+
103
+ await worker_sleep(7)
104
+
105
+ ##### Janela Movimento Livros Fiscais #####
106
+ # Conecta na janela principal
107
+ app = Application().connect(class_name="TFrmMovtoLivroFiscal")
108
+ main_window = app.window(class_name="TFrmMovtoLivroFiscal")
109
+ main_window.wait("exists enabled visible ready", timeout=20)
110
+
111
+ # Pegar o wrapper do campo
112
+ campo_data = main_window.child_window(class_name="TDBIEditDate")
113
+ campo_data.wait("exists enabled visible ready", timeout=10)
114
+ campo_data = campo_data.wrapper_object() # agora é o controle de fato
115
+
116
+ # Foco e clique
117
+ campo_data.set_focus()
118
+ campo_data.click_input()
119
+
120
+ # Limpa e digita
121
+ keyboard.send_keys("^a{BACKSPACE}07/2025")
122
+
123
+ # Seleciona inventário
124
+ chk_inventario = main_window.child_window(
125
+ class_name="TcxCheckBox", found_index=6
126
+ ).click_input()
127
+
128
+ await worker_sleep(2)
129
+
130
+ # Caminho da imagem do botão
131
+ imagem_botao = r"\\assets\\extracao_relatorios\\btn_incluir_livro.png"
132
+
133
+ if os.path.exists(imagem_botao):
134
+ try:
135
+ # Localiza a imagem na tela
136
+ botao = pyautogui.locateCenterOnScreen(
137
+ imagem_botao, confidence=0.9
138
+ ) # confidence precisa do opencv instalado
139
+ if botao:
140
+ pyautogui.click(botao)
141
+ print("Botão clicado com sucesso!")
142
+ else:
143
+ print("Não encontrou o botão na tela.")
144
+ except Exception as e:
145
+ print(f"Erro ao localizar/clicar na imagem: {e}")
146
+ else:
147
+ print("Caminho da imagem não existe.")
148
+
149
+ ##### Janela Perguntas da Geração Livros Fiscais #####
150
+ app = Application().connect(class_name="TPerguntasLivrosFiscaisForm")
151
+ main_window = app.window(class_name="TPerguntasLivrosFiscaisForm")
152
+ main_window.wait("exists enabled visible ready", timeout=20)
153
+
154
+ respostas = ["Não", "Sim", "Não", "Não"]
155
+
156
+ for i, resposta in enumerate(respostas):
157
+ combo = main_window.child_window(
158
+ class_name="TDBIComboBoxValues", found_index=i
159
+ ).wrapper_object()
160
+ combo.set_focus()
161
+ combo.click_input()
162
+ await worker_sleep(0.1)
163
+ keyboard.send_keys(resposta + "{ENTER}")
164
+ await worker_sleep(0.2)
165
+ # Clicar em confirmar
166
+ main_window.child_window(class_name="TButton", found_index=1).click_input()
167
+
168
+ await worker_sleep(2)
169
+
170
+ ##### Janela Gerar Registros #####
171
+ app = Application(backend="win32").connect(title="Gerar Registros")
172
+ main_window = app.window(title="Gerar Registros")
173
+ # Clicar em Sim
174
+ btn_sim = main_window.child_window(
175
+ class_name="Button", found_index=1
176
+ ).click_input()
177
+
178
+ await worker_sleep(2)
179
+
180
+ ##### Janela Informa Motivo do Inventario #####
181
+ app = Application().connect(class_name="TFrmMotvoMotivoInventario")
182
+ main_window = app.window(class_name="TFrmMotvoMotivoInventario")
183
+ main_window.wait("exists enabled visible ready", timeout=20)
184
+ slc_01 = main_window.child_window(
185
+ class_name="TDBIComboBoxValues", found_index=0
186
+ ).click_input()
187
+ await worker_sleep(0.1)
188
+ keyboard.send_keys("01" + "{ENTER}")
189
+ await worker_sleep(0.2)
190
+
191
+ # Clicar em confirmar
192
+ main_window.child_window(class_name="TBitBtn", found_index=0).click_input()
193
+
194
+ await worker_sleep(5)
195
+
196
+ ##### Conecta à janela Preview Relatorio #####
197
+ app = Application(backend="win32").connect(class_name="TFrmPreviewRelatorio")
198
+
199
+ # Espera até a janela aparecer e estar pronta
200
+ main_window = app.window(class_name="TFrmPreviewRelatorio")
201
+ main_window.wait("exists enabled visible ready", timeout=180)
202
+
203
+ # Dá o foco na janela
204
+ main_window.set_focus()
205
+
206
+ await worker_sleep(2)
207
+
208
+ main_window.close()
209
+
210
+ await worker_sleep(2)
211
+
212
+ ##### Janela Movimento Livro Fiscal #####
213
+ # Selecionar primeira linha inventario
214
+ pyautogui.click(928, 475)
215
+
216
+ await worker_sleep(2)
217
+
218
+ # Clicar em visualizar livro
219
+ caminho = r"assets\\extracao_relatorios\\btn_visu_livros.png"
220
+ # Verifica se o arquivo existe
221
+ if os.path.isfile(caminho):
222
+ print("A imagem existe:", caminho)
223
+
224
+ # Procura a imagem na tela
225
+ pos = pyautogui.locateCenterOnScreen(
226
+ caminho, confidence=0.9
227
+ ) # ajuste o confidence se necessário
228
+ if pos:
229
+ pyautogui.click(pos) # clica no centro da imagem
230
+ print("Clique realizado na imagem.")
231
+ else:
232
+ print("Imagem encontrada no disco, mas não está visível na tela.")
233
+ else:
234
+ print("A imagem NÃO existe:", caminho)
235
+
236
+ await worker_sleep(5)
237
+
238
+ ##### Janela Movimento Livro Fiscal - Livro - Inventario para Competencia #####
239
+ app = Application().connect(class_name="TFrmMovtoLivroFiscal")
240
+ main_window = app.window(class_name="TFrmMovtoLivroFiscal")
241
+ main_window.wait("exists enabled visible ready", timeout=20)
242
+ input_7 = main_window.child_window(
243
+ class_name="TDBIEditCode", found_index=0
244
+ ).click_input()
245
+ await worker_sleep(0.1)
246
+ keyboard.send_keys("7" + "{TAB}")
247
+ await worker_sleep(0.2)
248
+ # Clicar em imprimir
249
+ btn_imprimir = main_window.child_window(
250
+ class_name="TBitBtn", found_index=0
251
+ ).click_input()
252
+
253
+ await worker_sleep(2)
254
+
255
+ ##### Janela Selecion o Template Desejado #####
256
+ app = Application().connect(class_name="TFrmFRVisualizaTemplateMenuNew")
257
+ main_window = app.window(class_name="TFrmFRVisualizaTemplateMenuNew")
258
+ main_window.wait("exists enabled visible ready", timeout=20)
259
+ btn_gerar_rel = main_window.child_window(
260
+ class_name="TBitBtn", found_index=1
261
+ ).click_input()
262
+
263
+ await worker_sleep(2)
264
+
265
+ ##### Janela Parametros #####
266
+ app = Application().connect(class_name="TFrmFRParametroRelatorio")
267
+ main_window = app.window(class_name="TFrmFRParametroRelatorio")
268
+ main_window.wait("exists enabled visible ready", timeout=20)
269
+ slc_nao = main_window.child_window(
270
+ class_name="TComboBox", found_index=0
271
+ ).click_input()
272
+ await worker_sleep(0.1)
273
+ keyboard.send_keys("NAO" + "{ENTER}")
274
+ await worker_sleep(0.2)
275
+
276
+ # Clicar BOTAO OK
277
+ slc_nao = main_window.child_window(
278
+ class_name="TBitBtn", found_index=1
279
+ ).click_input()
280
+
281
+ await worker_sleep(2)
282
+
283
+ # Clicar em salvar
284
+ caminho = r"assets\\extracao_relatorios\\btn_salvar.png"
285
+ # Verifica se o arquivo existe
286
+ if os.path.isfile(caminho):
287
+ print("A imagem existe:", caminho)
288
+
289
+ # Procura a imagem na tela
290
+ pos = pyautogui.locateCenterOnScreen(
291
+ caminho, confidence=0.9
292
+ ) # ajuste o confidence se necessário
293
+ if pos:
294
+ pyautogui.click(pos) # clica no centro da imagem
295
+ print("Clique realizado na imagem.")
296
+ else:
297
+ print("Imagem encontrada no disco, mas não está visível na tela.")
298
+ else:
299
+ print("A imagem NÃO existe:", caminho)
300
+
301
+ await worker_sleep(2)
302
+
303
+ # Conecta na janela Configuração para Salvar Arquivo
304
+ app = Application().connect(class_name="TFrmRelatorioFormato", found_index=0)
305
+ main_window = app["TFrmRelatorioFormato"]
306
+ main_window.set_focus()
307
+ # Acessa o ComboBox pelo identificador conhecido
308
+ combo = main_window.ComboBox
309
+
310
+ # Garante que existe "Excel" na lista
311
+ itens = combo.texts()
312
+ print("Itens do ComboBox:", itens)
313
+
314
+ # Seleciona o Excel correto (o segundo da lista, índice 8)
315
+ combo.select(8)
316
+
317
+ await worker_sleep(2)
318
+
319
+ # Clicar em Salvar
320
+ btn_salvar = main_window.child_window(
321
+ class_name="TBitBtn", found_index=1
322
+ ).click_input()
323
+
324
+ await worker_sleep(5)
325
+
326
+ # Conecta na janela "Salvar para arquivo"
327
+ app = Application().connect(title_re="Salvar para arquivo", timeout=30)
328
+ main_window = app.window(title_re="Salvar para arquivo")
329
+
330
+ # Campo Nome (Edit) - use set_edit_text para evitar problemas de escape
331
+ campo_nome = main_window.child_window(
332
+ class_name="Edit", control_id=1148
333
+ ).wrapper_object()
334
+ caminho_arquivo = rf"C:\Users\automatehub\Downloads\saldo_estoque_fiscal_{periodo_format}_{filial}.xlsx"
335
+ campo_nome.set_focus()
336
+ campo_nome.set_edit_text(caminho_arquivo)
337
+
338
+ print("✅ Texto inserido no campo Nome")
339
+
340
+ await worker_sleep(3)
341
+
342
+ # Clicar em ok para salvar
343
+ keyboard.send_keys("{TAB}{TAB}{ENTER}", pause=0.3)
344
+
345
+ await worker_sleep(5)
346
+
347
+ caminho_img = r"assets\\extracao_realtorios\\janela_printing.png"
348
+
349
+ # Aguarda até a janela com título "Printing" (ou "Salvando...") fechar
350
+ try:
351
+ app = Application().connect(title_re="Printing") # conecta se existir
352
+ janela = app.window(title_re="Printing")
353
+
354
+ print("Aguardando a janela 'Printing' sumir...")
355
+ janela.wait_not("visible", timeout=60) # espera até 60 segundos
356
+ print("Janela 'Printing' fechada.")
357
+
358
+ except findwindows.ElementNotFoundError:
359
+ print("Janela 'Printing' não estava aberta.")
360
+
361
+ nome_com_extensao = f"saldo_estoque_fiscal_{periodo_format}_{filial}.xlsx"
362
+ # lê o arquivo
363
+ with open(f"{caminho_arquivo}", "rb") as file:
364
+ file_bytes = io.BytesIO(file.read())
365
+
366
+ console.print("Enviar Excel para o BOF")
367
+ try:
368
+ await send_file(
369
+ historico_id,
370
+ nome_com_extensao,
371
+ "xlsx",
372
+ file_bytes,
373
+ file_extension="xlsx",
374
+ )
375
+ console.print("Removendo arquivo XLS da pasta downloads")
376
+ os.remove(f"{caminho_arquivo}")
377
+ return RpaRetornoProcessoDTO(
378
+ sucesso=True,
379
+ retorno="Relatório enviado com sucesso",
380
+ status=RpaHistoricoStatusEnum.Sucesso,
381
+ )
382
+
383
+ except Exception as e:
384
+ console.print(f"Erro ao enviar o arquivo: {e}", style="bold red")
385
+ return RpaRetornoProcessoDTO(
386
+ sucesso=False,
387
+ retorno=f"Erro ao enviar o arquivo: {e}",
388
+ status=RpaHistoricoStatusEnum.Falha,
389
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
390
+ )
391
+
392
+ print("")
393
+
394
+ except Exception as ex:
395
+ retorno = f"Erro Processo Saldo Estoque Fiscal: {str(ex)}"
396
+ logger.error(retorno)
397
+ console.print(retorno, style="bold red")
398
+ return RpaRetornoProcessoDTO(
399
+ sucesso=False,
400
+ retorno=retorno,
401
+ status=RpaHistoricoStatusEnum.Falha,
402
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
403
+ )
@@ -32,6 +32,7 @@ from worker_automate_hub.tasks.jobs.entrada_de_notas_7139 import entrada_de_nota
32
32
  from worker_automate_hub.tasks.jobs.entrada_de_notas_36 import entrada_de_notas_36
33
33
  from worker_automate_hub.tasks.jobs.entrada_de_notas_503 import entrada_de_notas_503
34
34
  from worker_automate_hub.tasks.jobs.extracao_saldo_estoque import extracao_saldo_estoque
35
+ from worker_automate_hub.tasks.jobs.extracao_saldo_estoque_fiscal import extracao_saldo_estoque_fiscal
35
36
  from worker_automate_hub.tasks.jobs.fidc_remessa_cobranca_cnab240 import (
36
37
  remessa_cobranca_cnab240,
37
38
  )
@@ -199,7 +200,8 @@ task_definitions = {
199
200
  "58de6a65-68cd-4e68-ab28-31b543b6de02": transferencias, # Logistica reverse
200
201
  "ca7ac373-e8e7-4ac2-aa7e-298070e0d9a0": extracao_fechamento_contabil,
201
202
  "8c28726d-458d-4119-afa0-202695b79a8f": extracao_fechamento_emsys,
202
- "16debe45-3520-4f63-acfe-ef0e8784fcab": extracao_saldo_estoque
203
+ "16debe45-3520-4f63-acfe-ef0e8784fcab": extracao_saldo_estoque,
204
+ "9cbc6016-7c0e-4a3a-8ee9-fb9dc4b35e33": extracao_saldo_estoque_fiscal
203
205
  }
204
206
 
205
207
 
@@ -338,8 +338,10 @@ async def login_emsys_fiscal(
338
338
  category=UserWarning,
339
339
  message="32-bit application should be automated using 32-bit Python",
340
340
  )
341
-
341
+ await worker_sleep(2)
342
342
  filial_cod = task.configEntrada.get("empresa")
343
+ if filial_cod == None:
344
+ filial_cod = task.configEntrada.get("filialEmpresaOrigem")
343
345
  console.print(f"Empresa a ser processada: {filial_cod}")
344
346
 
345
347
  try:
@@ -1996,7 +1998,7 @@ async def faturar_pre_venda(task: RpaProcessoEntradaDTO) -> dict:
1996
1998
  await worker_sleep(2)
1997
1999
  console.print(f"Clicou em: 'Faturar'", style="bold green")
1998
2000
 
1999
- await worker_sleep(10)
2001
+ await worker_sleep(20)
2000
2002
 
2001
2003
  # Aviso "Deseja faturar pré-venda?"
2002
2004
  button_yes = (918, 557) # find_target_position(screenshot_path, "yes", attempts=15)