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