from packages.v1.administrativo.schemas.client_schema import ClientUpdateSchema, ClientCNSSchema from packages.v1.administrativo.actions.client.client_update_action import UpdateAction from actions.dynamic_import.dynamic_import import DynamicImport from fastapi import status, HTTPException class UpdateService: """ Service responsável por orquestrar a atualização de um cliente, incluindo validações de regra de negócio antes de delegar a ação. """ 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_id: int, client_schema: ClientUpdateSchema): """ Executa o serviço de atualização de um cliente. :param client_id: ID do cliente a ser atualizado. :param client_schema: Schema contendo os dados do cliente para atualização. :return: Resultado da operação de atualização. """ # 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 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) # É necessário usar um schema de busca específico para o CNS 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: # O CNS é um erro APENAS se pertencer a outro cliente, e não ao que está sendo atualizado. if self.response.get('client_id') != 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 da Action de atualização update_action = UpdateAction() # Executa a ação de atualização return update_action.execute(client_id, client_schema)