64 lines
No EOL
2.7 KiB
Python
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) |