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/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