worker-automate-hub 0.5.832__py3-none-any.whl → 0.5.833__py3-none-any.whl
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/tasks/jobs/devolucao_produtos.py +95 -27
- {worker_automate_hub-0.5.832.dist-info → worker_automate_hub-0.5.833.dist-info}/METADATA +1 -1
- {worker_automate_hub-0.5.832.dist-info → worker_automate_hub-0.5.833.dist-info}/RECORD +5 -5
- {worker_automate_hub-0.5.832.dist-info → worker_automate_hub-0.5.833.dist-info}/WHEEL +0 -0
- {worker_automate_hub-0.5.832.dist-info → worker_automate_hub-0.5.833.dist-info}/entry_points.txt +0 -0
|
@@ -2,6 +2,7 @@ import asyncio
|
|
|
2
2
|
import warnings
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
import json
|
|
5
|
+
import ast
|
|
5
6
|
import io
|
|
6
7
|
import pyautogui
|
|
7
8
|
from pywinauto.application import Application
|
|
@@ -127,7 +128,7 @@ def normalize_config_entrada(cfg: dict) -> dict:
|
|
|
127
128
|
for k in chaves_remover:
|
|
128
129
|
cfg.pop(k, None)
|
|
129
130
|
return cfg
|
|
130
|
-
|
|
131
|
+
|
|
131
132
|
|
|
132
133
|
# --- fim do normalizador ---
|
|
133
134
|
|
|
@@ -159,12 +160,40 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
159
160
|
res = await get_notas_produtos(int(cod_fornecedor), int(empresa), itens)
|
|
160
161
|
by_code = res.get("por_codigo", {}) or {} # dict dinâmico por código
|
|
161
162
|
|
|
163
|
+
# ========= EXTRAÇÃO DE UM CFOP (PRIMEIRO ENCONTRADO) =========
|
|
164
|
+
cfop = None # Apenas um CFOP em variável
|
|
165
|
+
for info in by_code.values():
|
|
166
|
+
notas_raw = info.get("notas") or []
|
|
167
|
+
# garante que seja lista
|
|
168
|
+
if isinstance(notas_raw, (str, int)):
|
|
169
|
+
notas_raw = [notas_raw]
|
|
170
|
+
|
|
171
|
+
achou = False
|
|
172
|
+
for n in notas_raw:
|
|
173
|
+
try:
|
|
174
|
+
# Caso venha como string de dict: "{'nota': '1401414', 'cfop': '1102'}"
|
|
175
|
+
if isinstance(n, str) and n.strip().startswith("{"):
|
|
176
|
+
nota_dict = ast.literal_eval(n)
|
|
177
|
+
elif isinstance(n, dict):
|
|
178
|
+
nota_dict = n
|
|
179
|
+
else:
|
|
180
|
+
nota_dict = None
|
|
181
|
+
|
|
182
|
+
if isinstance(nota_dict, dict) and "cfop" in nota_dict:
|
|
183
|
+
cfop = nota_dict["cfop"]
|
|
184
|
+
achou = True
|
|
185
|
+
break
|
|
186
|
+
except Exception:
|
|
187
|
+
continue
|
|
188
|
+
if achou:
|
|
189
|
+
break
|
|
190
|
+
|
|
162
191
|
# Constrói os itens na estrutura usada no fluxo de UI
|
|
163
192
|
itens_ui = []
|
|
164
|
-
notas_encontradas = [] # acumula notas para deduplicar depois
|
|
193
|
+
notas_encontradas = [] # acumula apenas os números das notas (strings) para deduplicar depois
|
|
165
194
|
|
|
166
195
|
for it in itens:
|
|
167
|
-
# aceita "
|
|
196
|
+
# aceita "descricaoProduto" contendo o código, ou "codigo"/"codigoProduto"
|
|
168
197
|
desc = it.get("descricaoProduto", "") or ""
|
|
169
198
|
nums = re.findall(r"\d+", desc)
|
|
170
199
|
if not nums:
|
|
@@ -179,7 +208,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
179
208
|
else:
|
|
180
209
|
cod = int(nums[0])
|
|
181
210
|
|
|
182
|
-
# quantidade (como int)
|
|
211
|
+
# quantidade (como int > 0)
|
|
183
212
|
qtd_raw = it.get("quantidade", it.get("qtd"))
|
|
184
213
|
try:
|
|
185
214
|
qtd = int(qtd_raw)
|
|
@@ -191,14 +220,35 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
191
220
|
info = by_code.get(cod) or {}
|
|
192
221
|
valor_unit = float(info.get("valorUnitario", 0) or 0)
|
|
193
222
|
|
|
194
|
-
# Normaliza "notas" para lista
|
|
195
|
-
|
|
196
|
-
if isinstance(
|
|
197
|
-
|
|
198
|
-
|
|
223
|
+
# Normaliza "notas" para lista SÓ com os números das notas (strings)
|
|
224
|
+
notas_item_raw = info.get("notas") or []
|
|
225
|
+
if isinstance(notas_item_raw, (str, int)):
|
|
226
|
+
notas_item_raw = [notas_item_raw]
|
|
227
|
+
|
|
228
|
+
notas_item_nums = []
|
|
229
|
+
for n in notas_item_raw:
|
|
230
|
+
# 1) se já vier dict
|
|
231
|
+
if isinstance(n, dict):
|
|
232
|
+
nota_num = n.get("nota")
|
|
233
|
+
if nota_num is not None:
|
|
234
|
+
notas_item_nums.append(str(nota_num))
|
|
235
|
+
continue
|
|
236
|
+
|
|
237
|
+
# 2) se vier string de dict "{'nota': '1401414', 'cfop': '1102'}"
|
|
238
|
+
if isinstance(n, str) and n.strip().startswith("{"):
|
|
239
|
+
try:
|
|
240
|
+
d = ast.literal_eval(n)
|
|
241
|
+
if isinstance(d, dict) and d.get("nota") is not None:
|
|
242
|
+
notas_item_nums.append(str(d["nota"]))
|
|
243
|
+
continue
|
|
244
|
+
except Exception:
|
|
245
|
+
pass
|
|
246
|
+
|
|
247
|
+
# 3) fallback: manter como string (pode ser já o número)
|
|
248
|
+
notas_item_nums.append(str(n))
|
|
199
249
|
|
|
200
250
|
# Acumula para a lista geral (será deduplicada depois)
|
|
201
|
-
notas_encontradas.extend(
|
|
251
|
+
notas_encontradas.extend(notas_item_nums)
|
|
202
252
|
|
|
203
253
|
itens_ui.append(
|
|
204
254
|
{
|
|
@@ -206,7 +256,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
206
256
|
"quantidade": qtd,
|
|
207
257
|
"valor_unitario": valor_unit,
|
|
208
258
|
"valor_total_item": round(valor_unit * qtd, 2),
|
|
209
|
-
"notas":
|
|
259
|
+
"notas": notas_item_nums, # vínculo item ↔ números das notas
|
|
210
260
|
}
|
|
211
261
|
)
|
|
212
262
|
|
|
@@ -221,11 +271,12 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
221
271
|
|
|
222
272
|
data = {
|
|
223
273
|
"nf_referencia": nf_ref, # ex.: ['1418727', '1410744']
|
|
224
|
-
"itens": itens_ui,
|
|
274
|
+
"itens": itens_ui, # cada item com suas notas (apenas números)
|
|
225
275
|
"totais": {
|
|
226
276
|
"valor_final": round(sum(i["valor_total_item"] for i in itens_ui), 2)
|
|
227
277
|
},
|
|
228
278
|
"itens_por_nota": itens_por_nota, # para uso direto no fluxo de UI
|
|
279
|
+
"cfop": cfop, # <<< CFOP único extraído e disponível no payload
|
|
229
280
|
}
|
|
230
281
|
# ========= FIM DA MONTAGEM DO DATA =========
|
|
231
282
|
|
|
@@ -317,11 +368,13 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
317
368
|
app = Application().connect(class_name="TFrmPreVenda")
|
|
318
369
|
main_window = app["TFrmPreVenda"]
|
|
319
370
|
console.print("Verificar estado...")
|
|
320
|
-
|
|
321
|
-
|
|
371
|
+
cfop_dentro = ["5101", "5102", "5103", "5104", "1102"]
|
|
372
|
+
if cfop not in cfop_dentro:
|
|
373
|
+
modelo = "DEVOLUCAO DE COMPRA DE MERCADORIAS SC"
|
|
322
374
|
else:
|
|
323
375
|
modelo = "DEVOLUCAO DE COMPRA DE MERCADORIAS - TRIBUTADO"
|
|
324
376
|
|
|
377
|
+
|
|
325
378
|
# Inserir modelo
|
|
326
379
|
console.print("Inserir modelo...")
|
|
327
380
|
select_modelo = main_window.child_window(
|
|
@@ -402,7 +455,22 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
402
455
|
await worker_sleep(1)
|
|
403
456
|
input_codigo.type_keys(codigo, with_spaces=True, set_foreground=True)
|
|
404
457
|
keyboard.send_keys("{TAB}")
|
|
405
|
-
await worker_sleep(
|
|
458
|
+
await worker_sleep(5)
|
|
459
|
+
try:
|
|
460
|
+
# Verificar item sem saldo
|
|
461
|
+
app_item_ss = Application().connect(class_name="TFrmPesquisaItem")
|
|
462
|
+
item_ss = app_item_ss["TFrmPesquisaItem"]
|
|
463
|
+
btn_ss = item_ss.child_window(
|
|
464
|
+
title="&Cancela", class_name="TDBIBitBtn").click_input()
|
|
465
|
+
# adiciona no dicionário de erros
|
|
466
|
+
itens_sem_saldo[codigo] = {
|
|
467
|
+
"quantidade": quantidade,
|
|
468
|
+
"valor_unitario": val_unitario,
|
|
469
|
+
}
|
|
470
|
+
continue
|
|
471
|
+
|
|
472
|
+
except:
|
|
473
|
+
pass
|
|
406
474
|
|
|
407
475
|
# --- Unidade (UNI) ---
|
|
408
476
|
console.print("Selecionar Unidade...")
|
|
@@ -472,7 +540,7 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
472
540
|
had_saldo = True
|
|
473
541
|
try:
|
|
474
542
|
console.print("Verificar mensagem de saldo menor....")
|
|
475
|
-
# img_saldo = r"C:\Users\automatehub\
|
|
543
|
+
# img_saldo = r"C:\Users\automatehub\Desktop\img_leo\saldo_menor.png"
|
|
476
544
|
img_saldo = "assets\\devolucao_produtos\\saldo_menor.png"
|
|
477
545
|
img_saldo_bool = False
|
|
478
546
|
|
|
@@ -929,7 +997,16 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
929
997
|
app = Application().connect(class_name="TFrmDadosTributacaoProdutoPreVenda")
|
|
930
998
|
trib = app["TFrmDadosTributacaoProdutoPreVenda"]
|
|
931
999
|
|
|
932
|
-
if
|
|
1000
|
+
if "disbal" in fornecedor.lower():
|
|
1001
|
+
select_trib.select("020 - 020 - ICMS 12% RED. BASE 41,667")
|
|
1002
|
+
|
|
1003
|
+
elif "punta balena" in fornecedor.lower():
|
|
1004
|
+
select_trib.select("000 - 000 - ICMS - 12%")
|
|
1005
|
+
|
|
1006
|
+
elif "vitrola" in fornecedor.lower():
|
|
1007
|
+
select_trib.select("041 - 041 - ICMS - NAO INCIDENTE ")
|
|
1008
|
+
|
|
1009
|
+
elif estado == "RS" and "pepsico" in fornecedor.lower():
|
|
933
1010
|
select_trib = trib.child_window(class_name="TDBIComboBox", found_index=4)
|
|
934
1011
|
select_trib.select("051 - 051 - ICMS 17% RED BC 29,4118% - TRIBUT.CORRETA")
|
|
935
1012
|
print("Selecionado: 051 - 051 - ICMS 17% RED BC 29,4118% - TRIBUT.CORRETA")
|
|
@@ -947,16 +1024,6 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
947
1024
|
else:
|
|
948
1025
|
print("Estado diferente dos mapeados")
|
|
949
1026
|
|
|
950
|
-
if "disbal" in fornecedor.lower():
|
|
951
|
-
select_trib.select("020 - 020 - ICMS 12% RED. BASE 41,667")
|
|
952
|
-
|
|
953
|
-
elif "punta balena" in fornecedor.lower():
|
|
954
|
-
select_trib.select("000 - 000 - ICMS - 12%")
|
|
955
|
-
|
|
956
|
-
elif "vitrola" in fornecedor.lower():
|
|
957
|
-
select_trib.select("041 - 041 - ICMS - NAO INCIDENTE ")
|
|
958
|
-
|
|
959
|
-
|
|
960
1027
|
await worker_sleep(2)
|
|
961
1028
|
|
|
962
1029
|
trib.child_window(title="&OK", class_name="TBitBtn").click_input()
|
|
@@ -1119,3 +1186,4 @@ async def devolucao_produtos(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoD
|
|
|
1119
1186
|
status=RpaHistoricoStatusEnum.Sucesso,
|
|
1120
1187
|
tags=[RpaTagDTO(descricao=RpaTagEnum.Negocio)],
|
|
1121
1188
|
)
|
|
1189
|
+
|
|
@@ -45,7 +45,7 @@ worker_automate_hub/tasks/jobs/descartes.py,sha256=wIi8n4vZrNE-03C5_lr4FmxuKoWSY
|
|
|
45
45
|
worker_automate_hub/tasks/jobs/devolucao_ctf.py,sha256=7tdUihaDqjIf7POjM79EqKG0w-qqXbhC6jq6hteavkw,250822
|
|
46
46
|
worker_automate_hub/tasks/jobs/devolucao_ctf_35.py,sha256=e9t5k2mtZcUcEGKPWysbWzsH_gqrK-6aBXjWe2jWfTg,253948
|
|
47
47
|
worker_automate_hub/tasks/jobs/devolucao_prazo_a_faturar.py,sha256=kzPJazDRbz2CLn8tKja2Lg1N4UzTRF1V4Nc1elIqTGY,272145
|
|
48
|
-
worker_automate_hub/tasks/jobs/devolucao_produtos.py,sha256=
|
|
48
|
+
worker_automate_hub/tasks/jobs/devolucao_produtos.py,sha256=0fhq7i4pxF-owwK8Lj3dWEsmIESMVweRpQU3Zt4c0cc,46688
|
|
49
49
|
worker_automate_hub/tasks/jobs/ecac_estadual_go.py,sha256=dKkf22nH5gp3RErq5u0UzRsKyJ81fc6ZZ4vLtUuMwHA,21002
|
|
50
50
|
worker_automate_hub/tasks/jobs/ecac_estadual_main.py,sha256=8WmKe4-MRtzHobXz2S4YBDNN8alfawkC-BBlRY-mn1g,1726
|
|
51
51
|
worker_automate_hub/tasks/jobs/ecac_estadual_mt.py,sha256=C26zmpGQGUq6sP9lU9nanM3Fje-rkyx5tjwmRy4lyL8,25300
|
|
@@ -105,7 +105,7 @@ worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbV
|
|
|
105
105
|
worker_automate_hub/utils/util.py,sha256=rDp5h36I_kMfaCDD9xgcxibRXe5AYaImlXKhGbQ7DHE,211273
|
|
106
106
|
worker_automate_hub/utils/utils_nfe_entrada.py,sha256=F7jk95LpDwl5WfaQXahCA5yDdnySnWdctDqczHXwGqE,38195
|
|
107
107
|
worker_automate_hub/worker.py,sha256=zEnYUrm5kY2cHbbee15QJkwkx4euD2SB2zRvUIbjS90,6850
|
|
108
|
-
worker_automate_hub-0.5.
|
|
109
|
-
worker_automate_hub-0.5.
|
|
110
|
-
worker_automate_hub-0.5.
|
|
111
|
-
worker_automate_hub-0.5.
|
|
108
|
+
worker_automate_hub-0.5.833.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
|
|
109
|
+
worker_automate_hub-0.5.833.dist-info/METADATA,sha256=qVom8MIpTMS_auXAR-oaAHDQWmAlQ_XRDl7ZKxbZq5Q,3142
|
|
110
|
+
worker_automate_hub-0.5.833.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
111
|
+
worker_automate_hub-0.5.833.dist-info/RECORD,,
|
|
File without changes
|
{worker_automate_hub-0.5.832.dist-info → worker_automate_hub-0.5.833.dist-info}/entry_points.txt
RENAMED
|
File without changes
|