O processo de integração do módulo Inspeção de Processos (SIGAQIP) do ERP TOTVS Protheus com o App Mobile Minha Produção se dá através do uso de API's REST. A TOTVS disponibiliza o uso destas API's para clientes que desejaram realizar diretamente a integração com o processo de inspeção. A seguir, apresentamos um resumo detalhando as APIs e os EndPoint disponibilizados, demonstração de configuração do servidor REST Full no AppServer.INI do servidor de aplicação do Protheus, utilização de Postman com GET e POST para conhecimento dos EndPoints e implementação de exemplo de código ADVPL para Cliente REST.
Informações |
---|
title | Pré-Requisitos Uso de API's |
---|
| - Configuração do servidor REST no ambiente, seguir instruções da documentação oficial: 1. Configuração do REST do Protheus;
- Atualização do RPO com versão da expedição contínua igual ou superior a: DMANQUALI-4478;
- Utilização dos métodos GET e POST conforme especificação padrão "TOTVS - RESTFul API" e exemplos a seguir;
|
Deck of Cards |
---|
history | false |
---|
id | Detalhamento_APIs |
---|
effectType | fade |
---|
| Card |
---|
id | Lista_APIs |
---|
label | Lista de API's e Endpoints Disponíveis |
---|
title | Lista de API's e Endpoints Disponíveis |
---|
| A seguir são listadas as API's disponibilizadas, detalhamentos de seus endpoints e mapa de campos relacionados. Deck of Cards |
---|
history | false |
---|
id | Principais_Campos |
---|
effectType | fade |
---|
| Card |
---|
id | API_1 |
---|
label | Inspeções de Processos por Operação |
---|
title | Inspeções de Processos por Operação |
---|
| - TOTVS - RESTFul API:
- Métodos:
- GET: Retorna Lista Inspeções de Processos Pendentes:
- Endpoint: processinspections/api/qip/v1/pendinglist/{Login}/{Order}/{OrderType}/{Page}/{PageSize}
- Objetivo: permitir a consulta das inspeções de processos pendentes a nível de ordem de produção + operação;
- PathParam:
- Login: referência de login do usuário do configurador Protheus em QAA_LOGIN (obrigatório). Ex: ADMINISTRADOR;
- Order: referência de campos para ordenação dos resultados. Ex: "productionOrderID,operationID,lot";
- OrderType: referência de ordenação dos resultados, Ex 1: vazio ou "ASC" para crescente. Ex 2: "DESC" para decrescente.
- Page: número de página atual da paginação de resultados; Ex: 1.
- PageSize: tamanho da página considerado na paginação de resultados; Ex: 5;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: vazio = todos;
- GET: Pesquisa Inspeção:
- Endpoint: processinspectionsapi/qip/v1/search/{Login}/{Text}/{Order}/{OrderType}/{Page}/{PageSize}
- Objetivo: permitir a pesquisa por Produto ou OP das inspeções de processos a nível de ordem de produção + operação;
- PathParam:
- Text: texto para pesquisa por OP ou produto;
- Demais conforme anterior;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: todos;
- GET: Existe Usuário:
- Endpoint: processinspectionsapiapi/qip/v1/userExist/{Login}
- Objetivo: permitir identificar se o usuário possui cadastro no módulo inspeção de processos;
- PathParam:
- Login: referência de login do usuário do configurador Protheus em QAA_LOGIN (obrigatório). Ex: ADMINISTRADOR;
Mapa de Campos Padrões: Descrição | Código API | Referência Protheus | Tipo | Opções |
---|
Código do Produto | productID | QPK_PRODUT | C |
| Descrição do Produto | product | B1_DESC | C |
| Ordem de Produção | productionOrderID | QPK_OP | C |
| Código da Operação | operationID | QQK_OPERAC | C |
| Descrição da Operação | operation | QQK_DESCRI | C |
| Recurso | resource | H1_DESCRI | C |
| Quantidade | lotSize | QPK_TAMLOT | N |
| Código Unidade Medida | lotUnitID | QPK_UM | C |
| Unidade de Medida | lotUnit | AH_DESCPO | C |
| Lote | lot | QPK_LOTE | C |
| Número de Série | serialNumber | QPK_NUMSER | C |
| Data de Emissão | date | QPK_EMISSA | D |
| Cliente e Loja | customer | A1_COD + A1_LOJA + A1_NOME | C |
| Versão da Especificação | specificationVersion | QPK_REVI | C |
| Data da Produção | productionDate | QPK_DTPROD | D |
| Usuário Permitido | allowedUser | Referência existente de cLogin = QAA_LOGIN → true== cLogin | L | true = Usuário Permitido false = Usuário Não PermitidoL | Status | status | Regra de Negócio Interna | C | N = Não Iniciado I = Iniciado A = Aprovado R = Rejeitado U = Liberação Urgente C = Liberação Condicional | Recno Inspeção | recno | QQK.R_E_C_N_O_ | N |
|
|
Card |
---|
id | API_2 |
---|
label | Ensaios |
---|
title | Ensaios |
---|
| - TOTVS - RESTFul API:
- Métodos:
- GET: Retorna Lista de Ensaios das Inspeções de Processos:
- Endpoint: processinspectiontestapi/qip/v1/list/{Recno}/{Order}/{OrderType}/{Page}/{PageSize}
- Objetivo: permitir a consulta dos ensaios das inspeções de processos;
- PathParam:
- Recno: recno da inspeção - QPK.R_E_C_N_O_;
- Order: referência de campos para ordenação dos resultados. Ex: "title,laboratory";
- OrderType: referência de ordenação dos resultados, Ex 1: vazio ou "ASC" para crescente. Ex 2: "DESC" para decrescente.
- Page: número de página atual da paginação de resultados; Ex: 1.
- PageSize: tamanho da página considerado na paginação de resultados; Ex: 5;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: vazio = todos;
Mapa de Campos Padrões:
Descrição | Código API | Referência Protheus | Tipo | Opções |
---|
RECNO Inspeção | recnoInspection | QPK.R_E_C_N_O_ | N |
| RECNO Ensaio | recnoTest | QP7.R_E_C_N_O_ ou QP8.R_E_C_N_O_ | N |
| Código do Ensaio | testID | QP7_ENSAIO ou QP8_ENSAIO | C |
| Sequência do Laboratório | sequence | QP7_SEQLAB ou QP8_SEQLAB | N |
| Título do Ensaio | title | QP1_DESCPO | C |
| Quantidade de Medições | numberOfMensurements | QP1_QTDE* | N |
| Laboratório | laboratory | X5_DESCRI para X5_TABELA = 'Q2' | C |
| Especificação Resumida | summarySpecification | QP7_NOMINA QP7_LIE / QP7_LSE Ou QP8_TEXTO | C |
| Código Unidade de Medida | lotUnitID | QP7_UNIMED | C |
| Tipo de Controle | controlType | QP7_MINMAX | C |
| Limite Inferior Engenharia | lowerDeviation | QP7_LIE | C |
| Limite Superior Engenharia | upperDeviation | QP7_LSE | C |
| Tipo do Ensaio | testType | QP7 = Tabela de Ensaios Mensuráveis Produtos QP8 = Tabela de Ensaios Textos dos Produtos | C | N = Numérico T = Texto | Status: | status | Regra de Negócio Interna | C | A = Aprovado R = Reprovado P = Pendente N = Não Obrigatório |
|
Card |
---|
id | API_3 |
---|
label | Resultados das Inspeções |
---|
title | Resultados das Inspeções |
---|
| - TOTVS - RESTFul API:
- Métodos:
- GET: Retorna Resultado(s) da Inspeção de Processos:
- Endpoint: processinspectiontestresultsapi/api/qip/v1/result/{RecnoQPK}/{RecnosQPR}/{Order}/{Page}/{PageSize}
- Objetivo: permitir a consulta de uma relação específica de resultados de inspeção com base no RECNO da inspeção (RecnoQPK) e em lista de RECNOS das amostras (RecnosQPR);
- PathParam:
- RecnoQPK: recno da inspeção - QPK.R_E_C_N_O_ (obrigatório);
- RecnosQPR: recnos das amostras separados por ponto e virgula - QPR.R_E_C_N_O_;
- Order: referência de campos para ordenação dos resultados. Ex: "productionOrderID,operationID";
- OrderType: referência de ordenação dos resultados, Ex 1: vazio ou "ASC" para crescente. Ex 2: "DESC" para decrescente.
- Page: número de página atual da paginação de resultados; Ex: 1.
- PageSize: tamanho da página considerado na paginação de resultados; Ex: 5;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: vazio = todos;
- GET: Retorna Histórico de Resultados por Ensaio:
- Endpoint: processinspectiontestresultsapi/api/qip/v1/testhistory/{RecnoQPK}/{IDTest}/{Order}/{Page}/{PageSize}
- Objetivo: permitir a consulta do histórico de resultados de um ensaio específico com base no RECNO de uma inspeção (RecnoQPK) e no ID de um ensaio (IDTest, QP7_ENSAIO ou QP8_ENSAIO);
- PathParam:
- RecnoQPK: recno da inspeção - QPK.R_E_C_N_O_ (obrigatório);
- IDTest: código do ensaio relacionado QP7_ENSAIO ou QP8_ENSAIO (obrigatório);
- Demais conforme anterior;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: vazio = todos;
- GET: Retorna Histórico de Resultados da Inspeção de Processos:
- Endpoint: processinspectiontestresultsapi/api/qip/v1/history/{RecnoQPK}/{Order}/{Page}/{PageSize}
- Objetivo: permitir a consulta do histórico de resultados completo da inspeção de processos com base no RECNO de uma inspeção (RecnoQPK);
- PathParam:
- RecnoQPK: recno da inspeção - QPK.R_E_C_N_O_ (obrigatório);
- Demais conforme anterior;
- QueryParam:
- Fields: referência de "Código API" para os campos que devem ser retornados. Default: vazio = todos;
- POST: Salva Resultado(s):
- Endpoint: processinspectiontestresultsapi/api/qip/v1/save
- Objetivo: permitir salvar resultados de inspeção;
- QueryParam:
- items: array com relação de objetos json com os campos padrões a seguir:
- recnoInspection: RECNO da inspeção QPK.R_E_C_N_O_ (Obrigatório);
- recnoTest: RECNO do ensaio relacionado - QP7.R_E_C_N_O_ ou QP8.R_E_C_N_O_ (Obrigatório);
- measurementDate: data da amostra (facultativo);
- Ao não enviar o sistema considerará a data do recebimento da mensagem;
- measurementTime: hora da amostra (facultativo);
- Ao não enviar o sistema considerará a data do recebimento da mensagem;
- testType: tipo do resultado de ensaio (Obrigatório):
- QP7 → N → Numérico;
- QP8 → T → Texto;
- measurements: array com string de medições da amostra (Obrigatório quando testType = N);
- textStatus: status da amostra (Obrigatório):
- A = Aprovado;
- R = Reprovado;
- textDetail: justificativa de medições do tipo texto reprovadas(Obrigatório quando testType = N e textStatus = R);
- protheusLogin: login do usuário do Protheus (Obrigatório);
- recno: RECNO da amostra - QPR.R_E_C_N_O_ (facultativo)
- 0 → incluirá nova amostra;
- informado → editará uma amostra existente;
Mapa de Campos Padrões: Descrição | Código API | Referência Protheus | Tipo | Opções |
---|
RECNO Inspeção | recnoInspection | QPK.R_E_C_N_O_ | N |
| RECNO Ensaio | recnoTest | QP7.R_E_C_N_O_ ou QP8.R_E_C_N_O_ | N |
| Data da Amostra | measurementDate | QPR_DTMEDI | D |
| Hora da Amostra | measurementTime | QPR_HRMEDI | H |
| Código do Ensaiador | rehearserID | QPR_ENSR | C |
| Ensaiador | rehearser | QAA_NOME | C |
| Tipo do Ensaio | testType | QP7 = Tabela de Ensaios Mensuráveis Produtos QP8 = Tabela de Ensaios Textos dos Produtos | C | N = Numérico T = Texto | Array de Medições | measurements | String com array de medições: QPS_MEDICA | C |
| Status da Amostra | textStatus | QPR_RESULT | C | A = Aprovado R = Reprovado | Justificativa Reprovação | textDetail | QPQ_MEDICA | C |
| Usuário Protheus | protheusLogin | QAA_LOGIN | C |
| RECNO Amostra | recno | QPR.R_E_C_N_O_ | N |
|
|
|
|
Card |
---|
id | AppServer.INI |
---|
label | AppServer.INI |
---|
title | AppServer.INI |
---|
| Segue abaixo demonstração de código para configuração de servidor REST Full no AppServer.ini do servidor de aplicação do ERP TOTVS Protheus: Bloco de código |
---|
language | text |
---|
title | Amostra de Configuração REST no AppServer.INI |
---|
| ;CONFIGURACAO REST
[ONSTART]
JOBS=HTTPJOB1
REFRESHRATE=120
[HTTPJOB1]
MAIN=HTTP_START
ENVIRONMENT=V12_1_33_compila
[HTTPV11]
Enable=1
Sockets=HTTPREST1
[HTTPREST1]
Port=5050
IPsBind=
URIs=HTTPURI1
Security=1
[HTTPURI1]
URL=/rest
PrepareIn=ALL
Instances=1,1,1,1
CORSEnable=1
AllowOrigin=*
; FIM CONFIGURACAO REST |
|
Card |
---|
id | GET Postman |
---|
label | GET Postman |
---|
title | GET Postman |
---|
| Segue abaixo demonstração da execução de um método GET via Postman: 1. Crie uma nova aba, selecione a operação GET e o endpoint desejado, por exemplo: http://localhost:5050/rest/processinspectiontestresults/api/qip/v1/history; 2. Configure o modo de autorização na aba "Authorization" com o usuário e senha de acesso ao ERP TOTVS Protheus; 3. Informe os parâmetros desejados na aba "Params"; 4. Envie a requisição clicando em "SEND";
Bloco de código |
---|
language | text |
---|
title | Exemplo de resposta |
---|
collapse | true |
---|
| {
"items": [
{
"recnoInspection": 134,
"recnoTest": 166,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "N",
"measurements": [
" 10"
],
"textStatus": "A",
"textDetail": null,
"protheusLogin": "ADMINISTRADOR",
"recno": 334
},
{
"recnoInspection": 134,
"recnoTest": 165,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "N",
"measurements": [
" 19.00"
],
"textStatus": "A",
"textDetail": null,
"protheusLogin": "ADMINISTRADOR",
"recno": 335
},
{
"recnoInspection": 134,
"recnoTest": 14,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "T",
"measurements": [],
"textStatus": "A",
"textDetail": "BOA",
"protheusLogin": "ADMINISTRADOR",
"recno": 336
}
],
"hasNext": false,
"code": 200
} |
|
Card |
---|
id | POST Postman |
---|
label | POST Postman |
---|
title | POST Postman |
---|
| Segue abaixo demonstração da execução de um método POST via Postman: 1. Crie uma nova aba, selecione a operação POST e o endpoint desejado, por exemplo: http://localhost:5050/rest/processinspectiontestresults/api/qip/v1/save; 2. Configure o modo de autorização na aba "Authorization" com o usuário e senha de acesso ao ERP TOTVS Protheus;
3. Informe os itens para inclusão na aba "Body" conforme os dados de recno, rehearser e testType de sua base: (Em caso de dúvidas, consulte acima "Lista de API's e Endpoints Disponíveis + Resultados das Inspeções")
Bloco de código |
---|
language | text |
---|
title | Exemplo de conteúdo para Body |
---|
collapse | true |
---|
| {
"items": [
{
"recnoInspection": 134,
"recnoTest": 165,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "N",
"measurements": [
" 19.00"
],
"textStatus": "A",
"textDetail": null,
"protheusLogin": "ADMINISTRADOR",
"recno": 335
},
{
"recnoInspection": 134,
"recnoTest": 14,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "T",
"measurements": [],
"textStatus": "A",
"textDetail": "BOA",
"protheusLogin": "ADMINISTRADOR",
"recno": 336
}]
} |
Bloco de código |
---|
language | text |
---|
title | Exemplo de resposta |
---|
collapse | true |
---|
| {
"items": [
{
"recnoInspection": 134,
"recnoTest": 14,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "T",
"measurements": [],
"textStatus": "A",
"textDetail": "BOA",
"protheusLogin": "ADMINISTRADOR",
"recno": 336
},
{
"recnoInspection": 134,
"recnoTest": 165,
"measurementDate": "2022-08-09",
"measurementTime": "11:31",
"rehearserID": "001",
"rehearser": "NOME DO ENSAIADOR",
"testType": "N",
"measurements": [
" 19.00"
],
"textStatus": "A",
"textDetail": null,
"protheusLogin": "ADMINISTRADOR",
"recno": 335
}
],
"hasNext": false,
"code": 200
} |
|
Card |
---|
id | Código: GET REST Client em ADVPL |
---|
label | Código: GET REST Client em ADVPL |
---|
title | Código: GET REST Client em ADVPL |
---|
| Você pode desenvolver uma customização usando a classe FWRest, documentada em: https://tdn.totvs.com/display/public/framework/FWRest Segue abaixo exemplo de código ADVPL com GET Rest Client para API de Inspeções de Processos: Bloco de código |
---|
language | text |
---|
title | Código Exemplo - ADVPL FWRest GET |
---|
| #INCLUDE "TOTVS.CH"
User Function tstMAIN()
RPCSetType(3)
lRet := RpcSetEnv("99", "01")
U_tstAPIGET()
RpcClearEnv()
Return
User Function tstAPIGET()
Local aHeaderWS as array
Local cLogin as string
Local cPassword as string
Local cPathParams as string
Local oRestClient as object
//Local oResult as object
cLogin := "ADMIN"
cPassword := "1234"
aHeaderWS := {}
AAdd(aHeaderWS, {"Content-Type: application/json"})
AAdd(aHeaderWS, "Authorization: Basic " + Encode64(cLogin+":"+cPassword))
oRestClient := FWRest():New("http://localhost:5050/rest")
cPathParams := ""
cPathParams += "RecnoQPK=134"
cPathParams += "&Order=recno"
cPathParams += "&Page=1"
cPathParams += "&PageSize=9"
oRestClient:SetPath("/processinspectiontestresults/api/qip/v1/history/")
oRestClient:SetGetParams(cPathParams)
If oRestClient:Get(aHeaderWS)
ConOut(oRestClient:GetResult())
//oResult := JsonObject():New()
//oResult:fromJson(oRestClient:GetResult())
//oResult['items'] //Relação de Resultados
Else
ConOut(oRestClient:GetLastError())
EndIf
Return
|
|
Card |
---|
id | Código: POST REST Client em ADVPL |
---|
label | Código: POST REST Client em ADVPL |
---|
title | Código: POST REST Client em ADVPL |
---|
| Você pode desenvolver uma customização usando a classe FWRest, documentada em: https://tdn.totvs.com/display/public/framework/FWRest Segue abaixo exemplo de código ADVPL com POST Rest Client para API de Resultados Inspeções de Processos: Bloco de código |
---|
language | text |
---|
title | Código Exemplo - ADVPL FWRest POST |
---|
| User Function tstMAIN()
RPCSetType(3)
lRet := RpcSetEnv("99", "01")
U_tstAPIPOST()
RpcClearEnv()
Return
User Function tstAPIPOST()
Local aHeaderWS as array
Local cBody as string
Local cLogin as string
Local cPassword as string
Local oBody as object
Local oNumeric as object
Local oRestClient as object
Local oText as object
cLogin := "ADMIN"
cPassword := "1234"
aHeaderWS := {}
AAdd(aHeaderWS, {"Content-Type: application/json"})
AAdd(aHeaderWS, "Authorization: Basic " + Encode64(cLogin+":"+cPassword))
oBody := JsonObject():New()
oBody['items'] := {}
oNumeric := JsonObject():New()
oNumeric["recnoInspection"] := 134
oNumeric["recnoTest"] := 165
oNumeric["measurementDate"] := "2022-08-09"
oNumeric["measurementTime"] := "11:31"
oNumeric["rehearserID"] := "001"
oNumeric["rehearser"] := "NOME DO ENSAIADOR"
oNumeric["testType"] := "N"
oNumeric["measurements"] := {}
aAdd(oNumeric["measurements"], " 19.00")
oNumeric["textStatus"] := "A"
oNumeric["textDetail"] := nil
oNumeric["protheusLogin"] := "ADMINISTRADOR"
oNumeric["recno"] := 335 //Para editar um resultado
//oNumeric["recno"] := 0 //Para incluir um novo resultado
aAdd(oBody['items'], oNumeric)
oText := JsonObject():New()
oText["recnoInspection"] := 134
oText["recnoTest"] := 14
oText["measurementDate"] := "2022-08-09"
oText["measurementTime"] := "11:31"
oText["rehearserID"] := "001"
oText["rehearser"] := "NOME DO ENSAIADOR"
oText["testType"] := "T"
oText["measurements"] := nil
oText["textStatus"] := "A"
oText["textDetail"] := "BOA"
oText["protheusLogin"] := "ADMINISTRADOR"
oText["recno"] := 336
//oText["recno"] := 0 //Para incluir um novo resultado
aAdd(oBody['items'], oText)
cBody := oBody:toJson()
oRestClient := FWRest():New("http://localhost:5050/rest")
oRestClient:SetPath("/processinspectiontestresults/api/qip/v1/save")
oRestClient:SetPostParams(cBody)
If oRestClient:Post(aHeaderWS)
Conout(oRestClient:GetResult())
Else
Conout(oRestClient:GetLastError())
EndIf
Return
|
|
|
|