worker-automate-hub 0.5.673__py3-none-any.whl → 0.5.675__py3-none-any.whl
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.
Potentially problematic release.
This version of worker-automate-hub might be problematic. Click here for more details.
- worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +375 -167
- worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +74 -128
- {worker_automate_hub-0.5.673.dist-info → worker_automate_hub-0.5.675.dist-info}/METADATA +1 -1
- {worker_automate_hub-0.5.673.dist-info → worker_automate_hub-0.5.675.dist-info}/RECORD +6 -6
- {worker_automate_hub-0.5.673.dist-info → worker_automate_hub-0.5.675.dist-info}/WHEEL +0 -0
- {worker_automate_hub-0.5.673.dist-info → worker_automate_hub-0.5.675.dist-info}/entry_points.txt +0 -0
|
@@ -5,8 +5,9 @@ import sys
|
|
|
5
5
|
import os
|
|
6
6
|
import sys
|
|
7
7
|
import os
|
|
8
|
+
from pywinauto.findwindows import ElementNotFoundError
|
|
8
9
|
from pywinauto.keyboard import send_keys
|
|
9
|
-
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
|
|
10
|
+
# sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
from worker_automate_hub.utils.logger import logger
|
|
@@ -121,31 +122,17 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
121
122
|
pass
|
|
122
123
|
|
|
123
124
|
##### Janela Principal ####
|
|
124
|
-
console.print("Navegando para Livros Fiscais")
|
|
125
125
|
app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
|
|
126
126
|
main_window = app["TFrmPrincipalFiscal"]
|
|
127
127
|
main_window.set_focus()
|
|
128
|
-
input_livros = main_window.child_window(class_name="TEdit", found_index=0)
|
|
129
|
-
type_text_into_field(
|
|
130
|
-
"Livros Fiscais", input_livros, True, "50"
|
|
131
|
-
)
|
|
132
|
-
await worker_sleep(5)
|
|
133
128
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
console.print("Navegando nos elementos...\n")
|
|
142
|
-
main_window.child_window(class_name="TButton", found_index=0).click()
|
|
143
|
-
await worker_sleep(2)
|
|
144
|
-
except:
|
|
145
|
-
pass
|
|
146
|
-
|
|
147
|
-
# Clicar no input inicial
|
|
148
|
-
input_livros = main_window.child_window(class_name="TEdit", found_index=0).click_input()
|
|
129
|
+
# Localiza o campo TEdit
|
|
130
|
+
input_livros = main_window.child_window(class_name="TEdit", found_index=0)
|
|
131
|
+
input_livros.click_input()
|
|
132
|
+
await worker_sleep(1)
|
|
133
|
+
input_livros.set_edit_text("") # Limpa o campo
|
|
134
|
+
input_livros.type_keys("Livros Fiscais", with_spaces=True)
|
|
135
|
+
await worker_sleep(1)
|
|
149
136
|
pyautogui.press("enter")
|
|
150
137
|
await worker_sleep(2)
|
|
151
138
|
pyautogui.press("down")
|
|
@@ -155,68 +142,89 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
155
142
|
"\nPesquisa: 'Livros Fiscais' realizada com sucesso.",
|
|
156
143
|
style="bold green",
|
|
157
144
|
)
|
|
158
|
-
|
|
159
|
-
await worker_sleep(10)
|
|
160
|
-
|
|
161
|
-
try:
|
|
162
|
-
##### Janela Confirm #####
|
|
163
|
-
app = Application().connect(class_name="TMessageForm", timeout=5)
|
|
164
|
-
main_window = app["TMessageForm"]
|
|
165
|
-
main_window.set_focus()
|
|
166
|
-
|
|
167
|
-
# Clicar em Não
|
|
168
|
-
console.print("Navegando nos elementos...\n")
|
|
169
|
-
main_window.child_window(class_name="TButton", found_index=0).click()
|
|
170
|
-
await worker_sleep(2)
|
|
171
|
-
except:
|
|
172
|
-
pass
|
|
173
|
-
|
|
174
|
-
await worker_sleep(2)
|
|
175
145
|
|
|
176
|
-
##### Janela Principal ####
|
|
177
|
-
app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
|
|
178
|
-
main_window = app["TFrmPrincipalFiscal"]
|
|
179
|
-
main_window.set_focus()
|
|
180
|
-
|
|
181
|
-
# Clicar no input inicial
|
|
182
|
-
input_livros = main_window.child_window(class_name="TEdit", found_index=0).click_input()
|
|
183
|
-
pyautogui.press("enter")
|
|
184
|
-
await worker_sleep(2)
|
|
185
|
-
pyautogui.press("down")
|
|
186
146
|
await worker_sleep(2)
|
|
187
|
-
pyautogui.press("enter")
|
|
188
|
-
console.print(
|
|
189
|
-
"\nPesquisa: 'Livros Fiscais' realizada com sucesso.",
|
|
190
|
-
style="bold green",
|
|
191
|
-
)
|
|
192
147
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
148
|
+
console.print("Aguardando janela 'Movimento de Livro Fiscal' aparecer...")
|
|
149
|
+
|
|
150
|
+
# Tempo limite de espera (em segundos)
|
|
151
|
+
timeout = 60
|
|
152
|
+
inicio = time.time()
|
|
153
|
+
|
|
154
|
+
# Espera até a janela aparecer
|
|
155
|
+
while True:
|
|
156
|
+
try:
|
|
157
|
+
app = Application().connect(class_name="TFrmMovtoLivroFiscal", timeout=5)
|
|
158
|
+
break # Se conectar, sai do loop
|
|
159
|
+
except ElementNotFoundError:
|
|
160
|
+
if time() - inicio > timeout:
|
|
161
|
+
console.print("[bold red]Erro: Janela 'TFrmMovtoLivroFiscal' não apareceu dentro do tempo limite.[/bold red]")
|
|
162
|
+
raise
|
|
163
|
+
await worker_sleep(2)
|
|
164
|
+
|
|
165
|
+
console.print("Janela encontrada. Inserindo competência...")
|
|
166
|
+
|
|
167
|
+
# Acessa a janela e insere a competência
|
|
197
168
|
main_window = app["TFrmMovtoLivroFiscal"]
|
|
198
169
|
main_window.set_focus()
|
|
170
|
+
|
|
199
171
|
data_input = main_window.child_window(class_name="TDBIEditDate", found_index=0)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
)
|
|
172
|
+
data_input.click_input()
|
|
173
|
+
await worker_sleep(1)
|
|
174
|
+
data_input.set_edit_text("")
|
|
204
175
|
|
|
205
|
-
#
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
competencia
|
|
209
|
-
|
|
210
|
-
await worker_sleep(
|
|
176
|
+
competencia = task.configEntrada.get("periodo") # Ex: "07/2025"
|
|
177
|
+
data_input.type_keys(competencia, with_spaces=True)
|
|
178
|
+
|
|
179
|
+
console.print(f"Competência '{competencia}' inserida com sucesso.")
|
|
180
|
+
|
|
181
|
+
await worker_sleep(2)
|
|
211
182
|
|
|
212
183
|
# Marcando caixa Entrada
|
|
213
184
|
console.print("Marcando caixa entrada")
|
|
214
185
|
entrada = main_window.child_window(class_name="TcxCheckBox", found_index=9).click_input()
|
|
215
186
|
|
|
187
|
+
await worker_sleep(2)
|
|
188
|
+
|
|
216
189
|
# Marcando caixa Saida
|
|
217
190
|
console.print("Marcando caixa saida")
|
|
218
|
-
|
|
219
|
-
|
|
191
|
+
saida_checkbox = main_window.child_window(class_name="TcxCheckBox", found_index=8)
|
|
192
|
+
|
|
193
|
+
# Tenta clicar inicialmente
|
|
194
|
+
saida_checkbox.click_input()
|
|
195
|
+
|
|
196
|
+
console.print("Aguardar marcar caixa de saida")
|
|
197
|
+
imagem = "assets\\abertura_livros\\saida_marcada.png"
|
|
198
|
+
|
|
199
|
+
tempo_limite = 600 # 10 minutos
|
|
200
|
+
intervalo = 2 # segundos entre verificações
|
|
201
|
+
|
|
202
|
+
inicio = time.time()
|
|
203
|
+
|
|
204
|
+
while True:
|
|
205
|
+
try:
|
|
206
|
+
localizacao = pyautogui.locateOnScreen(imagem, confidence=0.9)
|
|
207
|
+
except Exception as e:
|
|
208
|
+
print(f"Erro ao localizar imagem: {e}")
|
|
209
|
+
localizacao = None
|
|
210
|
+
|
|
211
|
+
if localizacao:
|
|
212
|
+
print("Imagem encontrada.")
|
|
213
|
+
break
|
|
214
|
+
|
|
215
|
+
if time.time() - inicio > tempo_limite:
|
|
216
|
+
print("Tempo esgotado. A imagem não apareceu.")
|
|
217
|
+
break
|
|
218
|
+
|
|
219
|
+
print("Imagem não apareceu na tela. Tentando clicar novamente na caixa de saída...")
|
|
220
|
+
try:
|
|
221
|
+
saida_checkbox.click_input()
|
|
222
|
+
except Exception as e:
|
|
223
|
+
print(f"Erro ao clicar na checkbox: {e}")
|
|
224
|
+
|
|
225
|
+
time.sleep(intervalo)
|
|
226
|
+
|
|
227
|
+
|
|
220
228
|
await worker_sleep(2)
|
|
221
229
|
|
|
222
230
|
# Clicando em incluir livro
|
|
@@ -238,41 +246,56 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
238
246
|
app = Application().connect(class_name="TPerguntasLivrosFiscaisForm", timeout=20)
|
|
239
247
|
main_window = app["TPerguntasLivrosFiscaisForm"]
|
|
240
248
|
main_window.set_focus()
|
|
241
|
-
console.print("Clicando sim em janela somar os valores de IPI Frete")
|
|
242
|
-
main_window.child_window(class_name="TDBIComboBoxValues", found_index=0).click_input()
|
|
243
249
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
250
|
+
try:
|
|
251
|
+
console.print("Clicando sim em janela somar os valores de IPI Frete")
|
|
252
|
+
main_window.child_window(class_name="TDBIComboBoxValues", found_index=0).click_input()
|
|
253
|
+
|
|
254
|
+
await worker_sleep(1)
|
|
255
|
+
send_keys("{ENTER}")
|
|
256
|
+
await worker_sleep(2)
|
|
257
|
+
except:
|
|
258
|
+
pass
|
|
248
259
|
console.print("Clicando sim em janela gerar Numero de Serie do SAT")
|
|
249
|
-
main_window.child_window(class_name="TDBIComboBoxValues", found_index=4).click_input()
|
|
250
|
-
|
|
251
|
-
await worker_sleep(1)
|
|
252
|
-
send_keys("Sim{ENTER}")
|
|
253
|
-
await worker_sleep(2)
|
|
254
|
-
|
|
255
|
-
console.print("Clicando sim em janela gerar Numero de Serie a partir da chave do documento")
|
|
256
|
-
main_window.child_window(class_name="TDBIComboBoxValues", found_index=1).click_input()
|
|
257
260
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
await worker_sleep(2)
|
|
261
|
-
|
|
262
|
-
console.print("Clicando sim em janela gerar livro com observação da nota fiscal")
|
|
263
|
-
main_window.child_window(class_name="TDBIComboBoxValues", found_index=3).click_input()
|
|
264
|
-
|
|
265
|
-
await worker_sleep(1)
|
|
266
|
-
send_keys("Sim{ENTER}")
|
|
267
|
-
await worker_sleep(2)
|
|
268
|
-
|
|
269
|
-
console.print("Clicando sim em janela somar valores de ICMS...")
|
|
270
|
-
main_window.child_window(class_name="TDBIComboBoxValues", found_index=2).click_input()
|
|
261
|
+
try:
|
|
262
|
+
main_window.child_window(class_name="TDBIComboBoxValues", found_index=4).click_input()
|
|
271
263
|
|
|
272
|
-
|
|
273
|
-
|
|
264
|
+
await worker_sleep(1)
|
|
265
|
+
send_keys("{ENTER}")
|
|
266
|
+
await worker_sleep(2)
|
|
267
|
+
except:
|
|
268
|
+
pass
|
|
274
269
|
|
|
275
|
-
|
|
270
|
+
try:
|
|
271
|
+
console.print("Clicando sim em janela gerar Numero de Serie a partir da chave do documento")
|
|
272
|
+
main_window.child_window(class_name="TDBIComboBoxValues", found_index=1).click_input()
|
|
273
|
+
|
|
274
|
+
await worker_sleep(1)
|
|
275
|
+
send_keys("{ENTER}")
|
|
276
|
+
await worker_sleep(2)
|
|
277
|
+
except:
|
|
278
|
+
pass
|
|
279
|
+
|
|
280
|
+
try:
|
|
281
|
+
console.print("Clicando sim em janela gerar livro com observação da nota fiscal")
|
|
282
|
+
main_window.child_window(class_name="TDBIComboBoxValues", found_index=3).click_input()
|
|
283
|
+
|
|
284
|
+
await worker_sleep(1)
|
|
285
|
+
send_keys("{ENTER}")
|
|
286
|
+
await worker_sleep(2)
|
|
287
|
+
except:
|
|
288
|
+
pass
|
|
289
|
+
|
|
290
|
+
try:
|
|
291
|
+
console.print("Clicando sim em janela somar valores de ICMS...")
|
|
292
|
+
main_window.child_window(class_name="TDBIComboBoxValues", found_index=2).click_input()
|
|
293
|
+
|
|
294
|
+
await worker_sleep(1)
|
|
295
|
+
send_keys("{ENTER}")
|
|
296
|
+
except:
|
|
297
|
+
pass
|
|
298
|
+
await worker_sleep(3)
|
|
276
299
|
|
|
277
300
|
# Clicar em confirmar
|
|
278
301
|
main_window.child_window(class_name="TButton", found_index=1).click_input()
|
|
@@ -287,16 +310,96 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
287
310
|
# Clicar em Sim
|
|
288
311
|
main_window.child_window(class_name="Button", found_index=0).click_input()
|
|
289
312
|
|
|
290
|
-
# try:
|
|
291
|
-
# # Esperando janela aguarde
|
|
292
|
-
# console.print("Aguardando tela de aguarde ser finalizada")
|
|
293
|
-
# await wait_aguarde_window_closed(app)
|
|
294
|
-
# await worker_sleep(5)
|
|
295
|
-
# except:
|
|
296
|
-
# pass
|
|
297
|
-
|
|
298
313
|
await worker_sleep(5)
|
|
299
314
|
|
|
315
|
+
console.print("Aguardar o término de carregar")
|
|
316
|
+
imagem = "assets\\abertura_livros\\livros_incluidos.png"
|
|
317
|
+
|
|
318
|
+
tempo_limite = 1200 # 20 minutos
|
|
319
|
+
intervalo = 2 # segundos entre as verificações
|
|
320
|
+
|
|
321
|
+
inicio = time.time()
|
|
322
|
+
|
|
323
|
+
while True:
|
|
324
|
+
janela_aberta = False
|
|
325
|
+
|
|
326
|
+
# 1. Verifica se a imagem apareceu e clica em 'Sim' na janela "Informação"
|
|
327
|
+
try:
|
|
328
|
+
if pyautogui.locateOnScreen(imagem, confidence=0.9):
|
|
329
|
+
print("Imagem 'livros_incluidos' apareceu na tela.")
|
|
330
|
+
try:
|
|
331
|
+
app_info = Application().connect(title="Informação", timeout=5)
|
|
332
|
+
info_window = app_info["Informação"]
|
|
333
|
+
info_window.set_focus()
|
|
334
|
+
console.print("Clicando em 'Sim' na janela Informação...")
|
|
335
|
+
info_window.child_window(class_name="Button", found_index=0).click_input()
|
|
336
|
+
except Exception as e:
|
|
337
|
+
print(f"Erro ao clicar em 'Sim' na janela Informação: {e}")
|
|
338
|
+
except Exception as e:
|
|
339
|
+
print(f"[Erro ao procurar imagem]: {e}")
|
|
340
|
+
|
|
341
|
+
# Verifica se a janela TMsgBox de aviso está aberta
|
|
342
|
+
try:
|
|
343
|
+
app_msgbox = Application().connect(class_name="TMsgBox", timeout=10)
|
|
344
|
+
box = app_msgbox["TMsgBox"]
|
|
345
|
+
print("Janela 'TMsgBox' encontrada.")
|
|
346
|
+
box.set_focus()
|
|
347
|
+
box.child_window(class_name="TBitBtn", found_index=0).click_input()
|
|
348
|
+
print("Clicou no botão 'TBitBtn'.")
|
|
349
|
+
except ElementNotFoundError:
|
|
350
|
+
pass
|
|
351
|
+
except Exception as e:
|
|
352
|
+
print(f"[Erro ao procurar/clicar na TMessageForm]: {e}")
|
|
353
|
+
|
|
354
|
+
# 2. Verifica e trata janela de confirmação TMessageForm
|
|
355
|
+
try:
|
|
356
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=2)
|
|
357
|
+
form = app_msg["TMessageForm"]
|
|
358
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
359
|
+
form.set_focus()
|
|
360
|
+
form.child_window(class_name="TButton", found_index=0).click_input()
|
|
361
|
+
print("Clicou no botão de confirmação.")
|
|
362
|
+
except ElementNotFoundError:
|
|
363
|
+
pass
|
|
364
|
+
except Exception as e:
|
|
365
|
+
print(f"[Erro ao procurar/clicar na TMessageForm]: {e}")
|
|
366
|
+
|
|
367
|
+
# 3. Verifica se a janela do relatório está aberta
|
|
368
|
+
try:
|
|
369
|
+
app_report = Application().connect(class_name="TFrmPreviewRelatorio", timeout=2)
|
|
370
|
+
janela = app_report["TFrmPreviewRelatorio"]
|
|
371
|
+
print("Janela 'TFrmPreviewRelatorio' encontrada.")
|
|
372
|
+
janela_aberta = True
|
|
373
|
+
except ElementNotFoundError:
|
|
374
|
+
pass
|
|
375
|
+
except Exception as e:
|
|
376
|
+
print(f"[Erro ao procurar TFrmPreviewRelatorio]: {e}")
|
|
377
|
+
|
|
378
|
+
# Se encontrou a janela de relatório, sai
|
|
379
|
+
if janela_aberta:
|
|
380
|
+
print("Relatório carregado. Saindo do loop.")
|
|
381
|
+
break
|
|
382
|
+
|
|
383
|
+
# Verifica tempo limite
|
|
384
|
+
if time.time() - inicio > tempo_limite:
|
|
385
|
+
print("Tempo esgotado. Relatório não carregado.")
|
|
386
|
+
break
|
|
387
|
+
|
|
388
|
+
print("Aguardando janela de relatório... (verificando novas confirmações se houver)")
|
|
389
|
+
time.sleep(intervalo)
|
|
390
|
+
|
|
391
|
+
await worker_sleep(5)
|
|
392
|
+
|
|
393
|
+
try:
|
|
394
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=5)
|
|
395
|
+
form = app_msg["TMessageForm"]
|
|
396
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
397
|
+
form.set_focus()
|
|
398
|
+
form.child_window(class_name="TButton", found_index=0).click_input()
|
|
399
|
+
print("Clicou no botão de confirmação.")
|
|
400
|
+
except:
|
|
401
|
+
pass
|
|
402
|
+
|
|
300
403
|
##### Janela Pré-visualizando Relatório #####
|
|
301
404
|
console.print("Fechar Janela Pré-visualizando Relatório ")
|
|
302
405
|
app = Application().connect(class_name="TFrmPreviewRelatorio", timeout=60)
|
|
@@ -306,32 +409,40 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
306
409
|
# Clicar em fechar
|
|
307
410
|
main_window.close()
|
|
308
411
|
|
|
309
|
-
await worker_sleep(
|
|
412
|
+
await worker_sleep(5)
|
|
310
413
|
|
|
311
|
-
|
|
312
|
-
console.print("Navegando para Livro de Apuração ICMS... ")
|
|
414
|
+
# Conecta na janela principal
|
|
313
415
|
app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
|
|
314
|
-
|
|
315
|
-
input_principal.set_focus()
|
|
316
|
-
input_livros = input_principal.child_window(class_name="TEdit", found_index=0)
|
|
317
|
-
type_text_into_field(
|
|
318
|
-
"Livro de Apuração ICMS", input_livros, True, "50"
|
|
319
|
-
)
|
|
320
|
-
await worker_sleep(5)
|
|
416
|
+
main_window = app["TFrmPrincipalFiscal"]
|
|
321
417
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
pass
|
|
330
|
-
console.print("Selecionar Livro de Apuração")
|
|
331
|
-
input_livros = input_principal.child_window(class_name="TEdit", found_index=0).click_input()
|
|
332
|
-
pyautogui.press("enter")
|
|
418
|
+
# Captura todos os controles do tipo Edit (inclui TEdit do Delphi)
|
|
419
|
+
edits = main_window.descendants(class_name="TEdit")
|
|
420
|
+
|
|
421
|
+
print(f"Foram encontrados {len(edits)} campos TEdit.")
|
|
422
|
+
|
|
423
|
+
campo = edits[0] # ou outro índice correto
|
|
424
|
+
campo.click_input()
|
|
333
425
|
await worker_sleep(1)
|
|
334
|
-
|
|
426
|
+
|
|
427
|
+
# Tenta limpar o campo e verifica se realmente foi limpo
|
|
428
|
+
max_tentativas = 3
|
|
429
|
+
for tentativa in range(max_tentativas):
|
|
430
|
+
campo.set_edit_text("")
|
|
431
|
+
await worker_sleep(0.5)
|
|
432
|
+
|
|
433
|
+
texto_atual = campo.window_text().strip()
|
|
434
|
+
if texto_atual == "":
|
|
435
|
+
break # Campo foi limpo com sucesso
|
|
436
|
+
print(f"Tentativa {tentativa+1}: campo ainda contém texto: '{texto_atual}'")
|
|
437
|
+
|
|
438
|
+
# Continua se o campo estiver limpo
|
|
439
|
+
campo.type_keys("Livro de Apuração ICMS", with_spaces=True)
|
|
440
|
+
await worker_sleep(1)
|
|
441
|
+
|
|
442
|
+
send_keys("{ENTER}")
|
|
443
|
+
await worker_sleep(2)
|
|
444
|
+
send_keys("{ENTER}")
|
|
445
|
+
|
|
335
446
|
|
|
336
447
|
await worker_sleep(5)
|
|
337
448
|
|
|
@@ -352,12 +463,13 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
352
463
|
|
|
353
464
|
main_window.close()
|
|
354
465
|
|
|
355
|
-
await worker_sleep(
|
|
466
|
+
await worker_sleep(5)
|
|
356
467
|
|
|
357
468
|
console.print("Selecionar Livro Saída aberto")
|
|
358
469
|
|
|
359
470
|
# Selecionar linha livro de saída aberto
|
|
360
|
-
imagem =
|
|
471
|
+
# imagem = "assets\\abertura_livros\\livro_saida_aberto.png"
|
|
472
|
+
imagem = "assets\\abertura_livros\\livro_saida_aberto.png"
|
|
361
473
|
|
|
362
474
|
# Tenta localizar a imagem na tela
|
|
363
475
|
localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9)
|
|
@@ -370,8 +482,8 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
370
482
|
console.print("Imagem livro de saída aberto não encontrado na tela.")
|
|
371
483
|
|
|
372
484
|
# Clicar em alterar livro
|
|
373
|
-
imagem =
|
|
374
|
-
|
|
485
|
+
# imagem = "assets\\abertura_livros\\alterar_livro.png"
|
|
486
|
+
imagem = "assets\\abertura_livros\\alterar_livro.png"
|
|
375
487
|
# Tenta localizar a imagem na tela
|
|
376
488
|
localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
|
|
377
489
|
|
|
@@ -385,8 +497,8 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
385
497
|
await worker_sleep(4)
|
|
386
498
|
|
|
387
499
|
# Clicar em Livro fiscal
|
|
388
|
-
imagem =
|
|
389
|
-
|
|
500
|
+
# imagem = "assets\\abertura_livros\\livro_fiscal.png"
|
|
501
|
+
imagem = "assets\\abertura_livros\\livro_fiscal.png"
|
|
390
502
|
# Tenta localizar a imagem na tela
|
|
391
503
|
localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
|
|
392
504
|
|
|
@@ -400,7 +512,8 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
400
512
|
await worker_sleep(4)
|
|
401
513
|
|
|
402
514
|
# Clicar em Gerar Relatório
|
|
403
|
-
imagem =
|
|
515
|
+
# imagem = "assets\\abertura_livros\\gerar_registros.png"
|
|
516
|
+
imagem = "assets\\abertura_livros\\gerar_registros.png"
|
|
404
517
|
|
|
405
518
|
# Tenta localizar a imagem na tela
|
|
406
519
|
localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
|
|
@@ -429,51 +542,139 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
429
542
|
main_window.set_focus()
|
|
430
543
|
main_window.child_window(class_name="TButton", found_index=1).click_input()
|
|
431
544
|
|
|
432
|
-
|
|
433
|
-
imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\janela_carregada.png"
|
|
545
|
+
await worker_sleep(5)
|
|
434
546
|
|
|
435
|
-
#
|
|
436
|
-
|
|
437
|
-
|
|
547
|
+
# Clicar no aviso
|
|
548
|
+
try:
|
|
549
|
+
app_msgbox = Application().connect(class_name="TMsgBox", timeout=10)
|
|
550
|
+
box = app_msgbox["TMsgBox"]
|
|
551
|
+
print("Janela 'TMsgBox' encontrada.")
|
|
552
|
+
box.set_focus()
|
|
553
|
+
box.child_window(class_name="TBitBtn", found_index=0).click_input()
|
|
554
|
+
print("Clicou no botão 'TBitBtn'.")
|
|
555
|
+
except:
|
|
556
|
+
pass
|
|
438
557
|
|
|
439
|
-
|
|
558
|
+
try:
|
|
559
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=10)
|
|
560
|
+
form = app_msg["TMessageForm"]
|
|
561
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
562
|
+
form.set_focus()
|
|
563
|
+
form.child_window(class_name="TButton", found_index=1).click_input()
|
|
564
|
+
print("Clicou no botão de confirmação.")
|
|
565
|
+
except:
|
|
566
|
+
pass
|
|
567
|
+
try:
|
|
568
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=10)
|
|
569
|
+
form = app_msg["TMessageForm"]
|
|
570
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
571
|
+
form.set_focus()
|
|
572
|
+
form.child_window(class_name="TButton", found_index=0).click_input()
|
|
573
|
+
print("Clicou no botão de confirmação.")
|
|
574
|
+
except:
|
|
575
|
+
pass
|
|
576
|
+
try:
|
|
577
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=10)
|
|
578
|
+
form = app_msg["TMessageForm"]
|
|
579
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
580
|
+
form.set_focus()
|
|
581
|
+
form.child_window(class_name="TButton", found_index=1).click_input()
|
|
582
|
+
print("Clicou no botão de confirmação.")
|
|
583
|
+
except:
|
|
584
|
+
pass
|
|
585
|
+
try:
|
|
586
|
+
app_msg = Application().connect(class_name="TMessageForm", timeout=10)
|
|
587
|
+
form = app_msg["TMessageForm"]
|
|
588
|
+
console.print("Janela de confirmação 'TMessageForm' encontrada.")
|
|
589
|
+
form.set_focus()
|
|
590
|
+
form.child_window(class_name="TButton", found_index=0).click_input()
|
|
591
|
+
print("Clicou no botão de confirmação.")
|
|
592
|
+
except:
|
|
593
|
+
pass
|
|
440
594
|
|
|
441
|
-
|
|
442
|
-
|
|
595
|
+
try:
|
|
596
|
+
# Caminho da imagem que deve desaparecer
|
|
597
|
+
console.print("Aguardar carregar dados")
|
|
598
|
+
# imagem = "assets\\abertura_livros\\janela_carregada.png"
|
|
599
|
+
imagem = "assets\\abertura_livros\\janela_carregada.png"
|
|
443
600
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
601
|
+
# Tempo máximo de espera (em segundos)
|
|
602
|
+
tempo_limite = 600 # 10 minutos
|
|
603
|
+
intervalo = 2 # segundos entre as verificações
|
|
447
604
|
|
|
448
|
-
|
|
449
|
-
print("Tempo esgotado. A imagem não desapareceu.")
|
|
450
|
-
break
|
|
605
|
+
inicio = time.time()
|
|
451
606
|
|
|
452
|
-
|
|
453
|
-
|
|
607
|
+
while True:
|
|
608
|
+
localizacao = pyautogui.locateOnScreen(imagem, confidence=0.9)
|
|
454
609
|
|
|
455
|
-
|
|
456
|
-
|
|
610
|
+
if localizacao:
|
|
611
|
+
print("Imagem ainda presente... aguardando")
|
|
612
|
+
else:
|
|
613
|
+
print("Imagem desapareceu da tela.")
|
|
614
|
+
break # A imagem sumiu, podemos seguir
|
|
615
|
+
|
|
616
|
+
if time.time() - inicio > tempo_limite:
|
|
617
|
+
print("Tempo esgotado. A imagem não desapareceu.")
|
|
618
|
+
break
|
|
619
|
+
|
|
620
|
+
time.sleep(intervalo)
|
|
621
|
+
except:
|
|
622
|
+
pass
|
|
623
|
+
# Conecta na janela principal
|
|
624
|
+
console.print("Janela Livro de Apuração ICMS 2ª Etapa")
|
|
457
625
|
app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
)
|
|
464
|
-
|
|
626
|
+
main_window = app["TFrmPrincipalFiscal"]
|
|
627
|
+
|
|
628
|
+
# Captura todos os controles do tipo Edit (inclui TEdit do Delphi)
|
|
629
|
+
edits = main_window.descendants(class_name="TEdit")
|
|
630
|
+
|
|
631
|
+
print(f"Foram encontrados {len(edits)} campos TEdit.")
|
|
632
|
+
|
|
633
|
+
campo = edits[0]
|
|
634
|
+
campo.click_input()
|
|
635
|
+
await worker_sleep(1)
|
|
636
|
+
|
|
637
|
+
# Tenta limpar o campo e verifica se realmente foi limpo
|
|
638
|
+
max_tentativas = 3
|
|
639
|
+
for tentativa in range(max_tentativas):
|
|
640
|
+
campo.set_edit_text("")
|
|
641
|
+
await worker_sleep(0.5)
|
|
465
642
|
|
|
643
|
+
texto_atual = campo.window_text().strip()
|
|
644
|
+
if texto_atual == "":
|
|
645
|
+
break # Campo foi limpo com sucesso
|
|
646
|
+
print(f"Tentativa {tentativa+1}: campo ainda contém texto: '{texto_atual}'")
|
|
647
|
+
|
|
648
|
+
# Continua se o campo estiver limpo
|
|
649
|
+
campo.type_keys("Livro de Apuração ICMS", with_spaces=True)
|
|
650
|
+
await worker_sleep(1)
|
|
651
|
+
|
|
652
|
+
send_keys("{ENTER}")
|
|
653
|
+
await worker_sleep(2)
|
|
654
|
+
send_keys("{ENTER}")
|
|
655
|
+
|
|
656
|
+
await worker_sleep(5)
|
|
657
|
+
console.print("Inserindo competência...")
|
|
658
|
+
|
|
659
|
+
# Conecta na janela
|
|
466
660
|
app = Application().connect(class_name="TFrmMovtoApuraIcmsNew", timeout=60)
|
|
467
661
|
main_window = app["TFrmMovtoApuraIcmsNew"]
|
|
468
662
|
main_window.set_focus()
|
|
663
|
+
|
|
664
|
+
# Captura o campo de data (TDBIEditDate)
|
|
469
665
|
data_input = main_window.child_window(class_name="TDBIEditDate", found_index=0)
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
666
|
+
data_input.click_input()
|
|
667
|
+
await worker_sleep(1)
|
|
668
|
+
data_input.set_edit_text("") # Limpa o campo
|
|
669
|
+
|
|
670
|
+
# Define a competência
|
|
671
|
+
# Ex: "07/2025"
|
|
672
|
+
data_input.type_keys(competencia, with_spaces=True)
|
|
474
673
|
|
|
674
|
+
console.print("Clicando no botão incluir apuração")
|
|
475
675
|
# Clicar em incluir apuração
|
|
476
|
-
imagem =
|
|
676
|
+
# imagem = "assets\\abertura_livros\\btn_incluir_apuracao.png"
|
|
677
|
+
imagem = "assets\\abertura_livros\btn_incluir_apuracao.png"
|
|
477
678
|
|
|
478
679
|
# Tenta localizar a imagem na tela
|
|
479
680
|
localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
|
|
@@ -482,6 +683,13 @@ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProc
|
|
|
482
683
|
print(f"Imagem incluir apuração encontrado em: {localizacao}")
|
|
483
684
|
pyautogui.moveTo(localizacao)
|
|
484
685
|
pyautogui.click()
|
|
686
|
+
console.print("Apuração incluida com sucesso")
|
|
687
|
+
retorno = "Apuração incluida com sucesso"
|
|
688
|
+
return RpaRetornoProcessoDTO(
|
|
689
|
+
sucesso=True,
|
|
690
|
+
retorno=retorno,
|
|
691
|
+
status=RpaHistoricoStatusEnum.Sucesso
|
|
692
|
+
)
|
|
485
693
|
else:
|
|
486
694
|
console.print("Imagem incluir apuração não encontrada na tela.")
|
|
487
695
|
|
|
@@ -7,18 +7,19 @@ import time
|
|
|
7
7
|
import uuid
|
|
8
8
|
import asyncio
|
|
9
9
|
import pyautogui
|
|
10
|
-
from datetime import datetime
|
|
11
10
|
import pytesseract
|
|
12
11
|
import win32clipboard
|
|
12
|
+
from datetime import datetime
|
|
13
13
|
from PIL import Image, ImageEnhance
|
|
14
|
-
from pyscreeze import ImageNotFoundException
|
|
15
14
|
from pywinauto.application import Application
|
|
16
15
|
from pywinauto.keyboard import send_keys
|
|
17
16
|
from pywinauto.timings import wait_until
|
|
18
17
|
from pywinauto_recorder.player import set_combobox
|
|
19
18
|
from rich.console import Console
|
|
20
|
-
import sys
|
|
21
|
-
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")))
|
|
19
|
+
# import sys
|
|
20
|
+
# sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")))
|
|
21
|
+
|
|
22
|
+
|
|
22
23
|
from worker_automate_hub.api.ahead_service import save_xml_to_downloads
|
|
23
24
|
from worker_automate_hub.api.client import (
|
|
24
25
|
get_config_by_name,
|
|
@@ -143,7 +144,7 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
143
144
|
await worker_sleep(5)
|
|
144
145
|
|
|
145
146
|
await get_xml(nota.get("nfe"))
|
|
146
|
-
await worker_sleep(
|
|
147
|
+
await worker_sleep(3)
|
|
147
148
|
|
|
148
149
|
# VERIFICANDO A EXISTENCIA DE WARNINGS
|
|
149
150
|
warning_pop_up = await is_window_open("Warning")
|
|
@@ -200,20 +201,31 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
200
201
|
await worker_sleep(3)
|
|
201
202
|
|
|
202
203
|
if str(cfop).startswith("6"):
|
|
203
|
-
|
|
204
|
+
texto_alvo = "2556-COMPRA DE MERCADORIAS SEM ESTOQUE- 2.556"
|
|
204
205
|
elif str(cfop).startswith("5"):
|
|
205
|
-
|
|
206
|
+
texto_alvo = "1556-COMPRA DE MERCADORIAS SEM ESTOQUE- 1.556"
|
|
206
207
|
else:
|
|
207
|
-
console.print(
|
|
208
|
-
"Erro mapeado, CFOP diferente de inicio com 540 ou 510, necessario ação manual ou ajuste no robo...\n"
|
|
209
|
-
)
|
|
208
|
+
console.print("CFOP não suportada...\n")
|
|
210
209
|
return RpaRetornoProcessoDTO(
|
|
211
210
|
sucesso=False,
|
|
212
|
-
retorno=
|
|
211
|
+
retorno="CFOP não suportada.",
|
|
213
212
|
status=RpaHistoricoStatusEnum.Falha,
|
|
214
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)]
|
|
213
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
215
214
|
)
|
|
216
|
-
|
|
215
|
+
|
|
216
|
+
# Percorre com seta para baixo até encontrar o texto alvo
|
|
217
|
+
for _ in range(500): # tenta até 15 opções
|
|
218
|
+
texto_atual = combo_box_natureza_operacao.window_text().strip()
|
|
219
|
+
|
|
220
|
+
if texto_alvo.lower() in texto_atual.lower():
|
|
221
|
+
combo_box_natureza_operacao.type_keys("{ENTER}")
|
|
222
|
+
break
|
|
223
|
+
else:
|
|
224
|
+
combo_box_natureza_operacao.type_keys("{DOWN}")
|
|
225
|
+
await worker_sleep(0.5)
|
|
226
|
+
|
|
227
|
+
# Sai do campo (opcional)
|
|
228
|
+
combo_box_natureza_operacao.type_keys("{TAB}")
|
|
217
229
|
await worker_sleep(3)
|
|
218
230
|
|
|
219
231
|
# INTERAGINDO COM O CAMPO ALMOXARIFADO
|
|
@@ -307,7 +319,7 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
307
319
|
"A opção 'Manter Natureza de Operação selecionada' selecionado com sucesso... \n"
|
|
308
320
|
)
|
|
309
321
|
|
|
310
|
-
await worker_sleep(
|
|
322
|
+
await worker_sleep(2)
|
|
311
323
|
console.print("Clicando em OK... \n")
|
|
312
324
|
|
|
313
325
|
max_attempts = 3
|
|
@@ -324,89 +336,8 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
324
336
|
except:
|
|
325
337
|
console.print("Não foi possivel clicar no Botão OK... \n")
|
|
326
338
|
|
|
327
|
-
await worker_sleep(
|
|
328
|
-
|
|
329
|
-
# Aguarda a tela de aguarde
|
|
330
|
-
# imagem_alvo = "assets\\entrada_notas\\aguarde.png"
|
|
331
|
-
imagem_alvo =r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\worker_automate_hub\assets\entrada_notas\aguarde.png"
|
|
332
|
-
timeout = 300 # 5 minutos
|
|
333
|
-
start_time = time.time()
|
|
334
|
-
|
|
335
|
-
try:
|
|
336
|
-
console.print("Aguardando a imagem desaparecer da tela (até 5 minutos)...")
|
|
337
|
-
|
|
338
|
-
while True:
|
|
339
|
-
localizacao = pyautogui.locateOnScreen(imagem_alvo, confidence=0.9)
|
|
340
|
-
|
|
341
|
-
if not localizacao:
|
|
342
|
-
console.print("Imagem não está mais na tela.")
|
|
343
|
-
break
|
|
344
|
-
|
|
345
|
-
if time.time() - start_time > timeout:
|
|
346
|
-
console.print("Tempo limite atingido. A imagem ainda está na tela.")
|
|
347
|
-
break
|
|
348
|
-
|
|
349
|
-
time.sleep(5) # Espera 5 segundos antes de verificar novamente
|
|
350
|
-
|
|
351
|
-
except:
|
|
352
|
-
pass
|
|
353
|
-
|
|
354
|
-
await worker_sleep(7)
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
try:
|
|
358
|
-
app = Application().connect(class_name="TMessageForm", timeout=10)
|
|
359
|
-
main_window = app["TMessageForm"]
|
|
360
|
-
main_window.set_focus()
|
|
361
|
-
click_yes = main_window.child_window(class_name='TButton', found_index=1).click()
|
|
362
|
-
except:
|
|
363
|
-
pass
|
|
364
|
-
|
|
365
|
-
try:
|
|
366
|
-
# Verifica erro ncm nao encontrado
|
|
367
|
-
imagem_alvo = "assets\\entrada_notas\\nao_encontrado_ncm.png"
|
|
368
|
-
imagem_alvo = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\worker_automate_hub\assets\entrada_notas\nao_encontrado_ncm.png"
|
|
369
|
-
localizacao = pyautogui.locateOnScreen(imagem_alvo, confidence=0.9)
|
|
370
|
-
|
|
371
|
-
if localizacao:
|
|
372
|
-
console.print("Não encontrado o NCM cadastrado no sistema")
|
|
373
|
-
return RpaRetornoProcessoDTO(
|
|
374
|
-
sucesso=False,
|
|
375
|
-
retorno="Não encontrado o NCM cadastrado no sistema",
|
|
376
|
-
status=RpaHistoricoStatusEnum.Falha,
|
|
377
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)]
|
|
378
|
-
)
|
|
379
|
-
|
|
380
|
-
except ImageNotFoundException:
|
|
381
|
-
console.print(
|
|
382
|
-
"Imagem não encontrada continuando"
|
|
383
|
-
)
|
|
384
|
-
|
|
385
|
-
# Aguarda a tela de aguarde
|
|
386
|
-
# imagem_alvo = "assets\\entrada_notas\\aguarde.png"
|
|
387
|
-
imagem_alvo =r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\worker_automate_hub\assets\entrada_notas\aguarde.png"
|
|
388
|
-
timeout = 300 # 5 minutos
|
|
389
|
-
start_time = time.time()
|
|
390
|
-
|
|
391
|
-
try:
|
|
392
|
-
console.print("Aguardando a imagem desaparecer da tela (até 5 minutos)...")
|
|
393
|
-
|
|
394
|
-
while True:
|
|
395
|
-
localizacao = pyautogui.locateOnScreen(imagem_alvo, confidence=0.9)
|
|
396
|
-
|
|
397
|
-
if not localizacao:
|
|
398
|
-
console.print("Imagem não está mais na tela.")
|
|
399
|
-
break
|
|
400
|
-
|
|
401
|
-
if time.time() - start_time > timeout:
|
|
402
|
-
console.print("Tempo limite atingido. A imagem ainda está na tela.")
|
|
403
|
-
break
|
|
404
|
-
|
|
405
|
-
time.sleep(2) # Espera 2 segundos antes de verificar novamente
|
|
339
|
+
await worker_sleep(3)
|
|
406
340
|
|
|
407
|
-
except Exception as e:
|
|
408
|
-
console.print(f"Ocorreu um erro: {e}")
|
|
409
|
-
|
|
410
341
|
console.print(
|
|
411
342
|
"Verificando a existencia da tela Informações para importação da Nota Fiscal Eletrônica...\n"
|
|
412
343
|
)
|
|
@@ -689,22 +620,59 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
689
620
|
class_name="TDBIComboBox", found_index=0
|
|
690
621
|
)
|
|
691
622
|
tipo_cobranca.click()
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
623
|
+
|
|
624
|
+
# Selecionando tipo de boleto
|
|
625
|
+
texto_alvo = "BANCO DO BRASIL BOLETO"
|
|
626
|
+
alternativo = "BOLETO"
|
|
627
|
+
# Tenta encontrar o texto preferencial
|
|
628
|
+
encontrado = False
|
|
629
|
+
for _ in range(50): # ajustável
|
|
630
|
+
texto_atual = tipo_cobranca.window_text().strip()
|
|
631
|
+
if texto_alvo.lower() in texto_atual.lower():
|
|
632
|
+
tipo_cobranca.type_keys("{ENTER}")
|
|
633
|
+
encontrado = True
|
|
634
|
+
break
|
|
635
|
+
else:
|
|
636
|
+
tipo_cobranca.type_keys("{DOWN}")
|
|
637
|
+
await worker_sleep(0.5)
|
|
638
|
+
|
|
639
|
+
# Se não encontrou o valor desejado, tenta o alternativo
|
|
640
|
+
if not encontrado:
|
|
641
|
+
console.print(f"[yellow]'{texto_alvo}' não encontrado. Tentando '{alternativo}'...[/yellow]")
|
|
642
|
+
|
|
643
|
+
# Reposiciona no início digitando parte do alternativo
|
|
644
|
+
tipo_cobranca.type_keys(alternativo[:4], with_spaces=True)
|
|
645
|
+
await worker_sleep(1)
|
|
646
|
+
|
|
647
|
+
for _ in range(50):
|
|
648
|
+
texto_atual = tipo_cobranca.window_text().strip()
|
|
649
|
+
if alternativo.lower() in texto_atual.lower():
|
|
650
|
+
tipo_cobranca.type_keys("{ENTER}")
|
|
651
|
+
encontrado = True
|
|
652
|
+
break
|
|
653
|
+
else:
|
|
654
|
+
tipo_cobranca.type_keys("{DOWN}")
|
|
655
|
+
await worker_sleep(0.5)
|
|
656
|
+
|
|
657
|
+
# Verifica se selecionou algo corretamente
|
|
658
|
+
texto_final = tipo_cobranca.window_text().strip()
|
|
659
|
+
|
|
660
|
+
if not encontrado or all(x.lower() not in texto_final.lower() for x in [texto_alvo, alternativo]):
|
|
661
|
+
console.print(f"[red]Erro: valor da conta de recebimento não foi selecionado corretamente. Último texto: '{texto_final}'[/red]")
|
|
662
|
+
return RpaRetornoProcessoDTO(
|
|
663
|
+
sucesso=False,
|
|
664
|
+
retorno="Conta de recebimento incorreta ou não encontrada.",
|
|
665
|
+
status=RpaHistoricoStatusEnum.Falha,
|
|
666
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
667
|
+
)
|
|
696
668
|
|
|
697
669
|
await worker_sleep(3)
|
|
698
670
|
console.print(f"Incluindo registro...\n")
|
|
699
671
|
try:
|
|
700
|
-
|
|
701
|
-
ASSETS_PATH = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\worker_automate_hub\assets\entrada_notas\IncluirRegistro.png"
|
|
672
|
+
ASSETS_PATH = "assets"
|
|
702
673
|
inserir_registro = pyautogui.locateOnScreen(
|
|
703
|
-
ASSETS_PATH, confidence=0.8
|
|
674
|
+
ASSETS_PATH + "\\entrada_notas\\IncluirRegistro.png", confidence=0.8
|
|
704
675
|
)
|
|
705
|
-
# inserir_registro = pyautogui.locateOnScreen(
|
|
706
|
-
# ASSETS_PATH + "\\entrada_notas\\IncluirRegistro.png", confidence=0.8
|
|
707
|
-
# )
|
|
708
676
|
pyautogui.click(inserir_registro)
|
|
709
677
|
except Exception as e:
|
|
710
678
|
console.print(
|
|
@@ -894,25 +862,3 @@ async def entrada_de_notas_33(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
|
|
|
894
862
|
finally:
|
|
895
863
|
# Deleta o xml
|
|
896
864
|
await delete_xml(nota.get("nfe"))
|
|
897
|
-
|
|
898
|
-
if __name__ == "__main__":
|
|
899
|
-
|
|
900
|
-
task = RpaProcessoEntradaDTO(
|
|
901
|
-
datEntradaFila= datetime.now(),
|
|
902
|
-
configEntrada= {"nfe":"43250703746938001387550040005122881902295895","cfop":"5102","itens":[{"qtd":"2.00","ocst":"000","ncmsh":"39232990","valorIpi":"0.00","valorIcms":"3.63","valorTotal":"21.34","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"21.34","codigoProduto":"030338","unidadeMedida":"UN","valorUnitario":"10.67","descricaoProduto":"Saco Plastico para Moedas Transparente 0,10m PCT 100UN"},{"qtd":"1.00","ocst":"000","ncmsh":"48211000","valorIpi":"0.00","valorIcms":"5.39","valorTotal":"31.72","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"31.72","codigoProduto":"044867","unidadeMedida":"ROL","valorUnitario":"31.72","descricaoProduto":"Etiqueta Adesiva 100X50mm Amarelo 101C RL 200UN"},{"qtd":"1.00","ocst":"000","ncmsh":"49111090","valorIpi":"0.00","valorIcms":"14.43","valorTotal":"84.90","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"84.90","codigoProduto":"041749","unidadeMedida":"PAC","valorUnitario":"84.90","descricaoProduto":"Bloco de Abastecimento 1 via 8 x 6,5cm PCT 50BL de 100fls"},{"qtd":"12.00","ocst":"000","ncmsh":"96081000","valorIpi":"0.00","valorIcms":"1.24","valorTotal":"7.32","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"7.32","codigoProduto":"029618","unidadeMedida":"UN","valorUnitario":"0.61","descricaoProduto":"Caneta Esferografica Compactor Economic 1.0mm Azul"},{"qtd":"20.00","ocst":"000","ncmsh":"96081000","valorIpi":"0.00","valorIcms":"2.07","valorTotal":"12.20","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"12.20","codigoProduto":"029618","unidadeMedida":"UN","valorUnitario":"0.61","descricaoProduto":"Caneta Esferografica Compactor Economic 1.0mm Azul"},{"qtd":"1.00","ocst":"100","ncmsh":"39191010","valorIpi":"0.83","valorIcms":"1.08","valorTotal":"5.50","aliquotaIpi":"15.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"6.33","codigoProduto":"050894","unidadeMedida":"UN","valorUnitario":"5.50","descricaoProduto":"Fita Adesiva Hot Melt Sooper PRO 45mmX45m Transparente"},{"qtd":"2.00","ocst":"000","ncmsh":"48119019","valorIpi":"6.78","valorIcms":"36.63","valorTotal":"208.66","aliquotaIpi":"3.25","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"215.44","codigoProduto":"041690","unidadeMedida":"UN","valorUnitario":"104.33","descricaoProduto":"Bobina Termica Rede Sim 80mmx80m 44g CX 16UN"},{"qtd":"1.00","ocst":"020","ncmsh":"17019900","valorIpi":"0.00","valorIcms":"1.57","valorTotal":"22.41","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"9.23","codigoProduto":"050962","unidadeMedida":"UN","valorUnitario":"22.41","descricaoProduto":"Acucar Refinado Alto Alegre Sache CX 400x5g"},{"qtd":"2.00","ocst":"000","ncmsh":"48232099","valorIpi":"0.00","valorIcms":"1.42","valorTotal":"8.38","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"8.38","codigoProduto":"009014","unidadeMedida":"UN","valorUnitario":"4.19","descricaoProduto":"Filtro de Papel Melitta No103 30UN"},{"qtd":"1.00","ocst":"200","ncmsh":"40151900","valorIpi":"0.00","valorIcms":"7.72","valorTotal":"45.41","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"45.41","codigoProduto":"020964","unidadeMedida":"CX","valorUnitario":"45.41","descricaoProduto":"Luva Latex Volk Cleanline Descartavel com Po G CX 100UN"},{"qtd":"2.00","ocst":"000","ncmsh":"68053090","valorIpi":"0.00","valorIcms":"0.33","valorTotal":"1.96","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"1.96","codigoProduto":"050637","unidadeMedida":"UN","valorUnitario":"0.98","descricaoProduto":"Esponja Esfrelux Lava Loucas Anti Bacteria"},{"qtd":"2.00","ocst":"200","ncmsh":"62160000","valorIpi":"0.00","valorIcms":"1.53","valorTotal":"9.00","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"9.00","codigoProduto":"025306","unidadeMedida":"PAR","valorUnitario":"4.50","descricaoProduto":"Luva Poliamida Volk Tatil PU Palma e Dedos Preta M"},{"qtd":"1.00","ocst":"000","ncmsh":"21039011","valorIpi":"0.00","valorIcms":"4.55","valorTotal":"26.78","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"26.78","codigoProduto":"100011581","unidadeMedida":"CX","valorUnitario":"26.78","descricaoProduto":"Maionese Sache Junior 7g CX 160UN"},{"qtd":"1.00","ocst":"100","ncmsh":"39235000","valorIpi":"3.45","valorIcms":"12.33","valorTotal":"69.05","aliquotaIpi":"5.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"72.50","codigoProduto":"053593","unidadeMedida":"CX","valorUnitario":"69.05","descricaoProduto":"Tampa Versaline PP Preta Copo de Papel PD 210ml CX 500UN"},{"qtd":"1.00","ocst":"000","ncmsh":"48211000","valorIpi":"0.00","valorIcms":"2.63","valorTotal":"15.46","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"15.46","codigoProduto":"053356","unidadeMedida":"ROL","valorUnitario":"15.46","descricaoProduto":"Etiqueta Validade Rede Sim 40x24mm RL 1000UN"},{"qtd":"12.00","ocst":"000","ncmsh":"39241000","valorIpi":"0.00","valorIcms":"9.28","valorTotal":"54.60","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"54.60","codigoProduto":"011523","unidadeMedida":"UN","valorUnitario":"4.55","descricaoProduto":"Copo Descartavel PS Branco 180ml PCT 100UN"},{"qtd":"1.00","ocst":"000","ncmsh":"21032010","valorIpi":"0.00","valorIcms":"4.53","valorTotal":"26.62","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"26.62","codigoProduto":"053435","unidadeMedida":"UN","valorUnitario":"26.62","descricaoProduto":"Ketchup Sache Junior 7g CX 168UN"},{"qtd":"1.00","ocst":"000","ncmsh":"39173229","valorIpi":"0.00","valorIcms":"0.83","valorTotal":"4.91","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"4.91","codigoProduto":"041209","unidadeMedida":"UN","valorUnitario":"4.91","descricaoProduto":"Canudo Oxi Biodegrad Strawplast Embalado Indiv 100UN"},{"qtd":"3.00","ocst":"000","ncmsh":"38089919","valorIpi":"0.00","valorIcms":"3.48","valorTotal":"20.49","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"20.49","codigoProduto":"054500","unidadeMedida":"UN","valorUnitario":"6.83","descricaoProduto":"Alcool Liquido 70o Super Vale 1L"},{"qtd":"2.00","ocst":"000","ncmsh":"48182000","valorIpi":"0.00","valorIcms":"13.49","valorTotal":"79.38","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"79.38","codigoProduto":"100010494","unidadeMedida":"CX","valorUnitario":"39.69","descricaoProduto":"Papel Higienico Rolo 300m Softpaper Eco FS 17g CX 8UN"},{"qtd":"2.00","ocst":"000","ncmsh":"39232190","valorIpi":"0.00","valorIcms":"2.15","valorTotal":"12.64","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"12.64","codigoProduto":"038796","unidadeMedida":"UN","valorUnitario":"6.32","descricaoProduto":"Saco para Lixo Basic Up Bag Azul 30L 50UN"},{"qtd":"2.00","ocst":"500","ncmsh":"48182000","valorIpi":"0.00","valorIcms":"29.07","valorTotal":"171.00","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"171.00","codigoProduto":"020684","unidadeMedida":"CX","valorUnitario":"85.50","descricaoProduto":"Papel Toalha Bobina 200m Softpaper Basic FS 24g CX 6UN"},{"qtd":"2.00","ocst":"020","ncmsh":"09012100","valorIpi":"0.00","valorIcms":"5.03","valorTotal":"71.78","aliquotaIpi":"0.00","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"29.56","codigoProduto":"047037","unidadeMedida":"UN","valorUnitario":"35.89","descricaoProduto":"Cafe em Po 1707 Tradicional Vacuo 500g"},{"qtd":"2.00","ocst":"100","ncmsh":"48236900","valorIpi":"37.59","valorIcms":"71.93","valorTotal":"385.54","aliquotaIpi":"9.75","cfopProduto":"5102","aliquotaIcms":"17.00","bCalculoIcms":"423.13","codigoProduto":"053592","unidadeMedida":"CX","valorUnitario":"192.77","descricaoProduto":"Copo Papel SIM PD 210ml FSCMisto70% CU-COC-855709 CX500UN"}],"natureza":"33","alocacoes":[],"valorNota":"1445.70","nomeFilial":"PF Praça Itália\t","numeroNota":"512288","dataEmissao":"14/07/2025","observacoes":"Vcto: 06/10/2025","existeDespesa":"Não","cnpjFornecedor":"03746938001387","dataVencimento":"06/10/2025","nomeFornecedor":"BRS SUPRIMENTOS CORPORATIVOS S/A","recebimentoFisico":"17/07/2025 14:52","filialEmpresaOrigem":"109"},
|
|
903
|
-
uuidProcesso='def194c2-ffa0-4b9e-b95c-920fb4ad4150',
|
|
904
|
-
nomProcesso='extracao_fechamento_emsys',
|
|
905
|
-
uuidFila="",
|
|
906
|
-
sistemas=[
|
|
907
|
-
{
|
|
908
|
-
"sistema": "EMSys",
|
|
909
|
-
"timeout": "1.0"
|
|
910
|
-
},
|
|
911
|
-
{
|
|
912
|
-
"sistema": "AutoSystem",
|
|
913
|
-
"timeout": "1.0"
|
|
914
|
-
}
|
|
915
|
-
],
|
|
916
|
-
historico_id='2c4429c8-26ae-4ec6-b775-21583992e82f'
|
|
917
|
-
)
|
|
918
|
-
asyncio.run(entrada_de_notas_33(task))
|
|
@@ -36,7 +36,7 @@ worker_automate_hub/models/dto/rpa_sap_dto.py,sha256=eovdvKCtVIhRct3PL98KjsdlngL
|
|
|
36
36
|
worker_automate_hub/models/dto/rpa_sistema_dto.py,sha256=sLkmJei8x6sl-1-IXUKDmYQuKx0sotYQREPyhQqPmRg,161
|
|
37
37
|
worker_automate_hub/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
38
|
worker_automate_hub/tasks/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
|
-
worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py,sha256=
|
|
39
|
+
worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py,sha256=jizPxeSddqPuWgdZj8TAsBlmZY_ZQyx-9qwwAdOSiVY,28657
|
|
40
40
|
worker_automate_hub/tasks/jobs/coleta_dje_process.py,sha256=UkLWTC5Ub2qBb0yY-8IZ0DLLOVJOfNTq_z9krx_t25Q,29476
|
|
41
41
|
worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=S6QC4xhuo0pB5FjaUJZNMm1LIgEjpjifReCTBDqxH-U,11719
|
|
42
42
|
worker_automate_hub/tasks/jobs/cte_manual.py,sha256=JucHpRMjMiy-QEJ0wtFnytLpN53tKXgCDI05nGLGclU,603
|
|
@@ -57,7 +57,7 @@ worker_automate_hub/tasks/jobs/entrada_de_notas_15.py,sha256=BYmdPLJFZEHD_lVSpua
|
|
|
57
57
|
worker_automate_hub/tasks/jobs/entrada_de_notas_16.py,sha256=xVz5bhbAYt1IeXbkYYXG6JvFWZ8Z0-mHOi218evI1So,36829
|
|
58
58
|
worker_automate_hub/tasks/jobs/entrada_de_notas_207.py,sha256=A5HM2Eh2bGZueVefnQL9KiCWW95j8zX1v2MslgbDcUE,36871
|
|
59
59
|
worker_automate_hub/tasks/jobs/entrada_de_notas_32.py,sha256=lku233FqwOknXF14HHC6fZ75WubE69Jp32bAUhKPtGQ,34575
|
|
60
|
-
worker_automate_hub/tasks/jobs/entrada_de_notas_33.py,sha256=
|
|
60
|
+
worker_automate_hub/tasks/jobs/entrada_de_notas_33.py,sha256=ODp82BkWaiF40t6uZLJYxG2nGGnvDyeQBHhkkh9ZgPI,35994
|
|
61
61
|
worker_automate_hub/tasks/jobs/entrada_de_notas_34.py,sha256=AXUL8DakrDeTxWW8dn36W830XfIuO47MFUusbUkrnUc,33586
|
|
62
62
|
worker_automate_hub/tasks/jobs/entrada_de_notas_36.py,sha256=z494n0SUyxorjhvpbat2ELnj7lbhtWPb9JOIsattwA8,35216
|
|
63
63
|
worker_automate_hub/tasks/jobs/entrada_de_notas_39.py,sha256=whsK_TfNZSmzt0PNHnVi0q4OIxzfKiR5nGuB9WfEYeI,47071
|
|
@@ -98,7 +98,7 @@ worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbV
|
|
|
98
98
|
worker_automate_hub/utils/util.py,sha256=xA13nQqZglwkvfAKH18Unv4UoZUyvL58CacSrzUpYTw,206352
|
|
99
99
|
worker_automate_hub/utils/utils_nfe_entrada.py,sha256=L_z1Aps6BFWl-6_Ibm45vDid1S4kFDz5O78N2uO1Rq0,36458
|
|
100
100
|
worker_automate_hub/worker.py,sha256=axdrr1xLTjWEyWfcyH3OCSpPTsyzck_fL_0u1DBLjvw,6525
|
|
101
|
-
worker_automate_hub-0.5.
|
|
102
|
-
worker_automate_hub-0.5.
|
|
103
|
-
worker_automate_hub-0.5.
|
|
104
|
-
worker_automate_hub-0.5.
|
|
101
|
+
worker_automate_hub-0.5.675.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
|
|
102
|
+
worker_automate_hub-0.5.675.dist-info/METADATA,sha256=ykAlCapXBc41PAm3kga2NMs70z76Ih7JdMAt_BpX9_I,3049
|
|
103
|
+
worker_automate_hub-0.5.675.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
104
|
+
worker_automate_hub-0.5.675.dist-info/RECORD,,
|
|
File without changes
|
{worker_automate_hub-0.5.673.dist-info → worker_automate_hub-0.5.675.dist-info}/entry_points.txt
RENAMED
|
File without changes
|