Tarefa
Uma tarefa é algo que alguém precisa fazer no acompanhamento de um paciente: ligar para confirmar a retirada de um medicamento, revisar um exame, responder a um questionário. É o item de trabalho da equipe de cuidado — não um registro clínico.
No FHIR isso é a Task. A tarefa pode ter sido criada à
mão por um profissional ou gerada automaticamente por uma diretriz aplicada ao paciente; nos
dois casos ela chega aqui com a mesma forma.
Este recurso é somente leitura. Não existe POST /fhir/resources/Task — tarefas são
criadas dentro do NiloCare ou pela diretriz que as gera. Veja
O que a integração não cobre para o que acontece se você
tentar enviá-la mesmo assim.
Duas coisas diferentes na mesma lista
Este endpoint devolve dois tipos de tarefa, e a diferença importa: os campos presentes não são os mesmos.
Para separar as duas, use o system do identifier: ele é estável e não depende de
configuração do cliente. code.text também distingue, mas do lado da tarefa da equipe é um
rótulo que o cliente configura — se alguém criar um tipo de tarefa chamado
patient-questionnaire, a distinção por code deixa de valer.
Filtrar por origem na busca não é confiável. code é um parâmetro de token, e a
plataforma preenche code só com text, sem coding — buscar code=patient-questionnaire
não encontra nada. Por identifier, a sintaxe de token do FHIR admite filtrar só pelo system
(identifier=…|, com o valor vazio); esse recorte, como o modificador :text no code, não
foi confirmado neste store. Enquanto isso, o caminho seguro é trazer as tarefas do paciente e
separar as duas origens no seu lado.
Campos
A coluna No NiloCare traz o rótulo com que o dado aparece para a equipe; são rótulos, não caminhos de navegação: a tela pode ser reorganizada, o rótulo é o que permite conferir se o dado é o que você esperava. A coluna Origem diz em qual dos dois tipos de tarefa o campo aparece.
Todos os campos são de resposta — nenhum deles é enviado por você.
executionPeriod não é o prazo, e também não é quando a tarefa foi de fato iniciada. Na
tarefa da equipe, executionPeriod.start repete a data de criação — o mesmo valor de
authoredOn — e end só aparece depois de concluída. O momento em que alguém efetivamente
começou a tarefa existe na plataforma (é o que faz o status virar in-progress) e não é
exposto: não há como medir quanto tempo a tarefa levou entre começar e terminar.
O prazo combinado está em restriction.period.end, e restriction.period.start nunca vem
preenchido.
No questionário do paciente o executionPeriod é outra coisa: é o período de vigência da
atividade. O end traz a data em que foi respondido quando já houve resposta, e o fim do
período de vigência quando não houve — então, num questionário ainda em aberto, end não
indica conclusão. Essa origem não tem restriction, então não há um campo separado de prazo
para comparar.
As datas vêm com precisões diferentes
Na tarefa da equipe, authoredOn, lastModified e as duas pontas de executionPeriod vêm
só com a data, sem hora — a exceção é note[].time, que vem com data e hora. No
questionário do paciente, lastModified e executionPeriod vêm com data e hora.
executionPeriod.end da tarefa da equipe é o maior entre a data de criação e a data de
conclusão. A plataforma admite registros com conclusão anterior à criação, e o campo é
calculado assim para nunca devolver um período invertido. Se você compara as duas pontas
esperando a diferença exata entre criar e concluir, num registro assim ela sai zerada.
Prioridade
Só a tarefa da equipe tem prioridade. A correspondência com os cinco níveis da plataforma não é a que o nome do código FHIR sugere:
Duas armadilhas aqui, e as duas geram interpretação errada:
urgenté a prioridade normal. Uma tarefa comum, sem nenhuma urgência marcada pela equipe, chega compriority: urgent. Não a trate como prioritária, e não conteurgentcomo sinal de risco.routineé ambíguo. Baixa e Baixíssima saem as duas comoroutine, e não há como distinguir uma da outra pela API.
Situação
status só assume três dos valores do FHIR, derivados do andamento na plataforma:
Não existe cancelled neste recurso. Uma tarefa apagada no NiloCare não muda de status:
ela é removida do store, e o id que você já leu com sucesso passa a responder 404 sem
aviso nenhum. Se você guarda o conteúdo de uma tarefa, guarde o conteúdo — não o id.
status também não diz se a tarefa está atrasada. Atrasada é a comparação do prazo com a
data de hoje, e a tela a mostra como tag; a API não traz esse cálculo. Compare
restriction.period.end com a data corrente.
No questionário do paciente, completed significa que ele foi respondido e requested que
ainda não; in-progress aparece quando a plataforma o marca como em andamento. Qualquer valor
que a plataforma não reconheça cai em requested — a ausência de resposta é o padrão.
Apagar um dado no NiloCare não limpa o campo aqui
A gravação preserva o valor anterior quando o novo é vazio. Na prática, alguns campos desta tarefa não voltam a ficar em branco depois de preenchidos uma vez.
Vale para code, requester e performerType. Removido o tipo da tarefa, ou o solicitante, a
leitura continua devolvendo o valor antigo indefinidamente.
O caso mais enganoso é performerType: ele é a especialidade do responsável atual, mas só é
reescrito quando o novo responsável tem alguma especialidade cadastrada. Passar a tarefa para
alguém sem especialidade deixa ali a especialidade do responsável anterior. Não use
performerType para deduzir quem é o responsável — para isso existe owner.
output[] está na mesma situação, por um motivo diferente: a lista é omitida quando fica
vazia, e o valor gravado antes é o que continua sendo devolvido.
note[] é a exceção real: removidas as anotações, elas somem da leitura.
Anotações de andamento
Cada anotação registrada sobre o andamento da tarefa vira um item de note[], com o texto em
text e o momento em time. Só a tarefa da equipe tem anotações.
note[].authorReference vem só quando quem anotou foi um profissional. Anotação registrada
por automação da plataforma vem sem autor, e o mesmo acontece quando o profissional que anotou
não é mais localizável. Trate a ausência de authorReference como “autor não identificado”,
não como erro.
A lista está ordenada como a plataforma a devolve, não necessariamente por time.
O questionário e a resposta dele
No questionário do paciente, output[] traz até dois itens, distinguidos por type.text:
output é o elo com o Questionário respondido: o
item questionnaire-response é a chave para ler o conteúdo das respostas. Enquanto o paciente
não responde, esse item simplesmente não existe.
Diferente das outras referências deste recurso, as de output vêm por identificador, sem
reference — resolva-as por uma busca por identifier, não por leitura direta.
O item questionnaire-response pode apontar para uma submissão que a busca de
Questionário respondido não devolve: uma submissão
sem nenhuma resposta válida não chega a existir como recurso FHIR. A referência fica lá,
irresolvível.
O contrário também acontece: não toda resposta de questionário tem uma tarefa. Só o
questionário atribuído ao paciente gera Task — um questionário respondido fora desse fluxo
existe como resposta e não aparece neste recurso.
Campos que a Nilo não usa
A Task canônica tem campos que esta integração não produz: basedOn, partOf,
groupIdentifier, statusReason, businessStatus, focus, encounter, reasonCode,
reasonReference, insurance, relevantHistory, input, location e doNotPerform. Como
esta referência descreve só o que é suportado, eles não aparecem no schema do recurso — e, como
não há escrita, também não há como preenchê-los.
Repare em encounter: uma tarefa criada durante um atendimento não guarda a referência ao
atendimento aqui. Não há como ligar tarefa a atendimento por esta API.
Cadastrar ou atualizar
Não existe. Este recurso não tem caminho de escrita nesta API — nem para criar, nem para atualizar, nem para apagar. Tarefas nascem no NiloCare, ou são geradas pela diretriz aplicada ao paciente, e chegam aqui já prontas.
Um POST /fhir/resources/Task não é uma operação suportada e não devolve um erro de
validação tratável: com um corpo válido, a chamada falha com erro inesperado do servidor
(500). Não escreva tratamento em cima desse comportamento — ele não é contrato, e nada é
gravado no NiloCare de qualquer forma. Um corpo malformado responde 400 antes disso, pela
validação do recurso — não conclua daí que a operação existe.
Dentro de uma carga em lote o erro é limpo, e
igualmente definitivo: a entrada é recusada com Resource Task not supported.
Para fazer a plataforma gerar tarefas por integração, o caminho é aplicar uma diretriz ao paciente — veja Plano de cuidado.
Buscar
A resposta é sempre um Bundle do tipo searchset. O exemplo abaixo traz as duas origens na
mesma resposta, que é o que uma busca por paciente devolve:
Busca sem resultados não é erro: volta 200 com um Bundle cujo entry é uma lista vazia.
Trate a ausência de resultados pela lista vazia, não esperando um 404.
Parâmetros de busca suportados
As tarefas de um paciente pelo identificador dele — a busca mais usada deste recurso:
As referências deste recurso trazem reference e identifier, então as duas formas de
busca por referência estão disponíveis: patient=Patient/{id}, com o id Nilo FHIR, e
patient:identifier=system|valor, com o identificador do paciente. A segunda é a prática,
porque dispensa conhecer o id do store.
Isso não vale para todos os recursos desta API — em
Avaliação clínica, por exemplo, as referências saem sem
reference e só a forma com :identifier encontra algo.
Qual identificador do paciente o for carrega depende da sua implantação. Na configuração
que usa identificadores externos nas referências, é o identificador do seu sistema — e o filtro
acima funciona como está. Sem ela, o for traz o identificador Nilo do paciente
(…/NamingSystem/hippocrates-api--patient), e é esse system que você tem de usar no filtro.
Confira numa resposta de leitura qual dos dois está lá antes de montar a busca em volume. O
mesmo vale para owner e requester.
Vários parâmetros canônicos da Task existem e não encontram nada aqui, porque a
plataforma não preenche o campo correspondente: based-on, part-of, focus, encounter,
business-status e group-identifier.
code e performer são um caso diferente, e mais traiçoeiro: os campos existem e vêm
preenchidos, mas só com text, sem coding — e os dois parâmetros são de token, que procura
em coding. Buscar o tipo de tarefa ou a especialidade do responsável pelo valor puro não
encontra nada. O modificador :text do FHIR existe justamente para procurar no text, mas o
suporte a ele neste store não foi confirmado — não conte com ele sem testar.
intent funciona, e por isso é inútil: o valor é constante, então intent=order traz todas as
tarefas.
Não há parâmetro para output, então não se busca a tarefa a partir do questionário ou da
resposta dele. O caminho é o inverso: leia a tarefa e siga o output.
A paginação é por _count e _page_token; havendo página seguinte, o Bundle traz a URL
pronta em link.
Ler por ID
Diferente da busca, esta leitura não devolve um Bundle — mas também não devolve o recurso
nu. A resposta é um envelope com fullUrl, search e resource, e a tarefa está em
resource. Ler status ou description na raiz da resposta não encontra nada.
A leitura por ID responde 404 quando o id não existe — inclusive quando a tarefa existia e
foi apagada no NiloCare.
Tarefas geradas por uma diretriz
Aplicar uma diretriz a um paciente faz a plataforma gerar as tarefas e os questionários previstos nela. Elas aparecem neste recurso como qualquer outra tarefa, com duas marcas:
- a tarefa da equipe gerada por diretriz vem sem
requester— não houve profissional solicitando (no NiloCare a tela mostra Criado automaticamente pela diretriz); - a tarefa é referenciada em
activity[]do Plano de cuidado correspondente.
A geração é assíncrona. Confirmada a aplicação da diretriz, as tarefas levam um tempo
para existir, e esse tempo é decidido pela plataforma — não há garantia de prazo. Uma busca
imediata que não devolve nada não significa diretriz sem tarefas: significa que a geração não
terminou. Reconsulte em vez de tratar a primeira resposta vazia como definitiva; o sinal de que
a geração acabou é a activity aparecer no
plano de cuidado.
Nem toda tarefa vem de uma diretriz, e a API não diz de onde a tarefa veio. A ausência de
requester é um indício, não uma garantia. Para saber quais tarefas pertencem a um plano, leia
o activity[] do plano — é lá que o vínculo está.
Referências entre recursos
for, owner, requester e note[].authorReference vêm completas: com reference,
identifier e type. Você pode resolver o recurso apontado pelo reference ou por uma busca
por identifier, como preferir.
output[].valueReference é a exceção: vem só com identifier e type, sem reference.
performerType[0] tem a forma de um código FHIR, mas não é um: traz apenas text, com o nome
da especialidade. Não há system nem code para casar com um catálogo.
O que a integração não cobre
Não há escrita: nem criar, nem atualizar, nem concluir, nem apagar uma tarefa. Também não há como registrar uma anotação de andamento, mudar o responsável ou remarcar o prazo por esta API.
E alguns dados que a plataforma guarda não têm campo aqui:
- no questionário do paciente: o prazo, o responsável e o solicitante existem na
plataforma e não são expostos —
restriction,ownererequesterficam vazios nessa origem, mesmo quando a tela mostra Prazo, Responsável e Solicitado por. Na outra origem os três são expostos, então a assimetria está dentro do mesmo recurso; - as anotações do próprio questionário, que também existem na plataforma —
note[]é só da tarefa da equipe; - a marca de alerta crítico do questionário;
- o momento em que a tarefa foi efetivamente iniciada;
- a recorrência da tarefa da equipe, quando ela se repete;
- a distinção entre tarefa criada à mão e tarefa gerada por diretriz;
- a especialidade exigida pela tarefa, quando ela é diferente da especialidade do responsável;
- o atendimento em que a tarefa foi criada.
Para o conteúdo das respostas de um questionário, o recurso é Questionário respondido. Para o plano que gerou as tarefas, Plano de cuidado.

