Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Manufatura

Linha de Produto:

TOTVS Protheus

Segmento:

Manufatura

Módulo:SIGAQIP - Inspeção de Processos
Função:

QIPA215

País:Todos
Ticket:Interno.
Issue:DMANQUALI-4018 - DMANQUALI-4686 - DMANQUALI-4478

02. SITUAÇÃO/REQUISITO

Criar uma nova interface para Inspeção de Processo, simplificada para facilitar a entrada de Medições.

03. SOLUÇÃO

Projeto em desenvolvimento, abaixo informações sobre requisitos e disponibilização das API's.

04. DEMAIS INFORMAÇÕES

    1. Módulo Inspeção de Processos (SIGAQIP) Implantado;
    2. Build, RPO e LIB atualizados para versão mais recente no release 12.1.33;
    3. Servidor REST habilitado no AppServer do ambiente;
    4. Host configurado no Mingle;
    5. Versão mais recente do APP Minha Produção instalada no dispositivo;

    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 desejam customizar a integração com o processo de inspeção. 

    A seguir, apresentamos um resumo detalhando as APIs e os EndPoints disponibilizados, demonstração de configuração do servidor RESTFul 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 Client REST.




    Pré-Requisitos Uso de API's

    1. Configuração do servidor REST no ambiente, seguir instruções da documentação oficial: Configuração do REST do Protheus;
    2. Atualização do RPO com última versão publicada disponível em: Pacotes - APP Inspeção de Processos - P12
    3. Utilização dos métodos GET e POST conforme especificação padrão "TOTVS - RESTFul API" e exemplos a seguir;

      A seguir são listadas as API's disponibilizadas, detalhamentos de seus endpoints e mapa de campos relacionados.

        • TOTVS - RESTFul API:
        • Métodos:
          • GET: Retorna Lista Inspeções de Processos Pendentes:
            • Endpoint: processinspections/api/qip/v1/pendinglist/{Login}/{Laboratory}/{Order}/{OrderType}/{Page}/{PageSize}/{NotStarted}/{WithoutReport}/{IncompleteReport}
            • 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;
              • Laboratory: laboratório para filtro da inspeção de processos. Ex: "LABFIS", "" para todos;
              • 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;
              • NotStarted: indicador se deve filtrar somente as inspeções não iniciadas; Ex: false (boolean);
              • WithoutReport: indicador se deve filtrar somente as inspeções sem laudo; Ex: false (boolean);
              • IncompleteReport: indicador se deve filtrar somente as inspeções incompletas; Ex: false (boolean);
            • 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}/{Laboratory}/{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: Retorna Uma Inspeção de Processos:
            • Endpoint: processinspectionsapi/qip/v1/inspection/{Login}/{Laboratory}/{Recno}/{OperationID}
            • Objetivo: permitir a consulta de uma inspeção de processo 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;
              • Recno: RECNO do registro na tabela de inspelção QPK;
              • OperationID: operação relacionada a inspeção. Ex: "01", "" para todas;
            • 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 do Roteiro operationRoutines QQK_CODIGO 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 QAA_LOGIN == cLogin L true = Usuário Permitido
        false = Usuário Não Permitido
        Laudo de Operação operationReport QPM_LAUDO C

        A = Aprovado
        R = Reprovado
        U = Liberação Urgente
        C = Liberação Condicional
        Vazio ou NULL = Pendente

        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
        Laudo Incompleto incompleteReport
        C

        "true" = possui laudo incompleto

        "false"= não possui laudo incompleto

        *ocorrência de laudo geral sem laudo de operação ou laboratório;
        * ou, a ocorrência de laudo de operação sem laudo de laboratório

        Recno Inspeção recno QQK.R_E_C_N_O_ N
        • TOTVS - RESTFul API:
        • Métodos:
          • GET: Retorna Lista de Ensaios das Inspeções de Processos:
            • Endpoint: processinspectiontestapi/qip/v1/list/{Recno}/{OperationID}/{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_;
              • OperationID: operação relacionada a inspeção. Ex: "01";
              • Laboratory: laboratório relacionado a inspeção. Ex: "LABFIS", "" para todos;
              • 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;

          • GET: Retorna Um Ensaios das Inspeções de Processos:
            • Endpoint: processinspectiontestapi/qip/v1/test/{Recno}/{OperationID}/{IDEnsaio}
            • Objetivo: permitir a consulta de um único Ensaio da inspeção de processos.
            • PathParam:
              • Recno: recno da inspeção - QPK.R_E_C_N_O_;
              • OperationID: código da operação relacionada a inspeção. Ex: "01", "" para todas;
              • IDRecno: código do ensaio para pesquisa, por exemplo, valor de conteúdo em QP7_ENSAIO, QP8_ENSAIO;
            • 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
        Ensaio Obrigatório obrigatory
        L
        Título do Ensaio title QP1_DESCPO C
        Quantidade de Medições numberOfMensurements QP1_QTDE* N

        QP1_QTDE quando QP1_CARTA $ "|XBR|XBS|XMR|HIS|NP |"

        3 quando QP1_CARTA == 'P  '

        2 quando QP1_CARTA == 'U  '

        1 caso contrário

        Tipo type QP1_TIPO C
        Laboratório laboratory X5_DESCRI para X5_TABELA = 'Q2' C
        ID do Laboratório laboratoryID X5_CHAVE 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
        Valor Nominal nominalValue QP7_NOMINA C
        Limite Inferior Engenharia lowerDeviation QP7_LIE C
        Limite Superior Engenharia upperDeviation QP7_LSE C
        Operação da Inspeção operationID QP7_OPERAC / QP8_OPERAC C
        Tipo do Ensaio testType Tabelas do Protheus:
        QP7 = Ensaios Mensuráveis Produtos
        QP8 = Ensaios Textos dos Produtos
        C N = Numérico
        T = Texto
        Laudo do Laboratório laboratoryReport QPL_LAUDO C

        A = Aceito sem restrição
        B = Aceito com desvio simples
        C = Aceito com desvio grave
        E = Rejeitado totalmente
        U = Liberação urgente

        Status status Regra de Negócio Interna C A = Aprovado
        R = Reprovado
        P = Pendente
        N = Não Obrigatório
        • 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}/{OperationID}/{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);
              • OperationID: operação da inspeçã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;

          • DELETE: Deleta Informações de Uma Amostra (Novo: em expedição):
            • Endpoint: processinspectiontestresultsapi/api/qip/v1/result
            • Objetivo: permitir deletar uma amostra da inspeção de resultados;
            • QueryParam:
              • RecnoQPR: RECNO da amostra correspondente para exclusão na tabela QPR;


        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

        Segue abaixo demonstração de código para configuração de servidor RESTFul no AppServer.ini do servidor de aplicação do ERP TOTVS Protheus:

        Nota: ajustar "ENVIRONMENT" para o nome de seu ambiente.

        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

        Conheça melhor os EndPoints testando-os via Postman. Segue abaixo demonstração da execução de um método GET:

        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";

        Exemplo de resposta
        {
            "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
        }

        Conheça melhor os EndPoints testando-os via Postman. Segue abaixo demonstração da execução de um método POST:

        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")


        Exemplo de conteúdo para Body
        {
            "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
                }]
        }
        Exemplo de resposta
        {
            "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
        }

        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:

        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
        
        

        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:

        Código Exemplo - ADVPL FWRest POST
        #INCLUDE "TOTVS.CH"
        
        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
        
        

        05. ASSUNTOS RELACIONADOS