
Documentação Funcional Simplificada
Cristhyan Couto / 22 de maio de 2025
Documentação resumida por Cristhyan Couto
Você pode conferir toda a documentação disponibilizada pela Funcional Health Tech diretamente no site da empresa. Documentação Funcional Health Tech
Endereços
- Produção: https://stores.funcionalmais.com/graphql
- Homologação: https://stores-uat.funcionalmais.com/graphql
GraphQL
Toda chamada e resposta para a Funcional é feita via GraphQL. Em resumo, usaremos apenas dois tipos de chamadas.
Query
A query será utilizada para dados sem mudanças (GETs), sempre que quisermos apenas o retorno da informação.
query {
# Nome da função de chamada
Pharma_checkPricesAndRules(
# Informações da requisição
storeCode: "0000000000010"
etc...
){
aproved
createdAt
etc...
}
}
Resposta
{
"data": {
"Pharma_checkPricesAndRules":{
"aproved": true,
"createdAt": "2022-01-14T15:22:57.000Z",
etc...
}
}
}
Mutations
Mutations serão usadas sempre que quiser sobrescrever ou criar um dado (POST, PUT).
mutation preAuthorizeSale {
# Pré-autorização de venda
Sales_preAuthorizeSale(
# Canal PHARMA ou BENEFITS
channel: PHARMA
# Origem da chamada
origin: PARTNERS_ECOMMERCE
# Cartão ou CPF
customerCode: "00000000000"
# CNPJ da farmácia
storeCode: "00000000000010"
etc...
)
}{
createdAt
totalValue
etc...
}
Tokens
- Toda chamada enviada precisa ser acompanhada por um TOKEN JWT (Authorization: Bearer).
- Os tokens têm duração de 24 horas.
Para criar um token se chama um mutation
mutation {
createToken(login: "<usuario>", password: "<senha>") {
token
}
}
Resposta
{
"data": {
"createToken": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
}
}
Importante
- Utilização do token sem aspas
- CRM para testes 999999
Carga de Produtos (HOMOLOGAÇÃO)
Essa função será usada para fazer a carga dos produtos para testes
query Pharma_discountPrograms {
# storeCode = CNPJ (utilizando 010 para homologação).
# origin = Ponto de origem da venda.
Pharma_discountPrograms(storeCode: "00000000000010", origin: POINT_OF_SALES) {
# id = ID do programa de desconto.
id
# name = Nome do programa de desconto.
name
# url = Site do programa de desconto (pode retornar null).
url
# allowedOrigins = Pontos de origem para aquele programa (PDV, Web, etc.).
allowedOrigins
# rules = Regra de Produtos.
rules {
# product = Objeto para mostrar os produtos disponíveis no programa de descontos.
product {
# name = Nome do produto.
name
# packge = Informações do produto como mg, quantidade, etc.
package
# eans = Lista de eans do produto.
eans
}
# requiresMedicalPrescription = Se o produto necessita de receita.
requiresMedicalPrescription
# witholdsMedicalPrescription = Se o produto necessita de retenção de receita.
witholdsMedicalPrescription
# blocked = Produto bloqueado para o PDV.
blocked
# saleBaseDiscountPercentage = Desconto base do produto para a venda.
saleBaseDiscountPercentage
# maximumConsumerPrice = Preço máximo para o consumidor.
maximumConsumerPrice
# repositionBaseDiscountPercentage = Desconto base do produto para reposição.
repositionBaseDiscountPercentage
# id = Código da regra do produto.
id
# description = Código da regra da descrição do produto.
description
}
}
}
resposta
{
"id": "9",
"name": "PROGRAMA VIVER - ADIUM",
"url": null,
"allowedOrigins": [
29,
3,
5,
6,
8,
16
],
"rules": [
{
"product": {
"name": "LACOTEM",
"package": "200 mg emb. c/ 28",
"eans": [
"7892953003909"
]
},
"requiresMedicalPrescription": false,
"witholdsMedicalPrescription": false,
"blocked": false,
"saleBaseDiscountPercentage": 65,
"maximumConsumerPrice": 562.61,
"repositionBaseDiscountPercentage": 1,
"id": "6888",
"description": null
},
{
"product": {
"name": "LACOTEM",
"package": "100 mg emb. c/ 28",
"eans": [
"7892953003879"
]
},
"requiresMedicalPrescription": false,
"witholdsMedicalPrescription": false,
"blocked": false,
"saleBaseDiscountPercentage": 65,
"maximumConsumerPrice": 288.15,
"repositionBaseDiscountPercentage": 1,
"id": "6887",
"description": null
},
{
"product": {
"name": "LACOTEM",
"package": "50 mg emb. c/ 14",
"eans": [
"7892953003831"
]
},
"requiresMedicalPrescription": false,
"witholdsMedicalPrescription": false,
"blocked": false,
"saleBaseDiscountPercentage": 65,
"maximumConsumerPrice": 71.96,
"repositionBaseDiscountPercentage": 1,
"id": "6889",
"description": null
},
{
"product": {
"name": "TAMSULON",
"package": "0,4 mg emb. c/ 30",
"eans": [
"7892953000755",
"7892953002186"
]
},
"requiresMedicalPrescription": false,
"witholdsMedicalPrescription": false,
"blocked": false,
"saleBaseDiscountPercentage": 66,
"maximumConsumerPrice": 270.46,
"repositionBaseDiscountPercentage": 1,
"id": "176",
"description": null
}
]
},
Cadastro e Elegibilidade
- Avaliar elegibilidade do CPF: query Pharma_assessEligibility
- Parâmetros Farmácia: Origem e CNPJ
* CAMPO: origin
Aqui será enviada a origem da venda, que é do tipo ENUM, então PRECISA ser exata.
* Exemplos de Origem:
- MOBILE_APP
- POINT_OF_SALES
- CALL_CENTER
* CAMPO: storeCode
Aqui deve ser enviado o CNPJ da farmácia.
* Formatação:
"0000000000010"
- Parâmetros Cliente: EAN e CPF.
* CAMPO: productCode
Aqui deve ser enviado o código de barras EAN do produto.
* Formatação:
"<EAN>"
* CAMPO: customerCode
Aqui deve ser enviado o CPF do cliente.
* Formatação:
"<CPF da pessoa>"
Fluxo da consulta:
- A consulta é feita sempre com dois parâmetros, o CPF do cliente e o EAN do produto.
- Primeiro, verifica-se se o produto está cadastrado em algum programa.
- Verifica-se se o CPF está cadastrado no programa ao qual o produto pertence.
- Verifica-se se o CPF está cadastrado no produto específico.
Caso CPF não esteja no programa:
- Será retornada uma lista de campos necessários para o cadastro no programa.
Caso exista e se houver (pacientes)
- Será retornada uma lista de pacientes atrelados àquele CPF.
Retorno:
* CAMPO: registrationPolicy.requiresBeneficiaryRegistration.TRUE
- Isso significa que o CPF não está cadastrado no programa.
* CAMPO: registrationPolicy.requiresBeneficiaryRegistration.FALSE
- Isso significa que o CPF está cadastrado e não precisa continuar o fluxo de cadastro.
* CAMPO: eligibilityAssessment.programCode
- OBS: Salve este campo, pois ele será enviado no momento do cadastro do CPF no programa.
Envio
query Pharma_assessEligibility {
Pharma_assessEligibility(
# Origem da solicitação
origin: POINT_OF_SALES
# CNPJ da loja
storeCode: "00000000000010"
# Ean do produto
productCode: "7896672203923"
# CPF do Cliente
customerCode: "71956929061"
) {
# Resultado da validação
validationResult {
status
message
errors {
message
}
}
# Retorno de eligibilidade
eligibilityAssessment {
# Se pertence a algum programa = Boolean
belongsToIndustryProgram
# Descrição do Programa
programDescription
# Código do Programa (OBS: Salvar campo)
programCode
# Descrição do produto (Geralmente o nome)
productDescription
}
# Politicas de registro do programa
# Aqui teremos campos opcionais e requeridos
# Campos requeridos deverão ser mandados para cadastro
registrationPolicy {
# Informa se o programa utiliza pacientes dependentes
allowDependents
# Limite de pacientes dependentes
dependentsLimit
# Informa se é necessário cadastro no programa
requiresBeneficiaryRegistration
# Informa se é necessário prescrição médica
requiresMedicalPrescriptionRegistration
# Informa se é necessário pelo menos um telefone de contato exigido
requiresAtLeastOneContactMedium
# Informa se o CRM é obrigatório ou opcional para o programa
requiresMedicalPrescriber
# Campos de origens permitidas
allowedOrigins
# Campos de cadastro do beneficiáro
# Aqui ira mostrar os campos requeridos para cadastro.
beneficiaryFields {
# Nome do campo - EX: "Nome"
field
# Descrição do campo - EX: "Nome Completo"
label
# Tipo do campo - EX: STRING
type
# Descrição do campo
description
# Aqui mostra se o campo é "REQUIRED" ou opcional
display
# A qual entidade esse campo pertence - EX: "BENEFICIARIO"
entity
# Valor pré definido - EX: null
defaultValue
}
# Campo de dependentes
dependentFields {
field
label
type
description
display
entity
defaultValue
}
# Campo de prescrição médica
medicalPrescriptionFields {
field
label
type
description
display
entity
defaultValue
}
extraFields {
field
label
type
description
display
entity
defaultValue
}
extraFormFields {
QuestionCode
ParentQuestionCode
ProgramCode
ProductName
DisplayTitle
MultipleChoice
Mandatory
DisplayOrder
QuestionHint
ControlType
QuestionTypeFlag
}
}
dependents {
id
name
birth
gender
holder
}
}
}
resposta
{
"data": {
"Pharma_assessEligibility": {
"validationResult": {
"status": "SUCCESS",
"message": null,
"errors": []
},
"eligibilityAssessment": {
"belongsToIndustryProgram": true,
"programDescription": "PROGRAMA ACESSAR - CHIESI",
"programCode": "21",
"productDescription": "BRONCHO VAXOM"
},
"registrationPolicy": {
"allowDependents": false,
"dependentsLimit": 0,
"requiresBeneficiaryRegistration": true,
"requiresMedicalPrescriptionRegistration": true,
"requiresAtLeastOneContactMedium": true,
"requiresMedicalPrescriber": false,
"allowedOrigins": [
"POINT_OF_SALES",
"CALL_CENTER",
"INDUSTRY_PROGRAM_WEBSITE",
"MOBILE_APP",
"PARTNERS_ECOMMERCE",
"MEMED"
],
"beneficiaryFields": [
{
"field": "Nome",
"label": "Nome Completo",
"type": "STRING",
"description": null,
"display": "REQUIRED",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "Nascimento",
"label": "Data de Nascimento",
"type": "DATETIME",
"description": null,
"display": "REQUIRED",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "Sexo",
"label": "Sexo",
"type": "SELECT",
"description": null,
"display": "REQUIRED",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "PermiteContatoTelefone",
"label": "Contato posterior por Telefone?",
"type": "BOOLEAN",
"description": null,
"display": "HIDDEN",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "TelefoneCelular",
"label": "Telefone Celular",
"type": "STRING",
"description": null,
"display": "OPTIONAL",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "Telefone",
"label": "Telefone Residencial",
"type": "STRING",
"description": null,
"display": "OPTIONAL",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "TelefoneComercial",
"label": "Outro Telefone",
"type": "STRING",
"description": null,
"display": "OPTIONAL",
"entity": "BENEFICIARIO",
"defaultValue": null
},
{
"field": "Email",
"label": "Email",
"type": "STRING",
"description": null,
"display": "OPTIONAL",
"entity": "BENEFICIARIO",
"defaultValue": null
}
],
"dependentFields": [],
"medicalPrescriptionFields": [
{
"field": "TipoConselho",
"label": "Tipo de conselho",
"type": "SELECT",
"description": null,
"display": "REQUIRED",
"entity": "PRODUTO",
"defaultValue": null
},
{
"field": "NumeroRegistroConselho",
"label": "Número de Registro",
"type": "INTEGER",
"description": null,
"display": "REQUIRED",
"entity": "PRODUTO",
"defaultValue": null
},
{
"field": "UF",
"label": "UF",
"type": "SELECT",
"description": null,
"display": "REQUIRED",
"entity": "PRODUTO",
"defaultValue": null
}
],
"extraFields": [],
"extraFormFields": []
},
"dependents": []
}
}
}
Após a verificação, caso o cliente seja elegível para o PBM, inicia-se o fluxo de cadastro.
Inscrição do Beneficiário
Mutation Pharma_signUpProgramBeneficiaryENVIO:
- O envio dependerá do retorno do Pharma_assessEligibility.
- Serão enviados os campos obrigatórios e, caso deseje, os opcionais.
Exemplo de envio:
mutation {
Pharma_signUpProgramBeneficiary(
input: {
# Código do programa
programCode: "1"
# Origem da solicitação
origin: POINT_OF_SALES
# CNPJ da farmácia
storeCode: "00000000000010"
# CPF do consumidor
customerCode: "00000000000"
# EAN do produto do programa da indústria
productCode: "7897572004405"
# Campos do cadastro de beneficiários
# (conforme Pharma_assessEligibility)
# Aqui só iremos mandar campos marcados como "REQUIRED"
beneficiaryFields: [
{ text: "Nome", value: "Fulano Beltrano Ciclano" }
{ text: "Nascimento", value: "1989-03-07 12:00:00" }
{ text: "Sexo", value: "M" }
{ text: "Email", value: "r@r.com" }
{ text: "Telefone", value: "12398472" }
{ text: "TelefoneCelular", value: "12398472" }
{ text: "CEP", value: "20261905" }
{ text: "Endereco", value: "Rua Jatoba" }
{ text: "Numero", value: "02" }
{ text: "Bairro", value: "Leblon" }
{ text: "Cidade", value: "Rio de Janeiro" }
{ text: "UF", value: "PR" }
]
# Campos do cadastro de receita médica
# (conforme Pharma_assessEligibility)
medicalPrescriptionFields: [
{ text: "NumeroRegistroConselho", value: "6055" }
{ text: "UF", value: "SC" }
{ text: "TipoConselho", value: "0" }
]
dependentFields: null
extraFields: null
extraFormFields: null
}
) {
# Status da solicitação
status
message
errors {
message
}
}
}
Resposta
{
"data": {
"Pharma_signUpProgramBeneficiary": {
"status": "SUCCESS",
"message": "Beneficiario cadastrado com sucesso",
"errors": []
}
}
}
Inscrição de Dependentes (OPCIONAL)
mutation Pharma_signUpProgramBeneficiary {
Pharma_signUpProgramBeneficiary(
input: {
origin: POINT_OF_SALES
storeCode: "00000000000010"
customerCode: "14771206023"
productCode: "7896672203923"
programCode: "21"
beneficiaryFields: [
{ text: "Nome", value: "Nome da Silva Sauro" }
{ text: "Nascimento", value: "1999-06-05" }
{ text: "Sexo", value: "M" }
{ text: "Telefone", value: "12398472" }
]
medicalPrescriptionFields: [
{ text: "NumeroRegistroConselho", value: "6055" }
{ text: "UF", value: "SC" }
{ text: "TipoConselho", value: "0" }
]
dependentFields: null
extraFields: null
extraFormFields: null
}
) {
status
message
errors {
message
}
}
}
Resposta
{
"data": {
"Pharma_signUpProgramBeneficiaryDependent": {
"status": "SUCCESS",
"message": "Beneficiario cadastrado com sucesso",
"errors": []
}
}
}
Incluir Produto a um Beneficiário
- Inclui um produto no cadastro do beneficiário, podendo também associá-lo a um paciente.
- Novamente, isso será baseado no retorno do Pharma_assessEligibility.
Exemplo:
mutation {
Pharma_addProgramBeneficiaryToProduct(
input: {
# Origem
origin: POINT_OF_SALES
# Codigo do programa
programCode: "8"
# CNPJ da farmácia
storeCode: "00000000000010"
# CPF do consumidor
# (beneficiário titular se for usar
# o ID de um dependente no campo dependenteID)
customerCode: "000000000000"
# EAN do produto do programa da indústria
productCode: "7896269900150"
# ID de um paciente dependente do beneficiário
# (titular). ID está na lista de dependentes na
# query Pharma_assessEligibility)
dependentID: null
# Campos do cadastro de receita médica
# (conforme Pharma_assessEligibility)
medicalPrescriptionFields: [
{ text: "NumeroRegistroConselho", value: "6055" }
{ text: "UF", value: "SC" }
{ text: "TipoConselho", value: "0" }
]
}
) {
status
message
errors {
message
}
}
}
Validar os dados do CRM do Prescritor
Phrama_prescriber
Envio:
query {
Pharma_prescriber(
data: { council: CRM, stateAbbr: "SP", registerNumber: 999999 }
) {
status
message
errors {
message
}
}
}
Resposta
{
"data": {
"Pharma_prescriber": {
"status": "SUCCESS",
"message": "",
"errors": []
}
}
}
Validando Regras e Checando Preços
query {
Pharma_checkPricesAndRules(
# Origem da venda
origin: POINT_OF_SALES
# CNPJ da loja
storeCode: "00000000000010"
# CPF do Cliente
customerCode: "23225452017"
# Lista de Produtos (Pode ser mais de 1)
products: [
{
ean: "7897337706339"
price: 222.99
saleAmount: 1
medicalPrescription: {
quantity: 1
date: "2025-05-28"
prescriber: { council: CRM, stateAbbr: "SP", registerNumber: 999999 }
}
}
]
) {
aproved
createdAt
totalValue
moneyPaidValue
cardPaidValue
totalValueMaxConsumerPrice
totalValueWithPrescription
totalValueWithoutPrescription
totalDiscountAmount
requiredUploadWithPrescription
products {
transactionType
ean
description
maximumConsumerPrice
priceReceived
funcionalPrice
salePrice
saleAmount
status {
aproved
message
}
medicalPrescription {
quantity
date
prescriber {
council
stateAbbr
registerNumber
}
# o parâmetro deve ser declarado na pré-autorização, após validação se retornado true no requiredInformDailyDose
dailyDose
# o mesmo valida se é obrigatório o envio do parâmetro "dailyDose"
requiredInformDailyDose
}
}
}
}
resposta
{
"data": {
"Pharma_checkPricesAndRules": {
"aproved": true,
"createdAt": "2025-05-28T15:22:57.000Z",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"totalValueMaxConsumerPrice": 221.84,
"totalValueWithPrescription": 0,
"totalValueWithoutPrescription": 221.84,
"totalDiscountAmount": 0,
"requiredUploadWithPrescription": false,
"products": [
{
"transactionType": "PHARMA",
"ean": "7897337706339",
"description": "JANUMET 50 mg + 850 mg emb. c/ 56",
"maximumConsumerPrice": 221.84,
"priceReceived": 221.84,
"funcionalPrice": 221.84,
"salePrice": 221.84,
"saleAmount": 1,
"status": {
"aproved": true,
"message": ""
},
"medicalPrescription": {
"quantity": 1,
"date": "2025-05-28T15:22:57.000Z",
"prescriber": {
"council": "CRM",
"stateAbbr": "SP",
"registerNumber": 999999
},
"dailyDose": null,
"requiredInformDailyDose": true
}
}
]
}
}
}
Pre-autorizando uma venda
mutation preAuthorizeSale {
# Pré-autorização de venda
Sales_preAuthorizeSale(
# Canal PHARMA ou BENEFITS
channel: PHARMA
# Origem da chamada
origin: POINT_OF_SALES
# Cartão ou CPF
customerCode: "23225452017"
# CNPJ da farmácia
storeCode: "00000000000010"
# Produtos
products: [
{
ean: "7897337706339"
unitPrice: 222.99
# Opcional - PMC do produto, praticado pelo estabelecimento.
maxConsumerPrice: 316.92
# Quantidade do produto a ser pré-autorizada
quantity: 1
# Receita Médica
medicalPrescription: {
date: "2025-05-28"
quantity: 1
usage: CONTINUAL # uso contínuo
# Prescritor (Médico, Dentista)
prescriber: { council: CRM, registerNumber: 999999, stateAbbr: "SP" }
}
}
]
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
status
statusCode
statusMessage
# Se exige um token gerado no app de celular
secondFactorAuthentication
products {
ean
description
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
medicalPrescription {
date
quantity
# quando necessário a declaração de acordo a validação de regra, é importante pedir o retorno para ser especificado no próximo passo que é a confirmação.
dailyDose
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta
{
"data": {
"Sales_preAuthorizeSale": {
"createdAt": "2025-06-02T16:46:51.000Z",
"authorizationID": "143790",
"sequenceID": "143801",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "Desconto calculado com sucesso!",
"secondFactorAuthentication": "NONE",
"products": [
{
"ean": "7897337706339",
"description": "JANUMET",
"maxConsumerPrice": 316.92,
"unitPrice": 221.84,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "Desconto Por Mes de Tratamento",
"medicalPrescription": {
"date": "2025-05-28",
"quantity": 1,
"dailyDose": null,
"prescriber": {
"council": "CRM",
"registerNumber": 999999,
"stateAbbr": "SP"
}
}
}
]
}
}
}
Enviando receitas caso campo seja requerido
OBS: Aqui é um pouco mais complicado, mas vamos de passo a passo, essa é uma função multi-part, explicação utilizando POSTMAN
- Requisição POST
- Headers - Key - Content-Type - Value - multipart/form-data
- Body - form-data
- Key - operations - Text - Value
{
"query": "mutation upload($file: Prescription_Upload!) {\n Prescription_uploadPrescription(\n file: $file\n uploadInfo: {\n cardNumber: \"00000000000\"\n source: POINT_OF_SALES\n mime: \"image/png\"\n }\n ) {\n id\n uploadedAt\n name\n cardNumber\n identity\n }\n}",
"variables": {
"file": null
},
"operationName": "upload"
}
- Key - map - Text - Value
{
"uploaded_file": ["variables.file"]
}
- Key - uploaded_file - File (selecione o arquivo)
resposta
{
"data": {
"Prescription_uploadPrescription": {
"id": "165651",
"uploadedAt": "2025-06-03T09:22:28.514Z",
"name": "65cc502a-be34-4c46-bf31-cc39fa4da2dd",
"cardNumber": "00000000000",
"identity": "00000000000"
}
}
}
Em Python
import requests
import json
# Caminho do arquivo local
file_path = "C:/caminho/para/new-year-background-736885_1280.jpg"
operations = {
"query": """
mutation upload($file: Prescription_Upload!) {
Prescription_uploadPrescription(
file: $file
uploadInfo: {
cardNumber: "00000000000"
source: POINT_OF_SALES
mime: "image/png"
}
) {
id
uploadedAt
name
cardNumber
identity
}
}
""",
"variables": {
"file": None
},
"operationName": "upload"
}
map_part = {
"uploaded_file": ["variables.file"]
}
with open(file_path, "rb") as f:
files = {
"operations": (None, json.dumps(operations), "application/json"),
"map": (None, json.dumps(map_part), "application/json"),
"uploaded_file": (file_path.split("/")[-1], f, "image/png")
}
response = requests.post("https://sua-api/graphql", files=files)
print(response.status_code)
print(response.json())
Observação
- operations - especificação do Cartão e Origem da requisição
- map - é fixo "uploaded_file":["variables.file"]
- uploaded_file - do "tipo file", onde tem como Funcionalidade pegar o arquivo digitalizado e salvo na máquina
- tamanho máximo do arquivo 2MB.
Associar Prescrição por ID retornado no ADD PRESCRIPTION
Aqui serão usado os dados gerados
- autorization e sequence vem de pre-autorização
mutation {
Prescription_bindPrescription(
prescriptionIDs: [247, 246, 245] # aqui podem ser anexadas mais de uma receita a venda
transaction: {
authorization: 53616
sequence: 53627
timestamp: "2022-01-14T16:08:09.000Z"
}
)
}
resposta
{
"data": {
"Prescription_bindPrescription": true
}
}
Consultando uma transação
Consulta a pré-autorização gerada, Resgata PreAutorizacao para seguir com a finalização
Exemplo de query
query transaction {
# Consulta os detalhes de uma transação
Sales_transaction(
# CNPJ da farmácia
storeCode: "00000000000010"
# CPF (Pharma) ou Cartão (Benefits) o envio é recomendado sendo um double check
customerCode: "00000000000"
# ID da autorização
authorizationID: "53466"
# Data da autorização (se não for de hoje)
createdAt: "2022-01-14T00:00:00.000Z"
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
status
statusCode
statusMessage
products {
ean
description
#storePrice
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
medicalPrescription {
date
quantity
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta
{
"data": {
"Sales_transaction": {
"createdAt": "2022-01-14T15:17:11.567Z",
"authorizationID": "53594",
"sequenceID": "53605",
"totalValue": 0,
"moneyPaidValue": 0,
"cardPaidValue": 0,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"products": [
{
"ean": "7896015523398",
"description": "COMBODART",
"maxConsumerPrice": 130.81,
"unitPrice": 130.81,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": null,
"medicalPrescription": {
"date": "2022-01-13",
"quantity": 1,
"prescriber": {
"council": "CRO",
"registerNumber": 12345,
"stateAbbr": "SP"
}
}
},
{
"ean": "7897337706742",
"description": "JANUVIA",
"maxConsumerPrice": 274.62,
"unitPrice": 0,
"quantity": 2000,
"status": "ERROR",
"statusCode": 72,
"statusMessage": null,
"medicalPrescription": {
"date": "2022-01-14",
"quantity": 2,
"prescriber": {
"council": "CRO",
"registerNumber": 12345,
"stateAbbr": "SP"
}
}
}
]
}
}
}
Confirmando uma autorização
Esse é o último passo para encerrar a venda da PBM, aqui nada podera ser alterado.
mutation confirmPreAuthorizedSale {
# Confirma pré-autorização e conclui venda
Sales_confirmPreAuthorizedSale(
# Cartão ou CPF
customerCode: "00000000000"
# Origem da chamada
origin: PARTNERS_ECOMMERCE
# CNPJ da farmácia
storeCode: "00000000000010"
# Código da pré-autorização
authorizationID: 57133
# Data e hora da pré-autorizaçao, retornado no campo createdAt da mutation Sales_preAuthorizeSale
preAuthorizationDate: "2022-01-14T15:22:57.000Z"
# Chave Danfe - Opcional
invoiceCode: "00000000000000000000000000000000000000000000"
# Protocolo de autenticação da Danfe - Opcional
invoiceAuthProtocol: "xxxxxxxxxxxxx"
# Produtos
products: [
{
ean: "7897337706742"
unitPrice: 45
# Opcional - PMC do produto, praticado pelo estabelecimento.
maxConsumerPrice: 45
quantity: 1
# Receita Médica
medicalPrescription: {
date: "2022-01-14"
quantity: 1
usage: CONTINUAL # uso contínuo
# Prescritor (Médico, Dentista)
prescriber: { council: CRM, registerNumber: 999999, stateAbbr: "SP" }
}
}
{
ean: "7896015523398" # COMBODART
unitPrice: 120
# Opcional - PMC do produto, praticado pelo estabelecimento.
maxConsumerPrice: 120
quantity: 1
# Receita Médica
medicalPrescription: {
date: "2022-01-13"
quantity: 1
usage: CONTINUAL # uso contínuo
# Prescritor (Médico, Dentista)
prescriber: { council: CRO, registerNumber: 12345, stateAbbr: "SP" }
}
}
]
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
cardBalance
status
statusCode
statusMessage
reimbursementValue # Valor do ressarcimento de toda a venda
receipt
products {
ean
description
#storePrice
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
reimbursementValue # Valor do ressarcimento por produto
medicalPrescription {
date
quantity
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta sucesso
{
"data": {
"Sales_confirmPreAuthorizedSale": {
"createdAt": "2022-02-07T12:33:11.000Z",
"authorizationID": "57134",
"sequenceID": "57145",
"totalValue": 364.89,
"moneyPaidValue": 0,
"cardPaidValue": 364.89,
"cardBalance": 99634.11,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"reimbursementValue": null,
"receipt": " Cartao: 60100022100000116@ Plano:Funcional Card@ CNPJ:03322366000175@
Data: 07/02/2022 Hora: 12:33:11@ Seq: 00057144 Aut: 00057134@ Cod Acesso: 00000010@
11004 - COMPRA MEDIC.INF. FARMACO@ TOTAL COMPRA: 405.43@ DESCONTO: 40.54 10 %
@ TOTAL A PAGAR: 364.89@ TOTAL A PAGAR A VISTA: 0.00@ TOTAL A PAGAR NO CARTAO: 364.89
@@ RECONHECO A DIVIDA E AUTORIZO O @ DESCONTO DO VALOR NA FORMA PREVISTA@@@ -------------------------------- @
Assinatura@@ RG------------------------------@ O VALOR DE R$ 364.89 SERA PAGO A TESTE @ FUNCIONAL POR FUNCIONAL CARD",
"products": [
{
"ean": "7897337706742",
"description": "JANUVIA 27462",
"maxConsumerPrice": 274.62,
"unitPrice": 247.16,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"reimbursementValue": null,
"medicalPrescription": {
"date": "2022-01-14T00:00:00.000Z",
"quantity": 1,
"prescriber": {
"council": "CRM",
"registerNumber": 999999,
"stateAbbr": "SP"
}
}
},
{
"ean": "7896015523398",
"description": "COMBODART 13081",
"maxConsumerPrice": 130.81,
"unitPrice": 117.73,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"reimbursementValue": null,
"medicalPrescription": {
"date": "2022-01-13T00:00:00.000Z",
"quantity": 1,
"prescriber": {
"council": "CRO",
"registerNumber": 12345,
"stateAbbr": "SP"
}
}
}
]
}
}
}
exemplo de erro
{
"data": {
"Sales_confirmPreAuthorizedSale": {
"createdAt": "2022-01-14T16:08:09.000Z",
"authorizationID": "53616",
"sequenceID": "53627",
"totalValue": null,
"moneyPaidValue": null,
"cardPaidValue": null,
"cardBalance": 0,
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Pre-Autorizacao nao encontrada!",
"products": []
}
}
}
Teste de Cadastro (HOMOLOGAÇÃO)
- Verificar Elegibilidade
query Pharma_assessEligibility {
Pharma_assessEligibility(
origin: POINT_OF_SALES
storeCode: "00000000000010"
productCode: "7897337706339"
customerCode: "23225452017"
) {
validationResult {
status
message
}
eligibilityAssessment {
belongsToIndustryProgram
programDescription
programCode
productDescription
}
registrationPolicy {
allowDependents
dependentsLimit
requiresBeneficiaryRegistration
requiresMedicalPrescriptionRegistration
requiresAtLeastOneContactMedium
requiresMedicalPrescriber
allowedOrigins
}
dependents {
id
name
birth
gender
holder
}
}
}
resposta
{
"data": {
"Pharma_assessEligibility": {
"validationResult": {
"status": "SUCCESS",
"message": null
},
"eligibilityAssessment": {
"belongsToIndustryProgram": true,
"programDescription": "PROGRAMA RECEITA DE VIDA - MSD",
"programCode": "6",
"productDescription": "JANUMET"
},
"registrationPolicy": {
"allowDependents": false,
"dependentsLimit": 0,
"requiresBeneficiaryRegistration": true,
"requiresMedicalPrescriptionRegistration": true,
"requiresAtLeastOneContactMedium": false,
"requiresMedicalPrescriber": false,
"allowedOrigins": [
"POINT_OF_SALES",
"INDUSTRY_PROGRAM_WEBSITE",
"CALL_CENTER",
"INTERACTIVE_VOICE_RESPONSE",
"PURCHASE",
"MOBILE_APP",
"PARTNERS_ECOMMERCE"
]
},
"dependents": []
}
}
}
- Cadastrar Beneficiário
mutation Pharma_signUpProgramBeneficiary {
Pharma_signUpProgramBeneficiary(
input: {
origin: POINT_OF_SALES
storeCode: "00000000000010"
customerCode: "23225452017"
productCode: "7897337706339"
programCode: "6"
beneficiaryFields: [
{ text: "Nome", value: "João Arlindo Mahoa Benedito" }
{ text: "Nascimento", value: "1984-06-05 12:00:00" }
{ text: "Sexo", value: "M" }
{ text: "Email", value: "jao@gmail.com" }
{ text: "Telefone", value: "41997126445" }
{ text: "TelefoneCelular", value: "41997126445" }
]
medicalPrescriptionFields: [
{ text: "NumeroRegistroConselho", value: "123456" }
{ text: "UF", value: "SP" }
{ text: "CRM", value: "999999" }
]
dependentFields: null
extraFields: null
extraFormFields: null
}
) {
status
message
errors {
message
}
}
}
resposta
{
"data": {
"Pharma_signUpProgramBeneficiary": {
"status": "SUCCESS",
"message": "Beneficiario cadastrado com sucesso",
"errors": []
}
}
}
- Adicionar Beneficiario ao Produto
mutation {
Pharma_addProgramBeneficiaryToProduct(
input: {
origin: POINT_OF_SALES
programCode: "6"
storeCode: "00000000000010"
customerCode: "23225452017"
productCode: "7897337706339"
dependentID: null
medicalPrescriptionFields: [
{ text: "NumeroRegistroConselho", value: "123456" }
{ text: "UF", value: "SP" }
{ text: "CRM", value: "999999" }
]
}
) {
status
message
errors {
message
}
}
}
resposta
{
"data": {
"Pharma_addProgramBeneficiaryToProduct": {
"status": "ERROR",
"message": null,
"errors": [
{
"message": "Usuário já cadastrado no produto, consulte novamente"
}
]
}
}
}
Teste de Venda
- Checkando Preço
query {
Pharma_checkPricesAndRules(
origin: POINT_OF_SALES
storeCode: "00000000000010"
customerCode: "23225452017"
products: [
{
ean: "7897337706339"
price: 222.99
saleAmount: 1
medicalPrescription: {
quantity: 1
date: "2025-05-28"
prescriber: { council: CRM, stateAbbr: "SP", registerNumber: 999999 }
}
}
]
) {
aproved
createdAt
totalValue
moneyPaidValue
cardPaidValue
totalValueMaxConsumerPrice
totalValueWithPrescription
totalValueWithoutPrescription
totalDiscountAmount
requiredUploadWithPrescription
products {
transactionType
ean
description
maximumConsumerPrice
priceReceived
funcionalPrice
salePrice
saleAmount
status {
aproved
message
}
medicalPrescription {
quantity
date
prescriber {
council
stateAbbr
registerNumber
}
dailyDose # o parâmetro deve ser declarado na pré-autorização, após validação se retornado true no requiredInformDailyDose
requiredInformDailyDose # o mesmo valida se é obrigatório o envio do parâmetro "dailyDose"
}
}
}
}
resposta
{
"data": {
"Pharma_checkPricesAndRules": {
"aproved": true,
"createdAt": "2025-05-28T14:17:15.000Z",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"totalValueMaxConsumerPrice": 316.92,
"totalValueWithPrescription": 0,
"totalValueWithoutPrescription": 221.84,
"totalDiscountAmount": 95.08,
"requiredUploadWithPrescription": false,
"products": [
{
"transactionType": "PHARMA",
"ean": "7897337706339",
"description": "JANUMET 50 mg + 850 mg emb. c/ 56",
"maximumConsumerPrice": 316.92,
"priceReceived": 222.99,
"funcionalPrice": 221.84,
"salePrice": 221.84,
"saleAmount": 1,
"status": {
"aproved": true,
"message": ""
},
"medicalPrescription": {
"quantity": 1,
"date": "2025-05-28T14:17:15.000Z",
"prescriber": {
"council": "CRM",
"stateAbbr": "00",
"registerNumber": 0
},
"dailyDose": null,
"requiredInformDailyDose": false
}
}
]
}
}
}
- Pre-autorizando Venda
mutation preAuthorizeSale {
Sales_preAuthorizeSale(
# Canal PHARMA ou BENEFITS
channel: PHARMA
origin: POINT_OF_SALES
customerCode: "23225452017"
storeCode: "00000000000010"
products: [
{
ean: "7897337706339"
unitPrice: 222.99
maxConsumerPrice: 316.92
quantity: 1
medicalPrescription: {
date: "2025-05-28"
quantity: 1
usage: CONTINUAL
prescriber: { council: CRM, registerNumber: 999999, stateAbbr: "SP" }
}
}
]
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
status
statusCode
statusMessage
# Se exige um token gerado no app de celular
secondFactorAuthentication
products {
ean
description
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
medicalPrescription {
date
quantity
# quando necessário a declaração de acordo a validação de regra, é importante pedir o retorno para ser especificado no próximo passo que é a confirmação.
dailyDose
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta - 200 OK
{
"data": {
"Sales_preAuthorizeSale": {
"createdAt": "2025-06-02T16:43:38.000Z",
"authorizationID": "143788",
"sequenceID": "143799",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "Desconto calculado com sucesso!",
"secondFactorAuthentication": "NONE",
"products": [
{
"ean": "7897337706339",
"description": "JANUMET",
"maxConsumerPrice": 316.92,
"unitPrice": 221.84,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "Desconto Por Mes de Tratamento",
"medicalPrescription": {
"date": "2025-05-28",
"quantity": 1,
"dailyDose": null,
"prescriber": {
"council": "CRM",
"registerNumber": 999999,
"stateAbbr": "SP"
}
}
}
]
}
}
}
- Fazendo upload de receita
Requisição POST Headers - Key - Content-Type - Value - multipart/form-data Body - form-data Key - operations - Text - Value
{
"query": "mutation upload($file: Prescription_Upload!) {\n Prescription_uploadPrescription(\n file: $file\n uploadInfo: {\n cardNumber: \"00000000000\"\n source: POINT_OF_SALES\n mime: \"image/png\"\n }\n ) {\n id\n uploadedAt\n name\n cardNumber\n identity\n }\n}",
"variables": {
"file": null
},
"operationName": "upload"
}
- Key - map - Text - Value
{
"uploaded_file": ["variables.file"]
}
- Key - uploaded_file - File (selecione o arquivo)
resposta
{
"data": {
"Prescription_uploadPrescription": {
"id": "165651",
"uploadedAt": "2025-06-03T09:22:28.514Z",
"name": "65cc502a-be34-4c46-bf31-cc39fa4da2dd",
"cardNumber": "00000000000",
"identity": "00000000000"
}
}
}
Anexando prescrição criada
mutation Prescription_bindPrescription {
Prescription_bindPrescription(
prescriptionIDs: 165649
transaction: {
authorization: 143815
sequence: 143826
timestamp: "2025-06-03T09:22:28.514Z"
}
)
}
resposta
{
"data": {
"Prescription_bindPrescription": true
}
}
Consulta de pre-autorização
query transaction {
Sales_transaction(
storeCode: "00000000000010"
customerCode: "23225452017"
authorizationID: "143815"
createdAt: "2025-06-03T09:22:28.514Z"
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
status
statusCode
statusMessage
products {
ean
description
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
medicalPrescription {
date
quantity
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta
{
"data": {
"Sales_transaction": {
"createdAt": "2025-06-03T10:24:06.000Z",
"authorizationID": "143815",
"sequenceID": "143826",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"products": [
{
"ean": "7897337706339",
"description": "JANUMET",
"maxConsumerPrice": 316.92,
"unitPrice": 221.84,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": null,
"medicalPrescription": {
"date": "2025-05-28",
"quantity": 1,
"prescriber": {
"council": "CRM",
"registerNumber": 999999,
"stateAbbr": "SP"
}
}
}
]
}
}
}
Confirmar autorização
mutation confirmPreAuthorizedSale {
Sales_confirmPreAuthorizedSale(
customerCode: "23225452017"
origin: POINT_OF_SALES
storeCode: "00000000000010"
authorizationID: 143788
preAuthorizationDate: "2025-06-03T09:22:28.514Z"
products: [
{
ean: "7897337706339"
unitPrice: 221.84
maxConsumerPrice: 316.92
quantity: 1
medicalPrescription: {
date: "2025-05-28"
quantity: 1
usage: null
prescriber: { council: CRM, registerNumber: 999999, stateAbbr: "SP" }
}
}
]
) {
createdAt
authorizationID
sequenceID
totalValue
moneyPaidValue
cardPaidValue
cardBalance
status
statusCode
statusMessage
reimbursementValue # Valor do ressarcimento de toda a venda
receipt
products {
ean
description
#storePrice
maxConsumerPrice
unitPrice
quantity
status
statusCode
statusMessage
reimbursementValue # Valor do ressarcimento por produto
medicalPrescription {
date
quantity
prescriber {
council
registerNumber
stateAbbr
}
}
}
}
}
resposta
{
"data": {
"Sales_confirmPreAuthorizedSale": {
"createdAt": "2025-06-03T10:39:37.000Z",
"authorizationID": "143816",
"sequenceID": "143827",
"totalValue": 221.84,
"moneyPaidValue": 221.84,
"cardPaidValue": 0,
"cardBalance": 0,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"reimbursementValue": null,
"receipt": " Cartao: 2322*****17@ Plano:Funcional Card@ CNPJ:03322366000175@ Data: 03/06/2025 Hora: 10:39:43@ Seq: 00143799 Aut: 00143816@ Cod Acesso: 00000010@ 11004 - COMPRA MEDIC.INF. FARMACO@ TOTAL COMPRA: 316.92@ DESCONTO: 95.08 30 %@ TOTAL A PAGAR: 221.84@ TOTAL A PAGAR A VISTA: 221.84@ TOTAL A PAGAR NO CARTAO: 0.00",
"products": [
{
"ean": "7897337706339",
"description": "JANUMET ",
"maxConsumerPrice": 316.92,
"unitPrice": 221.84,
"quantity": 1,
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "",
"reimbursementValue": null,
"medicalPrescription": {
"date": "2025-05-28",
"quantity": 1,
"prescriber": {
"council": "CRM",
"registerNumber": 999999,
"stateAbbr": "SP"
}
}
}
]
}
}
}