worker-automate-hub 0.5.829__tar.gz → 0.5.830__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.
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/PKG-INFO +1 -1
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/pyproject.toml +1 -1
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/devolucao_produtos.py +206 -95
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/README.md +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/ahead_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/client.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/datalake_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/helpers/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/rdp_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/rpa_fila_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/rpa_historico_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/webhook_service.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/cli.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/config/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/config/settings.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/config.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/core/so_manipulation.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/deprecation.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/rate_limit.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/repeat.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/retry.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/singleton.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/timeit.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/rpa_fila.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dao/rpa_robo.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/rpa_sap_dto.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/cte_manual.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/cte_xml.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/devolucao_ctf.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/devolucao_ctf_35.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_cte_1353.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_cte_333.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_22.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_37.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_503.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/entrada_de_notas_9000.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/extracao_fechamento_contabil.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/extracao_fechamento_emsys.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/fechar_conexao_rdp.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/fidc_exportacao_docs_portal_b2b.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/fidc_retorno_cobranca.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/geracao_aprovacao_pedidos_novo.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/geracao_balancetes_filial.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/integracao_contabil.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/integracao_contabil_generica.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/lancamento_pis_cofins.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/lancamento_rateio.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/login_emsys_versao_especifica.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/opex_capex.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/playground.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/task_definitions.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/task_executor.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/__init__.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/env.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/logger.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/toast.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/updater.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/util.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
- {worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/worker.py +0 -0
|
@@ -15,9 +15,15 @@ import re
|
|
|
15
15
|
import sys
|
|
16
16
|
import os
|
|
17
17
|
|
|
18
|
-
sys.path.append(
|
|
18
|
+
sys.path.append(
|
|
19
|
+
os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
|
|
20
|
+
)
|
|
19
21
|
|
|
20
|
-
from worker_automate_hub.api.client import
|
|
22
|
+
from worker_automate_hub.api.client import (
|
|
23
|
+
get_config_by_name,
|
|
24
|
+
send_file,
|
|
25
|
+
get_notas_produtos,
|
|
26
|
+
)
|
|
21
27
|
from worker_automate_hub.models.dto.rpa_historico_request_dto import (
|
|
22
28
|
RpaHistoricoStatusEnum,
|
|
23
29
|
RpaRetornoProcessoDTO,
|
|
@@ -29,6 +35,7 @@ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
|
|
|
29
35
|
)
|
|
30
36
|
from worker_automate_hub.utils.logger import logger
|
|
31
37
|
from pywinauto.keyboard import send_keys
|
|
38
|
+
|
|
32
39
|
# from worker_automate_hub.utils.toast import show_toast
|
|
33
40
|
from worker_automate_hub.utils.util import (
|
|
34
41
|
send_to_webhook,
|
|
@@ -52,15 +59,17 @@ console = Console()
|
|
|
52
59
|
ASSETS_BASE_PATH = "assets/descartes_transferencias_images/"
|
|
53
60
|
ALMOXARIFADO_DEFAULT = "50"
|
|
54
61
|
|
|
62
|
+
|
|
55
63
|
def _parse_int_tolerante(val):
|
|
56
64
|
if val is None:
|
|
57
65
|
return 0
|
|
58
66
|
if isinstance(val, int):
|
|
59
67
|
return val
|
|
60
68
|
s = str(val).replace("\u00a0", "").strip() # remove NBSP
|
|
61
|
-
s = s.replace(".", "").replace(",", "")
|
|
69
|
+
s = s.replace(".", "").replace(",", "") # remove separadores comuns
|
|
62
70
|
return int(float(s or 0))
|
|
63
71
|
|
|
72
|
+
|
|
64
73
|
def _coletar_itens_achatados(d: dict):
|
|
65
74
|
descrs, qtds = {}, {}
|
|
66
75
|
for k, v in d.items():
|
|
@@ -85,6 +94,7 @@ def _coletar_itens_achatados(d: dict):
|
|
|
85
94
|
itens.append({"descricaoProduto": desc, "qtd": qtd})
|
|
86
95
|
return itens
|
|
87
96
|
|
|
97
|
+
|
|
88
98
|
def normalize_config_entrada(cfg: dict) -> dict:
|
|
89
99
|
"""
|
|
90
100
|
Se vier com 'itens': mantém e normaliza qtd -> int.
|
|
@@ -111,10 +121,14 @@ def normalize_config_entrada(cfg: dict) -> dict:
|
|
|
111
121
|
itens = _coletar_itens_achatados(cfg)
|
|
112
122
|
cfg["itens"] = itens
|
|
113
123
|
# remove chaves achatadas da saída (opcional)
|
|
114
|
-
chaves_remover = [
|
|
124
|
+
chaves_remover = [
|
|
125
|
+
k for k in cfg.keys() if re.match(r"^(descricaoProduto|qtd)\d+$", k, flags=re.I)
|
|
126
|
+
]
|
|
115
127
|
for k in chaves_remover:
|
|
116
128
|
cfg.pop(k, None)
|
|
117
129
|
return cfg
|
|
130
|
+
|
|
131
|
+
|
|
118
132
|
# --- fim do normalizador ---
|
|
119
133
|
|
|
120
134
|
|
|
@@ -124,7 +138,6 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
124
138
|
config = await get_config_by_name("login_emsys")
|
|
125
139
|
console.print(task)
|
|
126
140
|
|
|
127
|
-
|
|
128
141
|
# Seta config entrada na var nota para melhor entendimento (normalizando formatos)
|
|
129
142
|
nota = normalize_config_entrada(task.configEntrada)
|
|
130
143
|
itens = nota.get("itens", [])
|
|
@@ -186,13 +199,15 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
186
199
|
# Acumula para a lista geral (será deduplicada depois)
|
|
187
200
|
notas_encontradas.extend(notas_item)
|
|
188
201
|
|
|
189
|
-
itens_ui.append(
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
202
|
+
itens_ui.append(
|
|
203
|
+
{
|
|
204
|
+
"codigo": cod,
|
|
205
|
+
"quantidade": qtd,
|
|
206
|
+
"valor_unitario": valor_unit,
|
|
207
|
+
"valor_total_item": round(valor_unit * qtd, 2),
|
|
208
|
+
"notas": notas_item, # mantém vínculo item↔notas
|
|
209
|
+
}
|
|
210
|
+
)
|
|
196
211
|
|
|
197
212
|
# Deduplica notas preservando a ordem de aparição
|
|
198
213
|
nf_ref = list(dict.fromkeys(notas_encontradas))
|
|
@@ -204,20 +219,19 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
204
219
|
itens_por_nota[n].append(item)
|
|
205
220
|
|
|
206
221
|
data = {
|
|
207
|
-
"nf_referencia": nf_ref,
|
|
208
|
-
"itens": itens_ui,
|
|
222
|
+
"nf_referencia": nf_ref, # ex.: ['1418727', '1410744']
|
|
223
|
+
"itens": itens_ui, # cada item com suas notas
|
|
209
224
|
"totais": {
|
|
210
225
|
"valor_final": round(sum(i["valor_total_item"] for i in itens_ui), 2)
|
|
211
226
|
},
|
|
212
|
-
"itens_por_nota": itens_por_nota
|
|
227
|
+
"itens_por_nota": itens_por_nota, # para uso direto no fluxo de UI
|
|
213
228
|
}
|
|
214
229
|
# ========= FIM DA MONTAGEM DO DATA =========
|
|
215
230
|
|
|
216
|
-
|
|
217
231
|
# Fecha a instancia do emsys - caso esteja aberta
|
|
218
232
|
await kill_all_emsys()
|
|
219
233
|
|
|
220
|
-
app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\
|
|
234
|
+
app = Application(backend="win32").start("C:\\Rezende\\EMSys3\\EMSys3_10.exe")
|
|
221
235
|
warnings.filterwarnings(
|
|
222
236
|
"ignore",
|
|
223
237
|
category=UserWarning,
|
|
@@ -244,12 +258,18 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
244
258
|
select_prevenda_type = app["Selecione o Tipo de Pré-Venda"]
|
|
245
259
|
|
|
246
260
|
if select_prevenda_type.exists():
|
|
247
|
-
tipo = select_prevenda_type.child_window(
|
|
261
|
+
tipo = select_prevenda_type.child_window(
|
|
262
|
+
class_name="TComboBox", found_index=0
|
|
263
|
+
)
|
|
248
264
|
tipo.select("Orçamento")
|
|
249
|
-
confirm = select_prevenda_type.child_window(
|
|
265
|
+
confirm = select_prevenda_type.child_window(
|
|
266
|
+
class_name="TDBIBitBtn", found_index=1
|
|
267
|
+
)
|
|
250
268
|
confirm.click()
|
|
251
269
|
except:
|
|
252
|
-
console.print(
|
|
270
|
+
console.print(
|
|
271
|
+
"Sem tela de selecionar modelo de pre venda", style="bold green"
|
|
272
|
+
)
|
|
253
273
|
else:
|
|
254
274
|
logger.info(f"\nError Message: {return_login.retorno}")
|
|
255
275
|
console.print(f"\nError Message: {return_login.retorno}", style="bold red")
|
|
@@ -262,16 +282,22 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
262
282
|
app = Application().connect(class_name="TFrmPreVenda")
|
|
263
283
|
main_window = app["TFrmPreVenda"]
|
|
264
284
|
|
|
265
|
-
condicao_field = main_window.child_window(
|
|
285
|
+
condicao_field = main_window.child_window(
|
|
286
|
+
class_name="TDBIComboBox", found_index=2
|
|
287
|
+
)
|
|
266
288
|
condicao_field.select("21 DIAS")
|
|
267
289
|
|
|
268
290
|
# Código do fornecedor
|
|
269
|
-
input_cod_fornecedor = main_window.child_window(
|
|
291
|
+
input_cod_fornecedor = main_window.child_window(
|
|
292
|
+
class_name="TDBIEditNumber", found_index=2
|
|
293
|
+
)
|
|
270
294
|
input_cod_fornecedor.click_input()
|
|
271
295
|
await worker_sleep(0.2)
|
|
272
296
|
keyboard.send_keys("{END}+{HOME}{DEL}")
|
|
273
297
|
await worker_sleep(0.2)
|
|
274
|
-
input_cod_fornecedor.type_keys(
|
|
298
|
+
input_cod_fornecedor.type_keys(
|
|
299
|
+
str(cod_fornecedor), with_spaces=True, set_foreground=True
|
|
300
|
+
)
|
|
275
301
|
keyboard.send_keys("{TAB}")
|
|
276
302
|
await worker_sleep(5)
|
|
277
303
|
|
|
@@ -281,13 +307,15 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
281
307
|
app["TFrmSelecionaEndereco"].close()
|
|
282
308
|
await worker_sleep(3)
|
|
283
309
|
app = Application().connect(class_name="TMessageForm")
|
|
284
|
-
app["TMessageForm"].child_window(
|
|
310
|
+
app["TMessageForm"].child_window(
|
|
311
|
+
class_name="TButton", found_index=0
|
|
312
|
+
).click()
|
|
285
313
|
except:
|
|
286
314
|
pass
|
|
287
315
|
|
|
288
316
|
app = Application().connect(class_name="TFrmPreVenda")
|
|
289
317
|
main_window = app["TFrmPreVenda"]
|
|
290
|
-
console.print("Verificar estado...")
|
|
318
|
+
console.print("Verificar estado...")
|
|
291
319
|
if estado != "RS":
|
|
292
320
|
modelo = "DEVOLUÇÃO DE COMPRA DE MERCADORIAS SC"
|
|
293
321
|
else:
|
|
@@ -295,7 +323,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
295
323
|
|
|
296
324
|
# Inserir modelo
|
|
297
325
|
console.print("Inserir modelo...")
|
|
298
|
-
select_modelo = main_window.child_window(
|
|
326
|
+
select_modelo = main_window.child_window(
|
|
327
|
+
class_name="TDBIComboBox", found_index=0
|
|
328
|
+
)
|
|
299
329
|
select_modelo.select(modelo)
|
|
300
330
|
await worker_sleep(1)
|
|
301
331
|
|
|
@@ -312,7 +342,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
312
342
|
await worker_sleep(2)
|
|
313
343
|
|
|
314
344
|
# Incluir item
|
|
315
|
-
botao_incluir = main_window.child_window(
|
|
345
|
+
botao_incluir = main_window.child_window(
|
|
346
|
+
title="Incluir", class_name="TDBIBitBtn"
|
|
347
|
+
).wrapper_object()
|
|
316
348
|
botao_incluir.click_input()
|
|
317
349
|
await worker_sleep(5)
|
|
318
350
|
|
|
@@ -324,15 +356,19 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
324
356
|
# Abre tela de inclusão de item
|
|
325
357
|
app_item = Application().connect(class_name="TFrmIncluiItemPreVenda")
|
|
326
358
|
wnd_item = app_item["TFrmIncluiItemPreVenda"]
|
|
327
|
-
input_almoxarifado = wnd_item.child_window(
|
|
359
|
+
input_almoxarifado = wnd_item.child_window(
|
|
360
|
+
class_name="TDBIEditNumber", found_index=16
|
|
361
|
+
)
|
|
328
362
|
input_almoxarifado.click_input()
|
|
329
363
|
await worker_sleep(1)
|
|
330
364
|
keyboard.send_keys("{END}+{HOME}{DEL}")
|
|
331
365
|
await worker_sleep(1)
|
|
332
|
-
input_almoxarifado.type_keys(
|
|
366
|
+
input_almoxarifado.type_keys(
|
|
367
|
+
almoxarifado, with_spaces=True, set_foreground=True
|
|
368
|
+
)
|
|
333
369
|
keyboard.send_keys("{TAB}")
|
|
334
370
|
await worker_sleep(1)
|
|
335
|
-
|
|
371
|
+
|
|
336
372
|
# Dicionário para guardar os itens sem saldo / com saldo
|
|
337
373
|
itens_sem_saldo = {}
|
|
338
374
|
itens_com_saldo = {}
|
|
@@ -355,7 +391,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
355
391
|
|
|
356
392
|
# --- Código ---
|
|
357
393
|
console.print("Inserir código...")
|
|
358
|
-
input_codigo = wnd_item.child_window(
|
|
394
|
+
input_codigo = wnd_item.child_window(
|
|
395
|
+
class_name="TDBIEditNumber", found_index=15
|
|
396
|
+
)
|
|
359
397
|
input_codigo.click_input()
|
|
360
398
|
await worker_sleep(1)
|
|
361
399
|
keyboard.send_keys("{END}+{HOME}{DEL}")
|
|
@@ -380,7 +418,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
380
418
|
|
|
381
419
|
# --- Quantidade ---
|
|
382
420
|
console.print("Inserir quantidade...")
|
|
383
|
-
wnd_item.child_window(
|
|
421
|
+
wnd_item.child_window(
|
|
422
|
+
class_name="TDBIEditNumber", found_index=8
|
|
423
|
+
).click_input()
|
|
384
424
|
await worker_sleep(1)
|
|
385
425
|
keyboard.send_keys("{END}+{HOME}{DEL}")
|
|
386
426
|
await worker_sleep(1)
|
|
@@ -390,7 +430,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
390
430
|
|
|
391
431
|
# --- Valor Unitário via popup ---
|
|
392
432
|
console.print("Inserir valor unitário...")
|
|
393
|
-
wnd_item.child_window(
|
|
433
|
+
wnd_item.child_window(
|
|
434
|
+
class_name="TDBIEditNumber", found_index=6
|
|
435
|
+
).click_input()
|
|
394
436
|
await worker_sleep(1)
|
|
395
437
|
keyboard.send_keys("{TAB}")
|
|
396
438
|
await worker_sleep(1)
|
|
@@ -400,7 +442,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
400
442
|
app_preco = Application().connect(class_name="TFrmInputBoxNumero")
|
|
401
443
|
wnd_preco = app_preco["TFrmInputBoxNumero"]
|
|
402
444
|
|
|
403
|
-
campo_preco = wnd_preco.child_window(
|
|
445
|
+
campo_preco = wnd_preco.child_window(
|
|
446
|
+
class_name="TDBIEditNumber", found_index=0
|
|
447
|
+
)
|
|
404
448
|
campo_preco.click_input()
|
|
405
449
|
await worker_sleep(1)
|
|
406
450
|
keyboard.send_keys("{END}+{HOME}{DEL}")
|
|
@@ -414,7 +458,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
414
458
|
console.print("Confirmar inclusão do item...")
|
|
415
459
|
app_prevenda = Application().connect(class_name="TFrmIncluiItemPreVenda")
|
|
416
460
|
wnd_prevenda = app_prevenda["TFrmIncluiItemPreVenda"]
|
|
417
|
-
botao_incluir = wnd_prevenda.child_window(
|
|
461
|
+
botao_incluir = wnd_prevenda.child_window(
|
|
462
|
+
title="&Incluir", class_name="TDBIBitBtn"
|
|
463
|
+
).wrapper_object()
|
|
418
464
|
botao_incluir.click_input()
|
|
419
465
|
|
|
420
466
|
await worker_sleep(4)
|
|
@@ -430,24 +476,30 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
430
476
|
for _ in range(10):
|
|
431
477
|
pos = pyautogui.locateCenterOnScreen(img_saldo, confidence=0.9)
|
|
432
478
|
if pos:
|
|
433
|
-
console.print(
|
|
479
|
+
console.print(
|
|
480
|
+
f"Saldo disponível menor para o item {codigo}: {quantidade} x {val_unitario}"
|
|
481
|
+
)
|
|
434
482
|
|
|
435
483
|
# adiciona no dicionário de erros
|
|
436
484
|
itens_sem_saldo[codigo] = {
|
|
437
485
|
"quantidade": quantidade,
|
|
438
|
-
"valor_unitario": val_unitario
|
|
486
|
+
"valor_unitario": val_unitario,
|
|
439
487
|
}
|
|
440
488
|
|
|
441
489
|
# fecha a mensagem
|
|
442
490
|
app = Application().connect(class_name="TMessageForm")
|
|
443
491
|
main_window_msg = app["TMessageForm"]
|
|
444
|
-
btn_no = main_window_msg.child_window(
|
|
492
|
+
btn_no = main_window_msg.child_window(
|
|
493
|
+
title="&No", class_name="TButton"
|
|
494
|
+
)
|
|
445
495
|
btn_no.click_input()
|
|
446
496
|
|
|
447
497
|
# clica em limpar
|
|
448
498
|
app = Application().connect(class_name="TFrmIncluiItemPreVenda")
|
|
449
499
|
main_window_limpa = app["TFrmIncluiItemPreVenda"]
|
|
450
|
-
btn_limpa = main_window_limpa.child_window(
|
|
500
|
+
btn_limpa = main_window_limpa.child_window(
|
|
501
|
+
title="&Limpa", class_name="TDBIBitBtn"
|
|
502
|
+
)
|
|
451
503
|
btn_limpa.click_input()
|
|
452
504
|
|
|
453
505
|
img_saldo_bool = True
|
|
@@ -472,8 +524,8 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
472
524
|
if had_saldo:
|
|
473
525
|
console.print(f"Item {codigo} incluído com sucesso.")
|
|
474
526
|
itens_com_saldo[codigo] = {
|
|
475
|
-
|
|
476
|
-
|
|
527
|
+
"quantidade": quantidade,
|
|
528
|
+
"valor_unitario": val_unitario,
|
|
477
529
|
}
|
|
478
530
|
for n in item_notas:
|
|
479
531
|
notas_validas_set.add(str(n))
|
|
@@ -482,14 +534,15 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
482
534
|
# Depois de processar todos os itens:
|
|
483
535
|
if itens_sem_saldo and not itens_com_saldo:
|
|
484
536
|
# Todos os itens ficaram sem saldo → para aqui
|
|
485
|
-
log_msg = "Todos os itens estão com saldo menor que a quantidade:\n" + \
|
|
486
|
-
|
|
487
|
-
|
|
537
|
+
log_msg = "Todos os itens estão com saldo menor que a quantidade:\n" + "\n".join(
|
|
538
|
+
f"- Código: {cod} | Quantidade: {dados['quantidade']} | Valor Unitário: {dados['valor_unitario']}"
|
|
539
|
+
for cod, dados in itens_sem_saldo.items()
|
|
540
|
+
)
|
|
488
541
|
return RpaRetornoProcessoDTO(
|
|
489
542
|
sucesso=False,
|
|
490
543
|
retorno=log_msg.strip(),
|
|
491
544
|
status=RpaHistoricoStatusEnum.Falha,
|
|
492
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)]
|
|
545
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
493
546
|
)
|
|
494
547
|
|
|
495
548
|
# Caso contrário, existe pelo menos 1 com saldo → segue o fluxo
|
|
@@ -509,9 +562,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
509
562
|
|
|
510
563
|
# Clicar em fechar
|
|
511
564
|
wnd_prevenda.close()
|
|
512
|
-
|
|
565
|
+
|
|
513
566
|
await worker_sleep(3)
|
|
514
|
-
|
|
567
|
+
|
|
515
568
|
# Clicar em recebimentos
|
|
516
569
|
console.print("Clicar em recebimentos...")
|
|
517
570
|
imagem_item = r"C:\Users\automatehub\Desktop\img_leo\btn_recebimentos.png"
|
|
@@ -523,7 +576,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
523
576
|
await worker_sleep(1)
|
|
524
577
|
else:
|
|
525
578
|
print("Imagem do item não encontrada na tela.")
|
|
526
|
-
|
|
579
|
+
|
|
527
580
|
await worker_sleep(3)
|
|
528
581
|
|
|
529
582
|
# Clicar em Parcelamento
|
|
@@ -537,7 +590,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
537
590
|
await worker_sleep(1)
|
|
538
591
|
else:
|
|
539
592
|
print("Imagem do item não encontrada na tela.")
|
|
540
|
-
|
|
593
|
+
|
|
541
594
|
await worker_sleep(3)
|
|
542
595
|
|
|
543
596
|
# Volta pra janela de pre venda
|
|
@@ -546,12 +599,16 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
546
599
|
|
|
547
600
|
# Condição de recebimento (boleto)
|
|
548
601
|
console.print("Selecionar boleto...")
|
|
549
|
-
condicao_field = main_window.child_window(
|
|
602
|
+
condicao_field = main_window.child_window(
|
|
603
|
+
class_name="TDBIComboBox", found_index=0
|
|
604
|
+
)
|
|
550
605
|
try:
|
|
551
606
|
condicao_field.select("BANCO DO BRASIL BOLETO")
|
|
552
607
|
print("Selecionado: BANCO DO BRASIL BOLETO")
|
|
553
608
|
except Exception as e:
|
|
554
|
-
print(
|
|
609
|
+
print(
|
|
610
|
+
f"Não foi possível selecionar 'BANCO DO BRASIL BOLETO' ({e}). Tentando 'BOLETO'..."
|
|
611
|
+
)
|
|
555
612
|
try:
|
|
556
613
|
condicao_field.select("BOLETO")
|
|
557
614
|
print("Selecionado: BOLETO")
|
|
@@ -569,7 +626,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
569
626
|
await worker_sleep(1)
|
|
570
627
|
else:
|
|
571
628
|
print("Imagem do item não encontrada na tela.")
|
|
572
|
-
|
|
629
|
+
|
|
573
630
|
await worker_sleep(3)
|
|
574
631
|
|
|
575
632
|
# Capturar número da pré-venda
|
|
@@ -586,14 +643,19 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
586
643
|
win.set_focus()
|
|
587
644
|
|
|
588
645
|
textos = []
|
|
589
|
-
try:
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
646
|
+
try:
|
|
647
|
+
textos.append(win.window_text())
|
|
648
|
+
except:
|
|
649
|
+
pass
|
|
650
|
+
try:
|
|
651
|
+
textos += [t for t in win.wrapper_object().texts() if t]
|
|
652
|
+
except:
|
|
653
|
+
pass
|
|
593
654
|
try:
|
|
594
655
|
for st in win.children(class_name="Static"):
|
|
595
656
|
textos += [t for t in st.texts() if t]
|
|
596
|
-
except:
|
|
657
|
+
except:
|
|
658
|
+
pass
|
|
597
659
|
|
|
598
660
|
texto = "\n".join([t for t in textos if t])
|
|
599
661
|
if ("Venda inclu" in texto) or ("Pré" in texto) or ("Pr" in texto):
|
|
@@ -604,7 +666,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
604
666
|
clicked = False
|
|
605
667
|
for title in ("OK", "&OK"):
|
|
606
668
|
try:
|
|
607
|
-
win.child_window(
|
|
669
|
+
win.child_window(
|
|
670
|
+
title=title, class_name="TButton"
|
|
671
|
+
).click_input()
|
|
608
672
|
clicked = True
|
|
609
673
|
break
|
|
610
674
|
except:
|
|
@@ -632,7 +696,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
632
696
|
# Botão confirma
|
|
633
697
|
app = Application().connect(class_name="TFrmPreVenda")
|
|
634
698
|
main_window = app["TFrmPreVenda"]
|
|
635
|
-
btn_confirmar = main_window.child_window(
|
|
699
|
+
btn_confirmar = main_window.child_window(
|
|
700
|
+
title="&Confirma", class_name="TBitBtn"
|
|
701
|
+
)
|
|
636
702
|
btn_confirmar.click_input()
|
|
637
703
|
await worker_sleep(4)
|
|
638
704
|
|
|
@@ -646,7 +712,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
646
712
|
# Fechar "Informação"
|
|
647
713
|
for _ in range(10):
|
|
648
714
|
try:
|
|
649
|
-
dlg = Desktop(backend="win32").window(
|
|
715
|
+
dlg = Desktop(backend="win32").window(
|
|
716
|
+
title_re="Informação", class_name="#32770"
|
|
717
|
+
)
|
|
650
718
|
if dlg.exists(timeout=1):
|
|
651
719
|
dlg.child_window(title="OK").click_input()
|
|
652
720
|
print("✅ Fechou janela 'Informação'.")
|
|
@@ -677,19 +745,23 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
677
745
|
|
|
678
746
|
for _ in range(10):
|
|
679
747
|
try:
|
|
680
|
-
dlg = Desktop(backend="win32").window(
|
|
748
|
+
dlg = Desktop(backend="win32").window(
|
|
749
|
+
title_re="Parcelas - Nota Fiscal Sa", class_name="#32770"
|
|
750
|
+
)
|
|
681
751
|
if dlg.exists(timeout=1):
|
|
682
752
|
dlg.child_window(title="&Não").click_input()
|
|
683
753
|
print("Clicou em Não")
|
|
684
754
|
break
|
|
685
755
|
except:
|
|
686
756
|
pass
|
|
687
|
-
|
|
757
|
+
|
|
688
758
|
await worker_sleep(10)
|
|
689
759
|
|
|
690
760
|
# Notas referenciadas
|
|
691
761
|
console.print("CLicar em notas referenciadas...")
|
|
692
|
-
imagem_notas_ref =
|
|
762
|
+
imagem_notas_ref = (
|
|
763
|
+
r"C:\Users\automatehub\Desktop\img_leo\notas_referenciadas.png"
|
|
764
|
+
)
|
|
693
765
|
for _ in range(20):
|
|
694
766
|
pos = pyautogui.locateCenterOnScreen(imagem_notas_ref, confidence=0.8)
|
|
695
767
|
if pos:
|
|
@@ -698,7 +770,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
698
770
|
await worker_sleep(1)
|
|
699
771
|
else:
|
|
700
772
|
print("Imagem do item não encontrada na tela.")
|
|
701
|
-
|
|
773
|
+
|
|
702
774
|
await worker_sleep(2)
|
|
703
775
|
|
|
704
776
|
# Faturamento Pré-venda
|
|
@@ -707,7 +779,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
707
779
|
main_window.set_focus()
|
|
708
780
|
|
|
709
781
|
# Radio Entrada
|
|
710
|
-
main_window.child_window(
|
|
782
|
+
main_window.child_window(
|
|
783
|
+
title="Entrada", class_name="TDBIRadioButton"
|
|
784
|
+
).click_input()
|
|
711
785
|
console.print("Clicado em 'Entrada'")
|
|
712
786
|
await worker_sleep(4)
|
|
713
787
|
|
|
@@ -716,16 +790,24 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
716
790
|
notas_validas_ordenadas = [n for n in todas_as_notas if n in notas_validas_set]
|
|
717
791
|
notas_descartadas = [n for n in todas_as_notas if n not in notas_validas_set]
|
|
718
792
|
|
|
719
|
-
console.print(
|
|
793
|
+
console.print(
|
|
794
|
+
f"[green]Notas a referenciar (itens com saldo): {notas_validas_ordenadas}[/]"
|
|
795
|
+
)
|
|
720
796
|
if notas_descartadas:
|
|
721
|
-
console.print(
|
|
797
|
+
console.print(
|
|
798
|
+
f"[yellow]Notas descartadas (apenas itens sem saldo): {notas_descartadas}[/]"
|
|
799
|
+
)
|
|
722
800
|
|
|
723
801
|
# >>> NOVO: nota_arquivo (primeira válida; fallback: pré-venda ou timestamp) - SEM extract_nf_number
|
|
724
802
|
if notas_validas_ordenadas:
|
|
725
|
-
nota_arquivo = re.sub(r"\D+", "", str(notas_validas_ordenadas[0])) or str(
|
|
803
|
+
nota_arquivo = re.sub(r"\D+", "", str(notas_validas_ordenadas[0])) or str(
|
|
804
|
+
notas_validas_ordenadas[0]
|
|
805
|
+
)
|
|
726
806
|
else:
|
|
727
807
|
if numero_pre_venda:
|
|
728
|
-
nota_arquivo = re.sub(r"\D+", "", str(numero_pre_venda)) or str(
|
|
808
|
+
nota_arquivo = re.sub(r"\D+", "", str(numero_pre_venda)) or str(
|
|
809
|
+
numero_pre_venda
|
|
810
|
+
)
|
|
729
811
|
else:
|
|
730
812
|
nota_arquivo = datetime.now().strftime("%Y%m%d%H%M%S")
|
|
731
813
|
|
|
@@ -733,7 +815,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
733
815
|
for nf_ref_atual in notas_validas_ordenadas:
|
|
734
816
|
itens_da_nota = data.get("itens_por_nota", {}).get(nf_ref_atual, [])
|
|
735
817
|
if not itens_da_nota:
|
|
736
|
-
console.print(
|
|
818
|
+
console.print(
|
|
819
|
+
f"[amarelo]Nenhum item associado à nota {nf_ref_atual}. Pulando...[/]"
|
|
820
|
+
)
|
|
737
821
|
continue
|
|
738
822
|
|
|
739
823
|
console.print(f"[cyan]Processando nota {nf_ref_atual}...[/]")
|
|
@@ -749,7 +833,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
749
833
|
await worker_sleep(0.4)
|
|
750
834
|
|
|
751
835
|
# 2) Digitar a nota e confirmar
|
|
752
|
-
input_num_nota.type_keys(
|
|
836
|
+
input_num_nota.type_keys(
|
|
837
|
+
str(nf_ref_atual), with_spaces=True, set_foreground=True
|
|
838
|
+
)
|
|
753
839
|
await worker_sleep(0.6)
|
|
754
840
|
keyboard.send_keys("{ENTER}")
|
|
755
841
|
await worker_sleep(0.6)
|
|
@@ -759,7 +845,9 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
759
845
|
main_window = app["TFrmDadosFaturamentoPreVenda"]
|
|
760
846
|
|
|
761
847
|
# Clica no botão identificado como TDBIBitBtn2 (control_id 918912)
|
|
762
|
-
main_window.child_window(
|
|
848
|
+
main_window.child_window(
|
|
849
|
+
class_name="TDBIBitBtn", found_index=1
|
|
850
|
+
).click_input()
|
|
763
851
|
|
|
764
852
|
print("Botão clicado com sucesso!")
|
|
765
853
|
console.print(f"Incluindo itens vinculados à nota {nf_ref_atual}...")
|
|
@@ -793,7 +881,11 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
793
881
|
console.print("Inserir mensagem...")
|
|
794
882
|
fornecedor = "Disbal"
|
|
795
883
|
lista_fornecedores = ["Disbal", "Pepsico", "Punta Balena"]
|
|
796
|
-
mensagem =
|
|
884
|
+
mensagem = (
|
|
885
|
+
"PRODUTOS VENCIDOS"
|
|
886
|
+
if fornecedor in lista_fornecedores
|
|
887
|
+
else "ACORDO COMERCIAL"
|
|
888
|
+
)
|
|
797
889
|
input_mensagem = main_window.child_window(class_name="TDBIMemo", found_index=0)
|
|
798
890
|
input_mensagem.type_keys(mensagem, with_spaces=True, set_foreground=True)
|
|
799
891
|
|
|
@@ -867,39 +959,45 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
867
959
|
await worker_sleep(5)
|
|
868
960
|
|
|
869
961
|
# DANFE 077
|
|
870
|
-
console.print(
|
|
962
|
+
console.print(
|
|
963
|
+
"Selecionar NFe - NOTA FISCAL ELETRONICA PROPRIA - DANFE SERIE 077..."
|
|
964
|
+
)
|
|
871
965
|
app = Application().connect(class_name="TFrmDadosFaturamentoPreVenda")
|
|
872
966
|
main_window = app["TFrmDadosFaturamentoPreVenda"]
|
|
873
|
-
select_danfe = main_window.child_window(
|
|
967
|
+
select_danfe = main_window.child_window(
|
|
968
|
+
class_name="TDBIComboBox", found_index=1
|
|
969
|
+
)
|
|
874
970
|
select_danfe.select("NFe - NOTA FISCAL ELETRONICA PROPRIA - DANFE SERIE 077")
|
|
875
|
-
|
|
971
|
+
|
|
876
972
|
await worker_sleep(2)
|
|
877
973
|
|
|
878
974
|
# OK
|
|
879
975
|
main_window.child_window(title="&OK", class_name="TBitBtn").click_input()
|
|
880
|
-
|
|
976
|
+
|
|
881
977
|
await worker_sleep(3)
|
|
882
978
|
|
|
883
979
|
# Faturar pré-venda (Yes)
|
|
884
980
|
app = Application().connect(class_name="TMessageForm")
|
|
885
981
|
main_window = app["TMessageForm"]
|
|
886
982
|
main_window.child_window(class_name="TButton", found_index=1).click()
|
|
887
|
-
|
|
983
|
+
|
|
888
984
|
await worker_sleep(5)
|
|
889
985
|
|
|
890
986
|
# Faturar pré-venda (Yes)
|
|
891
987
|
app = Application().connect(class_name="TMessageForm")
|
|
892
988
|
main_window = app["TMessageForm"]
|
|
893
|
-
main_window.child_window(
|
|
989
|
+
main_window.child_window(
|
|
990
|
+
title="Transmitir e &Imprimir", class_name="TButton"
|
|
991
|
+
).click_input()
|
|
894
992
|
|
|
895
993
|
await worker_sleep(10)
|
|
896
|
-
|
|
994
|
+
|
|
897
995
|
# Diálogo impressão
|
|
898
996
|
console.print("Confirmar impressão...")
|
|
899
997
|
app = Application().connect(class_name="TppPrintDialog")
|
|
900
998
|
main_window = app["TppPrintDialog"]
|
|
901
999
|
main_window.child_window(title="OK", class_name="TButton").click()
|
|
902
|
-
|
|
1000
|
+
|
|
903
1001
|
await worker_sleep(5)
|
|
904
1002
|
|
|
905
1003
|
console.print(f"NAVEGANDO NA TELA DE SALVAR RELATORIO\n")
|
|
@@ -911,7 +1009,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
911
1009
|
|
|
912
1010
|
console.print("Interagindo com a tela 'Salvar'...\n")
|
|
913
1011
|
username = getpass.getuser()
|
|
914
|
-
|
|
1012
|
+
|
|
915
1013
|
# Preenche o nome do arquivo - SOMENTE número da nota
|
|
916
1014
|
path_to_txt = f"C:\\Users\\{username}\\Downloads\\devolucao_nf_{estado}_{nota_arquivo}"
|
|
917
1015
|
|
|
@@ -927,15 +1025,17 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
927
1025
|
sucesso=False,
|
|
928
1026
|
retorno=retorno,
|
|
929
1027
|
status=RpaHistoricoStatusEnum.Falha,
|
|
930
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
|
|
1028
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
|
|
931
1029
|
)
|
|
932
1030
|
|
|
933
|
-
with open(f"{path_to_txt}.pdf",
|
|
1031
|
+
with open(f"{path_to_txt}.pdf", "rb") as file:
|
|
934
1032
|
file_bytes = io.BytesIO(file.read())
|
|
935
1033
|
|
|
936
1034
|
desArquivo = f"devolucao_nf_{estado}_{nota_arquivo}.pdf"
|
|
937
1035
|
try:
|
|
938
|
-
await send_file(
|
|
1036
|
+
await send_file(
|
|
1037
|
+
historico_id, desArquivo, "pdf", file_bytes, file_extension="pdf"
|
|
1038
|
+
)
|
|
939
1039
|
os.remove(f"{path_to_txt}.pdf")
|
|
940
1040
|
except Exception as e:
|
|
941
1041
|
result = (
|
|
@@ -947,14 +1047,17 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
947
1047
|
sucesso=False,
|
|
948
1048
|
retorno=result,
|
|
949
1049
|
status=RpaHistoricoStatusEnum.Falha,
|
|
950
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)]
|
|
1050
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico)],
|
|
951
1051
|
)
|
|
952
1052
|
|
|
953
1053
|
except Exception as ex:
|
|
954
1054
|
log_msg = f"Error: {ex}"
|
|
955
1055
|
print(ex)
|
|
956
1056
|
return RpaRetornoProcessoDTO(
|
|
957
|
-
sucesso=False,
|
|
1057
|
+
sucesso=False,
|
|
1058
|
+
retorno=log_msg,
|
|
1059
|
+
status=RpaHistoricoStatusEnum.Falha,
|
|
1060
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
958
1061
|
)
|
|
959
1062
|
|
|
960
1063
|
# ============== RESUMO FINAL ==============
|
|
@@ -965,27 +1068,35 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
965
1068
|
|
|
966
1069
|
if itens_com_saldo:
|
|
967
1070
|
lista_ok = "\n".join(_fmt_linha(c, d) for c, d in list(itens_com_saldo.items()))
|
|
968
|
-
resumo_partes.append(
|
|
1071
|
+
resumo_partes.append(
|
|
1072
|
+
"✅ Itens incluídos:\n" + (lista_ok if lista_ok else "(vazio)")
|
|
1073
|
+
)
|
|
969
1074
|
|
|
970
1075
|
if itens_sem_saldo:
|
|
971
|
-
lista_sem = "\n".join(
|
|
972
|
-
|
|
1076
|
+
lista_sem = "\n".join(
|
|
1077
|
+
_fmt_linha(c, d) for c, d in list(itens_sem_saldo.items())
|
|
1078
|
+
)
|
|
1079
|
+
resumo_partes.append(
|
|
1080
|
+
"⚠️ Itens sem saldo:\n" + (lista_sem if lista_sem else "(vazio)")
|
|
1081
|
+
)
|
|
973
1082
|
|
|
974
1083
|
# (Opcional) resumo sobre notas válidas/descartadas
|
|
975
1084
|
try:
|
|
976
1085
|
resumo_partes.append(
|
|
977
|
-
"🧾 Notas referenciadas: " + ", ".join(sorted(list(notas_validas_set)))
|
|
1086
|
+
"🧾 Notas referenciadas: " + ", ".join(sorted(list(notas_validas_set)))
|
|
1087
|
+
if notas_validas_set
|
|
1088
|
+
else "🧾 Notas referenciadas: (nenhuma)"
|
|
978
1089
|
)
|
|
979
1090
|
except:
|
|
980
1091
|
pass
|
|
981
1092
|
|
|
982
|
-
resumo_txt =
|
|
1093
|
+
resumo_txt = (
|
|
1094
|
+
"\n\n".join(resumo_partes) if resumo_partes else "Nenhum item processado."
|
|
1095
|
+
)
|
|
983
1096
|
|
|
984
1097
|
return RpaRetornoProcessoDTO(
|
|
985
1098
|
sucesso=True,
|
|
986
1099
|
retorno=f"Processo concluído.\n\n{resumo_txt}",
|
|
987
1100
|
status=RpaHistoricoStatusEnum.Sucesso,
|
|
988
|
-
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)]
|
|
1101
|
+
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
989
1102
|
)
|
|
990
|
-
|
|
991
|
-
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/__init__.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/ahead_service.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/api/rdp_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/config/__init__.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/config/settings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/repeat.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/retry.py
RENAMED
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/decorators/timeit.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/tasks/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/__init__.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/env.py
RENAMED
|
File without changes
|
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/logger.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/toast.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/updater.py
RENAMED
|
File without changes
|
{worker_automate_hub-0.5.829 → worker_automate_hub-0.5.830}/worker_automate_hub/utils/util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|