monitoring-api/packages/v1/administrativo/services/client/client_save_service.py

64 lines
No EOL
2.7 KiB
Python

from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.client_schema import ClientSaveSchema, ClientCNSSchema
from packages.v1.administrativo.actions.client.client_save_action import SaveAction
from fastapi import status, HTTPException
class SaveService:
"""
Service responsável por orquestrar o salvamento (INSERT/UPDATE) de um cliente.
Inclui validações de regra de negócio, como a unicidade do CNS.
"""
def __init__(self):
# Action responsável por carregar as services de acordo com o estado
self.dynamic_import = DynamicImport()
# Define o pacote que deve ser carregado
self.dynamic_import.set_package("administrativo")
# Define a tabela que o pacote pertence
self.dynamic_import.set_table("client")
pass
def execute(self, client_schema: ClientSaveSchema):
"""
Executa a lógica de serviço para salvar um cliente.
:param client_schema: Schema contendo os dados do cliente a serem salvos.
:return: Resultado da operação de salvamento.
"""
# Armazena possíveis erros de validação
errors = []
# --- Validação de Unicidade do CNS (Cadastro Nacional de Saúde) ---
if client_schema.cns:
# Importação de service de busca por CNS (Adaptado de user_get_email_service)
cns_service = self.dynamic_import.service("client_get_cns_service", "GetCNSService")
# Instânciamento da service
self.cns_service = cns_service()
# Tenta localizar o cliente pelo CNS, sem levantar erro HTTP se não encontrar (o False no segundo param)
self.response = self.cns_service.execute(ClientCNSSchema(cns=client_schema.cns), False)
# Se houver retorno, significa que o CNS já está sendo utilizado
if self.response:
# Se for um UPDATE (client_id existe) e o CNS encontrado pertencer ao próprio cliente que está atualizando,
# não deve ser considerado erro. A validação precisa garantir que o CNS pertence a OUTRO cliente.
if not client_schema.client_id or self.response.get('client_id') != client_schema.client_id:
errors.append({'input': 'cns', 'message': 'O CNS informado já está sendo utilizado por outro cliente.'})
# Se houver erros de validação, informa
if errors:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=errors
)
# Instânciamento de ações
save_action = SaveAction()
# Executa a ação de persistência
return save_action.execute(client_schema)