csc-cia-stne 0.0.43__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.
- csc_cia_stne/__init__.py +89 -0
- csc_cia_stne/bc_correios.py +529 -0
- csc_cia_stne/bc_sta.py +416 -0
- csc_cia_stne/email.py +239 -0
- csc_cia_stne/gcp_bigquery.py +224 -0
- csc_cia_stne/google_drive.py +268 -0
- csc_cia_stne/karavela.py +135 -0
- csc_cia_stne/logger_json.py +92 -0
- csc_cia_stne/logger_rich.py +249 -0
- csc_cia_stne/provio.py +103 -0
- csc_cia_stne/servicenow.py +689 -0
- csc_cia_stne/slack.py +227 -0
- csc_cia_stne/stne_admin.py +597 -0
- csc_cia_stne/utilitarios/__init__.py +9 -0
- csc_cia_stne/utilitarios/functions/__init__.py +14 -0
- csc_cia_stne/utilitarios/functions/func_b64.py +50 -0
- csc_cia_stne/utilitarios/functions/func_converters.py +18 -0
- csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +29 -0
- csc_cia_stne/utilitarios/functions/func_settings.py +66 -0
- csc_cia_stne/utilitarios/functions/func_titulo.py +141 -0
- csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +133 -0
- csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +144 -0
- csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +403 -0
- csc_cia_stne/utilitarios/validations/__init__.py +3 -0
- csc_cia_stne-0.0.43.dist-info/LICENCE +21 -0
- csc_cia_stne-0.0.43.dist-info/METADATA +33 -0
- csc_cia_stne-0.0.43.dist-info/RECORD +29 -0
- csc_cia_stne-0.0.43.dist-info/WHEEL +5 -0
- csc_cia_stne-0.0.43.dist-info/top_level.txt +1 -0
csc_cia_stne/__init__.py
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
import os
|
2
|
+
from dotenv import load_dotenv
|
3
|
+
from .logger_json import get_logger as get_logger_json
|
4
|
+
from .logger_rich import get_logger as get_logger_rich
|
5
|
+
from .karavela import Karavela
|
6
|
+
from .servicenow import ServiceNow
|
7
|
+
from .stne_admin import StoneAdmin
|
8
|
+
from .bc_sta import BC_STA
|
9
|
+
from .bc_correios import BC_Correios
|
10
|
+
from .gcp_bigquery import BigQuery
|
11
|
+
from .email import Email
|
12
|
+
from .provio import Provio
|
13
|
+
from .google_drive import GoogleDrive
|
14
|
+
from .slack import Slack
|
15
|
+
|
16
|
+
# Define os itens disponíveis para importação
|
17
|
+
__all__ = [
|
18
|
+
"Karavela",
|
19
|
+
"BigQuery",
|
20
|
+
"BC_Correios",
|
21
|
+
"BC_STA",
|
22
|
+
"StoneAdmin",
|
23
|
+
"ServiceNow",
|
24
|
+
"Util",
|
25
|
+
"logger",
|
26
|
+
"Provio",
|
27
|
+
"Email",
|
28
|
+
"GoogleDrive",
|
29
|
+
"Slack"
|
30
|
+
]
|
31
|
+
|
32
|
+
_diretorio_inicial = os.getcwd()
|
33
|
+
_caminho_env = os.path.join(_diretorio_inicial, ".env")
|
34
|
+
|
35
|
+
# Carrega .env
|
36
|
+
load_dotenv(_caminho_env)
|
37
|
+
logger = None # Inicializa como None
|
38
|
+
|
39
|
+
def _running_in_container():
|
40
|
+
"""
|
41
|
+
Verifica se o código está sendo executado dentro de um container.
|
42
|
+
Retorna True se estiver sendo executado dentro de um container e False caso contrário.
|
43
|
+
"""
|
44
|
+
|
45
|
+
if os.environ.get("KUBERNETES_SERVICE_HOST") or os.path.exists("/.dockerenv"):
|
46
|
+
|
47
|
+
return True
|
48
|
+
|
49
|
+
try:
|
50
|
+
|
51
|
+
with open("/proc/1/cgroup", "rt") as file:
|
52
|
+
|
53
|
+
for line in file:
|
54
|
+
|
55
|
+
if "docker" in line or "kubepods" in line:
|
56
|
+
|
57
|
+
return True
|
58
|
+
|
59
|
+
except FileNotFoundError as e:
|
60
|
+
|
61
|
+
return False
|
62
|
+
|
63
|
+
return False
|
64
|
+
|
65
|
+
def logger():
|
66
|
+
"""
|
67
|
+
Retorna um objeto logger com base no ambiente de execução.
|
68
|
+
Se a variável de ambiente 'ambiente_de_execucao' estiver definida e for igual a "karavela",
|
69
|
+
retorna um logger formatado em JSON usando a função get_logger_json().
|
70
|
+
Caso contrário, se estiver executando em um container, retorna um logger formatado em JSON
|
71
|
+
usando a função get_logger_json().
|
72
|
+
Caso contrário, retorna um logger formatado em texto usando a função get_logger_rich().
|
73
|
+
Exemplo de uso:
|
74
|
+
logger_obj = logger()
|
75
|
+
logger_obj.info("Mensagem de informação")
|
76
|
+
logger_obj.error("Mensagem de erro")
|
77
|
+
"""
|
78
|
+
|
79
|
+
if os.getenv('ambiente_de_execucao') is not None and os.getenv('ambiente_de_execucao') == "karavela":
|
80
|
+
|
81
|
+
return get_logger_json()
|
82
|
+
|
83
|
+
elif _running_in_container():
|
84
|
+
|
85
|
+
return get_logger_json()
|
86
|
+
|
87
|
+
else:
|
88
|
+
|
89
|
+
return get_logger_rich()
|
@@ -0,0 +1,529 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from zeep import Client
|
4
|
+
from zeep.transports import Transport
|
5
|
+
from requests import Session
|
6
|
+
from requests.auth import HTTPBasicAuth
|
7
|
+
from datetime import timedelta, datetime, time
|
8
|
+
from typing import List, Tuple, Union, Optional
|
9
|
+
from pydantic import BaseModel
|
10
|
+
|
11
|
+
class PastasAutorizadas(BaseModel):
|
12
|
+
MensagemErro: Optional[str] = None
|
13
|
+
OcorreuErro: bool
|
14
|
+
PastasAutorizadas: Optional[list] = None
|
15
|
+
QuantidadePastasAutorizadas: int
|
16
|
+
|
17
|
+
class ItemListaCorreio(BaseModel):
|
18
|
+
|
19
|
+
Assunto: str
|
20
|
+
Data:datetime
|
21
|
+
UnidadeDestinataria: str
|
22
|
+
DependenciaDestinataria: Optional[str] = None
|
23
|
+
UnidadeRemetente: str
|
24
|
+
DependenciaRemetente: Optional[str] = None
|
25
|
+
Grupo: Optional[str] = None
|
26
|
+
Status: str
|
27
|
+
TipoCorreio: str
|
28
|
+
NumeroCorreio: int
|
29
|
+
Pasta: dict
|
30
|
+
Setor: Optional[str] = None
|
31
|
+
Transicao: int
|
32
|
+
Versao: int
|
33
|
+
|
34
|
+
class ItemMsgCorreio(ItemListaCorreio):
|
35
|
+
|
36
|
+
OcorreuErro: bool
|
37
|
+
MensagemErro: Optional[str] = None
|
38
|
+
#NumeroCorreio = None
|
39
|
+
#Transicao = None
|
40
|
+
#Versao = None
|
41
|
+
#Assunto = None
|
42
|
+
Ementa: Optional[list] = None
|
43
|
+
Conteudo: str
|
44
|
+
#TipoCorreio = None
|
45
|
+
De: str
|
46
|
+
Para: str
|
47
|
+
EnviadaPor: str
|
48
|
+
EnviadaEm: datetime
|
49
|
+
RecebidaPor: str
|
50
|
+
RecebidaEm: datetime
|
51
|
+
Despachos: Optional[list] = None
|
52
|
+
Anexos: Optional[list] = None
|
53
|
+
|
54
|
+
class AnexoDict(BaseModel):
|
55
|
+
|
56
|
+
IdAnexo: int
|
57
|
+
NomeAnexo: str
|
58
|
+
Conteudo: str
|
59
|
+
|
60
|
+
class BC_Correios:
|
61
|
+
|
62
|
+
def __init__(self, wsdl_url:str, usuario:str, senha:str, correios_por_pasta_pasta_unidade_nome:str='40797', correios_por_pasta_pasta_unidade_ativa:bool=True, correios_por_pasta_pasta_unidade_tipo:str='InstituicaoFinanceira', correios_por_pasta_pasta_tipo:str='CaixaEntrada',correios_por_pasta_apenas_mensagens:bool=True, correios_por_pasta_pesquisar_em_todas_as_pastas:bool=True):
|
63
|
+
"""
|
64
|
+
Inicializa a classe BC_Correios.
|
65
|
+
Parâmetros:
|
66
|
+
- wsdl_url (str): URL do WSDL do serviço dos Correios.
|
67
|
+
- usuario (str): Nome de usuário para autenticação no serviço dos Correios.
|
68
|
+
- senha (str): Senha para autenticação no serviço dos Correios.
|
69
|
+
- correios_por_pasta_pasta_unidade_nome (str, opcional): Nome da unidade da pasta dos Correios. Valor padrão é '40797'.
|
70
|
+
- correios_por_pasta_pasta_unidade_ativa (bool, opcional): Indica se a unidade da pasta dos Correios está ativa. Valor padrão é True.
|
71
|
+
- correios_por_pasta_pasta_unidade_tipo (str, opcional): Tipo da unidade da pasta dos Correios. Valor padrão é 'InstituicaoFinanceira'.
|
72
|
+
- correios_por_pasta_pasta_tipo (str, opcional): Tipo da pasta dos Correios. Valor padrão é 'CaixaEntrada'.
|
73
|
+
- correios_por_pasta_apenas_mensagens (bool, opcional): Indica se deve retornar apenas mensagens da pasta dos Correios. Valor padrão é True.
|
74
|
+
- correios_por_pasta_pesquisar_em_todas_as_pastas (bool, opcional): Indica se deve pesquisar em todas as pastas dos Correios. Valor padrão é True.
|
75
|
+
"""
|
76
|
+
|
77
|
+
try:
|
78
|
+
|
79
|
+
session = Session()
|
80
|
+
session.auth = HTTPBasicAuth(usuario,senha)
|
81
|
+
|
82
|
+
transport = Transport(session=session,timeout=120,operation_timeout=120)
|
83
|
+
|
84
|
+
self.client = Client(wsdl_url, transport=transport)
|
85
|
+
self.is_connected = True
|
86
|
+
self.error = None
|
87
|
+
self.CorreiosPorPastaPastaUnidadeNome = correios_por_pasta_pasta_unidade_nome
|
88
|
+
self.CorreiosPorPastaPastaUnidadeAtiva = correios_por_pasta_pasta_unidade_ativa
|
89
|
+
self.CorreiosPorPastaPastaUnidadeTipo = correios_por_pasta_pasta_unidade_tipo
|
90
|
+
self.CorreiosPorPastaPastaTipo = correios_por_pasta_pasta_tipo
|
91
|
+
self.CorreiosPorPastaApenasMensagens = correios_por_pasta_apenas_mensagens
|
92
|
+
self.CorreiosPorPastaPesquisarEmTodasAsPastas = correios_por_pasta_pesquisar_em_todas_as_pastas
|
93
|
+
|
94
|
+
except Exception as e:
|
95
|
+
|
96
|
+
self.is_connected = False
|
97
|
+
self.error = e
|
98
|
+
|
99
|
+
def consultar_pastas_autorizadas(self)->Tuple[bool, Union[PastasAutorizadas, Exception]]:
|
100
|
+
"""
|
101
|
+
Retorna as pastas de correio e os setores que o usuário tem permissão de acessar.
|
102
|
+
"""
|
103
|
+
|
104
|
+
try:
|
105
|
+
|
106
|
+
response = self.client.service.ConsultarPastasAutorizadas()
|
107
|
+
|
108
|
+
if response.OcorreuErro:
|
109
|
+
|
110
|
+
raise Exception(response.MensagemErro)
|
111
|
+
|
112
|
+
pastas = PastasAutorizadas(MensagemErro=response.MensagemErro, OcorreuErro=response.OcorreuErro, QuantidadePastasAutorizadas=response.QuantidadePastasAutorizadas,PastasAutorizadas=response.PastasAutorizadas.PastaAutorizadaWSDTO)
|
113
|
+
|
114
|
+
return True, pastas
|
115
|
+
|
116
|
+
except Exception as e:
|
117
|
+
|
118
|
+
return False, e
|
119
|
+
|
120
|
+
def consultar_correios_por_pasta(self,ultimos_x_dias:int=None,data_inicial:datetime=None,data_final:datetime=None)->Tuple[bool, Union[List['ItemListaCorreio'], Exception]]:
|
121
|
+
|
122
|
+
"""
|
123
|
+
Retorna uma lista com os cabeçalhos dos correios contidos em uma pasta.
|
124
|
+
|
125
|
+
A consulta pode ser realizada de 2 maneiras:
|
126
|
+
1. Especificando um intervalo de dias relativos ao dia atual (com `ultimos_x_dias`).
|
127
|
+
2. Informando explicitamente uma `data_inicial` E `data_final`.
|
128
|
+
|
129
|
+
Args:
|
130
|
+
ultimos_x_dias (int, opcional): O número de dias a contar para trás a partir da data atual. Se especificado, ignorará `data_inicial` e `data_final`.
|
131
|
+
data_inicial (datetime, opcional): Data inicial do intervalo para filtrar os correios.
|
132
|
+
data_final (datetime, opcional): Data final do intervalo para filtrar os correios.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
tuple: Um par contendo:
|
136
|
+
- bool: Indica se a operação foi bem-sucedida (True) ou falhou (False).
|
137
|
+
- Union[list[ItemListaCorreio], Exception]: Retorna uma lista de objetos `ItemListaCorreio` contendo os detalhes dos correios encontrados, ou uma exceção em caso de erro.
|
138
|
+
"""
|
139
|
+
|
140
|
+
try:
|
141
|
+
|
142
|
+
if ultimos_x_dias is not None and isinstance(ultimos_x_dias,int):
|
143
|
+
|
144
|
+
agora = datetime.now()
|
145
|
+
|
146
|
+
# Pegando mensagens antigas, ja lidas, no desenvolvimento, para nao atrapalhar o time com as mensagens nao lidas atuais
|
147
|
+
#logger.warning("VERIFICAR DATA DO 'AGORA'!")
|
148
|
+
#agora = datetime.now() - timedelta(days=150)
|
149
|
+
|
150
|
+
dt_inicial_iso_format = agora - timedelta(days=ultimos_x_dias)
|
151
|
+
dt_inicial_iso_format = datetime.combine(dt_inicial_iso_format.date(), time.min)
|
152
|
+
dt_inicial_iso_format = dt_inicial_iso_format.isoformat()
|
153
|
+
|
154
|
+
dt_final_iso_format = datetime.combine(agora.date(), time.max)
|
155
|
+
dt_final_iso_format = agora.isoformat()
|
156
|
+
|
157
|
+
elif data_inicial is isinstance(data_inicial,datetime) and data_final is isinstance(data_final,datetime):
|
158
|
+
|
159
|
+
dt_inicial_iso_format = data_inicial.isoformat()
|
160
|
+
dt_final_iso_format = data_final.isoformat()
|
161
|
+
|
162
|
+
else:
|
163
|
+
|
164
|
+
raise ValueError("ultimos_x_dias se for informado, precisa ser um numero inteiro. Ou entao se for informado data_inicial E data_final, esses 2 parametros precisam ser datetime")
|
165
|
+
|
166
|
+
correios_filtrados = []
|
167
|
+
correios_repetidos = []
|
168
|
+
pagina_atual = 1
|
169
|
+
|
170
|
+
def objeto_ja_existe_na_lista(novo_item, lista_de_correios):
|
171
|
+
|
172
|
+
for item in lista_de_correios:
|
173
|
+
|
174
|
+
if (str(item.NumeroCorreio) == str(novo_item.NumeroCorreio)):
|
175
|
+
|
176
|
+
return True
|
177
|
+
|
178
|
+
return False
|
179
|
+
|
180
|
+
proxima_centena = 100
|
181
|
+
while True:
|
182
|
+
|
183
|
+
correios = None
|
184
|
+
params = {
|
185
|
+
'Pasta': {
|
186
|
+
'Unidade': {
|
187
|
+
'Nome': self.CorreiosPorPastaPastaUnidadeNome,
|
188
|
+
'Ativa': self.CorreiosPorPastaPastaUnidadeAtiva,
|
189
|
+
'Tipo': self.CorreiosPorPastaPastaUnidadeTipo
|
190
|
+
},
|
191
|
+
'Tipo': self.CorreiosPorPastaPastaTipo
|
192
|
+
},
|
193
|
+
'ApenasMensagens': self.CorreiosPorPastaApenasMensagens,
|
194
|
+
'PesquisarEmTodasAsPastas': self.CorreiosPorPastaPesquisarEmTodasAsPastas,
|
195
|
+
'Pagina': pagina_atual,
|
196
|
+
'DataInicial': dt_inicial_iso_format,
|
197
|
+
'DataFinal': dt_final_iso_format,
|
198
|
+
}
|
199
|
+
|
200
|
+
response = self.client.service.ConsultarCorreiosPorPasta(params)
|
201
|
+
|
202
|
+
if response.OcorreuErro:
|
203
|
+
raise Exception(f"Erro ao consultar correios: {response.MensagemErro}")
|
204
|
+
|
205
|
+
# Verifica a quantidade total de correios na primeira iteração
|
206
|
+
try:
|
207
|
+
|
208
|
+
# Acessa a lista de correios diretamente
|
209
|
+
correios = response.Correios.ResumoCorreioWSDTO
|
210
|
+
|
211
|
+
if not correios:
|
212
|
+
|
213
|
+
# Se não houver mais itens, paramos a busca
|
214
|
+
break
|
215
|
+
except:
|
216
|
+
|
217
|
+
# Fim da listagem de correios
|
218
|
+
break
|
219
|
+
|
220
|
+
for correio in correios:
|
221
|
+
|
222
|
+
item_de_lista_de_correios = ItemListaCorreio(
|
223
|
+
Assunto=correio.Assunto,
|
224
|
+
Data=correio.Data,
|
225
|
+
UnidadeDestinataria=correio.UnidadeDestinataria,
|
226
|
+
DependenciaDestinataria=correio.DependenciaDestinataria,
|
227
|
+
UnidadeRemetente=correio.UnidadeRemetente,
|
228
|
+
DependenciaRemetente=correio.DependenciaRemetente,
|
229
|
+
Grupo=correio.Grupo,
|
230
|
+
Status=correio.Status,
|
231
|
+
TipoCorreio=correio.TipoCorreio,
|
232
|
+
NumeroCorreio=correio.NumeroCorreio,
|
233
|
+
Pasta={
|
234
|
+
'Unidade': correio.Pasta.Unidade,
|
235
|
+
'Dependencia': correio.Pasta.Dependencia,
|
236
|
+
'Setor': correio.Pasta.Setor,
|
237
|
+
'Tipo': correio.Pasta.Tipo
|
238
|
+
},
|
239
|
+
Setor=correio.Setor,
|
240
|
+
Transicao=correio.Transicao,
|
241
|
+
Versao=correio.Versao
|
242
|
+
)
|
243
|
+
if objeto_ja_existe_na_lista(novo_item=item_de_lista_de_correios,lista_de_correios=correios_filtrados) == False:
|
244
|
+
|
245
|
+
correios_filtrados.append(item_de_lista_de_correios)
|
246
|
+
else:
|
247
|
+
correios_repetidos.append(item_de_lista_de_correios)
|
248
|
+
|
249
|
+
if len(correios_filtrados) >= proxima_centena:
|
250
|
+
|
251
|
+
logging.info(f"Página #{pagina_atual}: {len(correios_filtrados)} correios armazenados no total")
|
252
|
+
proxima_centena = proxima_centena + 100
|
253
|
+
|
254
|
+
# Avança para a próxima página
|
255
|
+
pagina_atual += 1
|
256
|
+
|
257
|
+
return True, correios_filtrados
|
258
|
+
|
259
|
+
except Exception as e:
|
260
|
+
|
261
|
+
return False, e
|
262
|
+
|
263
|
+
def ler_correio(self, numero:int,data_rebimento:datetime,tipo:str,transicao:int,versao:int,pasta:str)-> Tuple[bool, Union[ItemMsgCorreio, Exception]]:
|
264
|
+
"""
|
265
|
+
Retorna o conteúdo de um correio.
|
266
|
+
|
267
|
+
Args:
|
268
|
+
correio (ItemListaCorreio): objeto da classe ItemListaCorreio (item da listagem de mensagens)
|
269
|
+
|
270
|
+
Returns:
|
271
|
+
tuple: Um par contendo:
|
272
|
+
- bool: Indica se a operação foi bem-sucedida (True) ou falhou (False).
|
273
|
+
- Union[ItemMsgCorreio, Exception]: Retorna um objeto da classe ItemMsgCorreio contendo os detalhes do correio lido, ou uma exceção em caso de erro.
|
274
|
+
"""
|
275
|
+
|
276
|
+
try:
|
277
|
+
|
278
|
+
# Substituir aspas simples por aspas duplas
|
279
|
+
pasta = pasta.replace("'", '"').replace("None", "null")
|
280
|
+
pasta = json.loads(pasta)
|
281
|
+
#params = {
|
282
|
+
# 'Correio': {
|
283
|
+
# 'NumeroCorreio': correio.NumeroCorreio,
|
284
|
+
# 'Data': correio.Data.isoformat(),
|
285
|
+
# 'TipoCorreio': correio.TipoCorreio,
|
286
|
+
# 'Transicao': correio.Transicao,
|
287
|
+
# 'Versao': correio.Versao,
|
288
|
+
# 'Pasta': correio.Pasta
|
289
|
+
# }
|
290
|
+
#}
|
291
|
+
|
292
|
+
params = {
|
293
|
+
'Correio': {
|
294
|
+
'NumeroCorreio': numero,
|
295
|
+
'Data': data_rebimento.isoformat(),
|
296
|
+
'TipoCorreio': tipo,
|
297
|
+
'Transicao': transicao,
|
298
|
+
'Versao': versao,
|
299
|
+
'Pasta': {
|
300
|
+
'Unidade': pasta["Unidade"],
|
301
|
+
'Dependencia': pasta["Dependencia"],
|
302
|
+
'Setor': pasta["Setor"],
|
303
|
+
'Tipo': pasta["Tipo"],
|
304
|
+
}
|
305
|
+
}
|
306
|
+
}
|
307
|
+
|
308
|
+
response = self.client.service.LerCorreio(params)
|
309
|
+
|
310
|
+
#novo start
|
311
|
+
|
312
|
+
#print("antes")
|
313
|
+
#print("response type:",type(response))
|
314
|
+
#print("response:")
|
315
|
+
#print(response)
|
316
|
+
if response.OcorreuErro:
|
317
|
+
raise Exception(f"Erro ao detalhar correio: {response.MensagemErro}")
|
318
|
+
|
319
|
+
#msg_detail = ItemMsgCorreio()
|
320
|
+
#msg_detail.OcorreuErro = response.OcorreuErro
|
321
|
+
#msg_detail.MensagemErro = response.MensagemErro
|
322
|
+
##msg_detail.NumeroCorreio = response.DetalheCorreio.NumeroCorreio
|
323
|
+
##msg_detail.Transicao = response.DetalheCorreio.Transicao
|
324
|
+
##msg_detail.Versao = response.DetalheCorreio.Versao
|
325
|
+
##msg_detail.Assunto = response.DetalheCorreio.Assunto
|
326
|
+
#msg_detail.Ementa = response.DetalheCorreio.Ementa
|
327
|
+
#msg_detail.Conteudo = response.DetalheCorreio.Conteudo
|
328
|
+
##msg_detail.TipoCorreio = response.DetalheCorreio.TipoCorreio
|
329
|
+
#msg_detail.De = response.DetalheCorreio.De
|
330
|
+
#msg_detail.Para = response.DetalheCorreio.Para
|
331
|
+
#msg_detail.EnviadaPor = response.DetalheCorreio.EnviadaPor
|
332
|
+
#msg_detail.EnviadaEm = response.DetalheCorreio.EnviadaEm
|
333
|
+
#msg_detail.RecebidaPor = response.DetalheCorreio.RecebidaPor
|
334
|
+
#msg_detail.RecebidaEm = response.DetalheCorreio.RecebidaEm
|
335
|
+
#msg_detail.Despachos = response.DetalheCorreio.Despachos
|
336
|
+
#if response.DetalheCorreio.Anexos:
|
337
|
+
# msg_detail.Anexos = response.DetalheCorreio.Anexos.AnexoWSDTO
|
338
|
+
|
339
|
+
|
340
|
+
#msg_detail = ItemMsgCorreio(
|
341
|
+
# **correio.model_dump(),
|
342
|
+
# OcorreuErro = response.OcorreuErro,
|
343
|
+
# MensagemErro = response.MensagemErro,
|
344
|
+
# #msg_detail.NumeroCorreio = response.DetalheCorreio.NumeroCorreio
|
345
|
+
# #msg_detail.Transicao = response.DetalheCorreio.Transicao
|
346
|
+
# #msg_detail.Versao = response.DetalheCorreio.Versao
|
347
|
+
# #msg_detail.Assunto = response.DetalheCorreio.Assunto
|
348
|
+
# Ementa = response.DetalheCorreio.Ementa,
|
349
|
+
# Conteudo = response.DetalheCorreio.Conteudo,
|
350
|
+
# #msg_detail.TipoCorreio = response.DetalheCorreio.TipoCorreio
|
351
|
+
# De = response.DetalheCorreio.De,
|
352
|
+
# Para = response.DetalheCorreio.Para,
|
353
|
+
# EnviadaPor = response.DetalheCorreio.EnviadaPor,
|
354
|
+
# EnviadaEm = response.DetalheCorreio.EnviadaEm,
|
355
|
+
# RecebidaPor = response.DetalheCorreio.RecebidaPor,
|
356
|
+
# RecebidaEm = response.DetalheCorreio.RecebidaEm,
|
357
|
+
# Despachos = response.DetalheCorreio.Despachos,
|
358
|
+
# Anexos = response.DetalheCorreio.Anexos.AnexoWSDTO
|
359
|
+
#)
|
360
|
+
|
361
|
+
|
362
|
+
msg_detail = {
|
363
|
+
"OcorreuErro": response.OcorreuErro,
|
364
|
+
"MensagemErro": response.MensagemErro,
|
365
|
+
#msg_detail.NumeroCorreio = response.DetalheCorreio.NumeroCorreio
|
366
|
+
#msg_detail.Transicao = response.DetalheCorreio.Transicao
|
367
|
+
#msg_detail.Versao = response.DetalheCorreio.Versao
|
368
|
+
#msg_detail.Assunto = response.DetalheCorreio.Assunto
|
369
|
+
"Ementa": response.DetalheCorreio.Ementa,
|
370
|
+
"Conteudo": response.DetalheCorreio.Conteudo,
|
371
|
+
#msg_detail.TipoCorreio = response.DetalheCorreio.TipoCorreio
|
372
|
+
"De": response.DetalheCorreio.De,
|
373
|
+
"Para": response.DetalheCorreio.Para,
|
374
|
+
"EnviadaPor": response.DetalheCorreio.EnviadaPor,
|
375
|
+
"EnviadaEm": response.DetalheCorreio.EnviadaEm,
|
376
|
+
"RecebidaPor": response.DetalheCorreio.RecebidaPor,
|
377
|
+
"RecebidaEm": response.DetalheCorreio.RecebidaEm,
|
378
|
+
"Despachos": response.DetalheCorreio.Despachos,
|
379
|
+
"Anexos": response.DetalheCorreio.Anexos.AnexoWSDTO
|
380
|
+
}
|
381
|
+
|
382
|
+
|
383
|
+
#print("depois")
|
384
|
+
#print("response novo type:",type(msg_detail))
|
385
|
+
#print("response novo:")
|
386
|
+
#print(msg_detail)
|
387
|
+
#print(msg_detail.Anexos)
|
388
|
+
|
389
|
+
|
390
|
+
"""
|
391
|
+
xx = {
|
392
|
+
'MensagemErro': None,
|
393
|
+
'OcorreuErro': False,
|
394
|
+
'DetalheCorreio': {
|
395
|
+
'NumeroCorreio': 124311198,
|
396
|
+
'Transicao': 46142046,
|
397
|
+
'Versao': 670,
|
398
|
+
'Assunto': 'SOLJUD 2024087211',
|
399
|
+
'Ementa': None,
|
400
|
+
'Conteudo': '\n<pre>\nOfício 026707/2024-BCB/Deati/Coadi-1\nPE 262353/e-BC 2024211930 Brasília, 23 de setembro de 2024.\nJUD/EXT - 2024/087211E\n\nA todas as instituições financeiras.\n\nAssunto: Ofício S\\N, de 13 de setembro de 2024\nProcesso: 5094191-48.2024.8.09.0142\n\nPrezados Senhores,\n\nAtendendo à requisição do(a) Juíz de Direito MARLI PIMENTA NAVES, do(a) Juizado Especial Cível, encaminhamos, em anexo, para exame e adoção das\nprovidências julgadas cabíveis, a determinação judicial exarada no ofício em epígrafe.\n\n\n2. A propósito, esclarecemos que eventuais dúvidas a respeito da ordem, inclusive com relação a número de CPF/CNPJ, somente serão dirimidas\njunto ao Juízo demandante, ou ao órgão por ele designado, para onde devem ser encaminhadas as correspondências alusivas ao assunto,\nmencionando-se os números do ofício e do processo.\n\n\n3. Finalmente, alertamos que a inobservância à norma do sigilo bancário contido na Lei Complementar 105, de 10 de janeiro de 2001, sujeitará os\nresponsáveis às sanções previstas no artigo 10 da mencionada Lei, cabendo ainda à instituição zelar por manter a privacidade das informações\nrelativas a clientes (artigo 5º, item X, da CF/88).\n\n\nAtenciosamente,\n\nDepartamento de Atendimento Institucional – DEATI\nGerência de Relacionamento Institucional – GERIN\n\n\nGILDO TEREZA DOS REIS\nTECNICO\n\nMAURO MAGNO MACHADO JUNIOR \nTECNICO \n\nDocumento transmitido por correio eletrônico, via BC Correio, dispensado de assinatura.\n</pre>\n',
|
401
|
+
'TipoCorreio': 'MENSAGEM',
|
402
|
+
'De': 'DEATI',
|
403
|
+
'Para': '40797 (Transmissão para grupo geral F1)',
|
404
|
+
'EnviadaPor': 'DEATI.GILDO',
|
405
|
+
'EnviadaEm': datetime.datetime(2024, 9, 23, 10, 40, 19),
|
406
|
+
'RecebidaPor': '407970001.PALCANTARA',
|
407
|
+
'RecebidaEm': datetime.datetime(2024, 9, 25, 14, 45, 51),
|
408
|
+
'Despachos': None,
|
409
|
+
'Anexos': {
|
410
|
+
'AnexoWSDTO': [
|
411
|
+
{
|
412
|
+
'IdAnexo': 538648,
|
413
|
+
'NomeAnexo': '-2024-171630-211930--20092024233504.PDF',
|
414
|
+
'Conteudo': None
|
415
|
+
}
|
416
|
+
]
|
417
|
+
}
|
418
|
+
}
|
419
|
+
}
|
420
|
+
"""
|
421
|
+
|
422
|
+
|
423
|
+
#logger.debug("parou aqui 6757576")
|
424
|
+
#sys.exit(0)
|
425
|
+
#novo end
|
426
|
+
|
427
|
+
#return True, response
|
428
|
+
return True, msg_detail
|
429
|
+
|
430
|
+
# Serializa o objeto SOAP em um dicionário Python
|
431
|
+
#serialized_response = serialize_object(response)
|
432
|
+
|
433
|
+
# Converte o dicionário em um JSON formatado
|
434
|
+
#response_json = json.dumps(serialized_response, indent=4, default=str)
|
435
|
+
|
436
|
+
#return True, response_json
|
437
|
+
|
438
|
+
except Exception as e:
|
439
|
+
|
440
|
+
return False, e
|
441
|
+
|
442
|
+
def obter_anexo(self, numero:int, versao:int, transicao:int,pasta:str,anexo_id:int,file_name:str,conteudo:str)-> Tuple[bool,Union[dict, Exception]]:
|
443
|
+
"""
|
444
|
+
Obtém um anexo de um correio eletrônico.
|
445
|
+
|
446
|
+
Args:
|
447
|
+
correio (ItemListaCorreio): objeto da classe ItemListaCorreio (item da listagem de mensagens)
|
448
|
+
anexo (AnexoDict): um item do dicionário da lista de anexos de ItemListaCorreio
|
449
|
+
|
450
|
+
Returns:
|
451
|
+
tuple: Um par contendo:
|
452
|
+
- bool: Indica se a operação foi bem-sucedida (True) ou falhou (False).
|
453
|
+
- Union[dict, Exception]: Retorna um dicionario com dados do anexo, ou uma exceção em caso de erro.
|
454
|
+
|
455
|
+
"""
|
456
|
+
#logger.info("ANEXOS PARA OBTER")
|
457
|
+
#print(correio.Anexos)
|
458
|
+
try:
|
459
|
+
|
460
|
+
pasta = pasta.replace("'", '"').replace("None", "null")
|
461
|
+
pasta = json.loads(pasta)
|
462
|
+
|
463
|
+
# Monta os parâmetros para a requisição SOAP
|
464
|
+
params = {
|
465
|
+
'NumeroCorreio': numero,
|
466
|
+
'Versao': versao,
|
467
|
+
'Transicao': transicao,
|
468
|
+
#'Pasta': pasta,
|
469
|
+
'Pasta': {
|
470
|
+
'Unidade': pasta["Unidade"],
|
471
|
+
'Dependencia': pasta["Dependencia"],
|
472
|
+
'Setor': pasta["Setor"],
|
473
|
+
'Tipo': pasta["Tipo"],
|
474
|
+
},
|
475
|
+
#'Pasta': {
|
476
|
+
# 'Unidade': {
|
477
|
+
# 'Nome': pasta['Unidade']['Nome'],
|
478
|
+
# 'Ativa': pasta['Unidade']['Ativa'],
|
479
|
+
# 'Tipo': pasta['Unidade']['Tipo']
|
480
|
+
# },
|
481
|
+
# 'Dependencia': pasta['Dependencia'],
|
482
|
+
# 'Setor': {
|
483
|
+
# 'Nome': pasta['Setor']['Nome'],
|
484
|
+
# 'Ativo': pasta['Setor']['Ativo']
|
485
|
+
# },
|
486
|
+
# 'Tipo': pasta['Tipo']
|
487
|
+
#},
|
488
|
+
'Anexo': {
|
489
|
+
'IdAnexo': anexo_id,
|
490
|
+
'NomeAnexo': file_name,
|
491
|
+
'Conteudo': conteudo # Conteúdo em base64
|
492
|
+
}
|
493
|
+
}
|
494
|
+
|
495
|
+
# Faz a requisição SOAP para o método ObterAnexo
|
496
|
+
response = self.client.service.ObterAnexo(parametros=params)
|
497
|
+
#logger.info("response")
|
498
|
+
#logger.info(response)
|
499
|
+
|
500
|
+
# Acessa os dados da resposta (IdAnexo, NomeAnexo, Conteudo)
|
501
|
+
if response and hasattr(response, 'Anexo'):
|
502
|
+
id_anexo = response.Anexo.IdAnexo
|
503
|
+
nome_anexo = response.Anexo.NomeAnexo
|
504
|
+
conteudo_anexo = response.Anexo.Conteudo
|
505
|
+
|
506
|
+
# Retorna os dados capturados como um dicionário
|
507
|
+
return True, {
|
508
|
+
'IdAnexo': id_anexo,
|
509
|
+
'NomeAnexo': nome_anexo,
|
510
|
+
'Conteudo': conteudo_anexo
|
511
|
+
}
|
512
|
+
else:
|
513
|
+
return False, Exception("Correio não possui anexo")
|
514
|
+
|
515
|
+
except Exception as e:
|
516
|
+
|
517
|
+
return False, e
|
518
|
+
|
519
|
+
def encerrar(self):
|
520
|
+
"""Fecha o cliente e libera a sessão."""
|
521
|
+
|
522
|
+
try:
|
523
|
+
|
524
|
+
self.client.transport.session.close()
|
525
|
+
|
526
|
+
except:
|
527
|
+
|
528
|
+
pass
|
529
|
+
|