worker-automate-hub 0.5.762__tar.gz → 0.5.764__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.
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/PKG-INFO +1 -1
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/pyproject.toml +1 -1
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +104 -50
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +169 -68
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/README.md +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/ahead_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/client.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/datalake_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/helpers/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/rdp_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/rpa_fila_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/rpa_historico_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/webhook_service.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/cli.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/config/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/config/settings.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/config.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/core/so_manipulation.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/deprecation.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/rate_limit.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/repeat.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/retry.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/singleton.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/timeit.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/opex_capex.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/playground.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/task_definitions.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/task_executor.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/__init__.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/env.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/logger.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/toast.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/updater.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/util.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
- {worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/worker.py +0 -0
@@ -1,9 +1,10 @@
|
|
1
1
|
import asyncio
|
2
2
|
import os
|
3
3
|
from datetime import datetime
|
4
|
-
from pywinauto import Application, timings, findwindows
|
4
|
+
from pywinauto import Application, timings, findwindows, Desktop
|
5
5
|
import sys
|
6
6
|
import io
|
7
|
+
import win32gui
|
7
8
|
# sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
|
8
9
|
|
9
10
|
from worker_automate_hub.models.dto.rpa_historico_request_dto import (
|
@@ -114,10 +115,13 @@ async def extracao_saldo_estoque(task: RpaProcessoEntradaDTO):
|
|
114
115
|
tentativa = 1
|
115
116
|
sucesso = False
|
116
117
|
|
118
|
+
# defina caminho_arquivo ANTES para não ficar indefinido
|
119
|
+
caminho_arquivo = rf"C:\Users\automatehub\Downloads\saldo_estoque_{periodo_format}_{filial}.xlsx"
|
120
|
+
|
117
121
|
while tentativa <= max_tentativas and not sucesso:
|
118
122
|
console.print(f"Tentativa {tentativa} de {max_tentativas}", style="bold cyan")
|
119
123
|
|
120
|
-
# 1) Abrir o picker
|
124
|
+
# 1) Abrir o picker pelo botão (imagem)
|
121
125
|
console.print("Procurando botão de salvar (imagem)...", style="bold cyan")
|
122
126
|
caminho_img = r'assets\\extracao_relatorios\\btn_salvar.png'
|
123
127
|
if os.path.isfile(caminho_img):
|
@@ -132,40 +136,92 @@ async def extracao_saldo_estoque(task: RpaProcessoEntradaDTO):
|
|
132
136
|
|
133
137
|
await worker_sleep(8)
|
134
138
|
|
135
|
-
# 2) Selecionar formato
|
139
|
+
# 2) Selecionar formato Excel (desambiguando múltiplas TFrmRelatorioFormato)
|
136
140
|
console.print("Selecionando formato Excel...", style="bold cyan")
|
137
141
|
try:
|
138
|
-
|
139
|
-
|
140
|
-
|
142
|
+
desktop = Desktop(backend="win32")
|
143
|
+
|
144
|
+
# Liste todas as visíveis
|
145
|
+
wins_visiveis = desktop.windows(class_name="TFrmRelatorioFormato", visible_only=True)
|
146
|
+
if not wins_visiveis:
|
147
|
+
raise RuntimeError("Janela de formato não apareceu.")
|
148
|
+
|
149
|
+
# 2.1) Tente a janela em foco (foreground)
|
150
|
+
h_fore = win32gui.GetForegroundWindow()
|
151
|
+
alvo = None
|
152
|
+
for w in wins_visiveis:
|
153
|
+
if w.handle == h_fore:
|
154
|
+
alvo = w
|
155
|
+
break
|
156
|
+
|
157
|
+
# 2.2) Se não estiver em foco, pegue a que contém um TComboBox (a 'Configuração para Salvar arq...')
|
158
|
+
if alvo is None:
|
159
|
+
candidatos = []
|
160
|
+
for w in wins_visiveis:
|
161
|
+
try:
|
162
|
+
if w.child_window(class_name="TComboBox").exists(timeout=0.8):
|
163
|
+
candidatos.append(w)
|
164
|
+
except Exception:
|
165
|
+
pass
|
166
|
+
if candidatos:
|
167
|
+
alvo = candidatos[-1] # a mais recente
|
168
|
+
else:
|
169
|
+
alvo = wins_visiveis[-1] # fallback
|
170
|
+
|
171
|
+
# Trabalhe via WindowSpecification
|
172
|
+
spec_fmt = desktop.window(handle=alvo.handle)
|
173
|
+
spec_fmt.wait("visible", timeout=10)
|
174
|
+
win_fmt = spec_fmt.wrapper_object()
|
175
|
+
win_fmt.set_focus()
|
176
|
+
|
177
|
+
# Acessar o ComboBox
|
178
|
+
try:
|
179
|
+
combo_spec = spec_fmt.child_window(class_name="TComboBox")
|
180
|
+
except Exception:
|
181
|
+
combo_spec = spec_fmt.child_window(control_type="ComboBox")
|
182
|
+
combo_spec.wait("exists enabled", timeout=10)
|
183
|
+
combo = combo_spec.wrapper_object()
|
141
184
|
|
142
|
-
combo = win_fmt.ComboBox
|
143
185
|
textos = combo.texts()
|
144
186
|
console.print(f"Itens do ComboBox: {textos}", style="bold yellow")
|
145
187
|
|
146
|
-
#
|
188
|
+
# Seleção por índice conhecido; fallback por texto
|
147
189
|
try:
|
148
190
|
combo.select(8)
|
149
191
|
except Exception:
|
150
|
-
|
192
|
+
alvo_idx = None
|
151
193
|
for i, t in enumerate(textos):
|
152
194
|
if "EXCEL" in str(t).upper() or "XLSX" in str(t).upper():
|
153
|
-
|
195
|
+
alvo_idx = i
|
154
196
|
break
|
155
|
-
if
|
156
|
-
combo.select(alvo)
|
157
|
-
else:
|
197
|
+
if alvo_idx is None:
|
158
198
|
console.print("Não foi possível localizar a opção de Excel no ComboBox.", style="bold red")
|
159
199
|
tentativa += 1
|
160
200
|
await worker_sleep(2)
|
161
201
|
continue
|
202
|
+
combo.select(alvo_idx)
|
162
203
|
|
163
204
|
await worker_sleep(1)
|
164
205
|
|
165
|
-
#
|
166
|
-
|
167
|
-
|
168
|
-
|
206
|
+
# Clique em OK
|
207
|
+
btn_ok_spec = spec_fmt.child_window(class_name="TBitBtn", found_index=1)
|
208
|
+
btn_ok_spec.wait("enabled", timeout=5)
|
209
|
+
btn_ok_spec.click_input()
|
210
|
+
|
211
|
+
# Aguarde a janela de formato desaparecer
|
212
|
+
try:
|
213
|
+
spec_fmt.wait_not("visible", timeout=10)
|
214
|
+
except Exception:
|
215
|
+
pass
|
216
|
+
|
217
|
+
# Feche possíveis duplicatas remanescentes (defensivo)
|
218
|
+
for w in desktop.windows(class_name="TFrmRelatorioFormato", visible_only=True):
|
219
|
+
if w.handle != alvo.handle:
|
220
|
+
try:
|
221
|
+
w.close()
|
222
|
+
except Exception:
|
223
|
+
pass
|
224
|
+
|
169
225
|
except Exception as e:
|
170
226
|
console.print(f"Falha ao selecionar formato: {e}", style="bold red")
|
171
227
|
tentativa += 1
|
@@ -177,19 +233,17 @@ async def extracao_saldo_estoque(task: RpaProcessoEntradaDTO):
|
|
177
233
|
# 3) Janela "Salvar para arquivo"
|
178
234
|
console.print("Abrindo janela de salvar arquivo...", style="bold cyan")
|
179
235
|
try:
|
180
|
-
app_save = Application().connect(title_re="Salvar para arquivo", timeout=30)
|
181
|
-
|
182
|
-
|
236
|
+
app_save = Application(backend="win32").connect(title_re="Salvar para arquivo|Salvar como|Save As", timeout=30)
|
237
|
+
spec_save = app_save.window(title_re="Salvar para arquivo|Salvar como|Save As")
|
238
|
+
spec_save.wait("visible", timeout=30)
|
239
|
+
win_save = spec_save.wrapper_object()
|
183
240
|
except Exception as e:
|
184
241
|
console.print(f"Não achou a janela 'Salvar para arquivo': {e}", style="bold red")
|
185
242
|
tentativa += 1
|
186
243
|
await worker_sleep(3)
|
187
244
|
continue
|
188
245
|
|
189
|
-
#
|
190
|
-
caminho_arquivo = rf"C:\Users\automatehub\Downloads\saldo_estoque_{periodo_format}_{filial}.xlsx"
|
191
|
-
|
192
|
-
# Se já existe, removemos para evitar pop-up de confirmação
|
246
|
+
# 3.1) Remover arquivo pré-existente
|
193
247
|
if os.path.exists(caminho_arquivo):
|
194
248
|
try:
|
195
249
|
os.remove(caminho_arquivo)
|
@@ -197,27 +251,32 @@ async def extracao_saldo_estoque(task: RpaProcessoEntradaDTO):
|
|
197
251
|
except Exception as e:
|
198
252
|
console.print(f"Não foi possível remover o arquivo existente: {e}", style="bold red")
|
199
253
|
|
254
|
+
# 3.2) Preencher nome e salvar
|
200
255
|
try:
|
201
|
-
|
202
|
-
|
256
|
+
campo_spec = spec_save.child_window(class_name="Edit", control_id=1148)
|
257
|
+
campo_spec.wait("exists enabled visible", timeout=10)
|
258
|
+
campo_nome = campo_spec.wrapper_object()
|
203
259
|
campo_nome.set_focus()
|
204
|
-
# limpa conteúdo
|
205
260
|
try:
|
206
261
|
campo_nome.set_edit_text("")
|
207
262
|
except Exception:
|
208
|
-
# fallback limpando com Ctrl+A + Delete
|
209
263
|
campo_nome.type_keys("^a{DELETE}", pause=0.02)
|
210
264
|
|
211
|
-
# digita caminho
|
212
265
|
campo_nome.type_keys(caminho_arquivo, with_spaces=True, pause=0.01)
|
213
266
|
console.print(f"Arquivo configurado para: {caminho_arquivo}", style="bold green")
|
214
267
|
|
215
268
|
await worker_sleep(1)
|
216
269
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
270
|
+
btn_salvar_spec = spec_save.child_window(class_name="Button", found_index=0)
|
271
|
+
btn_salvar_spec.wait("enabled", timeout=10)
|
272
|
+
btn_salvar_spec.click_input()
|
273
|
+
|
274
|
+
# Esperar a janela sumir
|
275
|
+
try:
|
276
|
+
spec_save.wait_not("visible", timeout=15)
|
277
|
+
except Exception:
|
278
|
+
pass
|
279
|
+
|
221
280
|
except Exception as e:
|
222
281
|
console.print(f"Erro ao confirmar salvar: {e}", style="bold red")
|
223
282
|
tentativa += 1
|
@@ -226,32 +285,27 @@ async def extracao_saldo_estoque(task: RpaProcessoEntradaDTO):
|
|
226
285
|
|
227
286
|
await worker_sleep(2)
|
228
287
|
|
229
|
-
# 3.
|
288
|
+
# 3.3) Confirmar sobrescrita (se houver)
|
230
289
|
try:
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
# Tente o primeiro botão (Yes/Sim)
|
239
|
-
win_conf.child_window(class_name="Button", found_index=0).click_input()
|
240
|
-
console.print("Confirmação de sobrescrita respondida.", style="bold yellow")
|
241
|
-
except Exception:
|
242
|
-
pass
|
290
|
+
app_conf = Application(backend="win32").connect(
|
291
|
+
title_re="Confirm(ar)?( )?Salvar( )?Como|Confirm Save As", timeout=3
|
292
|
+
)
|
293
|
+
spec_conf = app_conf.window(title_re="Confirm(ar)?( )?Salvar( )?Como|Confirm Save As")
|
294
|
+
spec_conf.wait("visible", timeout=3)
|
295
|
+
spec_conf.child_window(class_name="Button", found_index=0).click_input()
|
296
|
+
console.print("Confirmação de sobrescrita respondida.", style="bold yellow")
|
243
297
|
except Exception:
|
244
298
|
pass
|
245
299
|
|
246
300
|
await worker_sleep(2)
|
247
301
|
|
248
|
-
# 4) Aguardar
|
302
|
+
# 4) Aguardar 'Printing' (se existir)
|
249
303
|
console.print("Aguardando finalização do processo de impressão/salvamento...", style="bold cyan")
|
250
304
|
try:
|
251
|
-
app_print = Application().connect(title_re="Printing", timeout=5)
|
252
|
-
|
305
|
+
app_print = Application(backend="win32").connect(title_re="Printing", timeout=5)
|
306
|
+
spec_print = app_print.window(title_re="Printing")
|
253
307
|
try:
|
254
|
-
|
308
|
+
spec_print.wait_not("visible", timeout=60)
|
255
309
|
console.print("Janela 'Printing' fechada.", style="bold green")
|
256
310
|
except Exception:
|
257
311
|
console.print("Janela 'Printing' não fechou no tempo esperado. Seguindo.", style="bold yellow")
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import asyncio
|
2
2
|
import os
|
3
3
|
from datetime import datetime
|
4
|
-
from pywinauto import Application, timings, findwindows, keyboard
|
4
|
+
from pywinauto import Application, timings, findwindows, keyboard, Desktop
|
5
5
|
import sys
|
6
6
|
import io
|
7
|
+
import win32gui
|
7
8
|
|
8
9
|
# sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
|
9
10
|
|
@@ -59,9 +60,7 @@ async def extracao_saldo_estoque_fiscal(
|
|
59
60
|
# Fecha a instancia do emsys - caso esteja aberta
|
60
61
|
await kill_all_emsys()
|
61
62
|
|
62
|
-
app = Application(backend="win32").start(
|
63
|
-
"C:\\Rezende\\EMSys3\\EMSysFiscal_39.exe"
|
64
|
-
)
|
63
|
+
app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\EMSysFiscal.exe")
|
65
64
|
warnings.filterwarnings(
|
66
65
|
"ignore",
|
67
66
|
category=UserWarning,
|
@@ -286,57 +285,129 @@ async def extracao_saldo_estoque_fiscal(
|
|
286
285
|
tentativa = 1
|
287
286
|
sucesso = False
|
288
287
|
|
288
|
+
# defina caminho_arquivo ANTES para não ficar indefinido
|
289
|
+
caminho_arquivo = rf"C:\Users\automatehub\Downloads\saldo_estoque_fiscal_{periodo_format}_{filial}.xlsx"
|
290
|
+
|
289
291
|
while tentativa <= max_tentativas and not sucesso:
|
290
|
-
console.print(
|
292
|
+
console.print(
|
293
|
+
f"Tentativa {tentativa} de {max_tentativas}", style="bold cyan"
|
294
|
+
)
|
291
295
|
|
292
|
-
# 1) Abrir o picker
|
296
|
+
# 1) Abrir o picker pelo botão (imagem)
|
293
297
|
console.print("Procurando botão de salvar (imagem)...", style="bold cyan")
|
294
|
-
caminho_img = r
|
298
|
+
caminho_img = r"assets\\extracao_relatorios\\btn_salvar.png"
|
295
299
|
if os.path.isfile(caminho_img):
|
296
300
|
pos = pyautogui.locateCenterOnScreen(caminho_img, confidence=0.9)
|
297
301
|
if pos:
|
298
302
|
pyautogui.click(pos)
|
299
|
-
console.print(
|
303
|
+
console.print(
|
304
|
+
"Clique realizado no botão salvar", style="bold green"
|
305
|
+
)
|
300
306
|
else:
|
301
|
-
console.print(
|
307
|
+
console.print(
|
308
|
+
"Imagem encontrada mas não está visível na tela",
|
309
|
+
style="bold yellow",
|
310
|
+
)
|
302
311
|
else:
|
303
312
|
console.print("Imagem do botão salvar NÃO existe", style="bold red")
|
304
313
|
|
305
314
|
await worker_sleep(8)
|
306
315
|
|
307
|
-
# 2) Selecionar formato
|
316
|
+
# 2) Selecionar formato Excel (desambiguando múltiplas TFrmRelatorioFormato)
|
308
317
|
console.print("Selecionando formato Excel...", style="bold cyan")
|
309
318
|
try:
|
310
|
-
|
311
|
-
|
312
|
-
|
319
|
+
desktop = Desktop(backend="win32")
|
320
|
+
|
321
|
+
# Liste todas as visíveis
|
322
|
+
wins_visiveis = desktop.windows(
|
323
|
+
class_name="TFrmRelatorioFormato", visible_only=True
|
324
|
+
)
|
325
|
+
if not wins_visiveis:
|
326
|
+
raise RuntimeError("Janela de formato não apareceu.")
|
327
|
+
|
328
|
+
# 2.1) Tente a janela em foco (foreground)
|
329
|
+
h_fore = win32gui.GetForegroundWindow()
|
330
|
+
alvo = None
|
331
|
+
for w in wins_visiveis:
|
332
|
+
if w.handle == h_fore:
|
333
|
+
alvo = w
|
334
|
+
break
|
335
|
+
|
336
|
+
# 2.2) Se não estiver em foco, pegue a que contém um TComboBox (a 'Configuração para Salvar arq...')
|
337
|
+
if alvo is None:
|
338
|
+
candidatos = []
|
339
|
+
for w in wins_visiveis:
|
340
|
+
try:
|
341
|
+
if w.child_window(class_name="TComboBox").exists(
|
342
|
+
timeout=0.8
|
343
|
+
):
|
344
|
+
candidatos.append(w)
|
345
|
+
except Exception:
|
346
|
+
pass
|
347
|
+
if candidatos:
|
348
|
+
alvo = candidatos[-1] # a mais recente
|
349
|
+
else:
|
350
|
+
alvo = wins_visiveis[-1] # fallback
|
351
|
+
|
352
|
+
# Trabalhe via WindowSpecification
|
353
|
+
spec_fmt = desktop.window(handle=alvo.handle)
|
354
|
+
spec_fmt.wait("visible", timeout=10)
|
355
|
+
win_fmt = spec_fmt.wrapper_object()
|
356
|
+
win_fmt.set_focus()
|
357
|
+
|
358
|
+
# Acessar o ComboBox
|
359
|
+
try:
|
360
|
+
combo_spec = spec_fmt.child_window(class_name="TComboBox")
|
361
|
+
except Exception:
|
362
|
+
combo_spec = spec_fmt.child_window(control_type="ComboBox")
|
363
|
+
combo_spec.wait("exists enabled", timeout=10)
|
364
|
+
combo = combo_spec.wrapper_object()
|
313
365
|
|
314
|
-
combo = win_fmt.ComboBox
|
315
366
|
textos = combo.texts()
|
316
367
|
console.print(f"Itens do ComboBox: {textos}", style="bold yellow")
|
317
368
|
|
318
|
-
#
|
369
|
+
# Seleção por índice conhecido; fallback por texto
|
319
370
|
try:
|
320
371
|
combo.select(8)
|
321
372
|
except Exception:
|
322
|
-
|
373
|
+
alvo_idx = None
|
323
374
|
for i, t in enumerate(textos):
|
324
375
|
if "EXCEL" in str(t).upper() or "XLSX" in str(t).upper():
|
325
|
-
|
376
|
+
alvo_idx = i
|
326
377
|
break
|
327
|
-
if
|
328
|
-
|
329
|
-
|
330
|
-
|
378
|
+
if alvo_idx is None:
|
379
|
+
console.print(
|
380
|
+
"Não foi possível localizar a opção de Excel no ComboBox.",
|
381
|
+
style="bold red",
|
382
|
+
)
|
331
383
|
tentativa += 1
|
332
384
|
await worker_sleep(2)
|
333
385
|
continue
|
386
|
+
combo.select(alvo_idx)
|
334
387
|
|
335
388
|
await worker_sleep(1)
|
336
389
|
|
337
|
-
#
|
338
|
-
|
339
|
-
|
390
|
+
# Clique em OK
|
391
|
+
btn_ok_spec = spec_fmt.child_window(class_name="TBitBtn", found_index=1)
|
392
|
+
btn_ok_spec.wait("enabled", timeout=5)
|
393
|
+
btn_ok_spec.click_input()
|
394
|
+
|
395
|
+
# Aguarde a janela de formato desaparecer
|
396
|
+
try:
|
397
|
+
spec_fmt.wait_not("visible", timeout=10)
|
398
|
+
except Exception:
|
399
|
+
pass
|
400
|
+
|
401
|
+
# Feche possíveis duplicatas remanescentes (defensivo)
|
402
|
+
for w in desktop.windows(
|
403
|
+
class_name="TFrmRelatorioFormato", visible_only=True
|
404
|
+
):
|
405
|
+
if w.handle != alvo.handle:
|
406
|
+
try:
|
407
|
+
w.close()
|
408
|
+
except Exception:
|
409
|
+
pass
|
410
|
+
|
340
411
|
except Exception as e:
|
341
412
|
console.print(f"Falha ao selecionar formato: {e}", style="bold red")
|
342
413
|
tentativa += 1
|
@@ -348,47 +419,66 @@ async def extracao_saldo_estoque_fiscal(
|
|
348
419
|
# 3) Janela "Salvar para arquivo"
|
349
420
|
console.print("Abrindo janela de salvar arquivo...", style="bold cyan")
|
350
421
|
try:
|
351
|
-
app_save = Application().connect(
|
352
|
-
|
353
|
-
|
422
|
+
app_save = Application(backend="win32").connect(
|
423
|
+
title_re="Salvar para arquivo|Salvar como|Save As", timeout=30
|
424
|
+
)
|
425
|
+
spec_save = app_save.window(
|
426
|
+
title_re="Salvar para arquivo|Salvar como|Save As"
|
427
|
+
)
|
428
|
+
spec_save.wait("visible", timeout=30)
|
429
|
+
win_save = spec_save.wrapper_object()
|
354
430
|
except Exception as e:
|
355
|
-
console.print(
|
431
|
+
console.print(
|
432
|
+
f"Não achou a janela 'Salvar para arquivo': {e}", style="bold red"
|
433
|
+
)
|
356
434
|
tentativa += 1
|
357
435
|
await worker_sleep(3)
|
358
436
|
continue
|
359
437
|
|
360
|
-
#
|
361
|
-
caminho_arquivo = rf"C:\Users\automatehub\Downloads\saldo_estoque_fiscal_{periodo_format}_{filial}.xlsx"
|
362
|
-
|
363
|
-
# Se já existe, removemos para evitar pop-up de confirmação
|
438
|
+
# 3.1) Remover arquivo pré-existente
|
364
439
|
if os.path.exists(caminho_arquivo):
|
365
440
|
try:
|
366
441
|
os.remove(caminho_arquivo)
|
367
|
-
console.print(
|
442
|
+
console.print(
|
443
|
+
"Arquivo existente removido para evitar prompt de sobrescrita.",
|
444
|
+
style="bold yellow",
|
445
|
+
)
|
368
446
|
except Exception as e:
|
369
|
-
console.print(
|
447
|
+
console.print(
|
448
|
+
f"Não foi possível remover o arquivo existente: {e}",
|
449
|
+
style="bold red",
|
450
|
+
)
|
370
451
|
|
452
|
+
# 3.2) Preencher nome e salvar
|
371
453
|
try:
|
372
|
-
|
373
|
-
|
454
|
+
campo_spec = spec_save.child_window(class_name="Edit", control_id=1148)
|
455
|
+
campo_spec.wait("exists enabled visible", timeout=10)
|
456
|
+
campo_nome = campo_spec.wrapper_object()
|
374
457
|
campo_nome.set_focus()
|
375
|
-
# limpa conteúdo
|
376
458
|
try:
|
377
459
|
campo_nome.set_edit_text("")
|
378
460
|
except Exception:
|
379
|
-
# fallback limpando com Ctrl+A + Delete
|
380
461
|
campo_nome.type_keys("^a{DELETE}", pause=0.02)
|
381
462
|
|
382
|
-
# digita caminho
|
383
463
|
campo_nome.type_keys(caminho_arquivo, with_spaces=True, pause=0.01)
|
384
|
-
console.print(
|
464
|
+
console.print(
|
465
|
+
f"Arquivo configurado para: {caminho_arquivo}", style="bold green"
|
466
|
+
)
|
385
467
|
|
386
468
|
await worker_sleep(1)
|
387
469
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
470
|
+
btn_salvar_spec = spec_save.child_window(
|
471
|
+
class_name="Button", found_index=0
|
472
|
+
)
|
473
|
+
btn_salvar_spec.wait("enabled", timeout=10)
|
474
|
+
btn_salvar_spec.click_input()
|
475
|
+
|
476
|
+
# Esperar a janela sumir
|
477
|
+
try:
|
478
|
+
spec_save.wait_not("visible", timeout=15)
|
479
|
+
except Exception:
|
480
|
+
pass
|
481
|
+
|
392
482
|
except Exception as e:
|
393
483
|
console.print(f"Erro ao confirmar salvar: {e}", style="bold red")
|
394
484
|
tentativa += 1
|
@@ -397,35 +487,42 @@ async def extracao_saldo_estoque_fiscal(
|
|
397
487
|
|
398
488
|
await worker_sleep(2)
|
399
489
|
|
400
|
-
# 3.
|
490
|
+
# 3.3) Confirmar sobrescrita (se houver)
|
401
491
|
try:
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
pass
|
492
|
+
app_conf = Application(backend="win32").connect(
|
493
|
+
title_re="Confirm(ar)?( )?Salvar( )?Como|Confirm Save As", timeout=3
|
494
|
+
)
|
495
|
+
spec_conf = app_conf.window(
|
496
|
+
title_re="Confirm(ar)?( )?Salvar( )?Como|Confirm Save As"
|
497
|
+
)
|
498
|
+
spec_conf.wait("visible", timeout=3)
|
499
|
+
spec_conf.child_window(class_name="Button", found_index=0).click_input()
|
500
|
+
console.print(
|
501
|
+
"Confirmação de sobrescrita respondida.", style="bold yellow"
|
502
|
+
)
|
414
503
|
except Exception:
|
415
504
|
pass
|
416
505
|
|
417
506
|
await worker_sleep(2)
|
418
507
|
|
419
|
-
# 4) Aguardar
|
420
|
-
console.print(
|
508
|
+
# 4) Aguardar 'Printing' (se existir)
|
509
|
+
console.print(
|
510
|
+
"Aguardando finalização do processo de impressão/salvamento...",
|
511
|
+
style="bold cyan",
|
512
|
+
)
|
421
513
|
try:
|
422
|
-
app_print = Application().connect(
|
423
|
-
|
514
|
+
app_print = Application(backend="win32").connect(
|
515
|
+
title_re="Printing", timeout=5
|
516
|
+
)
|
517
|
+
spec_print = app_print.window(title_re="Printing")
|
424
518
|
try:
|
425
|
-
|
519
|
+
spec_print.wait_not("visible", timeout=60)
|
426
520
|
console.print("Janela 'Printing' fechada.", style="bold green")
|
427
521
|
except Exception:
|
428
|
-
console.print(
|
522
|
+
console.print(
|
523
|
+
"Janela 'Printing' não fechou no tempo esperado. Seguindo.",
|
524
|
+
style="bold yellow",
|
525
|
+
)
|
429
526
|
except findwindows.ElementNotFoundError:
|
430
527
|
console.print("Janela 'Printing' não apareceu.", style="bold yellow")
|
431
528
|
except Exception as e:
|
@@ -433,18 +530,23 @@ async def extracao_saldo_estoque_fiscal(
|
|
433
530
|
|
434
531
|
# 5) Validar arquivo salvo
|
435
532
|
if os.path.exists(caminho_arquivo):
|
436
|
-
console.print(
|
533
|
+
console.print(
|
534
|
+
f"Arquivo encontrado: {caminho_arquivo}", style="bold green"
|
535
|
+
)
|
437
536
|
with open(caminho_arquivo, "rb") as f:
|
438
537
|
file_bytes = io.BytesIO(f.read())
|
439
538
|
sucesso = True
|
440
539
|
else:
|
441
|
-
console.print(
|
540
|
+
console.print(
|
541
|
+
"Arquivo não encontrado, tentando novamente...", style="bold red"
|
542
|
+
)
|
442
543
|
tentativa += 1
|
443
544
|
await worker_sleep(3)
|
444
545
|
|
445
546
|
if not sucesso:
|
446
|
-
console.print(
|
447
|
-
|
547
|
+
console.print(
|
548
|
+
"Falha após 5 tentativas. Arquivo não foi gerado.", style="bold red"
|
549
|
+
)
|
448
550
|
|
449
551
|
nome_com_extensao = f"saldo_estoque_fiscal_{periodo_format}_{filial}.xlsx"
|
450
552
|
# lê o arquivo
|
@@ -488,4 +590,3 @@ async def extracao_saldo_estoque_fiscal(
|
|
488
590
|
status=RpaHistoricoStatusEnum.Falha,
|
489
591
|
tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
|
490
592
|
)
|
491
|
-
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/__init__.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/ahead_service.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/api/rdp_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/config/__init__.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/config/settings.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/repeat.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/retry.py
RENAMED
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/decorators/timeit.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/models/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/tasks/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/__init__.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/env.py
RENAMED
File without changes
|
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/logger.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/toast.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/updater.py
RENAMED
File without changes
|
{worker_automate_hub-0.5.762 → worker_automate_hub-0.5.764}/worker_automate_hub/utils/util.py
RENAMED
File without changes
|
File without changes
|
File without changes
|