worker-automate-hub 0.4.445__py3-none-any.whl → 0.4.447__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- worker_automate_hub/api/webhook_service.py +57 -0
- worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +34 -14
- worker_automate_hub/tasks/task_executor.py +9 -0
- worker_automate_hub/utils/util.py +103 -0
- {worker_automate_hub-0.4.445.dist-info → worker_automate_hub-0.4.447.dist-info}/METADATA +1 -1
- {worker_automate_hub-0.4.445.dist-info → worker_automate_hub-0.4.447.dist-info}/RECORD +8 -7
- {worker_automate_hub-0.4.445.dist-info → worker_automate_hub-0.4.447.dist-info}/WHEEL +0 -0
- {worker_automate_hub-0.4.445.dist-info → worker_automate_hub-0.4.447.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
from worker_automate_hub.utils.logger import logger
|
2
|
+
from rich.console import Console
|
3
|
+
|
4
|
+
import aiohttp
|
5
|
+
|
6
|
+
console = Console()
|
7
|
+
|
8
|
+
async def send_to_webhook(
|
9
|
+
url_retorno: str,
|
10
|
+
status: str,
|
11
|
+
observacao: str
|
12
|
+
) -> None:
|
13
|
+
"""
|
14
|
+
Envia uma notificacao para o endpoint do webhook passado como parametro.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
url_retorno (str): URL do endpoint do webhook.
|
18
|
+
status (str): Status da notificacao.
|
19
|
+
observacao (str): Observacao da notificacao.
|
20
|
+
|
21
|
+
Raises:
|
22
|
+
ValueError: Se a URL, status ou observacao forem vazias.
|
23
|
+
"""
|
24
|
+
if not url_retorno:
|
25
|
+
raise ValueError("URL do retorno esta vazia.")
|
26
|
+
|
27
|
+
if not status:
|
28
|
+
raise ValueError("Status da notificacao esta vazio.")
|
29
|
+
|
30
|
+
if not observacao:
|
31
|
+
raise ValueError("Observacao da notificacao esta vazia.")
|
32
|
+
|
33
|
+
data = {
|
34
|
+
"status": status,
|
35
|
+
"observacao": observacao,
|
36
|
+
}
|
37
|
+
|
38
|
+
try:
|
39
|
+
async with aiohttp.ClientSession(
|
40
|
+
connector=aiohttp.TCPConnector(verify_ssl=False)
|
41
|
+
) as session:
|
42
|
+
async with session.post(f"{url_retorno}", data=data) as response:
|
43
|
+
if response.status != 200:
|
44
|
+
raise Exception(f"Erro ao enviar notificacao: {response.text()}")
|
45
|
+
|
46
|
+
data = await response.text()
|
47
|
+
log_msg = f"\nSucesso ao enviar {data}\n para o webhook: {url_retorno}.\n"
|
48
|
+
console.print(
|
49
|
+
log_msg,
|
50
|
+
style="bold green",
|
51
|
+
)
|
52
|
+
logger.info(log_msg)
|
53
|
+
|
54
|
+
except Exception as e:
|
55
|
+
err_msg = f"Erro ao comunicar com endpoint do webhook: {e}"
|
56
|
+
console.print(f"\n{err_msg}\n", style="bold red")
|
57
|
+
logger.info(err_msg)
|
@@ -39,6 +39,7 @@ from worker_automate_hub.utils.util import (
|
|
39
39
|
worker_sleep,
|
40
40
|
check_nota_importada,
|
41
41
|
carregamento_import_xml,
|
42
|
+
errors_generate_after_import,
|
42
43
|
)
|
43
44
|
|
44
45
|
pyautogui.PAUSE = 0.5
|
@@ -276,23 +277,41 @@ async def entrada_de_notas_7139(task: RpaProcessoEntradaDTO) -> RpaRetornoProces
|
|
276
277
|
status=RpaHistoricoStatusEnum.Falha,
|
277
278
|
)
|
278
279
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
280
|
+
try:
|
281
|
+
console.print(
|
282
|
+
"Verificando a existencia de POP-UP de Itens não localizados ou NCM ...\n"
|
283
|
+
)
|
284
|
+
itens_by_supplier = await is_window_open_by_class("TFrmAguarde", "TMessageForm")
|
285
|
+
if itens_by_supplier["IsOpened"] == True:
|
286
|
+
itens_by_supplier_work = await itens_not_found_supplier(nota.get("nfe"))
|
287
|
+
if itens_by_supplier_work.get("window") == "NCM":
|
288
|
+
console.log(itens_by_supplier_work.get("retorno"), style="bold green")
|
289
|
+
else:
|
290
|
+
return RpaRetornoProcessoDTO(
|
291
|
+
sucesso=False,
|
292
|
+
retorno=itens_by_supplier_work.get("retorno"),
|
293
|
+
status=RpaHistoricoStatusEnum.Falha,
|
294
|
+
)
|
295
|
+
except Exception as error:
|
296
|
+
return RpaRetornoProcessoDTO(
|
297
|
+
sucesso=False,
|
298
|
+
retorno=f"Falha ao verificar a existência de POP-UP de itens não localizados: {error}",
|
299
|
+
status=RpaHistoricoStatusEnum.Falha,
|
300
|
+
)
|
301
|
+
|
302
|
+
|
303
|
+
logs_erro = await is_window_open_by_class("TFrmExibeLogErroImportacaoNfe","TFrmExibeLogErroImportacaoNfe")
|
304
|
+
if logs_erro["IsOpened"] == True:
|
305
|
+
errors_genetared = await errors_generate_after_import(nota.get("nfe"))
|
306
|
+
return RpaRetornoProcessoDTO(
|
307
|
+
sucesso=False,
|
308
|
+
retorno=errors_genetared.retorno,
|
309
|
+
status=RpaHistoricoStatusEnum.Falha,
|
310
|
+
)
|
293
311
|
|
294
312
|
await worker_sleep(6)
|
295
313
|
|
314
|
+
|
296
315
|
max_attempts = 7
|
297
316
|
i = 0
|
298
317
|
while i < max_attempts:
|
@@ -334,6 +353,7 @@ async def entrada_de_notas_7139(task: RpaProcessoEntradaDTO) -> RpaRetornoProces
|
|
334
353
|
f"Não foi possivel incluir o registro utilizando reconhecimento de imagem, Error: {e}...\n tentando inserir via posição...\n"
|
335
354
|
)
|
336
355
|
await incluir_registro()
|
356
|
+
|
337
357
|
|
338
358
|
await worker_sleep(6)
|
339
359
|
nf_imported = await check_nota_importada(nota.get("nfe"))
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
|
3
3
|
from pytz import timezone
|
4
|
+
from worker_automate_hub.api.webhook_service import send_to_webhook
|
4
5
|
from rich.console import Console
|
5
6
|
|
6
7
|
from worker_automate_hub.api.client import (
|
@@ -37,6 +38,7 @@ async def perform_task(task: RpaProcessoEntradaDTO):
|
|
37
38
|
console.print(f"\n{log_msg}\n", style="green")
|
38
39
|
logger.info(log_msg)
|
39
40
|
task_uuid = task.uuidProcesso
|
41
|
+
url_retorno = task.configEntrada.get("urlRetorno", None)
|
40
42
|
processo: RpaProcesso = await get_processo(task_uuid)
|
41
43
|
if processo is None:
|
42
44
|
worker_config = load_worker_config()
|
@@ -74,6 +76,9 @@ async def perform_task(task: RpaProcessoEntradaDTO):
|
|
74
76
|
)
|
75
77
|
else:
|
76
78
|
show_toast("Sucesso", f"Processo executado com sucesso: {result}")
|
79
|
+
|
80
|
+
if url_retorno is not None and result.sucesso == False:
|
81
|
+
await send_to_webhook(url_retorno, result.status, result.retorno)
|
77
82
|
return result
|
78
83
|
else:
|
79
84
|
err_msg = f"Processo não encontrado: {task_uuid}"
|
@@ -93,6 +98,8 @@ async def perform_task(task: RpaProcessoEntradaDTO):
|
|
93
98
|
processo=processo,
|
94
99
|
)
|
95
100
|
await unlock_queue(task.uuidFila)
|
101
|
+
if url_retorno is not None:
|
102
|
+
await send_to_webhook(url_retorno, RpaHistoricoStatusEnum.Falha, err_msg)
|
96
103
|
return None
|
97
104
|
except Exception as e:
|
98
105
|
err_msg = f"Erro ao performar o processo: {e}"
|
@@ -112,6 +119,8 @@ async def perform_task(task: RpaProcessoEntradaDTO):
|
|
112
119
|
await capture_and_send_screenshot(
|
113
120
|
uuidRelacao=historico.uuidHistorico, desArquivo=err_msg
|
114
121
|
)
|
122
|
+
if url_retorno is not None:
|
123
|
+
await send_to_webhook(url_retorno, RpaHistoricoStatusEnum.Falha, err_msg)
|
115
124
|
|
116
125
|
|
117
126
|
async def _store_historico(
|
@@ -2188,6 +2188,7 @@ async def select_documento_type(document_type: str) -> RpaRetornoProcessoDTO:
|
|
2188
2188
|
main_window = app["TFrmNotaFiscalEntrada"]
|
2189
2189
|
|
2190
2190
|
main_window.set_focus()
|
2191
|
+
await worker_sleep(3)
|
2191
2192
|
|
2192
2193
|
console.print(
|
2193
2194
|
"Controles encontrados na janela 'Nota Fiscal de Entrada, navegando entre eles...\n"
|
@@ -3196,4 +3197,106 @@ async def kill_all_emsys():
|
|
3196
3197
|
sucesso=False,
|
3197
3198
|
retorno=f"Erro ao fechar o emsys, erro{e}",
|
3198
3199
|
status=RpaHistoricoStatusEnum.Falha,
|
3200
|
+
)
|
3201
|
+
|
3202
|
+
|
3203
|
+
async def errors_generate_after_import(xml_nota: str) -> RpaRetornoProcessoDTO:
|
3204
|
+
try:
|
3205
|
+
app = Application().connect(class_name="TFrmExibeLogErroImportacaoNfe")
|
3206
|
+
main_window = app["TFrmExibeLogErroImportacaoNfe"]
|
3207
|
+
console.print("Tela com itens com erro existe, salvando os itens...\n")
|
3208
|
+
|
3209
|
+
btn_save = main_window.child_window(
|
3210
|
+
title="Salvar", class_name="TBitBtn"
|
3211
|
+
)
|
3212
|
+
|
3213
|
+
if btn_save.exists():
|
3214
|
+
max_attempts = 3
|
3215
|
+
i = 0
|
3216
|
+
while i < max_attempts:
|
3217
|
+
console.print("Clicando no botão de salvar...\n")
|
3218
|
+
try:
|
3219
|
+
btn_save.click()
|
3220
|
+
except:
|
3221
|
+
console.print("Não foi possivel clicar no Botão OK... \n")
|
3222
|
+
|
3223
|
+
await worker_sleep(3)
|
3224
|
+
|
3225
|
+
console.print(
|
3226
|
+
"Verificando a existencia da tela para informar o caminho do arquivo...\n"
|
3227
|
+
)
|
3228
|
+
|
3229
|
+
try:
|
3230
|
+
app = Application().connect(title="Salvar")
|
3231
|
+
main_window = app["Salvar"]
|
3232
|
+
console.print(
|
3233
|
+
"Tela para informar o caminho do arquivo existe"
|
3234
|
+
)
|
3235
|
+
break
|
3236
|
+
except Exception as e:
|
3237
|
+
console.print(
|
3238
|
+
f"Tela para informar o caminho do arquivo não encontrada. Tentativa {i + 1}/{max_attempts}."
|
3239
|
+
)
|
3240
|
+
|
3241
|
+
i += 1
|
3242
|
+
|
3243
|
+
if i == max_attempts:
|
3244
|
+
raise Exception(
|
3245
|
+
"Número máximo de tentativas atingido. Tela para informar o caminho do arquivo existe."
|
3246
|
+
)
|
3247
|
+
|
3248
|
+
await worker_sleep(4)
|
3249
|
+
console.print(
|
3250
|
+
"Interagindo com a tela para informar o caminho do arquivo...\n"
|
3251
|
+
)
|
3252
|
+
app = Application().connect(title="Salvar")
|
3253
|
+
main_window = app["Salvar"]
|
3254
|
+
console.print(
|
3255
|
+
"Tela para informar o caminho do arquivo existe, inserindo o diretorio...\n"
|
3256
|
+
)
|
3257
|
+
await worker_sleep(2)
|
3258
|
+
main_window.type_keys("%n")
|
3259
|
+
username = getpass.getuser()
|
3260
|
+
path_to_txt = (
|
3261
|
+
f"C:\\Users\\{username}\\Downloads\\erro_itens{xml_nota}.txt"
|
3262
|
+
)
|
3263
|
+
pyautogui.write(path_to_txt)
|
3264
|
+
await worker_sleep(1)
|
3265
|
+
main_window.type_keys("%l")
|
3266
|
+
console.print(f"Arquivo salvo com sucesso... \n")
|
3267
|
+
|
3268
|
+
conteudo = ""
|
3269
|
+
await worker_sleep(3)
|
3270
|
+
with open(
|
3271
|
+
path_to_txt, "r", encoding="latin1", errors="replace"
|
3272
|
+
) as arquivo:
|
3273
|
+
conteudo = arquivo.read()
|
3274
|
+
console.print(
|
3275
|
+
f"Arquivo salvo com sucesso, itens com erro {conteudo}...\n"
|
3276
|
+
)
|
3277
|
+
|
3278
|
+
os.remove(path_to_txt)
|
3279
|
+
console.print(
|
3280
|
+
f"Removendo o arquivo e enviando os itens para o backoffice... \n"
|
3281
|
+
)
|
3282
|
+
console.print(
|
3283
|
+
f"Itens nao localizados para o fornecedor salvo e retornando como falha no backoffice para correção...\n"
|
3284
|
+
)
|
3285
|
+
return RpaRetornoProcessoDTO(
|
3286
|
+
sucesso=True,
|
3287
|
+
retorno=f"Itens nao localizados para o fornecedor, Mensagem: {conteudo}",
|
3288
|
+
status=RpaHistoricoStatusEnum.Sucesso,
|
3289
|
+
)
|
3290
|
+
else:
|
3291
|
+
console.print(f"Botao Salvar - Não foi encontrado...\n")
|
3292
|
+
return RpaRetornoProcessoDTO(
|
3293
|
+
sucesso=False,
|
3294
|
+
retorno=f"Erro ao processar - Tela de Erros gerados na importação do NF-e - Botao Salvar - Não foi encontrado",
|
3295
|
+
status=RpaHistoricoStatusEnum.Sucesso,
|
3296
|
+
)
|
3297
|
+
except Exception as e:
|
3298
|
+
return RpaRetornoProcessoDTO(
|
3299
|
+
sucesso=False,
|
3300
|
+
retorno=f"Erro ao processar - Tela de Erros gerados na importação do NF-e, {e}",
|
3301
|
+
status=RpaHistoricoStatusEnum.Falha,
|
3199
3302
|
)
|
@@ -6,6 +6,7 @@ worker_automate_hub/api/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
6
6
|
worker_automate_hub/api/helpers/api_helpers.py,sha256=SkheO2fXexeh-a4shr8Qzsz_kZhuSG0DJ7kbODctRbM,3696
|
7
7
|
worker_automate_hub/api/rpa_fila_service.py,sha256=DxBEghdoF2DZQDnkThEEQDkoak4yVRM9kooV1fm0syg,2102
|
8
8
|
worker_automate_hub/api/rpa_historico_service.py,sha256=WhTMVW-uNlJO3YZakhx63xlsw3_XDeWnSD-3MVEzzdk,4763
|
9
|
+
worker_automate_hub/api/webhook_service.py,sha256=9KvTv1U02CSYpf_vLnqs4RZqZzR7Mn0v1OVOI451yOM,1762
|
9
10
|
worker_automate_hub/cli.py,sha256=JB45pjPJ8_E-4xw0OjqDMcAw-tpDV0mjmvwJRTnTzY0,6862
|
10
11
|
worker_automate_hub/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
12
|
worker_automate_hub/config/settings.py,sha256=4BkIYV0C9C_tl68WNfw3aoywr1-_bRJsKysSnSRALT0,2450
|
@@ -49,7 +50,7 @@ worker_automate_hub/tasks/jobs/entrada_de_notas_36.py,sha256=vFkDcgJ9uxrMMLYdeON
|
|
49
50
|
worker_automate_hub/tasks/jobs/entrada_de_notas_39.py,sha256=r4q3QRwho0GsX2Lo6HBenQyMIEQO6EaqlaQQ9ee80m8,32796
|
50
51
|
worker_automate_hub/tasks/jobs/entrada_de_notas_500.py,sha256=MYPaYAP2iwdBYDZUf39f7yGibTME9uObEash_QTCmFA,32231
|
51
52
|
worker_automate_hub/tasks/jobs/entrada_de_notas_505.py,sha256=jIml8gjXPdI6_x7S9VVV8IrKZRF7_PTNOMnhNmYMDTU,14490
|
52
|
-
worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py,sha256=
|
53
|
+
worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py,sha256=oxH2CUJj3UyhYoSxEY2hUr_6wFgZPLcHswEbApIu8VY,15558
|
53
54
|
worker_automate_hub/tasks/jobs/entrada_de_notas_9.py,sha256=Urt_7dZNuyUkSyG9fYb2ArBXzEONXlrqWIesoXeL1EI,50984
|
54
55
|
worker_automate_hub/tasks/jobs/exemplo_processo.py,sha256=3-zxbb-9YHPmSA_K1Qgxp_FwSqg2QDjGBRCLxDZ8QoQ,3451
|
55
56
|
worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py,sha256=mZ6mCaz1lYmyFxwC8MVLXPsgynE1VkNKlEzYGsciDiY,10179
|
@@ -59,17 +60,17 @@ worker_automate_hub/tasks/jobs/playground.py,sha256=bdnXv3C7WLQUxt4edGZDfAbRJJ2-
|
|
59
60
|
worker_automate_hub/tasks/jobs/sped_fiscal.py,sha256=_byvD7i_N3pgPjQd1lc0XNKCFONIPbmvX3_jq5AnbKY,26707
|
60
61
|
worker_automate_hub/tasks/jobs/transferencias.py,sha256=zwCbVTwX15SCeLtvYgAyENeUSIuETx4Z9Cysr1Es8Jo,38013
|
61
62
|
worker_automate_hub/tasks/task_definitions.py,sha256=2Jp1H4_qJZqqGyaP6MA87KLt4QNrtWBYWbXu-2gymFo,4459
|
62
|
-
worker_automate_hub/tasks/task_executor.py,sha256=
|
63
|
+
worker_automate_hub/tasks/task_executor.py,sha256=B5tHhktA0eWYbx5bFWIrIBKU2iWsHGzaYS8QZ4KjSHo,9462
|
63
64
|
worker_automate_hub/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
65
|
worker_automate_hub/utils/env.py,sha256=TacQjGRO7PUNpttrhTAc5Gnegaiysl2Knsv1P8qfkfs,57
|
65
66
|
worker_automate_hub/utils/get_creds_gworkspace.py,sha256=ZJ0IIEjM4IXIV9rwfbOZ1V1wiaMoJAGZeSy0D37sYdU,2212
|
66
67
|
worker_automate_hub/utils/logger.py,sha256=FYV9fg0_RAYJF_ZOCJEbqQAiCXlXk2gMpvUU1rzT_xs,671
|
67
68
|
worker_automate_hub/utils/toast.py,sha256=xPHc5r5uOxB_cZlCzm13Kt2qSKLLFZALncU6Qg3Ft68,1162
|
68
69
|
worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbVlwDl49Y,7972
|
69
|
-
worker_automate_hub/utils/util.py,sha256=
|
70
|
+
worker_automate_hub/utils/util.py,sha256=h0AoZgFND72mR0HufpvT0KB-QBa5lRml0pDKh_7pyrI,125955
|
70
71
|
worker_automate_hub/utils/utils_nfe_entrada.py,sha256=p5r_L5k7gqCBvV8v6dbLFM6INKiSpGc4Gegid0_YAh4,29017
|
71
72
|
worker_automate_hub/worker.py,sha256=tftQpX8liC-_0_bOUf1YYzXSCvloMQBvjmQ6lzfEE-c,4816
|
72
|
-
worker_automate_hub-0.4.
|
73
|
-
worker_automate_hub-0.4.
|
74
|
-
worker_automate_hub-0.4.
|
75
|
-
worker_automate_hub-0.4.
|
73
|
+
worker_automate_hub-0.4.447.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
|
74
|
+
worker_automate_hub-0.4.447.dist-info/METADATA,sha256=C5PY7SvzFlnrrdFBhCf0vxBXyfRwi2-59whX-t6Bul4,2895
|
75
|
+
worker_automate_hub-0.4.447.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
76
|
+
worker_automate_hub-0.4.447.dist-info/RECORD,,
|
File without changes
|
{worker_automate_hub-0.4.445.dist-info → worker_automate_hub-0.4.447.dist-info}/entry_points.txt
RENAMED
File without changes
|