csc-cia-stne 0.1.20__tar.gz → 0.1.22__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.
Files changed (51) hide show
  1. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/PKG-INFO +1 -1
  2. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/pyproject.toml +1 -1
  3. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/bc_sta.py +81 -70
  4. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/PKG-INFO +1 -1
  5. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/LICENCE +0 -0
  6. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/README.md +0 -0
  7. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/README_PYPI.md +0 -0
  8. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/setup.cfg +0 -0
  9. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/__init__.py +0 -0
  10. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/bc_correios.py +0 -0
  11. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/email.py +0 -0
  12. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/ftp.py +0 -0
  13. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/gcp_bigquery.py +0 -0
  14. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/gcp_bucket.py +0 -0
  15. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/google_drive.py +0 -0
  16. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/karavela.py +0 -0
  17. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/logger_json.py +0 -0
  18. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/logger_rich.py +0 -0
  19. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/provio.py +0 -0
  20. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/servicenow.py +0 -0
  21. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/slack.py +0 -0
  22. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/stne_admin.py +0 -0
  23. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/__init__.py +0 -0
  24. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/__init__.py +0 -0
  25. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_b64.py +0 -0
  26. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_converters.py +0 -0
  27. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_datetime.py +0 -0
  28. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_delete.py +0 -0
  29. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_get_secret.py +0 -0
  30. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +0 -0
  31. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_settings.py +0 -0
  32. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_titulo.py +0 -0
  33. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/functions/func_validate_json.py +0 -0
  34. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +0 -0
  35. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +0 -0
  36. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +0 -0
  37. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/__init__.py +0 -0
  38. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/ftp.py +0 -0
  39. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/gcp_bucket.py +0 -0
  40. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/waccess.py +0 -0
  41. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/validations/web_validator.py +0 -0
  42. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/__init__.py +0 -0
  43. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_abstract.py +0 -0
  44. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_botcity.py +0 -0
  45. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/utilitarios/web_screen/web_screen_selenium.py +0 -0
  46. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/wacess.py +0 -0
  47. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne/web.py +0 -0
  48. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/SOURCES.txt +0 -0
  49. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/dependency_links.txt +0 -0
  50. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/requires.txt +0 -0
  51. {csc_cia_stne-0.1.20 → csc_cia_stne-0.1.22}/src/csc_cia_stne.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csc_cia_stne
3
- Version: 0.1.20
3
+ Version: 0.1.22
4
4
  Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
5
5
  License: MIT
6
6
  Keywords: karavela,csc,cia,stone,rpa,botcity,stne
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "csc_cia_stne"
7
- version = "0.1.20"
7
+ version = "0.1.22"
8
8
  license = { text = "MIT" }
9
9
  description = "Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs"
10
10
  keywords = ["karavela", "csc", "cia", "stone", "rpa", "botcity", "stne"]
@@ -509,84 +509,95 @@ class BC_STA:
509
509
  tipo_arquivo: list = None):
510
510
  resultados = []
511
511
 
512
- # Parse seguro para datetime (assume formato ISO 'AAAA-MM-DDTHH:MM:SS')
513
- dt_inicio = datetime.fromisoformat(inicio)
514
- dt_fim = datetime.fromisoformat(fim) if fim else None
515
- ultima_dt = dt_inicio
516
-
517
- while True:
518
- # Se já passamos do fim, encerra antes de chamar a API
519
- if dt_fim and ultima_dt >= dt_fim:
520
- break
521
-
522
- # Monta a URL usando a data atual do cursor
523
- _inicio_str = ultima_dt.strftime("%Y-%m-%dT%H:%M:%S")
524
- url = f"{self.base_url}/arquivos?tipoConsulta=AVANC&nivelDetalhe={nivel}"
525
- url += f"&dataHoraInicio={_inicio_str}"
526
- if situacao:
527
- url += f"&situacaoTransmissao={situacao}"
528
- if identificadorDocumento:
529
- url += f"&identificadorDocumento={identificadorDocumento}"
530
- if dt_fim:
531
- _fim_str = dt_fim.strftime("%Y-%m-%dT%H:%M:%S")
532
- url += f"&dataHoraFim={_fim_str}"
533
- url += f"&qtdMaxResultados={qtd}"
534
-
535
- response = requests.get(
536
- url, headers=self.headers, auth=self.auth, timeout=60,
537
- )
538
-
539
- if response.status_code != 200:
540
- log.error(f"Erro ao listar arquivos: response code {response.status_code}\n{response.text}")
541
- return False
542
-
543
- try:
544
- dados = xml_response_to_json(response.text)
545
- if not dados:
546
- break # sem mais resultados
512
+ try:
513
+ # Parse seguro para datetime (assume formato ISO 'AAAA-MM-DDTHH:MM:SS')
514
+ dt_inicio = datetime.fromisoformat(inicio)
515
+ dt_fim = datetime.fromisoformat(fim) if fim else None
516
+ ultima_dt = dt_inicio
517
+
518
+ while True:
519
+ # Se passamos do fim, encerra antes de chamar a API
520
+ if dt_fim and ultima_dt >= dt_fim:
521
+ break
547
522
 
548
- # Normaliza dados para lista
549
- itens = dados if isinstance(dados, list) else [dados]
523
+ # Monta a URL usando a data atual do cursor
524
+ _inicio_str = ultima_dt.strftime("%Y-%m-%dT%H:%M:%S")
525
+ url = f"{self.base_url}/arquivos?tipoConsulta=AVANC&nivelDetalhe={nivel}"
526
+ url += f"&dataHoraInicio={_inicio_str}"
527
+ if situacao:
528
+ url += f"&situacaoTransmissao={situacao}"
529
+ if identificadorDocumento:
530
+ url += f"&identificadorDocumento={identificadorDocumento}"
531
+ if dt_fim:
532
+ _fim_str = dt_fim.strftime("%Y-%m-%dT%H:%M:%S")
533
+ url += f"&dataHoraFim={_fim_str}"
534
+ url += f"&qtdMaxResultados={qtd}"
535
+
536
+ response = requests.get(
537
+ url, headers=self.headers, auth=self.auth, timeout=60,
538
+ )
539
+
540
+ if response.status_code != 200:
541
+ log.error(f"Erro ao listar arquivos: response code {response.status_code}\n{response.text}")
542
+ resposta = {"success": False, "status_code": int(response.status_code), "content": response.text}
543
+ return resposta
550
544
 
551
- # (opcional) filtra por tipo_arquivo
552
- if tipo_arquivo is not None:
553
- itens = [a for a in itens if a.get("TipoArquivo") in tipo_arquivo]
545
+ try:
546
+ dados = xml_response_to_json(response.text)
547
+ if not dados:
548
+ break # sem mais resultados
549
+
550
+ # Normaliza dados para lista
551
+ itens = dados if isinstance(dados, list) else [dados]
552
+
553
+ # (opcional) filtra por tipo_arquivo
554
+ if tipo_arquivo is not None:
555
+ itens = [a for a in itens if a.get("TipoArquivo") in tipo_arquivo]
556
+
557
+ resultados.extend(itens)
558
+
559
+ # Atualiza o cursor a partir do último item retornado
560
+ # Busca o último com DataHoraDisponibilizacao
561
+ ultimo = None
562
+ for cand in reversed(itens):
563
+ if "DataHoraDisponibilizacao" in cand and cand["DataHoraDisponibilizacao"]:
564
+ ultimo = cand["DataHoraDisponibilizacao"]
565
+ break
566
+
567
+ if not ultimo:
568
+ # fallback: se o JSON bruto vier como dict/list diferente, tente no original
569
+ if isinstance(dados, list) and dados and "DataHoraDisponibilizacao" in dados[-1]:
570
+ ultimo = dados[-1]["DataHoraDisponibilizacao"]
571
+ elif isinstance(dados, dict) and "DataHoraDisponibilizacao" in dados:
572
+ ultimo = dados["DataHoraDisponibilizacao"]
573
+
574
+ if not ultimo:
575
+ log.error("Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada.")
576
+ resposta = {"success": False, "status_code": 500, "content": "Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada."}
577
+ return resposta
578
+ #return False
554
579
 
555
- resultados.extend(itens)
580
+ # Cursor: último + 1s para evitar repetir o mesmo registro
581
+ proxima_dt = datetime.fromisoformat(ultimo) + timedelta(seconds=1)
556
582
 
557
- # Atualiza o cursor a partir do último item retornado
558
- # Busca o último com DataHoraDisponibilizacao
559
- ultimo = None
560
- for cand in reversed(itens):
561
- if "DataHoraDisponibilizacao" in cand and cand["DataHoraDisponibilizacao"]:
562
- ultimo = cand["DataHoraDisponibilizacao"]
583
+ # Se a próxima dt ultrapassa o fim, encerramos sem nova chamada
584
+ if dt_fim and proxima_dt > dt_fim:
563
585
  break
564
586
 
565
- if not ultimo:
566
- # fallback: se o JSON bruto vier como dict/list diferente, tente no original
567
- if isinstance(dados, list) and dados and "DataHoraDisponibilizacao" in dados[-1]:
568
- ultimo = dados[-1]["DataHoraDisponibilizacao"]
569
- elif isinstance(dados, dict) and "DataHoraDisponibilizacao" in dados:
570
- ultimo = dados["DataHoraDisponibilizacao"]
571
-
572
- if not ultimo:
573
- log.error("Campo 'DataHoraDisponibilizacao' não encontrado ou estrutura inesperada.")
574
- return False
587
+ ultima_dt = proxima_dt
575
588
 
576
- # Cursor: último + 1s para evitar repetir o mesmo registro
577
- proxima_dt = datetime.fromisoformat(ultimo) + timedelta(seconds=1)
578
-
579
- # Se a próxima dt já ultrapassa o fim, encerramos sem nova chamada
580
- if dt_fim and proxima_dt > dt_fim:
581
- break
582
-
583
- ultima_dt = proxima_dt
584
-
585
- except ET.ParseError as e:
586
- log.error(f"Erro ao processar XML: {e}")
587
- return False
589
+ except ET.ParseError as e:
590
+ log.error(f"Erro ao processar XML: {e}")
591
+ resposta = {"success": False, "status_code": 500, "content": f"Erro ao processar XML: {e}"}
592
+ return resposta
593
+ #return False
588
594
 
589
- return resultados
595
+ return {"success": True, "status_code": 200, "content": resultados}
596
+ #return resultados
597
+ except Exception as e:
598
+ log.error(f"Erro em BC_STA:listar_arquivos: {e}")
599
+ resposta = {"success": False, "status_code": 500, "content": f"Erro em BC_STA:listar_arquivos: {e}"}
600
+ return resposta
590
601
 
591
602
  def download_arquivo(self,protocolo:str,filename:str=None):
592
603
  """Faz o download de um arquivo de um protocolo especifico
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csc_cia_stne
3
- Version: 0.1.20
3
+ Version: 0.1.22
4
4
  Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
5
5
  License: MIT
6
6
  Keywords: karavela,csc,cia,stone,rpa,botcity,stne
File without changes
File without changes
File without changes