
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" } } } ] } } }