csc-cia-stne 0.0.88__py3-none-any.whl → 0.0.89__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 +5 -1
- csc_cia_stne/gcp_bigquery.py +4 -11
- csc_cia_stne/gcp_bucket.py +293 -0
- csc_cia_stne/utilitarios/validations/gcp_bucket.py +152 -0
- csc_cia_stne/utilitarios/validations/waccess.py +215 -0
- csc_cia_stne/wacess.py +836 -0
- {csc_cia_stne-0.0.88.dist-info → csc_cia_stne-0.0.89.dist-info}/METADATA +1 -1
- {csc_cia_stne-0.0.88.dist-info → csc_cia_stne-0.0.89.dist-info}/RECORD +11 -7
- {csc_cia_stne-0.0.88.dist-info → csc_cia_stne-0.0.89.dist-info}/WHEEL +1 -1
- {csc_cia_stne-0.0.88.dist-info → csc_cia_stne-0.0.89.dist-info}/licenses/LICENCE +0 -0
- {csc_cia_stne-0.0.88.dist-info → csc_cia_stne-0.0.89.dist-info}/top_level.txt +0 -0
csc_cia_stne/wacess.py
ADDED
@@ -0,0 +1,836 @@
|
|
1
|
+
import requests
|
2
|
+
from datetime import datetime,timezone
|
3
|
+
from dateutil.relativedelta import relativedelta
|
4
|
+
|
5
|
+
from .utilitarios.validations.waccess import InitParamsValidator,CreateUserValidator,ValidateExistenceValidator,CreateWaccessValidator,UpdateWaccessValidator,UpdateUserValidator,AddPhotoValidator,ChangeGroupsUserValidator,AddCardUserValidator,GetUserCardsValidator,CreateCardValidator,AssociateCardUserValidator,TurnOffUserValidator,RemoveGroupsValidator
|
6
|
+
|
7
|
+
class Waccess():
|
8
|
+
|
9
|
+
def __init__(self, headers:dict, url:str):
|
10
|
+
"""
|
11
|
+
Inicializa a classe Waccess.
|
12
|
+
"""
|
13
|
+
|
14
|
+
try:
|
15
|
+
|
16
|
+
InitParamsValidator(
|
17
|
+
headers=headers,
|
18
|
+
url=url
|
19
|
+
)
|
20
|
+
|
21
|
+
except Exception as e:
|
22
|
+
|
23
|
+
raise ValueError("Erro na validação dos dados de input da inicialização da instância:", e.errors())
|
24
|
+
|
25
|
+
self.waccess_headers = headers
|
26
|
+
self.waccess_url = url
|
27
|
+
|
28
|
+
# Função para criar usuario no waccess
|
29
|
+
def create_user(self, cpf:str, name:str, email:str, empresa:str, rg:str=None) -> dict:
|
30
|
+
"""
|
31
|
+
Cria um usuário no sistema WAccess, caso ele ainda não exista.
|
32
|
+
Args:
|
33
|
+
cpf (str): CPF do usuário a ser criado.
|
34
|
+
name (str): Nome do usuário.
|
35
|
+
email (str): E-mail do usuário.
|
36
|
+
empresa (str): Nome da empresa associada ao usuário.
|
37
|
+
rg (str, opcional): RG do usuário. Padrão é None.
|
38
|
+
Returns:
|
39
|
+
dict: Um dicionário contendo:
|
40
|
+
- 'success' (bool): Indica se a operação foi bem-sucedida.
|
41
|
+
- 'code' (str): Mensagem de status da operação.
|
42
|
+
- 'data' (dict): Dados adicionais relacionados à operação.
|
43
|
+
"""
|
44
|
+
|
45
|
+
try:
|
46
|
+
|
47
|
+
CreateUserValidator(
|
48
|
+
cpf=cpf,
|
49
|
+
name=name,
|
50
|
+
email=email,
|
51
|
+
empresa=empresa,
|
52
|
+
rg=rg
|
53
|
+
)
|
54
|
+
|
55
|
+
except Exception as e:
|
56
|
+
|
57
|
+
raise ValueError("Erro na validação dos dados de input da criação do usuario:", e.errors())
|
58
|
+
|
59
|
+
# Valida a existencia do usuario dentro do waccess
|
60
|
+
|
61
|
+
status_existence = self._validate_existence(cpf=cpf)
|
62
|
+
|
63
|
+
if status_existence is False:
|
64
|
+
|
65
|
+
# Liberado para criar o usuario
|
66
|
+
|
67
|
+
status_creation = self._create_waccess(
|
68
|
+
cpf=cpf,
|
69
|
+
name=name,
|
70
|
+
email=email,
|
71
|
+
rg=rg,
|
72
|
+
empresa=empresa
|
73
|
+
)
|
74
|
+
|
75
|
+
if status_creation['success'] is False:
|
76
|
+
|
77
|
+
return {
|
78
|
+
'success':False,
|
79
|
+
'code':'Erro ao criar usuario no waccess',
|
80
|
+
'data':status_creation['data']
|
81
|
+
}
|
82
|
+
|
83
|
+
else:
|
84
|
+
|
85
|
+
return {
|
86
|
+
'success':True,
|
87
|
+
'code':'Usuario criado com sucesso no waccess',
|
88
|
+
'data':status_creation['data']
|
89
|
+
}
|
90
|
+
|
91
|
+
else:
|
92
|
+
|
93
|
+
return {
|
94
|
+
'success':True,
|
95
|
+
'code':'Usuario já existe no waccess',
|
96
|
+
'data':status_existence
|
97
|
+
}
|
98
|
+
|
99
|
+
def _validate_existence(self, cpf:str):
|
100
|
+
"""
|
101
|
+
Valida a existência de um cadastro no sistema WAccess com base no CPF fornecido.
|
102
|
+
Args:
|
103
|
+
cpf (str): O CPF do titular do cartão a ser validado.
|
104
|
+
Returns:
|
105
|
+
dict: Um dicionário contendo os dados do titular do cartão, caso encontrado.
|
106
|
+
bool: Retorna False se o titular do cartão não for encontrado.
|
107
|
+
Raises:
|
108
|
+
ValueError: Se ocorrer um erro na requisição HTTP ou outro erro inesperado.
|
109
|
+
"""
|
110
|
+
|
111
|
+
try:
|
112
|
+
|
113
|
+
ValidateExistenceValidator(
|
114
|
+
cpf=cpf
|
115
|
+
)
|
116
|
+
|
117
|
+
except Exception as e:
|
118
|
+
|
119
|
+
raise ValueError("Erro na validação dos dados de input da validação de existencia:", e.errors())
|
120
|
+
|
121
|
+
try:
|
122
|
+
|
123
|
+
reply = requests.get(
|
124
|
+
f"{self.waccess_url}/cardholders?CHtype=2&IdNumber={cpf}",
|
125
|
+
headers=self.waccess_headers,
|
126
|
+
verify=False,
|
127
|
+
)
|
128
|
+
|
129
|
+
if reply.status_code == 200:
|
130
|
+
|
131
|
+
result = reply.json()[0]
|
132
|
+
|
133
|
+
return result
|
134
|
+
|
135
|
+
else:
|
136
|
+
|
137
|
+
return False
|
138
|
+
|
139
|
+
except requests.exceptions.RequestException as e:
|
140
|
+
|
141
|
+
raise ValueError("Erro na validação de existencia", e)
|
142
|
+
|
143
|
+
except Exception as e:
|
144
|
+
|
145
|
+
raise ValueError("Erro na validação de existencia", e)
|
146
|
+
|
147
|
+
def _create_waccess(self, name:str, email:str,cpf:str, rg:str=None, empresa:str=None) -> dict:
|
148
|
+
"""
|
149
|
+
Cria um registro de "cardholder" no sistema WAccess.
|
150
|
+
Args:
|
151
|
+
name (str): Nome do usuário.
|
152
|
+
email (str): Endereço de e-mail do usuário.
|
153
|
+
cpf (str): CPF do usuário.
|
154
|
+
rg (str, opcional): RG do usuário. Padrão é None.
|
155
|
+
empresa (str, opcional): Nome da empresa do usuário. Se for "TERCEIRIZADO",
|
156
|
+
o campo "CompanyID" será configurado como 21. Padrão é None.
|
157
|
+
Returns:
|
158
|
+
dict: Um dicionário contendo o resultado da operação.
|
159
|
+
- 'success' (bool): Indica se a operação foi bem-sucedida.
|
160
|
+
- 'data' (dict): Dados retornados pela API em caso de sucesso ou erro.
|
161
|
+
"""
|
162
|
+
|
163
|
+
try:
|
164
|
+
|
165
|
+
CreateWaccessValidator(
|
166
|
+
name=name,
|
167
|
+
email=email,
|
168
|
+
cpf=cpf,
|
169
|
+
empresa=empresa,
|
170
|
+
rg=rg
|
171
|
+
)
|
172
|
+
|
173
|
+
except Exception as e:
|
174
|
+
|
175
|
+
raise ValueError("Erro na validação dos dados de input da criação do usuario:", e.errors())
|
176
|
+
|
177
|
+
cardholder = {
|
178
|
+
'PartitionID': 1,
|
179
|
+
'CHtype': 2,
|
180
|
+
'IdNumber': cpf,
|
181
|
+
'FirstName': name,
|
182
|
+
'AuxText05': str(rg),
|
183
|
+
'EMail': email,
|
184
|
+
'AuxLst01': None,
|
185
|
+
'AuxText04':None,
|
186
|
+
'AuxText15':None,
|
187
|
+
'AuxTextA01':f'Usuário criado por API via'
|
188
|
+
}
|
189
|
+
|
190
|
+
if str(empresa).upper() == 'TERCEIRIZADO':
|
191
|
+
|
192
|
+
cardholder["CompanyID"] = 21
|
193
|
+
|
194
|
+
reply = requests.post(
|
195
|
+
f'{self.waccess_url}/cardholders',
|
196
|
+
headers=self.waccess_headers,
|
197
|
+
json=cardholder,
|
198
|
+
verify=False,
|
199
|
+
)
|
200
|
+
|
201
|
+
if reply.status_code == 201:
|
202
|
+
|
203
|
+
result = reply.json()
|
204
|
+
|
205
|
+
return {
|
206
|
+
'success':True,
|
207
|
+
'data':result
|
208
|
+
}
|
209
|
+
|
210
|
+
else:
|
211
|
+
|
212
|
+
return {
|
213
|
+
'success':False,
|
214
|
+
'data':reply.json()
|
215
|
+
}
|
216
|
+
|
217
|
+
# Função para atualizar usuario no waccess
|
218
|
+
def update_user_information(self, name:str, cpf:str, email:str, status:int, empresa:str=None ,rg:str=None, foto:str=None) -> dict:
|
219
|
+
"""
|
220
|
+
Atualiza as informações de um usuário no sistema WAccess.
|
221
|
+
Args:
|
222
|
+
name (str): Nome do usuário.
|
223
|
+
cpf (str): CPF do usuário.
|
224
|
+
email (str): E-mail do usuário.
|
225
|
+
empresa (str): Nome da empresa associada ao usuário.
|
226
|
+
status (int): Status do usuário (ativo/inativo).
|
227
|
+
rg (str, opcional): RG do usuário. Padrão é None.
|
228
|
+
foto (str, opcional): Caminho ou referência para a foto do usuário. Padrão é None.
|
229
|
+
Returns:
|
230
|
+
dict: Um dicionário contendo o resultado da operação com as seguintes chaves:
|
231
|
+
- success (bool): Indica se a operação foi bem-sucedida.
|
232
|
+
- code (str): Mensagem descritiva do resultado.
|
233
|
+
- data (qualquer): Dados adicionais relacionados ao resultado da operação.
|
234
|
+
"""
|
235
|
+
|
236
|
+
# Valida a existencia do usuario dentro do waccess
|
237
|
+
|
238
|
+
try:
|
239
|
+
|
240
|
+
UpdateWaccessValidator(
|
241
|
+
cpf=cpf,
|
242
|
+
name=name,
|
243
|
+
email=email,
|
244
|
+
empresa=empresa,
|
245
|
+
rg=rg,
|
246
|
+
status=status
|
247
|
+
)
|
248
|
+
|
249
|
+
except Exception as e:
|
250
|
+
|
251
|
+
raise ValueError("Erro na validação dos dados de input da atualização do usuario:", e.errors())
|
252
|
+
|
253
|
+
status_existence = self._validate_existence(cpf=cpf)
|
254
|
+
|
255
|
+
if status_existence is False:
|
256
|
+
|
257
|
+
return {
|
258
|
+
'success':False,
|
259
|
+
'code':'Usuario não existe no waccess',
|
260
|
+
'data':status_existence
|
261
|
+
}
|
262
|
+
|
263
|
+
status_update = self._update_user(
|
264
|
+
name=name,
|
265
|
+
email=email,
|
266
|
+
cpf=cpf,
|
267
|
+
rg=rg,
|
268
|
+
empresa=empresa,
|
269
|
+
status=status
|
270
|
+
)
|
271
|
+
|
272
|
+
if status_update['success'] is False:
|
273
|
+
|
274
|
+
return {
|
275
|
+
'success':False,
|
276
|
+
'code':'Erro ao atualizar usuario no waccess',
|
277
|
+
'data':status_update['data']
|
278
|
+
}
|
279
|
+
|
280
|
+
if self._add_photo(
|
281
|
+
chid=status_existence['CHid'],
|
282
|
+
picture=foto
|
283
|
+
) is False:
|
284
|
+
|
285
|
+
return {
|
286
|
+
'success':False,
|
287
|
+
'code':'Erro ao adicionar foto no usuario',
|
288
|
+
'data':status_update['data']
|
289
|
+
}
|
290
|
+
|
291
|
+
return {
|
292
|
+
'success':True,
|
293
|
+
'code':'Dados atualizados com sucesso no waccess',
|
294
|
+
}
|
295
|
+
|
296
|
+
def _update_user(self, name:str, email:str, cpf:str, status:int , rg:str=None, empresa:str=None) -> dict:
|
297
|
+
|
298
|
+
try:
|
299
|
+
|
300
|
+
UpdateUserValidator(
|
301
|
+
cpf=cpf,
|
302
|
+
name=name,
|
303
|
+
email=email,
|
304
|
+
empresa=empresa,
|
305
|
+
rg=rg,
|
306
|
+
status=status
|
307
|
+
)
|
308
|
+
|
309
|
+
except Exception as e:
|
310
|
+
|
311
|
+
raise ValueError("Erro na validação dos dados de input da atualização do usuario:", e.errors())
|
312
|
+
|
313
|
+
def _add_photo(self, chid:str, picture:str) -> dict:
|
314
|
+
"""
|
315
|
+
Adiciona uma foto a um titular de cartão no sistema WAccess.
|
316
|
+
Args:
|
317
|
+
chid (str): O identificador do titular do cartão.
|
318
|
+
picture (str): O caminho ou os dados da imagem a ser enviada.
|
319
|
+
Returns:
|
320
|
+
dict: Retorna True se a foto foi adicionada com sucesso,
|
321
|
+
caso contrário, retorna False.
|
322
|
+
"""
|
323
|
+
|
324
|
+
try:
|
325
|
+
|
326
|
+
AddPhotoValidator(
|
327
|
+
chid=chid,
|
328
|
+
picture=picture
|
329
|
+
)
|
330
|
+
|
331
|
+
except Exception as e:
|
332
|
+
|
333
|
+
raise ValueError("Erro na validação dos dados de input da adição da foto:", e.errors())
|
334
|
+
|
335
|
+
reply = requests.post(
|
336
|
+
f'{self.waccess_url}/cardholders/{chid}/photos/1',
|
337
|
+
headers=self.waccess_headers,
|
338
|
+
files=(('photoJpegData', picture), ),
|
339
|
+
verify=False,
|
340
|
+
)
|
341
|
+
|
342
|
+
if reply.status_code == 200:
|
343
|
+
|
344
|
+
return True
|
345
|
+
|
346
|
+
else:
|
347
|
+
|
348
|
+
return False
|
349
|
+
|
350
|
+
# Adicionar grupo(s)
|
351
|
+
def change_groups_user(self, cpf:str, groups_list:list) -> dict:
|
352
|
+
"""
|
353
|
+
Altera os grupos associados a um usuário no sistema WAccess.
|
354
|
+
Args:
|
355
|
+
cpf (str): CPF do usuário cujo grupo será alterado.
|
356
|
+
groups_list (list): Lista de dicionários contendo as ações e IDs dos grupos.
|
357
|
+
Cada item da lista deve ter o formato:
|
358
|
+
{
|
359
|
+
'action': 'add' ou 'remove',
|
360
|
+
'group_id': <ID do grupo>
|
361
|
+
Returns:
|
362
|
+
dict: Um dicionário contendo o status da operação.
|
363
|
+
- Se o usuário não existir:
|
364
|
+
{
|
365
|
+
'success': False,
|
366
|
+
'code': 'Usuario não existe no waccess',
|
367
|
+
'data': False
|
368
|
+
- Se a operação for bem-sucedida:
|
369
|
+
{
|
370
|
+
'success': True,
|
371
|
+
'code': 'Grupos atualizados com sucesso no waccess',
|
372
|
+
'data': [
|
373
|
+
{
|
374
|
+
'success': True ou False,
|
375
|
+
'action': 'add' ou 'remove',
|
376
|
+
'group_id': <ID do grupo>,
|
377
|
+
'error': <Erro retornado pela API, se houver>
|
378
|
+
},
|
379
|
+
...
|
380
|
+
]
|
381
|
+
"""
|
382
|
+
|
383
|
+
try:
|
384
|
+
|
385
|
+
ChangeGroupsUserValidator(
|
386
|
+
cpf=cpf,
|
387
|
+
groups_list=groups_list
|
388
|
+
)
|
389
|
+
|
390
|
+
except Exception as e:
|
391
|
+
|
392
|
+
raise ValueError("Erro na validação dos dados de input da alteração dos grupos do usuario:", e.errors())
|
393
|
+
|
394
|
+
status_existence = self._validate_existence(cpf=cpf)
|
395
|
+
|
396
|
+
if status_existence is False:
|
397
|
+
|
398
|
+
return {
|
399
|
+
'success':False,
|
400
|
+
'code':'Usuario não existe no waccess',
|
401
|
+
'data':status_existence
|
402
|
+
}
|
403
|
+
|
404
|
+
# Adicionar/Remover grupos do usuario
|
405
|
+
|
406
|
+
result = []
|
407
|
+
|
408
|
+
for item_groups in groups_list:
|
409
|
+
|
410
|
+
if item_groups['action'] == 'add':
|
411
|
+
|
412
|
+
reply = requests.post(
|
413
|
+
f'{self.waccess_url}/cardholders/{status_existence["CHid"]}/groups/{item_groups["group_id"]}',
|
414
|
+
headers=self.waccess_headers,
|
415
|
+
verify=False,
|
416
|
+
)
|
417
|
+
|
418
|
+
elif item_groups['action'] == 'remove':
|
419
|
+
|
420
|
+
reply = requests.delete(
|
421
|
+
f'{self.waccess_url}/cardholders/{status_existence["CHid"]}/groups/{item_groups["group_id"]}',
|
422
|
+
headers=self.waccess_headers,
|
423
|
+
verify=False,
|
424
|
+
)
|
425
|
+
|
426
|
+
if reply.status_code == 204:
|
427
|
+
|
428
|
+
result.append({
|
429
|
+
'success':True,
|
430
|
+
'action':item_groups['action'],
|
431
|
+
'group_id':item_groups['group_id']
|
432
|
+
})
|
433
|
+
|
434
|
+
else:
|
435
|
+
|
436
|
+
result.append({
|
437
|
+
'success':False,
|
438
|
+
'action':item_groups['action'],
|
439
|
+
'group_id':item_groups['group_id'],
|
440
|
+
'error':reply.json()
|
441
|
+
})
|
442
|
+
|
443
|
+
return {
|
444
|
+
'success':True,
|
445
|
+
'code':'Grupos atualizados com sucesso no waccess',
|
446
|
+
'data':result
|
447
|
+
}
|
448
|
+
|
449
|
+
# Adicionar cracha
|
450
|
+
def add_card_user(self, cpf:str, card:str) -> dict:
|
451
|
+
"""
|
452
|
+
Adiciona um cartão a um usuário no sistema WAccess.
|
453
|
+
Este método realiza as seguintes etapas:
|
454
|
+
1. Verifica a existência do usuário no sistema WAccess.
|
455
|
+
2. Verifica se o usuário está ativo.
|
456
|
+
3. Cria o cartão no sistema WAccess, caso ele ainda não exista.
|
457
|
+
4. Remove outros cartões associados ao usuário, se necessário.
|
458
|
+
5. Associa o novo cartão ao usuário.
|
459
|
+
Args:
|
460
|
+
cpf (str): CPF do usuário a ser verificado.
|
461
|
+
card (str): Número do cartão a ser associado ao usuário.
|
462
|
+
Returns:
|
463
|
+
dict: Um dicionário contendo o status da operação. As chaves possíveis são:
|
464
|
+
- 'success' (bool): Indica se a operação foi bem-sucedida.
|
465
|
+
- 'code' (str): Código ou mensagem descritiva do status da operação.
|
466
|
+
- 'data' (opcional): Dados adicionais relacionados ao status da operação.
|
467
|
+
"""
|
468
|
+
|
469
|
+
try:
|
470
|
+
|
471
|
+
AddCardUserValidator(
|
472
|
+
cpf=cpf,
|
473
|
+
card=card
|
474
|
+
)
|
475
|
+
|
476
|
+
except Exception as e:
|
477
|
+
|
478
|
+
raise ValueError("Erro na validação dos dados de input da adição do cartão:", e.errors())
|
479
|
+
|
480
|
+
status_existence = self._validate_existence(cpf=cpf)
|
481
|
+
|
482
|
+
if status_existence is False:
|
483
|
+
|
484
|
+
return {
|
485
|
+
'success':False,
|
486
|
+
'code':'Usuario não existe no waccess',
|
487
|
+
'data':status_existence
|
488
|
+
}
|
489
|
+
|
490
|
+
elif str(status_existence['CHState']) == "1" or str(status_existence['CHState']) == "2":
|
491
|
+
|
492
|
+
return {
|
493
|
+
'success':False,
|
494
|
+
'code':'Usuario inativo no waccess',
|
495
|
+
'data':status_existence
|
496
|
+
}
|
497
|
+
|
498
|
+
# Verifica a existencia do cartão
|
499
|
+
|
500
|
+
status_creation_card = self._create_card(card=card)
|
501
|
+
|
502
|
+
if not status_creation_card:
|
503
|
+
|
504
|
+
return {
|
505
|
+
'success':False,
|
506
|
+
'code':'Erro ao criar cartão no waccess',
|
507
|
+
'data':status_creation_card
|
508
|
+
}
|
509
|
+
|
510
|
+
# Verifica a existencia do cartão do colaborador
|
511
|
+
|
512
|
+
status_user_cards = self._get_user_cards(chid=status_existence['CHid'])
|
513
|
+
|
514
|
+
# Remove os outros cartões do colaborador
|
515
|
+
|
516
|
+
if status_user_cards['success'] is True:
|
517
|
+
|
518
|
+
for item_card in status_user_cards['data']:
|
519
|
+
|
520
|
+
if item_card['CardNumber'] != card:
|
521
|
+
|
522
|
+
reply = requests.delete(
|
523
|
+
f'{self.waccess_url}/cards/{item_card["CardID"]}',
|
524
|
+
headers=self.waccess_headers,
|
525
|
+
verify=False,
|
526
|
+
)
|
527
|
+
|
528
|
+
if reply.status_code != 204:
|
529
|
+
|
530
|
+
return {
|
531
|
+
'success':False,
|
532
|
+
'code':'Erro ao remover cartão do colaborador',
|
533
|
+
'data':reply.json()
|
534
|
+
}
|
535
|
+
|
536
|
+
# Associa o cartão ao usuario
|
537
|
+
|
538
|
+
status_associate_card = self._associate_card_user(card=card, chid=status_existence['CHid'])
|
539
|
+
|
540
|
+
if status_associate_card is False:
|
541
|
+
|
542
|
+
return {
|
543
|
+
'success':False,
|
544
|
+
'code':'Erro ao associar cartão ao colaborador',
|
545
|
+
}
|
546
|
+
|
547
|
+
else:
|
548
|
+
|
549
|
+
return {
|
550
|
+
'success':True,
|
551
|
+
'code':'Cartão associado com sucesso ao colaborador',
|
552
|
+
}
|
553
|
+
|
554
|
+
def _get_user_cards(self, chid:str) -> dict:
|
555
|
+
"""
|
556
|
+
Obtém os cartões associados a um usuário específico (cardholder) no sistema WAccess.
|
557
|
+
Args:
|
558
|
+
chid (str): O identificador único do cardholder.
|
559
|
+
Returns:
|
560
|
+
dict: Um dicionário contendo:
|
561
|
+
- 'success' (bool): Indica se a operação foi bem-sucedida.
|
562
|
+
- 'data' (dict ou list): Os dados retornados pela API em caso de sucesso,
|
563
|
+
ou a resposta de erro em caso de falha.
|
564
|
+
"""
|
565
|
+
|
566
|
+
try:
|
567
|
+
|
568
|
+
GetUserCardsValidator(
|
569
|
+
chid=chid
|
570
|
+
)
|
571
|
+
|
572
|
+
except Exception as e:
|
573
|
+
|
574
|
+
raise ValueError("Erro na validação dos dados de input da obtenção dos cartões do usuario:", e.errors())
|
575
|
+
|
576
|
+
reply = requests.get(
|
577
|
+
f'{self.waccess_url}/cardholders/{chid}/cards',
|
578
|
+
headers=self.waccess_headers,
|
579
|
+
verify=False,
|
580
|
+
)
|
581
|
+
|
582
|
+
if reply.status_code == 200:
|
583
|
+
|
584
|
+
result = reply.json()
|
585
|
+
|
586
|
+
return {
|
587
|
+
'success':True,
|
588
|
+
'data':result
|
589
|
+
}
|
590
|
+
|
591
|
+
else:
|
592
|
+
|
593
|
+
return {
|
594
|
+
'success':False,
|
595
|
+
'data':reply.json()
|
596
|
+
}
|
597
|
+
|
598
|
+
def _create_card(self,card:str) -> bool:
|
599
|
+
"""
|
600
|
+
Cria um cartão no sistema WAccess.
|
601
|
+
Args:
|
602
|
+
card (str): O número do cartão a ser criado.
|
603
|
+
Returns:
|
604
|
+
bool: Retorna True se o cartão foi criado com sucesso (status HTTP 201),
|
605
|
+
caso contrário, retorna False.
|
606
|
+
Observações:
|
607
|
+
- O cartão criado terá validade de 10 anos a partir da data atual.
|
608
|
+
- A comunicação com o sistema WAccess é feita via uma requisição HTTP POST.
|
609
|
+
- Certifique-se de que `self.waccess_url` e `self.waccess_headers` estejam configurados corretamente.
|
610
|
+
"""
|
611
|
+
|
612
|
+
try:
|
613
|
+
|
614
|
+
CreateCardValidator(
|
615
|
+
card=card
|
616
|
+
)
|
617
|
+
|
618
|
+
except Exception as e:
|
619
|
+
|
620
|
+
raise ValueError("Erro na validação dos dados de input da criação do cartão:", e.errors())
|
621
|
+
|
622
|
+
command = {
|
623
|
+
'ClearCode': card,
|
624
|
+
'CardNumber': card,
|
625
|
+
'CardStartValidityDateTime': datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S'),
|
626
|
+
'CardEndValidityDateTime': (datetime.now(timezone.utc)+relativedelta(days=3650)).strftime('%Y-%m-%dT%H:%M:%S'),
|
627
|
+
}
|
628
|
+
|
629
|
+
reply = requests.post(
|
630
|
+
f'{self.waccess_url}/cards',
|
631
|
+
headers=self.waccess_headers,
|
632
|
+
json=command,
|
633
|
+
verify=False,
|
634
|
+
)
|
635
|
+
|
636
|
+
if reply.status_code == 201:
|
637
|
+
|
638
|
+
return True
|
639
|
+
|
640
|
+
else:
|
641
|
+
|
642
|
+
return False
|
643
|
+
|
644
|
+
def _associate_card_user(self, card:str, chid:str) -> bool:
|
645
|
+
"""
|
646
|
+
Associa um cartão a um usuário no sistema WAccess.
|
647
|
+
Args:
|
648
|
+
card (str): O ID do cartão a ser associado.
|
649
|
+
chid (str): O ID do titular do cartão (CardHolder ID).
|
650
|
+
Returns:
|
651
|
+
bool: Retorna True se a associação for bem-sucedida (status HTTP 201),
|
652
|
+
caso contrário, retorna False.
|
653
|
+
Observação:
|
654
|
+
- O campo 'CardStartValidityDateTime' é definido como a data e hora atual no formato UTC.
|
655
|
+
- O campo 'CardEndValidityDateTime' é definido como 10 anos a partir da data e hora atual.
|
656
|
+
- A requisição é enviada para o endpoint '/cardholders/{chid}/cards' da URL base do WAccess.
|
657
|
+
- A verificação SSL está desativada (verify=False).
|
658
|
+
"""
|
659
|
+
|
660
|
+
try:
|
661
|
+
|
662
|
+
AssociateCardUserValidator(
|
663
|
+
card=card,
|
664
|
+
chid=chid
|
665
|
+
)
|
666
|
+
|
667
|
+
except Exception as e:
|
668
|
+
|
669
|
+
raise ValueError("Erro na validação dos dados de input da associação do cartão:", e.errors())
|
670
|
+
|
671
|
+
command = {
|
672
|
+
'CardID': card,
|
673
|
+
'CHid': card,
|
674
|
+
'CardStartValidityDateTime': datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S'),
|
675
|
+
'CardEndValidityDateTime': (datetime.now(timezone.utc)+relativedelta(days=3650)).strftime('%Y-%m-%dT%H:%M:%S'),
|
676
|
+
}
|
677
|
+
|
678
|
+
reply = requests.post(
|
679
|
+
f'{self.waccess_url}/cardholders/{chid}/cards',
|
680
|
+
headers=self.waccess_headers,
|
681
|
+
json=command,
|
682
|
+
verify=False,
|
683
|
+
)
|
684
|
+
|
685
|
+
if reply.status_code == 201:
|
686
|
+
|
687
|
+
return True
|
688
|
+
|
689
|
+
else:
|
690
|
+
|
691
|
+
return False
|
692
|
+
|
693
|
+
# Função para inativar usuario no waccess
|
694
|
+
def turn_off_user(self, cpf:str) -> dict:
|
695
|
+
"""
|
696
|
+
Desativa um usuário no sistema WAccess.
|
697
|
+
Este método realiza as seguintes etapas:
|
698
|
+
1. Valida a existência do usuário no WAccess.
|
699
|
+
2. Remove os grupos de acesso associados ao usuário.
|
700
|
+
3. Remove os cartões vinculados ao usuário.
|
701
|
+
4. Inativa o usuário no sistema WAccess.
|
702
|
+
Args:
|
703
|
+
cpf (str): CPF do usuário que será desativado.
|
704
|
+
Returns:
|
705
|
+
dict: Um dicionário contendo o resultado da operação:
|
706
|
+
- 'success' (bool): Indica se a operação foi bem-sucedida.
|
707
|
+
- 'code' (str): Mensagem de status da operação.
|
708
|
+
- 'data' (opcional): Dados adicionais, como resposta da API em caso de erro.
|
709
|
+
Exceções:
|
710
|
+
- Caso o usuário não exista no WAccess, retorna um dicionário com 'success' como False e uma mensagem apropriada.
|
711
|
+
- Caso ocorra um erro ao inativar o usuário, retorna um dicionário com 'success' como False e os detalhes do erro.
|
712
|
+
"""
|
713
|
+
|
714
|
+
try:
|
715
|
+
|
716
|
+
TurnOffUserValidator(
|
717
|
+
cpf=cpf
|
718
|
+
)
|
719
|
+
|
720
|
+
except Exception as e:
|
721
|
+
|
722
|
+
raise ValueError("Erro na validação dos dados de input da inativação do usuario:", e.errors())
|
723
|
+
|
724
|
+
# Valida a existencia do usuario dentro do waccess
|
725
|
+
|
726
|
+
status_existence = self._validate_existence(cpf=cpf)
|
727
|
+
|
728
|
+
if status_existence is False:
|
729
|
+
|
730
|
+
return {
|
731
|
+
'success':False,
|
732
|
+
'code':'Usuario não existe no waccess',
|
733
|
+
'data':status_existence
|
734
|
+
}
|
735
|
+
|
736
|
+
# Remove os grupos de acesso
|
737
|
+
|
738
|
+
self._remove_groups(
|
739
|
+
chid=status_existence['CHid'],
|
740
|
+
cpf=cpf
|
741
|
+
)
|
742
|
+
|
743
|
+
# Remove o cartão do colaborador
|
744
|
+
|
745
|
+
status_user_cards = self._get_user_cards(chid=status_existence['CHid'])
|
746
|
+
|
747
|
+
for item_card in status_user_cards['data']:
|
748
|
+
|
749
|
+
requests.delete(
|
750
|
+
f'{self.waccess_url}/cards/{item_card["CardID"]}',
|
751
|
+
headers=self.waccess_headers,
|
752
|
+
verify=False,
|
753
|
+
)
|
754
|
+
|
755
|
+
# Inativa o usuario no waccess
|
756
|
+
|
757
|
+
reply = requests.put(
|
758
|
+
f'{self.waccess_url}/cardholders/{status_existence["CHid"]}',
|
759
|
+
headers=self.waccess_headers,
|
760
|
+
json={
|
761
|
+
'CHState': 1,
|
762
|
+
},
|
763
|
+
verify=False,
|
764
|
+
)
|
765
|
+
|
766
|
+
if reply.status_code == 204:
|
767
|
+
|
768
|
+
return {
|
769
|
+
'success':True,
|
770
|
+
'code':'Usuario inativado com sucesso no waccess',
|
771
|
+
}
|
772
|
+
|
773
|
+
else:
|
774
|
+
|
775
|
+
return {
|
776
|
+
'success':False,
|
777
|
+
'code':'Erro ao inativar usuario no waccess',
|
778
|
+
'data':reply.json()
|
779
|
+
}
|
780
|
+
|
781
|
+
def _remove_groups(self, chid:str,cpf:str) -> bool:
|
782
|
+
"""
|
783
|
+
Remove todos os grupos associados a um usuário específico no sistema WAccess.
|
784
|
+
Args:
|
785
|
+
chid (str): O ID do titular do cartão (Cardholder ID) no sistema WAccess.
|
786
|
+
cpf (str): O CPF do usuário associado ao titular do cartão.
|
787
|
+
Returns:
|
788
|
+
bool: Retorna True se os grupos foram removidos com sucesso,
|
789
|
+
caso contrário, retorna False.
|
790
|
+
Detalhes:
|
791
|
+
- Faz uma requisição GET para obter os grupos associados ao titular do cartão.
|
792
|
+
- Prepara uma lista de ações para remover todos os grupos encontrados.
|
793
|
+
- Chama o método `change_groups_user` para aplicar as alterações.
|
794
|
+
- Retorna False se a requisição inicial falhar.
|
795
|
+
"""
|
796
|
+
|
797
|
+
try:
|
798
|
+
|
799
|
+
RemoveGroupsValidator(
|
800
|
+
chid=chid,
|
801
|
+
cpf=cpf
|
802
|
+
)
|
803
|
+
|
804
|
+
except Exception as e:
|
805
|
+
|
806
|
+
raise ValueError("Erro na validação dos dados de input da remoção dos grupos do usuario:", e.errors())
|
807
|
+
|
808
|
+
reply = requests.get(
|
809
|
+
f'{self.waccess_url}/cardholders/{chid}/groups',
|
810
|
+
headers=self.waccess_headers,
|
811
|
+
verify=False,
|
812
|
+
)
|
813
|
+
|
814
|
+
if reply.status_code == 200:
|
815
|
+
|
816
|
+
groups = reply.json()
|
817
|
+
|
818
|
+
groups_remove = []
|
819
|
+
|
820
|
+
for item_group in groups:
|
821
|
+
|
822
|
+
groups_remove.append({
|
823
|
+
'action':'remove',
|
824
|
+
'group_id':item_group['GroupID']
|
825
|
+
})
|
826
|
+
|
827
|
+
self.change_groups_user(
|
828
|
+
cpf=cpf,
|
829
|
+
groups_list=groups_remove
|
830
|
+
)
|
831
|
+
|
832
|
+
return True
|
833
|
+
|
834
|
+
else:
|
835
|
+
|
836
|
+
return False
|