worker-automate-hub 0.5.749__py3-none-any.whl → 0.5.912__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.
Files changed (36) hide show
  1. worker_automate_hub/api/client.py +186 -68
  2. worker_automate_hub/api/rpa_historico_service.py +1 -0
  3. worker_automate_hub/cli.py +91 -111
  4. worker_automate_hub/tasks/jobs/abertura_livros_fiscais.py +112 -229
  5. worker_automate_hub/tasks/jobs/descartes.py +91 -77
  6. worker_automate_hub/tasks/jobs/devolucao_produtos.py +1386 -0
  7. worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +3 -46
  8. worker_automate_hub/tasks/jobs/entrada_de_notas_22.py +833 -0
  9. worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +29 -9
  10. worker_automate_hub/tasks/jobs/entrada_de_notas_37.py +619 -0
  11. worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +1 -1
  12. worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +63 -16
  13. worker_automate_hub/tasks/jobs/extracao_dados_nielsen.py +504 -0
  14. worker_automate_hub/tasks/jobs/extracao_saldo_estoque.py +242 -108
  15. worker_automate_hub/tasks/jobs/extracao_saldo_estoque_fiscal.py +688 -0
  16. worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +2 -2
  17. worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +25 -16
  18. worker_automate_hub/tasks/jobs/geracao_balancetes_filial.py +330 -0
  19. worker_automate_hub/tasks/jobs/importacao_extratos.py +538 -0
  20. worker_automate_hub/tasks/jobs/importacao_extratos_748.py +800 -0
  21. worker_automate_hub/tasks/jobs/inclusao_pedidos_ipiranga.py +222 -0
  22. worker_automate_hub/tasks/jobs/inclusao_pedidos_raizen.py +174 -0
  23. worker_automate_hub/tasks/jobs/inclusao_pedidos_vibra.py +327 -0
  24. worker_automate_hub/tasks/jobs/notas_faturamento_sap.py +438 -157
  25. worker_automate_hub/tasks/jobs/opex_capex.py +540 -326
  26. worker_automate_hub/tasks/jobs/sped_fiscal.py +8 -8
  27. worker_automate_hub/tasks/jobs/transferencias.py +52 -41
  28. worker_automate_hub/tasks/task_definitions.py +46 -1
  29. worker_automate_hub/tasks/task_executor.py +11 -0
  30. worker_automate_hub/utils/util.py +252 -215
  31. worker_automate_hub/utils/utils_nfe_entrada.py +1 -1
  32. worker_automate_hub/worker.py +1 -9
  33. {worker_automate_hub-0.5.749.dist-info → worker_automate_hub-0.5.912.dist-info}/METADATA +4 -2
  34. {worker_automate_hub-0.5.749.dist-info → worker_automate_hub-0.5.912.dist-info}/RECORD +36 -25
  35. {worker_automate_hub-0.5.749.dist-info → worker_automate_hub-0.5.912.dist-info}/WHEEL +1 -1
  36. {worker_automate_hub-0.5.749.dist-info → worker_automate_hub-0.5.912.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,327 @@
1
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import (
2
+ RpaHistoricoStatusEnum,
3
+ RpaRetornoProcessoDTO,
4
+ RpaTagDTO,
5
+ RpaTagEnum,
6
+ )
7
+ from worker_automate_hub.models.dto.rpa_processo_entrada_dto import (
8
+ RpaProcessoEntradaDTO,
9
+ )
10
+ from rich.console import Console
11
+ import asyncio
12
+ from datetime import datetime
13
+ import re
14
+ from playwright.async_api import async_playwright
15
+ from worker_automate_hub.api.client import get_config_by_name
16
+ from worker_automate_hub.utils.util import capture_and_send_screenshot, kill_all_emsys
17
+
18
+ logger = Console()
19
+
20
+
21
+ async def inclusao_pedidos_vibra(task: RpaProcessoEntradaDTO):
22
+ try:
23
+ await kill_all_emsys()
24
+ config_entrada = task.configEntrada
25
+ #Collect configs
26
+ config = await get_config_by_name("ConsultaPreco")
27
+ config = config.conConfiguracao
28
+ async with async_playwright() as p:
29
+ logger.print("Starting Browser")
30
+ browser = await p.chromium.launch(
31
+ headless=False,
32
+ args=[
33
+ "--disable-blink-features=AutomationControlled",
34
+ "--no-sandbox",
35
+ "--disable-dev-shm-usage",
36
+ "--disable-gpu",
37
+ "--disable-infobars",
38
+ "--window-size=1920,1080"
39
+ ]
40
+ )
41
+ page = await browser.new_page()
42
+ await page.set_viewport_size({"width": 1850, "height": 900})
43
+ await page.goto(config.get('url_vibra'), wait_until="load")
44
+ #Login
45
+ try:
46
+ await page.locator('//*[@id="usuario"]').type(config.get('login_vibra'))
47
+ await page.locator('//*[@id="senha"]').type(config.get('pass_vibra'))
48
+ await page.locator('//*[@id="btn-acessar"]').click()
49
+ await asyncio.sleep(20)
50
+ except Exception as e:
51
+ raise Exception("An error occurred: Erro ao efetuar login")
52
+ await page.wait_for_selector("#img-menu-open", timeout=50000)
53
+ selector = '.btn.btn-informativo'
54
+ counter = 0
55
+ count = await page.locator(selector).count()
56
+ while counter < count:
57
+ count = await page.locator(selector).count()
58
+ if count == 0:
59
+ break
60
+ for i in range(count):
61
+ try:
62
+ button = page.locator(selector).nth(i)
63
+ await button.scroll_into_view_if_needed(timeout=1000)
64
+ await button.click(force=True, timeout=1000)
65
+ await asyncio.sleep(1)
66
+ except Exception as e:
67
+ continue
68
+ counter += 1
69
+ await asyncio.sleep(1)
70
+
71
+ try:
72
+ try:
73
+ await page.locator('//*[@id="img-menu-open"]').click()
74
+ except:
75
+ await page.locator('//*[@id="btnMenu"]').click()
76
+ await asyncio.sleep(1)
77
+ await page.locator('//*[@id="menu"]/div/div[2]/ul/li[4]').hover()
78
+ await asyncio.sleep(1)
79
+ await page.locator('//*[@id="menu"]/div/div[2]/ul/li[4]/ul/li[5]/a').click()
80
+ except Exception as e:
81
+ await capture_and_send_screenshot(task.historico_id, "Erro")
82
+ raise Exception("An error occurred: Erro ao abrir menu")
83
+ await asyncio.sleep(20)
84
+ logger.print("Selecting company")
85
+ #Getting cod SAP
86
+ try:
87
+ cod_sap_relation = await get_config_by_name('vibraCodSapRelation')
88
+ cod_sap_relation = cod_sap_relation.conConfiguracao
89
+ cnpj = config_entrada.get('cnpjEmpresa')
90
+ #Selecting company by CodSAP
91
+ await page.wait_for_selector("select[name='filtroCodigoLogin']", state="visible", timeout=60000)
92
+ await page.select_option("select[name='filtroCodigoLogin']", cod_sap_relation[cnpj], timeout=60000)
93
+ except:
94
+ await capture_and_send_screenshot(task.historico_id, "Erro")
95
+ raise Exception("An error occurred: Erro ao selecionar empresa")
96
+ await page.locator('//*[@id="conteudo"]/div/form[1]/div/table[2]/tbody/tr/td/input').click()
97
+ await page.wait_for_selector('//*[@id="conteudo"]/div/form[2]/div/table[2]/tbody/tr[2]/td[1]/input[1]')
98
+ texto = await page.locator('tr td.result_bold').nth(0).inner_text()
99
+ await page.locator('//*[@id="conteudo"]/div/form[2]/div/table[2]/tbody/tr[2]/td[1]/input[1]').click()
100
+ await asyncio.sleep(1)
101
+ logger.print("Confirming")
102
+ await page.locator('//*[@id="conteudo"]/div/form[2]/div/table[1]/tbody/tr/td/input[1]').click()
103
+ texto_atual = await page.locator('span.info-cliente.hidden-xs').inner_text()
104
+ if texto not in texto_atual:
105
+ await capture_and_send_screenshot(task.historico_id, "Erro")
106
+ raise Exception("An error occurred: Não foi possivel selecionar a empresa para realizer pedido de combustivel.")
107
+ logger.print("Clicking Pedidos")
108
+ await page.locator('//*[@id="menuAcessoRevendedorPedidos"]').click()
109
+ await asyncio.sleep(10)
110
+ #Cleaning cart
111
+ try:
112
+ await page.goto("https://cn.vibraenergia.com.br/central-de-pedidos/#/meu-carrinho")
113
+ await asyncio.sleep(6)
114
+ #Cleaning cart
115
+ await page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-meu-carrinho/div/div[1]/app-carrinho/div/div[2]/div/button[2]/span[1]/mat-icon').click()
116
+ await asyncio.sleep(6)
117
+ except:
118
+ await page.goto('https://cn.vibraenergia.com.br/central-de-pedidos/#/vitrine')
119
+ logger.print("Selecting Base")
120
+ base_ralation = await get_config_by_name("relacaoBaseVibra")
121
+ base_ralation = base_ralation.conConfiguracao
122
+ base = base_ralation[config_entrada['baseNome']]
123
+ try:
124
+ logger.print(f"{base}")
125
+ await page.wait_for_selector('input[formcontrolname="base"]', state="visible", timeout=60000)
126
+ await page.locator('input[formcontrolname="base"]').click()
127
+ await asyncio.sleep(3)
128
+ await page.locator('.md-icons.adicionar-bases-icon').click()
129
+ await asyncio.sleep(3)
130
+ base_selection = page.locator('.mat-option-text', has_text=base)
131
+ await base_selection.scroll_into_view_if_needed()
132
+ await asyncio.sleep(3)
133
+ await base_selection.click()
134
+ await asyncio.sleep(4)
135
+ except:
136
+ await capture_and_send_screenshot(task.historico_id, "Erro")
137
+ raise Exception("An error occurred: Erro ao selecionar base")
138
+ logger.print("Getting configuration")
139
+ xpaths = await get_config_by_name('vibraXpathCombustiveis')
140
+ xpaths = xpaths.conConfiguracao
141
+ try:
142
+ for fuel in config_entrada['combustiveis']:
143
+ if fuel['uuidItem'] in xpaths:
144
+ try:
145
+ logger.print('Collecting Carrossel')
146
+ carrossel = page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]')
147
+ xpath = xpaths[fuel['uuidItem']]
148
+ fuel_card = carrossel.locator(xpath)
149
+ await fuel_card.scroll_into_view_if_needed()
150
+ card = fuel_card.filter(has=page.locator('button:not([disabled])', has_text="Adicionar"))
151
+ await card.scroll_into_view_if_needed()
152
+ await card.locator('button:not([disabled])', has_text="Adicionar").click()
153
+ except:
154
+ try:
155
+ logger.print('Collecting Carrossel 2')
156
+ carrossel = page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]')
157
+ await carrossel.locator('mat-icon:has-text("chevron_right")').click()
158
+ carrossel = page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]')
159
+ fuel_card = carrossel.locator(xpath)
160
+ card = fuel_card.filter(has=page.locator('button:not([disabled])', has_text="Adicionar")).first
161
+ await card.scroll_into_view_if_needed()
162
+ await card.locator(
163
+ "button:not([disabled])", has_text="Adicionar"
164
+ ).click()
165
+ except:
166
+ try:
167
+ logger.print("Collecting Carrossel 2")
168
+ carrossel = page.locator(
169
+ '//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]'
170
+ )
171
+ await carrossel.locator(
172
+ 'mat-icon:has-text("chevron_right")'
173
+ ).click()
174
+ carrossel = page.locator(
175
+ '//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]'
176
+ )
177
+ fuel_card = carrossel.locator(xpath)
178
+ card = fuel_card.filter(
179
+ has=page.locator(
180
+ "button:not([disabled])",
181
+ has_text="Adicionar",
182
+ )
183
+ ).first
184
+ await card.scroll_into_view_if_needed()
185
+ await card.locator(
186
+ "button:not([disabled])", has_text="Adicionar"
187
+ ).click()
188
+ except:
189
+ logger.print('Collecting Carrossel 3')
190
+ carrossel = page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]')
191
+ await carrossel.locator('mat-icon:has-text("chevron_left")').click()
192
+ carrossel = page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-vitrine/div/div[3]/div[4]/div[2]/app-carrosel-produtos/div/div[1]')
193
+ fuel_card = carrossel.locator(xpath)
194
+ card = fuel_card.filter(has=page.locator('button:not([disabled])', has_text="Adicionar")).first
195
+ await card.scroll_into_view_if_needed()
196
+ await card.locator('button:not([disabled])', has_text="Adicionar").click()
197
+ except:
198
+ await capture_and_send_screenshot(task.historico_id, "Erro")
199
+ raise Exception("An error occurred: Nao foi possivel selecionar combustivel")
200
+ #Go to Cart
201
+ await asyncio.sleep(5)
202
+ await page.locator('//*[@id="user"]/app-root/div[1]/div[1]/cn-header/header/div/div[4]/div/i').click()
203
+ await asyncio.sleep(10)
204
+ #Fill Date
205
+ await page.get_by_role("button", name="Open calendar").click()
206
+ #Get Calendar
207
+ await asyncio.sleep(1)
208
+ await page.wait_for_selector(".cdk-overlay-pane mat-calendar")
209
+ date = config_entrada['dataRetirada']
210
+ date = datetime.fromisoformat(date)
211
+ date_day = str(date.day)
212
+ today = datetime.now()
213
+ if date.month > today.month:
214
+ #change month
215
+ await page.get_by_label("Next month").click()
216
+ await asyncio.sleep(1)
217
+ await page.locator(f".mat-calendar-body-cell-content:text-is('{date_day}')").click()
218
+ await page.keyboard.press("Escape")
219
+ await asyncio.sleep(10)
220
+ #Collect Cards in cart
221
+ items = page.locator("app-accordion-item-carrinho")
222
+ count = await items.count()
223
+ consulta_preco = await get_config_by_name('ConsultaPrecoCombustiveisIds')
224
+ consulta_preco = consulta_preco.conConfiguracao["CombustiveisIds"]
225
+ logger.print(f"Found {count} items in cart")
226
+ await asyncio.sleep(5)
227
+ for i in range(count):
228
+ logger.print(f"Collecting name of item {i}")
229
+ item = items.nth(i)
230
+ nome = (await item.locator(".produto-nome").inner_text()).strip()
231
+ logger.print(f"Collecting {nome}")
232
+ # Find config by fuel name
233
+ config_item = next((c for c in consulta_preco if c['descricaoVibra'].lower() == nome.lower()), None)
234
+ if not config_item:
235
+ continue
236
+ # Find fuel by UUID
237
+ fuel = next((f for f in config_entrada['combustiveis'] if f['uuidItem'] == config_item['uuid']), None)
238
+ if not fuel:
239
+ continue
240
+ await item.locator("input[formcontrolname='quantidade']").fill("")
241
+ await item.locator("input[formcontrolname='quantidade']").fill(str(fuel['quantidade']))
242
+ await item.locator("input[formcontrolname='quantidade']").press("Escape")
243
+ prazo_select_trigger = item.locator("mat-select[formcontrolname='prazo']")
244
+ await prazo_select_trigger.scroll_into_view_if_needed()
245
+ await prazo_select_trigger.click()
246
+ await asyncio.sleep(5)
247
+ await page.wait_for_selector("mat-option", timeout=5000)
248
+ try:
249
+ if config_entrada['diasFaturamento'] == 1:
250
+ option = page.locator("mat-option .mat-option-text", has_text="1 Dia").first
251
+ else:
252
+ option = page.locator("mat-option .mat-option-text", has_text=f"{str(config_entrada['diasFaturamento'])} Dias").first
253
+ except:
254
+ await capture_and_send_screenshot(task.historico_id, "Erro")
255
+ raise Exception(f"Opção de {str(config_entrada['diasFaturamento'])} Dia(s) não encontrada")
256
+ await option.scroll_into_view_if_needed()
257
+ # await option.click()
258
+ await option.evaluate("(el) => el.click()")
259
+ await asyncio.sleep(10)
260
+ #Confirm order
261
+ try:
262
+ msg = page.locator("text=Volume solicitado acima")
263
+ if await msg.is_visible():
264
+ texto = await msg.inner_text()
265
+ await capture_and_send_screenshot(task.historico_id, "Erro")
266
+ raise Exception(texto)
267
+ except:
268
+ pass
269
+ try:
270
+ await page.wait_for_selector('//*[@id="user"]/app-root/div[2]/div/div/app-meu-carrinho/div/div[1]/app-carrinho/div/div[2]/button')
271
+ await page.locator('//*[@id="user"]/app-root/div[2]/div/div/app-meu-carrinho/div/div[1]/app-carrinho/div/div[2]/button').click()
272
+ await asyncio.sleep(5)
273
+ except:
274
+ await capture_and_send_screenshot(task.historico_id, "Erro")
275
+ raise Exception("Falha ao confirmar pedido")
276
+ #Close Satisfaction Survey
277
+ try:
278
+ logger.print("Closing satisfaction survey")
279
+ await page.locator('//*[@id="mat-dialog-2"]/lib-cn-pesquisa-satisfacao/div/i', timeout=1000).click()
280
+ except:
281
+ logger.print("No satisfaction survey found")
282
+ pass
283
+ await asyncio.sleep(10)
284
+ #Collect order details
285
+ logger.print("Collecting order details")
286
+ numero_pedido = None
287
+ for _ in range(5):
288
+ try:
289
+ success_message = page.locator("div.sucesso span").first
290
+ success_message = await success_message.inner_text()
291
+ if "sucesso" in success_message:
292
+ success_message = success_message.strip()
293
+ logger.print(success_message)
294
+ numero_pedido = re.search(r"\d+", success_message).group()
295
+ break
296
+ else:
297
+ await capture_and_send_screenshot(task.historico_id, "Erro")
298
+ raise Exception(f"Site nao retornou sucesso ao realizar pedido: {str(success_message)}")
299
+ except Exception as e:
300
+ logger.print(f"An error occurred: {e}")
301
+ await asyncio.sleep(7)
302
+ continue
303
+ if not numero_pedido:
304
+ await capture_and_send_screenshot(task.historico_id, "Erro")
305
+ raise Exception("Erro ao coletar numero do pedido")
306
+ bof = {
307
+ 'numero_pedido' : numero_pedido,
308
+ 'cnpj': config_entrada["cnpjEmpresa"],
309
+ 'data': date.strftime('%d/%m/%Y')
310
+ }
311
+ await capture_and_send_screenshot(task.historico_id, "Sucesso ao realizar pedido!")
312
+ await browser.close()
313
+ return RpaRetornoProcessoDTO(
314
+ sucesso=True,
315
+ retorno=str(bof),
316
+ status=RpaHistoricoStatusEnum.Sucesso)
317
+ except Exception as e:
318
+ logger.print(f"An error occurred: {e}")
319
+ await capture_and_send_screenshot(task.historico_id, "Erro")
320
+ return RpaRetornoProcessoDTO(
321
+ sucesso=False,
322
+ retorno=f"An error occurred: {e}",
323
+ status=RpaHistoricoStatusEnum.Falha,
324
+ tags=[RpaTagDTO(descricao=RpaTagEnum.Tecnico), RpaTagDTO(descricao=RpaTagEnum.Negocio)],
325
+ )
326
+ finally:
327
+ await browser.close()