worker-automate-hub 0.5.671__tar.gz → 0.5.673__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of worker-automate-hub might be problematic. Click here for more details.

Files changed (104) hide show
  1. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/pyproject.toml +1 -1
  3. worker_automate_hub-0.5.673/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +495 -0
  4. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +53 -33
  5. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +35 -5
  6. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/util.py +30 -34
  7. worker_automate_hub-0.5.671/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +0 -298
  8. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/README.md +0 -0
  9. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/__init__.py +0 -0
  10. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/__init__.py +0 -0
  11. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/ahead_service.py +0 -0
  12. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/client.py +0 -0
  13. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/datalake_service.py +0 -0
  14. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/helpers/__init__.py +0 -0
  15. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  16. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/rdp_service.py +0 -0
  17. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/rpa_fila_service.py +0 -0
  18. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  19. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/api/webhook_service.py +0 -0
  20. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/cli.py +0 -0
  21. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/config/__init__.py +0 -0
  22. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/config/settings.py +0 -0
  23. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/config.py +0 -0
  24. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/core/so_manipulation.py +0 -0
  25. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/__init__.py +0 -0
  26. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/deprecation.py +0 -0
  27. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/rate_limit.py +0 -0
  28. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/repeat.py +0 -0
  29. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/retry.py +0 -0
  30. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/singleton.py +0 -0
  31. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/decorators/timeit.py +0 -0
  32. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/__init__.py +0 -0
  33. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/__init__.py +0 -0
  34. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  35. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
  36. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  37. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  38. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
  39. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/__init__.py +0 -0
  40. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  41. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  42. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
  43. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
  44. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  45. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/__init__.py +0 -0
  46. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  47. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  48. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
  49. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
  50. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
  51. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  52. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
  53. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
  54. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  55. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  56. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  57. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  58. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  59. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  60. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
  61. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
  62. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  63. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  64. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  65. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  66. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  67. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  68. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  69. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  70. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
  71. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  72. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  73. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
  74. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
  75. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  76. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
  77. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
  78. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
  79. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
  80. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  81. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  82. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
  83. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
  84. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
  85. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
  86. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
  87. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
  88. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
  89. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  90. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
  91. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
  92. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  93. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  94. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  95. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/task_definitions.py +0 -0
  96. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/tasks/task_executor.py +0 -0
  97. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/__init__.py +0 -0
  98. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/env.py +0 -0
  99. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  100. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/logger.py +0 -0
  101. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/toast.py +0 -0
  102. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/updater.py +0 -0
  103. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  104. {worker_automate_hub-0.5.671 → worker_automate_hub-0.5.673}/worker_automate_hub/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: worker-automate-hub
3
- Version: 0.5.671
3
+ Version: 0.5.673
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.5.671"
3
+ version = "0.5.673"
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"
@@ -0,0 +1,495 @@
1
+ import time
2
+ import pyautogui
3
+ from datetime import datetime
4
+ import sys
5
+ import os
6
+ import sys
7
+ import os
8
+ from pywinauto.keyboard import send_keys
9
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
10
+
11
+
12
+ from worker_automate_hub.utils.logger import logger
13
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
14
+ RpaHistoricoStatusEnum,
15
+ RpaRetornoProcessoDTO,
16
+ RpaTagDTO,
17
+ RpaTagEnum,
18
+ )
19
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
20
+ RpaProcessoEntradaDTO,
21
+ )
22
+
23
+ from worker_automate_hub.api.client import get_config_by_name
24
+ from pywinauto import Application
25
+ from rich.console import Console
26
+ from worker_automate_hub.utils.util import (
27
+ is_window_open_by_class,
28
+ kill_all_emsys,
29
+ login_emsys_fiscal,
30
+ type_text_into_field,
31
+ worker_sleep,
32
+ )
33
+ from worker_automate_hub.utils.utils_nfe_entrada import EMSys
34
+ import pyperclip
35
+ import warnings
36
+ import asyncio
37
+ from worker_automate_hub.decorators.repeat import repeat
38
+ from pytesseract import image_to_string
39
+ from pywinauto import Desktop
40
+
41
+ pyautogui.PAUSE = 0.5
42
+ pyautogui.FAILSAFE = False
43
+
44
+ console = Console()
45
+
46
+ emsys = EMSys()
47
+
48
+
49
+ @repeat(times=10, delay=5)
50
+ async def wait_aguarde_window_closed(app, timeout=60):
51
+ console.print("Verificando existencia de aguarde...")
52
+ start_time = time.time()
53
+
54
+ while time.time() - start_time < timeout:
55
+ janela_topo = app.top_window()
56
+ titulo = janela_topo.window_text()
57
+ console.print(f"Titulo da janela top: ${titulo}")
58
+ await emsys.verify_warning_and_error("Aviso", "&Ok")
59
+ await worker_sleep(2)
60
+
61
+ if "Gerar Registros" in titulo or "Movimento de Livro Fiscal" in titulo:
62
+ console.log("Fim de aguardando...")
63
+ return
64
+ else:
65
+ console.log("Aguardando...")
66
+
67
+ console.log("Timeout esperando a janela Aguarde...")
68
+
69
+
70
+ def click_desconfirmar():
71
+ cords = (675, 748)
72
+ pyautogui.click(x=cords[0], y=cords[1])
73
+
74
+
75
+ def ctrl_c():
76
+ pyautogui.press("tab", presses=12) # verificar
77
+ pyautogui.hotkey("ctrl", "c")
78
+ return pyperclip.paste()
79
+
80
+
81
+ async def abertura_livros_fiscais(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
82
+ try:
83
+ config = await get_config_by_name("login_emsys_fiscal")
84
+
85
+ # Fecha a instancia do emsys - caso esteja aberta
86
+ await kill_all_emsys()
87
+
88
+ app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\EMSysFiscal.exe")
89
+ warnings.filterwarnings(
90
+ "ignore",
91
+ category=UserWarning,
92
+ message="32-bit application should be automated using 32-bit Python",
93
+ )
94
+
95
+ await worker_sleep(4)
96
+
97
+ try:
98
+ app = Application(backend="win32").connect(
99
+ class_name="TFrmLoginModulo", timeout=50
100
+ )
101
+ except:
102
+ return RpaRetornoProcessoDTO(
103
+ sucesso=False,
104
+ retorno="Erro ao abrir o EMSys Fiscal, tela de login não encontrada",
105
+ status=RpaHistoricoStatusEnum.Falha,
106
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
107
+ )
108
+ return_login = await login_emsys_fiscal(config.conConfiguracao, app, task)
109
+ if return_login.sucesso:
110
+ try:
111
+ ##### Janela Confirm #####
112
+ app = Application().connect(class_name="TMessageForm", timeout=5)
113
+ main_window = app["TMessageForm"]
114
+ main_window.set_focus()
115
+
116
+ # Clicar em Não
117
+ console.print("Navegando nos elementos...\n")
118
+ main_window.child_window(class_name="TButton", found_index=0).click()
119
+ await worker_sleep(2)
120
+ except:
121
+ pass
122
+
123
+ ##### Janela Principal ####
124
+ console.print("Navegando para Livros Fiscais")
125
+ app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
126
+ main_window = app["TFrmPrincipalFiscal"]
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
+
134
+ try:
135
+ ##### Janela Confirm #####
136
+ app = Application().connect(class_name="TMessageForm", timeout=5)
137
+ main_window = app["TMessageForm"]
138
+ main_window.set_focus()
139
+
140
+ # Clicar em Não
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()
149
+ pyautogui.press("enter")
150
+ await worker_sleep(2)
151
+ pyautogui.press("down")
152
+ await worker_sleep(2)
153
+ pyautogui.press("enter")
154
+ console.print(
155
+ "\nPesquisa: 'Livros Fiscais' realizada com sucesso.",
156
+ style="bold green",
157
+ )
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
+
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
+ await worker_sleep(2)
187
+ pyautogui.press("enter")
188
+ console.print(
189
+ "\nPesquisa: 'Livros Fiscais' realizada com sucesso.",
190
+ style="bold green",
191
+ )
192
+
193
+ await worker_sleep(10)
194
+
195
+ ##### janela Movimento de Livro Fiscal #####
196
+ app = Application().connect(class_name="TFrmMovtoLivroFiscal", timeout=20)
197
+ main_window = app["TFrmMovtoLivroFiscal"]
198
+ main_window.set_focus()
199
+ data_input = main_window.child_window(class_name="TDBIEditDate", found_index=0)
200
+ competencia = task.configEntrada.get("periodo")
201
+ type_text_into_field(
202
+ competencia, data_input, True, "50"
203
+ )
204
+
205
+ # Preenchendo campo competencia
206
+ console.print("Preenchendo campo competencia...")
207
+ pyautogui.press("tab")
208
+ competencia = task.configEntrada.get("periodo")
209
+ pyautogui.write(competencia)
210
+ await worker_sleep(3)
211
+
212
+ # Marcando caixa Entrada
213
+ console.print("Marcando caixa entrada")
214
+ entrada = main_window.child_window(class_name="TcxCheckBox", found_index=9).click_input()
215
+
216
+ # Marcando caixa Saida
217
+ console.print("Marcando caixa saida")
218
+ saida = main_window.child_window(class_name="TcxCheckBox", found_index=8).click_input()
219
+
220
+ await worker_sleep(2)
221
+
222
+ # Clicando em incluir livro
223
+ try:
224
+ console.print("Clicando em incluir livro")
225
+ cords = (695, 729)
226
+ pyautogui.click(x=cords[0], y=cords[1])
227
+ await worker_sleep(5)
228
+ except:
229
+ return RpaRetornoProcessoDTO(
230
+ sucesso=False,
231
+ retorno=f"Erro ao clicar em botão de incluir livro.",
232
+ status=RpaHistoricoStatusEnum.Falha,
233
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
234
+ )
235
+
236
+ ##### Janela Pergunta das Geração dos Livros Fiscais #####
237
+ await worker_sleep(5)
238
+ app = Application().connect(class_name="TPerguntasLivrosFiscaisForm", timeout=20)
239
+ main_window = app["TPerguntasLivrosFiscaisForm"]
240
+ 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
+
244
+ await worker_sleep(1)
245
+ send_keys("Sim{ENTER}")
246
+ await worker_sleep(2)
247
+
248
+ 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
+
258
+ await worker_sleep(1)
259
+ send_keys("Sim{ENTER}")
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()
271
+
272
+ await worker_sleep(1)
273
+ send_keys("Sim{ENTER}")
274
+
275
+ await worker_sleep(2)
276
+
277
+ # Clicar em confirmar
278
+ main_window.child_window(class_name="TButton", found_index=1).click_input()
279
+
280
+ await worker_sleep(5)
281
+ ##### Janela Gerar Registro ####
282
+ console.print("Confirmar Registro")
283
+ app = Application().connect(title="Gerar Registros", timeout=60)
284
+ main_window = app["Gerar Registros"]
285
+ main_window.set_focus()
286
+
287
+ # Clicar em Sim
288
+ main_window.child_window(class_name="Button", found_index=0).click_input()
289
+
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
+ await worker_sleep(5)
299
+
300
+ ##### Janela Pré-visualizando Relatório #####
301
+ console.print("Fechar Janela Pré-visualizando Relatório ")
302
+ app = Application().connect(class_name="TFrmPreviewRelatorio", timeout=60)
303
+ main_window = app["TFrmPreviewRelatorio"]
304
+ main_window.set_focus()
305
+
306
+ # Clicar em fechar
307
+ main_window.close()
308
+
309
+ await worker_sleep(3)
310
+
311
+ ##### Janela Principal ####
312
+ console.print("Navegando para Livro de Apuração ICMS... ")
313
+ app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
314
+ input_principal = main_window = app["TFrmPrincipalFiscal"]
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)
321
+
322
+ try:
323
+ ##### Janela Confirm #####
324
+ app = Application().connect(class_name="TMessageForm", timeout=60)
325
+ main_window = app["TMessageForm"]
326
+ main_window.set_focus()
327
+ main_window.child_window(class_name="TButton", found_index=0).click_input()
328
+ except:
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")
333
+ await worker_sleep(1)
334
+ pyautogui.press("enter")
335
+
336
+ await worker_sleep(5)
337
+
338
+ ##### Janela Movimentação de Apuração ICMS #####
339
+ app = Application().connect(class_name="TFrmMovtoApuraIcmsNew", timeout=60)
340
+ main_window = app["TFrmMovtoApuraIcmsNew"]
341
+ main_window.set_focus()
342
+
343
+ console.print("Clicando no último livro, primeira linha")
344
+ pyautogui.click(599,410)
345
+
346
+ await worker_sleep(1)
347
+
348
+ console.print("Clicando em Estornar Livro")
349
+ pyautogui.click(667,742)
350
+
351
+ await worker_sleep(3)
352
+
353
+ main_window.close()
354
+
355
+ await worker_sleep(2)
356
+
357
+ console.print("Selecionar Livro Saída aberto")
358
+
359
+ # Selecionar linha livro de saída aberto
360
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\livro_saida_aberto.png"
361
+
362
+ # Tenta localizar a imagem na tela
363
+ localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9)
364
+
365
+ if localizacao:
366
+ print(f"Imagem livro de saída aberto encontrado em: {localizacao}")
367
+ pyautogui.moveTo(localizacao)
368
+ pyautogui.click()
369
+ else:
370
+ console.print("Imagem livro de saída aberto não encontrado na tela.")
371
+
372
+ # Clicar em alterar livro
373
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\alterar_livro.png"
374
+
375
+ # Tenta localizar a imagem na tela
376
+ localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
377
+
378
+ if localizacao:
379
+ print(f"Imagem alterar livro encontrado em: {localizacao}")
380
+ pyautogui.moveTo(localizacao)
381
+ pyautogui.click()
382
+ else:
383
+ console.print("Imagem alterar livro não encontrada na tela.")
384
+
385
+ await worker_sleep(4)
386
+
387
+ # Clicar em Livro fiscal
388
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\livro_fiscal.png"
389
+
390
+ # Tenta localizar a imagem na tela
391
+ localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
392
+
393
+ if localizacao:
394
+ print(f"Imagem Livro fiscal encontrado em: {localizacao}")
395
+ pyautogui.moveTo(localizacao)
396
+ pyautogui.click()
397
+ else:
398
+ console.print("Imagem Livro fiscal não encontrada na tela.")
399
+
400
+ await worker_sleep(4)
401
+
402
+ # Clicar em Gerar Relatório
403
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\gerar_registros.png"
404
+
405
+ # Tenta localizar a imagem na tela
406
+ localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
407
+
408
+ if localizacao:
409
+ print(f"Imagem gerar relatório encontrado em: {localizacao}")
410
+ pyautogui.moveTo(localizacao)
411
+ pyautogui.click()
412
+ else:
413
+ console.print("Imagem gerar relatório não encontrada na tela.")
414
+
415
+ ##### Janela Gerar Registro ####
416
+ console.print("Confirmar Registro")
417
+ app = Application().connect(class_name="TMsgBox", timeout=60)
418
+ main_window = app["TMsgBox"]
419
+ main_window.set_focus()
420
+
421
+ # Clicar em Sim
422
+ main_window.child_window(class_name="TBitBtn", found_index=1).click_input()
423
+
424
+ await worker_sleep(4)
425
+
426
+ console.print("Clicar em confirmar")
427
+ app = Application().connect(class_name="TPerguntasLivrosFiscaisForm", timeout=60)
428
+ main_window = app["TPerguntasLivrosFiscaisForm"]
429
+ main_window.set_focus()
430
+ main_window.child_window(class_name="TButton", found_index=1).click_input()
431
+
432
+ # Caminho da imagem que deve desaparecer
433
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\janela_carregada.png"
434
+
435
+ # Tempo máximo de espera (em segundos)
436
+ tempo_limite = 600 # 10 minutos
437
+ intervalo = 2 # segundos entre as verificações
438
+
439
+ inicio = time.time()
440
+
441
+ while True:
442
+ localizacao = pyautogui.locateOnScreen(imagem, confidence=0.9)
443
+
444
+ if not localizacao:
445
+ print("Imagem desapareceu da tela.")
446
+ break # A imagem sumiu, podemos seguir
447
+
448
+ if time.time() - inicio > tempo_limite:
449
+ print("Tempo esgotado. A imagem não desapareceu.")
450
+ break
451
+
452
+ print("Imagem ainda presente... aguardando")
453
+ time.sleep(intervalo)
454
+
455
+ ##### Janela Principal ####
456
+ console.print("Navegando para Livro de Apuração ICMS... ")
457
+ app = Application().connect(class_name="TFrmPrincipalFiscal", timeout=60)
458
+ input_principal = main_window = app["TFrmPrincipalFiscal"]
459
+ input_principal.set_focus()
460
+ input_livros = input_principal.child_window(class_name="TEdit", found_index=0)
461
+ type_text_into_field(
462
+ "Livro de Apuração ICMS", input_livros, True, "50"
463
+ )
464
+ await worker_sleep(5)
465
+
466
+ app = Application().connect(class_name="TFrmMovtoApuraIcmsNew", timeout=60)
467
+ main_window = app["TFrmMovtoApuraIcmsNew"]
468
+ main_window.set_focus()
469
+ data_input = main_window.child_window(class_name="TDBIEditDate", found_index=0)
470
+ competencia = competencia #task.configEntrada.get("periodo")
471
+ type_text_into_field(
472
+ competencia, data_input, True, "50"
473
+ )
474
+
475
+ # Clicar em incluir apuração
476
+ imagem = r"C:\Users\automatehub\Documents\GitHub\worker-automate-hub\assets\abertura_livros\btn_incluir_apuracao.png"
477
+
478
+ # Tenta localizar a imagem na tela
479
+ localizacao = pyautogui.locateCenterOnScreen(imagem, confidence=0.9) # você pode ajustar o confidence
480
+
481
+ if localizacao:
482
+ print(f"Imagem incluir apuração encontrado em: {localizacao}")
483
+ pyautogui.moveTo(localizacao)
484
+ pyautogui.click()
485
+ else:
486
+ console.print("Imagem incluir apuração não encontrada na tela.")
487
+
488
+ except Exception as erro:
489
+ console.print(f"Erro ao executar abertura de livros fiscais, erro : {erro}")
490
+ return RpaRetornoProcessoDTO(
491
+ sucesso=False,
492
+ retorno=f"Erro na Abertura de Livro Fiscal : {erro}",
493
+ status=RpaHistoricoStatusEnum.Falha,
494
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
495
+ )
@@ -318,6 +318,7 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
318
318
  main_window.set_focus()
319
319
  modelo_select = main_window.child_window(class_name="TDBIComboBox", found_index=1)
320
320
  modelo_select.click()
321
+ await worker_sleep(3)
321
322
  try:
322
323
  # Verifica mensagem danfe 077
323
324
  imagem_alvo = "assets\\entrada_notas\\danfe077.png"
@@ -375,61 +376,79 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
375
376
  else:
376
377
  field_fornecedor.set_edit_text(cod_empresa)
377
378
  field_fornecedor.click()
378
- pyautogui.press("tab")
379
+ pyautogui.press("enter")
379
380
  await worker_sleep(2)
380
381
 
381
382
 
382
383
  itens = nota.get('itens', [])
383
384
  itens_arla = [item for item in itens if item['descricao'].lower() == 'arla']
384
385
 
385
- #SELECIONAO A NOP
386
+ # SELECIONA A NOP
386
387
  console.print("SELECIONANDO A NOP...\n")
387
388
  select_box_nop_select = main_window.child_window(class_name="TDBIComboBox", found_index=0)
388
389
  select_box_nop_select.click()
389
390
 
391
+ await worker_sleep(3)
392
+
390
393
  itens_to_select = select_box_nop_select.texts()
391
394
  nop_to_be_select = ''
392
395
 
396
+ def normaliza(texto):
397
+ return texto.lower().replace(" ", "").strip()
398
+
399
+ # Função para buscar a NOP com sufixo prioritariamente
400
+ def buscar_nop(itens, codigo, sufixo_normalizado=None):
401
+ for item in itens:
402
+ if codigo in item:
403
+ item_normalizado = normaliza(item)
404
+ if sufixo_normalizado and sufixo_normalizado in item_normalizado:
405
+ return item # prioriza item com sufixo
406
+ for item in itens:
407
+ if codigo in item:
408
+ return item # fallback para item com mesmo código
409
+ return ''
410
+
411
+ # Lógica de seleção da NOP
393
412
  if len(itens_arla) == len(itens):
394
- for item in itens_to_select:
395
- if ('1202' in item and ('s/ est' in item.lower() or 's/est' in item.lower()) and ('c/ fin' in item.lower() or 'c/fin' in item.lower())):
396
- nop_to_be_select = item
397
- break
398
- elif '2202' in item and (('s/ est' in item.lower() or 's/est' in item.lower()) and ('c/ fin' in item.lower() or 'c/fin' in item.lower())):
399
- nop_to_be_select = item
400
- break
401
- else:
402
- for item in itens_to_select:
403
- if uf_posto:
404
- if uf_posto != uf_cliente:
405
- if '2662' in item and (('c/fi' in item.lower() or 'c /fi' in item.lower())):
406
- nop_to_be_select = item
407
- break
408
- else:
409
- if '1662' in item and (('c/fi' in item.lower() or 'c /fi' in item.lower())):
410
- nop_to_be_select = item
411
- break
412
- else:
413
- if '1662' in item and (('c/fi' in item.lower() or 'c /fi' in item.lower())):
414
- nop_to_be_select = item
415
- break
416
-
413
+ nop_to_be_select = buscar_nop(itens_to_select, '1202', 's/estc/fin')
414
+ if not nop_to_be_select:
415
+ nop_to_be_select = buscar_nop(itens_to_select, '2202', 's/estc/fin')
416
+ else:
417
+ if uf_posto and uf_posto != uf_cliente:
418
+ nop_to_be_select = buscar_nop(itens_to_select, '2662', 'devcombc/fi')
419
+ else:
420
+ nop_to_be_select = buscar_nop(itens_to_select, '1662', 'devcombc/fi')
417
421
 
422
+ # Se encontrou, faz a seleção precisa no combobox
418
423
  if nop_to_be_select != '':
419
424
  console.print(f"Nop a ser considerada: {nop_to_be_select}...\n")
420
425
  await worker_sleep(1)
421
426
  try:
422
- set_combobox("||List", nop_to_be_select)
423
- except:
427
+ # Clica para ativar o combobox
424
428
  select_box_nop_select.click()
425
429
  await worker_sleep(1)
426
- select_box_nop_select.click()
430
+
431
+ # Digita apenas o código inicial (ex: "1662") para posicionar
432
+ codigo_nop = nop_to_be_select.split('-')[0].strip()
433
+ select_box_nop_select.type_keys(codigo_nop)
427
434
  await worker_sleep(1)
428
- select_box_nop_select.select(nop_to_be_select)
429
- #set_combobox("||List", nop_to_be_select)
430
435
 
436
+ # Navega pela lista até encontrar o texto exato
437
+ for _ in range(10): # tenta até 10 movimentos para baixo
438
+ current_text = select_box_nop_select.window_text()
439
+ if nop_to_be_select.strip().lower() in current_text.strip().lower():
440
+ select_box_nop_select.type_keys('{ENTER}')
441
+ break
442
+ else:
443
+ select_box_nop_select.type_keys('{DOWN}')
444
+ await worker_sleep(0.5)
445
+
446
+ await worker_sleep(1)
447
+ select_box_nop_select.type_keys('{TAB}')
448
+ except Exception as e:
449
+ console.print(f"[red]Erro ao selecionar a NOP: {e}[/red]")
431
450
  else:
432
- retorno = f"Não foi possivel encontrar a nop \nEtapas Executadas:\n{steps}"
451
+ retorno = f"Não foi possível encontrar a NOP\nEtapas Executadas:\n{steps}"
433
452
  return RpaRetornoProcessoDTO(
434
453
  sucesso=False,
435
454
  retorno=retorno,
@@ -437,6 +456,7 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
437
456
  tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)]
438
457
  )
439
458
 
459
+
440
460
  await worker_sleep(7)
441
461
  try:
442
462
  pesquisar_icon = pyautogui.locateOnScreen(ASSETS_PATH + "\\emsys\\selecionar_venda.png", confidence=0.8)
@@ -1020,7 +1040,7 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
1020
1040
  #STEP 3
1021
1041
  type_text_into_field("Gerenciador de Notas Fiscais", app["TFrmMenuPrincipal"]["Edit"], True, "50")
1022
1042
  pyautogui.press("enter")
1023
- await worker_sleep(2)
1043
+ await worker_sleep(5)
1024
1044
  pyautogui.press("enter")
1025
1045
  await worker_sleep(5)
1026
1046
  console.print(f"\nPesquisa: 'Gerenciador de Notas Fiscais' realizada com sucesso 1ª Etapa",style="bold green")
@@ -1198,7 +1218,7 @@ async def devolucao_prazo_a_faturar(task: RpaProcessoEntradaDTO) -> RpaRetornoPr
1198
1218
 
1199
1219
  type_text_into_field("Gerenciador de Notas Fiscais", app["TFrmMenuPrincipal"]["Edit"], True, "50")
1200
1220
  pyautogui.press("enter")
1201
- await worker_sleep(2)
1221
+ await worker_sleep(5)
1202
1222
  pyautogui.press("enter")
1203
1223
  await worker_sleep(5)
1204
1224
  console.print(f"\nPesquisa: 'Gerenciador de Notas Fiscais' realizada com sucesso 2ª Etapa",style="bold green")