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 ClientSaveAction from fastapi import status, HTTPException class ClientSaveService: """ 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 = ClientSaveAction() # Executa a ação de persistência return save_action.execute(client_schema)