"""Definição de escopos para a API do Sicoob.
Este módulo contém as definições de escopos necessários para diferentes
funcionalidades da API do Sicoob, organizados por categoria.
"""
from pypix_api.scopes.base import BankScopesBase, ScopeGroup
[docs]
class SicoobScopes(BankScopesBase):
"""Definição de escopos para a API do Sicoob."""
# Informações do banco
BANK_NAME = 'Sicoob'
BANK_CODE = '756'
BANK_CODES = ['756', 'sicoob']
# Constantes para escopos
SCOPE_COB_WRITE = 'cob.write'
SCOPE_COB_READ = 'cob.read'
SCOPE_COBV_WRITE = 'cobv.write'
SCOPE_COBV_READ = 'cobv.read'
SCOPE_LOTECOBV_WRITE = 'lotecobv.write'
SCOPE_LOTECOBV_READ = 'lotecobv.read'
SCOPE_PIX_WRITE = 'pix.write'
SCOPE_PIX_READ = 'pix.read'
SCOPE_WEBHOOK_READ = 'webhook.read'
SCOPE_WEBHOOK_WRITE = 'webhook.write'
SCOPE_PAYLOADLOCATION_WRITE = 'payloadlocation.write'
SCOPE_PAYLOADLOCATION_READ = 'payloadlocation.read'
# PIX - Funcionalidades relacionadas ao PIX
PIX = ScopeGroup(
name='pix',
scopes=[
SCOPE_COB_WRITE,
SCOPE_COB_READ,
SCOPE_COBV_WRITE,
SCOPE_COBV_READ,
SCOPE_LOTECOBV_WRITE,
SCOPE_LOTECOBV_READ,
SCOPE_PIX_WRITE,
SCOPE_PIX_READ,
SCOPE_WEBHOOK_READ,
SCOPE_WEBHOOK_WRITE,
SCOPE_PAYLOADLOCATION_WRITE,
SCOPE_PAYLOADLOCATION_READ,
],
description='Funcionalidades completas do PIX incluindo cobranças, webhooks e payload location',
)
# Subgrupos do PIX para uso mais granular
PIX_COB = ScopeGroup(
name='pix_cob',
scopes=[SCOPE_COB_WRITE, SCOPE_COB_READ],
description='Cobranças imediatas PIX',
)
PIX_COBV = ScopeGroup(
name='pix_cobv',
scopes=[SCOPE_COBV_WRITE, SCOPE_COBV_READ],
description='Cobranças com vencimento PIX',
)
PIX_LOTE_COBV = ScopeGroup(
name='pix_lote_cobv',
scopes=[SCOPE_LOTECOBV_WRITE, SCOPE_LOTECOBV_READ],
description='Lote de cobranças com vencimento PIX',
)
PIX_BASIC = ScopeGroup(
name='pix_basic',
scopes=[SCOPE_PIX_WRITE, SCOPE_PIX_READ],
description='Operações básicas PIX',
)
PIX_WEBHOOK = ScopeGroup(
name='pix_webhook',
scopes=[SCOPE_WEBHOOK_READ, SCOPE_WEBHOOK_WRITE],
description='Webhooks PIX',
)
PIX_PAYLOAD = ScopeGroup(
name='pix_payload',
scopes=[SCOPE_PAYLOADLOCATION_WRITE, SCOPE_PAYLOADLOCATION_READ],
description='Payload location PIX',
)
# Boleto - Funcionalidades de boleto bancário
BOLETO = ScopeGroup(
name='boleto',
scopes=[
'boletos_inclusao',
'boletos_consulta',
'boletos_alteracao',
'webhooks_alteracao',
'webhooks_consulta',
'webhooks_inclusao',
],
description='Funcionalidades completas de boleto bancário',
)
# Subgrupos do Boleto
BOLETO_BASIC = ScopeGroup(
name='boleto_basic',
scopes=['boletos_inclusao', 'boletos_consulta', 'boletos_alteracao'],
description='Operações básicas de boleto',
)
BOLETO_WEBHOOK = ScopeGroup(
name='boleto_webhook',
scopes=['webhooks_alteracao', 'webhooks_consulta', 'webhooks_inclusao'],
description='Webhooks de boleto',
)
# Conta Corrente - Funcionalidades de conta corrente
CONTA_CORRENTE = ScopeGroup(
name='conta_corrente',
scopes=['cco_consulta', 'cco_transferencias', 'openid'],
description='Funcionalidades de conta corrente',
)
# Combinações comuns
PIX_COMPLETO = ScopeGroup(
name='pix_completo',
scopes=PIX.scopes,
description='Todas as funcionalidades PIX',
)
TODOS_ESCOPOS = ScopeGroup(
name='todos',
scopes=PIX.scopes + BOLETO.scopes + CONTA_CORRENTE.scopes,
description='Todos os escopos disponíveis',
)
[docs]
@classmethod
def get_pix_scopes(cls) -> ScopeGroup:
"""Retorna os escopos PIX do Sicoob."""
return cls.PIX
[docs]
@classmethod
def get_scope_group(cls, name: str) -> ScopeGroup:
"""Obtém um grupo de escopos pelo nome.
Args:
name: Nome do grupo de escopos
Returns:
ScopeGroup: Grupo de escopos correspondente
Raises:
AttributeError: Se o grupo não existir
"""
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.
Args:
*groups: Grupos de escopos a serem combinados
Returns:
str: Escopos combinados separados por espaço
"""
all_scopes = []
for group in groups:
all_scopes.extend(group.scopes)
# Remove duplicatas mantendo a ordem
unique_scopes = list(dict.fromkeys(all_scopes))
return ' '.join(unique_scopes)