Árvore de páginas

Disponibiliza uma API REST no Dashboard para visualizar um Card.




Exemplo1.prw
#INCLUDE "TOTVS.CH"
#INCLUDE "RESTFUL.CH"

//-------------------------------------------------------------------
/*/{Protheus.doc} Exemplo1
    Exemplo de API de integração de Cards

    @author     Squad CRM & Faturamento
    @since      26/03/2020
    @version    12.1.27  
/*/
//-------------------------------------------------------------------
WSRESTFUL Exemplo1 DESCRIPTION "Exemplo 1"
    WSDATA Fields			AS STRING	OPTIONAL
    WSDATA Order			AS STRING	OPTIONAL
    WSDATA Page				AS INTEGER	OPTIONAL
    WSDATA PageSize			AS INTEGER	OPTIONAL

    WSMETHOD POST itemsDetails ;
        DESCRIPTION "Carrega os Itens Utilizados para Montagem do Painel" ;
        WSSYNTAX "/cards/itemsDetails/{Order, Page, PageSize, Fields}" ;
        PATH "/cards/itemsDetails";
        PRODUCES APPLICATION_JSON

    WSMETHOD GET cardFilter;
        DESCRIPTION "Disponibiliza os campos que poderão ser utilizados no filtro do Card" ;
        WSSYNTAX "/cards/cardFilter/" ;
        PATH "/cards/cardFilter";
        PRODUCES APPLICATION_JSON

    WSMETHOD GET cardInfo ;
        DESCRIPTION "Carrega as informações do Painel" ;
        WSSYNTAX "/cards/cardInfo/" ;
        PATH "/cards/cardInfo";
        PRODUCES APPLICATION_JSON

    WSMETHOD GET fieldsInfo ;
        DESCRIPTION "Carrega os campos que podem que ser utilizados" ;
        WSSYNTAX "/cards/fieldsInfo/" ;
        PATH "/cards/fieldsInfo";
        PRODUCES APPLICATION_JSON

ENDWSRESTFUL

//-------------------------------------------------------------------
/*/{Protheus.doc} POST itemsDetails
    Carrega os Itens Utilizados para Montagem do Painel

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD POST itemsDetails WSRECEIVE Order, Page, PageSize, Fields WSSERVICE Exemplo1

    Local aHeader       := {}
    Local aRet          := {}
    Local cError	    := "Erro na Requisição"
    Local lRet			:= .T.
    Local oCoreDash    := CoreDash():New()

    Self:SetContentType("application/json")

    aHeader := {;
        {"num"        , "Numero"           },;
        {"prefixo"	  , "Prefixo"          },;
        {"parcela"    , "Loja"             },;
        {"tipo"       , "Tipo"             },;
        {"naturez"	  , "Natureza"	       };
        }

    //Chama a função responsavel por montar a Expressão SQL
    aRet := MntQuery()

    //Define a Query padrão utilizada no Serviço
    oCoreDash:SetQuery(aRet[1])
    oCoreDash:SetWhere(aRet[2])
    oCoreDash:SetFields(DePara())
    oCoreDash:SetApiQstring(Self:aQueryString)
    lRet := oCoreDash:BuildJson()

    If lRet
        oCoreDash:SetPOHeader(aHeader)
        Self:SetResponse( oCoreDash:ToObjectJson())
    Else
        cError := oCoreDash:GetJsonError()
        SetRestFault( 500,  EncodeUtf8(cError) )
    EndIf

    oCoreDash:Destroy()

    aSize(aRet, 0)
    aSize(aHeader, 0)

Return lRet

//-------------------------------------------------------------------
/*/{Protheus.doc} GET cardFilter
    Retorna os campos que poderão ser filtrados

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET cardFilter WSSERVICE Exemplo1

    Local aHeader       := {}
    Local oCoreDash     := CoreDash():New()
    Local oResponse		:=	JsonObject():New()

    aHeader := {;
        {"num"        , "Numero"           },;
        {"prefixo"	  , "Prefixo"          },;
        {"parcela"    , "Loja"             },;
        {"tipo"       , "Tipo"             },;
        {"naturez"	  , "Natureza"	       };
        }

    oResponse["items"]      := oCoreDash:SetPOHeader(aHeader)

    Self:SetResponse( EncodeUtf8(oResponse:ToJson()))

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} GET cardInfo
    Método para retornar os dados do Card

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET cardInfo WSRESTFUL Exemplo1

    Local aFilter       := {}
    Local cWhere        := ""
    Local nFiltro       := 0
    Local oCoreDash     := CoreDash():New()
    Local oResponse	    := JsonObject():New()

    //Converte os campos utilizados na consulta para os campos utilizados no card.
    oCoreDash:SetFields(DePara())

    //Converte o Filtro informado no parametro Query String.
    oCoreDash:SetApiQstring(Self:aQueryString)
    aFilter := oCoreDash:GetApiFilter()
    
    For nFiltro := 1 to Len(aFilter)
        cWhere += " AND " + aFilter[nFiltro][1]
    Next

    RetCardInfo( @oResponse )

    self:SetResponse( EncodeUtf8(FwJsonSerialize(oResponse,.T.,.T.)) )

    oResponse := Nil
    FreeObj( oResponse )

    oCoreDash:Destroy()
    FreeObj( oCoreDash )

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} GET fieldsInfo
    Carrega os campos que podem que ser utilizados

    @param cSelect, Caractere, Campos que serão retornados no SELECT
    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET fieldsInfo WSSERVICE Exemplo1

    Local aItems        := {}    
    Local oResponse	    :=	JsonObject():New()
    Local oCoreDash    := CoreDash():New()

    aAdd(aItems, { "total"  , "Total a Receber:"    })
    aAdd(aItems, { "antigo" , "Titulo mais Antigo:" })
    aAdd(aItems, { "saldo"  , "Saldo Total:"        })

    /*Retorna um Objeto no formato de Value e Label*/
    oResponse["items"] := oCoreDash:SetPOCombo(aItems)

    Self:SetResponse( EncodeUtf8(oResponse:ToJson()))

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} MntQuery
    Monta a query responsável por trazer os itens utilizados no Painel

    @param cSelect, Caractere, Campos que serão retornados no SELECT
    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function MntQuery(cCampos)
    Local cQuery
    Local cWhere

    Default cCampos := " SE1.E1_PREFIXO, SE1.E1_NUM, SE1.E1_PARCELA, SE1.E1_TIPO, SE1.E1_NATUREZ "

    cQuery := " SELECT " + cCampos + " FROM " + RetSqlName("SE1") + " SE1 "
    cWhere := " SE1.E1_FILIAL = '" + xFilial("SE1") + "' "
    cWhere += " AND SE1.D_E_L_E_T_ = ' ' "

Return {cQuery, cWhere}

//-------------------------------------------------------------------
/*/{Protheus.doc} DePara
    Efetua o Conversão entre os atributos objetos do Json e os campos utilizados na Consulta

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function DePara()
    Local aCampos := {}

    aCampos := {;
        {"prefixo"  , "SE1.E1_PREFIXO"  },;
        {"num"      , "SE1.E1_NUM"      },;
        {"parcela"  , "SE1.E1_PARCELA"  },;
        {"tipo"     , "SE1.E1_TIPO"     },;
        {"naturez"  , "SE1.E1_NATUREZ"  };
        }
Return aCampos

//-------------------------------------------------------------------
/*/{Protheus.doc} GET RetCardInfo
    Retorna os dados que poderão ser apresentados no painel

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function RetCardInfo( oResponse )

    Local oItem
    Local aItems := {}

    oItem := JsonObject():New()

    oItem["total"] := 'R$ 526.232.123,23'
    oItem["antigo"] := '02/04/2020'
    oItem["salto"] := 'R$ 265.235.201,33'
    aAdd(aItems, oItem)    

    oResponse['hasNext'] := 'false'
    oResponse["items"] := aItems

Return Nil

Demais informações

Consultar a documentação do CoreDash.