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.
@@ -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
- await worker_sleep(4)
280
- console.print(
281
- "Verificando a existencia de POP-UP de Itens não localizados ou NCM ...\n"
282
- )
283
- itens_by_supplier = await is_window_open_by_class("TFrmAguarde", "TMessageForm")
284
- if itens_by_supplier["IsOpened"] == True:
285
- itens_by_supplier_work = await itens_not_found_supplier(nota["nfe"])
286
- if itens_by_supplier_work["window"] == "NCM":
287
- console.log(itens_by_supplier_work["retorno"], style="bold green")
288
- else:
289
- return {
290
- "sucesso": False,
291
- "retorno": f"{itens_by_supplier_work['retorno']}",
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
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: worker-automate-hub
3
- Version: 0.4.445
3
+ Version: 0.4.447
4
4
  Summary: Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta.
5
5
  Author: Joel Paim
6
6
  Requires-Python: >=3.12,<4.0
@@ -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=DOyf0A7BSggD8KgzZ66dtfwhOeEhztylpQAy9RCEnxE,14651
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=_PredamXAISIHpw7R-S0VgLbaO8lyG_z2BdUxtOrcg8,8921
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=SWpivcmtSH-4RVwjupyyE8wpRcuFlOlGq3_Z29gvUPM,121845
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.445.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
73
- worker_automate_hub-0.4.445.dist-info/METADATA,sha256=-oJMTPOMZAQPgl7VRBiCBbAMf8h32yn11ISzfxC029U,2895
74
- worker_automate_hub-0.4.445.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
75
- worker_automate_hub-0.4.445.dist-info/RECORD,,
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,,