"""Classe base para definição de escopos bancários."""
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any
[docs]
@dataclass(frozen=True)
class ScopeGroup:
"""Grupo de escopos para uma funcionalidade específica."""
name: str
scopes: list[str]
description: str
[docs]
def as_string(self) -> str:
"""Retorna os escopos como string separada por espaços."""
return ' '.join(self.scopes)
[docs]
def __contains__(self, scope: str) -> bool:
"""Verifica se um escopo específico está no grupo."""
return scope in self.scopes
[docs]
def __add__(self, other: 'ScopeGroup') -> 'ScopeGroup':
"""Combina dois grupos de escopos."""
combined_scopes = list(dict.fromkeys(self.scopes + other.scopes))
return ScopeGroup(
name=f'{self.name}_{other.name}',
scopes=combined_scopes,
description=f'{self.description} + {other.description}',
)
[docs]
class BankScopesBase(ABC):
"""Classe base para definição de escopos bancários."""
# Informações do banco (devem ser definidas pelas subclasses)
BANK_NAME: str = ''
BANK_CODE: str = ''
BANK_CODES: list[str] = [] # Códigos alternativos (ex: ['001', 'bb'])
[docs]
@classmethod
@abstractmethod
def get_pix_scopes(cls) -> ScopeGroup:
"""Retorna os escopos PIX do banco."""
[docs]
@classmethod
def get_scope_group(cls, name: str) -> ScopeGroup:
"""Obtém um grupo de escopos pelo nome."""
return getattr(cls, name.upper())
[docs]
@classmethod
def list_available_groups(cls) -> list[str]:
"""Lista todos os grupos de escopos disponíveis."""
return [
attr
for attr in dir(cls)
if not attr.startswith('_') and isinstance(getattr(cls, attr), ScopeGroup)
]
[docs]
@classmethod
def combine_scopes(cls, *groups: ScopeGroup) -> str:
"""Combina múltiplos grupos de escopos em uma string."""
all_scopes = []
for group in groups:
all_scopes.extend(group.scopes)
unique_scopes = list(dict.fromkeys(all_scopes))
return ' '.join(unique_scopes)
[docs]
@classmethod
def get_bank_info(cls) -> dict[str, Any]:
"""Retorna informações do banco."""
return {
'name': cls.BANK_NAME,
'code': cls.BANK_CODE,
'alternative_codes': cls.BANK_CODES,
'available_groups': cls.list_available_groups(),
}