Á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-4377

02. SITUAÇÃO/REQUISITO

Continuidade no desenvolvimento do projeto de Inspeção de Processos Mobile, requisito encerramento da inspeção via Laudos.

03. SOLUÇÃO

Projeto em desenvolvimento.

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 versão da expedição contínua igual ou superior a XX/XX/2022 - Pacotes de Atualização - QIP - 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.





        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