worker-automate-hub 0.4.415__tar.gz → 0.4.417__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/pyproject.toml +1 -1
  3. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +37 -28
  4. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +114 -1
  5. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +42 -31
  6. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/README.md +0 -0
  7. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/__init__.py +0 -0
  8. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/__init__.py +0 -0
  9. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/ahead_service.py +0 -0
  10. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/client.py +0 -0
  11. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/helpers/__init__.py +0 -0
  12. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  13. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  14. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/cli.py +0 -0
  15. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/config/__init__.py +0 -0
  16. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/config/settings.py +0 -0
  17. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/config.py +0 -0
  18. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/core/so_manipulation.py +0 -0
  19. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/__init__.py +0 -0
  20. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/deprecation.py +0 -0
  21. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/rate_limit.py +0 -0
  22. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/repeat.py +0 -0
  23. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/retry.py +0 -0
  24. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/singleton.py +0 -0
  25. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/decorators/timeit.py +0 -0
  26. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/__init__.py +0 -0
  27. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dao/__init__.py +0 -0
  28. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  29. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  30. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  31. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dto/__init__.py +0 -0
  32. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  33. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  34. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  35. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/__init__.py +0 -0
  36. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  37. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  38. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  39. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  40. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  41. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  42. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  43. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  44. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  45. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  46. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  47. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  48. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  49. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  50. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  51. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  52. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  53. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  54. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  55. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  56. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  57. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  58. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  59. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  60. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  61. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  62. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/task_definitions.py +0 -0
  63. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/tasks/task_executor.py +0 -0
  64. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/__init__.py +0 -0
  65. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/env.py +0 -0
  66. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  67. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/logger.py +0 -0
  68. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/toast.py +0 -0
  69. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/updater.py +0 -0
  70. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/util.py +0 -0
  71. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  72. {worker_automate_hub-0.4.415 → worker_automate_hub-0.4.417}/worker_automate_hub/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: worker-automate-hub
3
- Version: 0.4.415
3
+ Version: 0.4.417
4
4
  Summary: Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta.
5
5
  Author: Joel Paim
6
6
  Requires-Python: >=3.12,<4.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "worker-automate-hub"
3
- version = "0.4.415"
3
+ version = "0.4.417"
4
4
  description = "Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta."
5
5
  authors = ["Joel Paim"]
6
6
  readme = "README.md"
@@ -521,36 +521,36 @@ async def entrada_de_notas_39(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
521
521
 
522
522
  select_box_nop_select = main_window.child_window(class_name="TDBIComboBox", found_index=0)
523
523
  select_box_nop_select.click()
524
- nop_value = "1152 - ENTRADAS P/ TRANSFERENCIAS DE MERCADORIA- 1.152"
524
+ pyautogui.write("1152")
525
+ await worker_sleep(2)
526
+ pyautogui.hotkey("enter")
525
527
  await worker_sleep(2)
526
- set_combobox("||List", nop_value)
527
- await worker_sleep(1)
528
- pyautogui.press('down')
529
528
 
530
- nop_selected = select_box_nop_select.window_text()
531
- if '1152' in nop_selected:
532
- console.print(f"NOP selecionada corretamente, {nop_selected} ...\n")
533
- else:
534
- select_box_nop_select.click()
535
- console.print(f"Inserindo a informação da NOP: {nop_value} ...\n")
536
- await worker_sleep(2)
537
- set_combobox("||List", nop_value)
538
- await worker_sleep(2)
539
- pyautogui.hotkey("enter")
540
- await worker_sleep(2)
541
- console.print(f"Confirmando a NOP selecionada...\n")
542
- main_window.set_focus()
543
- await worker_sleep(1)
529
+ max_try = 10
530
+ i = 0
531
+ first_nop = False
532
+ while i <= max_try:
544
533
  select_box_nop_select = main_window.child_window(class_name="TDBIComboBox", found_index=0)
545
534
  nop_selected = select_box_nop_select.window_text()
546
- if '1152' in nop_selected:
547
- console.print(f"NOP selecionada corretamente, {nop_selected} ...\n")
535
+ if '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' == nop_selected and first_nop == False:
536
+ first_nop = True
548
537
  else:
549
- return RpaRetornoProcessoDTO(
550
- sucesso=False,
551
- retorno=f"Erro não foi possivel selecionar NOP correta, NOP selecionada: {nop_selected}",
552
- status=RpaHistoricoStatusEnum.Falha,
553
- )
538
+ if '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' == nop_selected:
539
+ break
540
+
541
+ pyautogui.press('down')
542
+ await worker_sleep(2)
543
+ i = i + 1
544
+
545
+
546
+ if i <= max_try and first_nop:
547
+ console.print(f"A segunda correspondência '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' foi encontrada e selecionada.")
548
+ else:
549
+ return RpaRetornoProcessoDTO(
550
+ sucesso=False,
551
+ retorno=f"Erro não foi encontrada a segunda correspondência dentro do número máximo de tentativas ({max_try})",
552
+ status=RpaHistoricoStatusEnum.Falha,
553
+ )
554
554
 
555
555
  await emsys.incluir_registro()
556
556
  await worker_sleep(10)
@@ -589,8 +589,7 @@ async def entrada_de_notas_39(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
589
589
  sucesso=True,
590
590
  retorno="Nota Lançada com sucesso!",
591
591
  status=RpaHistoricoStatusEnum.Sucesso,
592
- )
593
-
592
+ )
594
593
  except Exception as e:
595
594
  select_box_nop_select.click()
596
595
  return RpaRetornoProcessoDTO(
@@ -709,7 +708,17 @@ async def entrada_de_notas_39(task: RpaProcessoEntradaDTO) -> RpaRetornoProcesso
709
708
  app = Application().connect(class_name="TFrmTelaSelecao")
710
709
  main_window = app["TFrmTelaSelecao"]
711
710
  send_keys("%o")
712
- await worker_sleep(3)
711
+ await worker_sleep(7)
712
+
713
+ # VERIFICANDO A EXISTENCIA DE ERRO
714
+ erro_pop_up = await is_window_open("Erro")
715
+ if erro_pop_up["IsOpened"] == True:
716
+ error_work = await error_after_xml_imported()
717
+ return RpaRetornoProcessoDTO(
718
+ sucesso=False,
719
+ retorno=error_work.retorno,
720
+ status=RpaHistoricoStatusEnum.Falha,
721
+ )
713
722
 
714
723
  max_attempts = 50
715
724
  i = 0
@@ -523,8 +523,121 @@ async def entrada_de_notas_500(task: RpaProcessoEntradaDTO) -> RpaRetornoProcess
523
523
  app = Application().connect(class_name="TFrmTelaSelecao")
524
524
  main_window = app["TFrmTelaSelecao"]
525
525
  send_keys("%o")
526
-
527
526
 
527
+
528
+ await worker_sleep(7)
529
+ aviso_pop_up = await is_window_open("Aviso")
530
+ if aviso_pop_up["IsOpened"] == True:
531
+ app = Application().connect(title="Aviso")
532
+ main_window = app["Aviso"]
533
+ main_window.set_focus()
534
+
535
+ console.print(f"Clicando em Aviso, para andamento do processo...\n")
536
+ btn_no = main_window.child_window(title="OK")
537
+ if btn_no.exists(timeout=5) and btn_no.is_enabled():
538
+ btn_no.set_focus()
539
+ btn_no.click()
540
+ await worker_sleep(2)
541
+
542
+ try:
543
+ pyautogui.click(623, 374)
544
+ await worker_sleep(1)
545
+ pyautogui.press('home')
546
+ console.print("Alterando a NOP...\n")
547
+
548
+ app = Application().connect(class_name="TFrmNotaFiscalEntrada", timeout=30)
549
+ main_window = app["TFrmNotaFiscalEntrada"]
550
+ main_window.set_focus()
551
+
552
+ select_box_nop_select = main_window.child_window(class_name="TDBIComboBox", found_index=0)
553
+ select_box_nop_select.click()
554
+ pyautogui.write("1152")
555
+ await worker_sleep(2)
556
+ pyautogui.hotkey("enter")
557
+ await worker_sleep(2)
558
+
559
+ max_try = 10
560
+ i = 0
561
+ first_nop = False
562
+ while i <= max_try:
563
+ select_box_nop_select = main_window.child_window(class_name="TDBIComboBox", found_index=0)
564
+ nop_selected = select_box_nop_select.window_text()
565
+ if '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' == nop_selected and first_nop == False:
566
+ first_nop = True
567
+ else:
568
+ if '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' == nop_selected:
569
+ break
570
+
571
+ pyautogui.press('down')
572
+ await worker_sleep(2)
573
+ i = i + 1
574
+
575
+
576
+ if i <= max_try and first_nop:
577
+ console.print(f"A segunda correspondência '1152 - ENTRADAS P/ TRANSFERENCIA DE MERCADORIAS- 1.152' foi encontrada e selecionada.")
578
+ else:
579
+ return RpaRetornoProcessoDTO(
580
+ sucesso=False,
581
+ retorno=f"Erro não foi encontrada a segunda correspondência dentro do número máximo de tentativas ({max_try})",
582
+ status=RpaHistoricoStatusEnum.Falha,
583
+ )
584
+
585
+ try:
586
+ ASSETS_PATH = "assets"
587
+ inserir_registro = pyautogui.locateOnScreen(
588
+ ASSETS_PATH + "\\entrada_notas\\IncluirRegistro.png", confidence=0.8
589
+ )
590
+ pyautogui.click(inserir_registro)
591
+ except Exception as e:
592
+ console.print(
593
+ f"Não foi possivel incluir o registro utilizando reconhecimento de imagem, Error: {e}...\n tentando inserir via posição...\n"
594
+ )
595
+ await incluir_registro()
596
+ await worker_sleep(10)
597
+
598
+ console.print("Verificando a existencia de POP-UP de Itens que Ultrapassam a Variação Máxima de Custo ...\n")
599
+ itens_variacao_maxima = await is_window_open_by_class("TFrmTelaSelecao", "TFrmTelaSelecao")
600
+ if itens_variacao_maxima["IsOpened"] == True:
601
+ app = Application().connect(class_name="TFrmTelaSelecao")
602
+ main_window = app["TFrmTelaSelecao"]
603
+ send_keys("%o")
604
+ await worker_sleep(7)
605
+
606
+ aviso_pop_up = await is_window_open("Aviso")
607
+ if aviso_pop_up["IsOpened"] == True:
608
+ return RpaRetornoProcessoDTO(
609
+ sucesso=False,
610
+ retorno=f"Erro na validação de CFOP, foi encontrado mais de uma opção com a mesma informação",
611
+ status=RpaHistoricoStatusEnum.Falha,
612
+ )
613
+
614
+ console.print("Verificando a existencia de Warning informando que a Soma dos pagamentos não bate com o valor da nota. ...\n")
615
+ warning_pop_up_pagamentos = await is_window_open("Warning")
616
+ if warning_pop_up_pagamentos["IsOpened"] == True:
617
+ return RpaRetornoProcessoDTO(
618
+ sucesso=False,
619
+ retorno=f"A soma dos pagamentos não bate com o valor da nota.",
620
+ status=RpaHistoricoStatusEnum.Falha,
621
+ )
622
+
623
+ await worker_sleep(60)
624
+ console.print("\nVerifica se a nota ja foi lançada...")
625
+ nf_chave_acesso = int(nota.get("nfe"))
626
+ status_nf_emsys = await get_status_nf_emsys(nf_chave_acesso)
627
+ if status_nf_emsys.get("status") == "Lançada":
628
+ return RpaRetornoProcessoDTO(
629
+ sucesso=True,
630
+ retorno="Nota Lançada com sucesso!",
631
+ status=RpaHistoricoStatusEnum.Sucesso,
632
+ )
633
+ except Exception as e:
634
+ select_box_nop_select.click()
635
+ return RpaRetornoProcessoDTO(
636
+ sucesso=False,
637
+ retorno=f"Erro ao alterar o NOP, erro {e}",
638
+ status=RpaHistoricoStatusEnum.Falha,
639
+ )
640
+
528
641
  # Verificando se possui pop-up de Warning
529
642
  await worker_sleep(6)
530
643
  warning_pop_up = await is_window_open("Warning")
@@ -7,7 +7,7 @@ import pyautogui
7
7
  import pytesseract
8
8
  from datetime import datetime, timedelta
9
9
  from pywinauto.application import Application
10
- from PIL import Image, ImageEnhance
10
+ from PIL import Image, ImageEnhance, ImageFilter
11
11
  from pywinauto.keyboard import send_keys
12
12
  import win32clipboard
13
13
  from pywinauto_recorder.player import set_combobox
@@ -461,39 +461,50 @@ async def entrada_de_notas_9(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
461
461
  if distribuiu_algo:
462
462
  console.print(f"Extraindo informação da Janela de Distribuir Itens para realização do OCR...\n")
463
463
 
464
- main_window.set_focus()
465
- window_rect = main_window.rectangle()
466
- screenshot = pyautogui.screenshot(
467
- region=(
468
- window_rect.left,
469
- window_rect.top,
470
- window_rect.width(),
471
- window_rect.height(),
464
+ max_attempts = 3
465
+ attempts = 0
466
+ resultado = None
467
+ while attempts < max_attempts:
468
+ main_window.set_focus()
469
+ window_rect = main_window.rectangle()
470
+ screenshot = pyautogui.screenshot(
471
+ region=(
472
+ window_rect.left,
473
+ window_rect.top,
474
+ window_rect.width(),
475
+ window_rect.height(),
476
+ )
472
477
  )
473
- )
474
- username = getpass.getuser()
475
- path_to_png = f"C:\\Users\\{username}\\Downloads\\distribuir_iten_{nota.get("nfe")}.png"
476
- screenshot.save(path_to_png)
477
- console.print(f"Print salvo em {path_to_png}...\n")
478
+ username = getpass.getuser()
479
+ path_to_png = f"C:\\Users\\{username}\\Downloads\\distribuir_iten_{nota.get("nfe")}.png"
480
+ screenshot.save(path_to_png)
481
+ console.print(f"Print salvo em {path_to_png}...\n")
478
482
 
479
- console.print(
480
- f"Preparando a imagem para maior resolução e assertividade no OCR...\n"
481
- )
482
- image = Image.open(path_to_png)
483
- image = image.convert("L")
484
- enhancer = ImageEnhance.Contrast(image)
485
- image = enhancer.enhance(2.0)
486
- image.save(path_to_png)
487
- console.print(f"Imagem preparada com sucesso...\n")
488
- console.print(f"Realizando OCR...\n")
489
- captured_text = pytesseract.image_to_string(Image.open(path_to_png))
490
- console.print(
491
- f"Texto Full capturado {captured_text}...\n"
492
- )
493
- os.remove(path_to_png)
483
+ console.print(
484
+ f"Preparando a imagem para maior resolução e assertividade no OCR...\n"
485
+ )
486
+ image = Image.open(path_to_png)
487
+ image = image.filter(ImageFilter.SHARPEN)
488
+ image = image.convert("L")
489
+ enhancer = ImageEnhance.Contrast(image)
490
+ image = enhancer.enhance(2.0)
491
+ image.save(path_to_png)
492
+ console.print(f"Imagem preparada com sucesso...\n")
493
+ console.print(f"Realizando OCR...\n")
494
+ await worker_sleep(1)
495
+ captured_text = pytesseract.image_to_string(Image.open(path_to_png))
496
+ console.print(
497
+ f"Texto Full capturado {captured_text}...\n"
498
+ )
499
+ os.remove(path_to_png)
494
500
 
495
- pattern_qtd_restante = r"Quantidade restante:\s([\d,]+)"
496
- resultado = re.search(pattern_qtd_restante, captured_text)
501
+ pattern_qtd_restante = r"Quantidade restante:\s([\d,]+)"
502
+ resultado = re.search(pattern_qtd_restante, captured_text)
503
+ if resultado:
504
+ break
505
+ else:
506
+ await worker_sleep(2)
507
+ attempts += 1
497
508
 
498
509
  try:
499
510
  if resultado: