1. VISÃO GERAL

A classe CoreDash fornece um objeto utilizado na construção de Cards ou Gráficos.

Este objeto pode ser utilizado na construção de serviços REST utilizados no Dashboard.

02. EXEMPLO DE UTILIZAÇÃO

Para visualizar um novo card ou gráfico disponibilizado na API de exemplo é necessário criar um novo tipo de card/gráfico. Segue abaixo o exemplo da carga a ser realizada nas tabelas A1N e A1P para criação dos novos tipos de card e gráfico.




#INCLUDE "TOTVS.CH"
#INCLUDE "RESTFUL.CH"

//------------------------------------------------------------------------
/*/{Protheus.doc} cargaExemplo
    Exemplo de carga a ser feita no Card e Gráfico para funcionamento da API de Exemplo
 
    @author     Squad CRM & Faturamento
    @since      16/12/2021
    @version    12.1.33
/*/
//------------------------------------------------------------------------

Function cargaExemplo()

	Local aAreaA1N := A1N->(GetArea())
	Local aAreaA1P := A1P->(GetArea())
	Local nX       := 0
	Local nY       := 0

	If !A1N->(DbSeek(xFilial("A1N")))
		aA1N     := CargaA1NAB()
		AAdd(aTables,aA1N)
	EndIf

	If !A1P->(DbSeek(xFilial("A1P")))
		aA1P     := CargaA1PAB()
		AAdd(aTables,aA1P)
	EndIf

	For nX := 1 to Len(aA1N)
		RecLock("A1N", .T.)
		For nY := 1 To Len(aA1N[nX])
			FieldPut(FieldPos(aA1N[nX][nY][1]), aA1N[nX][nY][2])
		Next
		A1N->(MsUnlock())
	Next

	For nX := 1 to Len(aA1P)
		RecLock("A1P", .T.)
		For nY := 1 To Len(aA1P[nX])
			FieldPut(FieldPos(aA1P[nX][nY][1]) , aA1P[nX][nY][2])
		Next
		A1P->(MsUnlock())
	Next

	RestArea(aAreaA1N)
	RestArea(aAreaA1P)

Return

Static Function CargaA1NAB()
	Local aRet  := {}

	aAdd(aRet,{;
		{"A1N_FILIAL ", xFilial("A1N")},;
		{"A1N_ID     ", "000012"},;
		{"A1N_CARSER ", "/exemplo1/cards/cardInfo"},;
		{"A1N_FLDSER ", "/exemplo1/cards/fieldsInfo"},;
		{"A1N_ITSER  ", "/exemplo1/cards/itemsDetails"},;
		{"A1N_CABSER ", "/exemplo1/cards/headerItens"},;
		{"A1N_TITULO ", "Exemplo API"};
		})

Return aRet

Static Function CargaA1PAB()
	Local aRet := {}

	aAdd(aRet, {;
		{"A1P_FILIAL", xFilial("A1P")},;
		{"A1P_ID    ", "000008"},;
		{"A1P_SRVFOR", "/exemplo2/charts/form"},;
		{"A1P_SRVDAT", "/exemplo2/charts/retDados"},;
		{"A1P_TITULO", "Exemplo API"},;
		{"A1P_MAXNIV", 2},;
		{"A1P_ITSERV", "/exemplo2/charts/itemsDetails"};
		})

Return aRet

Disponibiliza uma API REST no Dashboard para visualizar um Card.




#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

Disponibiliza uma API REST no Dashboard para visualizar um gráfico de Pizza ou Polar.




#INCLUDE "TOTVS.CH"
#INCLUDE "RESTFUL.CH"

//------------------------------------------------------------------------
/*/{Protheus.doc} Exemplo2
    Exemplo de API de integração de Graficos de Pizza e/ou Polar

    @author     Squad CRM & Faturamento
    @since      26/03/2020
    @version    12.1.27  
/*/
//------------------------------------------------------------------------
WSRESTFUL Exemplo2 DESCRIPTION "Exemplo de API - Grafico Pizza e Polar"

    WSDATA JsonFilter       AS STRING	OPTIONAL
    WSDATA drillDownFilter  AS STRING	OPTIONAL
    WSDATA Page				AS INTEGER	OPTIONAL
    WSDATA PageSize			AS INTEGER	OPTIONAL

    WSMETHOD GET form ;
        DESCRIPTION "Form de Cadastro do Gráfico" ;
        WSSYNTAX "/charts/form/" ;
        PATH "/charts/form";
        PRODUCES APPLICATION_JSON

    WSMETHOD GET filterItens ;
        DESCRIPTION "Carrega os filtros adicionais disponíveis para o gráfico" ;
        WSSYNTAX "/charts/filterItens/" ;
        PATH "/charts/filterItens";
        PRODUCES APPLICATION_JSON

    WSMETHOD POST retdados ;
        DESCRIPTION "Retorna as Informações do Gráfico" ;
        WSSYNTAX "/charts/retdados/{JsonFilter}" ;
        PATH "/charts/retdados";
        PRODUCES APPLICATION_JSON

    WSMETHOD POST itemsDetails ;
        DESCRIPTION "Carrega o detalhamento do gráfico" ;
        WSSYNTAX "/charts/itemsDetails/{JsonFilter}" ;
        PATH "/charts/itemsDetails";
        PRODUCES APPLICATION_JSON

ENDWSRESTFUL

//-------------------------------------------------------------------
/*/{Protheus.doc} GET form
    Retorna os campos que apresentados no Cadastro do Grafico.
    Devera seguir o formato do Dynamic Form do PO-UI.
    https://po-ui.io/tools/dynamic-form
    
    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET form WSSERVICE Exemplo2

    Local oResponse   := JsonObject():New()
    Local oCoreDash   := CoreDash():New()

    oCoreDash:SetPOForm("Tipo de Gráfico"    , "charttype"     , 6   , "Tipo de Gráfico"     , .T., "string",;
     oCoreDash:SetPOCombo({{"pie","Pizza"},{"polarArea","Polar"}}))
    oCoreDash:SetPOForm("Datas"              , "datainicio"      , 6   , "Dt. Emissão De"      , .T., "date")
    oCoreDash:SetPOForm(""                   , "datafim"         , 6   , "Dt. Emissão Ate"     , .T., "date")    

    oResponse  := oCoreDash:GetPOForm()

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

Return .T.

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

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

    Local aItems        := {}   
    Local oResponse     := JsonObject():New()
    Local oCoreDash     := CoreDash():New()
 
    aAdd(aItems, { "customerId" , "Cod. Cliente"    })
    aAdd(aItems, { "store"      , "Loja"            })
    aAdd(aItems, { "state"      , "Estado"          })
 
    /*Retorna um Objeto no formato de property e Label*/
    oResponse["items"] := oCoreDash:SetPOHeader(aItems)
 
    Self:SetResponse( EncodeUtf8(oResponse:ToJson()))

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} POST retdados
    Retorna um objeto JSON com as informações e valores do Grafico

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD POST retdados WSRECEIVE JsonFilter WSSERVICE Exemplo2

    Local oResponse   := JsonObject():New()
    Local oCoreDash   := CoreDash():New()
    Local oJson       := JsonObject():New()

    oJson:FromJson(DecodeUtf8(Self:GetContent()))

    retDados(@oResponse, oCoreDash, oJson)

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

    oResponse := Nil
    FreeObj( oResponse )

    oCoreDash:Destroy()
    FreeObj( oCoreDash )

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} POST retdados
    Retorna os items utilizado no Drilldown

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD POST itemsDetails WSRECEIVE JsonFilter, drillDownFilter WSRESTFUL Exemplo2

    Local aHeader     := {}
    Local aItems      := {}
    Local aRet        := {}
    Local cBody       := DecodeUtf8(Self:GetContent())
    Local cError      := "Erro na Requisição"
    Local cSelect     := ""
    Local cWhere      := ""
    Local lRet        := .T.
    Local oCoreDash  := CoreDash():New()
    Local oBody       := JsonObject():New()
    Local oJsonFilter := JsonObject():New()
    Local oJsonDD     := JsonObject():New()

    If !Empty(cBody)
        oBody:FromJson(cBody)

        If ValType(oBody["chartFilter"]) == "J"
            oJsonFilter := oBody["chartFilter"]
        EndIf

        If ValType(oBody["detailFilter"]) == "A"
            oJsonDD := oBody["detailFilter"]
        EndIf
    EndIf

    Self:SetContentType("application/json")

    If oJsonFilter:GetJsonText("level") == "null" .Or. Len(oJsonFilter["level"]) == 0        
        If Len(oJsonDD) == 0 //Nivel 1 do Drilldown
            aHeader := {;
                {"document"     , "Documento" ,"link"   },;
                {"series"       , "Serie"               },;
                {"state"        , "UF"                  },;
                {"documentType" , "Tipo"                },;
                {"dateOfIssue"  , "Emissão"             };
                }

            aItems := {;
                {"document"     , "F2_DOC"      },;
                {"series"       , "F2_SERIE"    },;
                {"state"        , "F2_EST"      },;
                {"documentType" , "F2_TIPO"     },;
                {"dateOfIssue"  , "F2_EMISSAO"  };
                }

            cSelect := " F2_DOC, F2_SERIE, F2_EST, F2_TIPO, F2_EMISSAO, F2_TIPO "

            aRet := QuerySF2(cSelect)

        Elseif Len(oJsonDD) == 1 //Nivel 2 do Drilldown

            aHeader := {;
                {"D2_ITEM"  , "Item"                            },;
                {"D2_COD"   , "Cod. Produto", "link"            },;
                {"B1_DESC"  , "Desc. Produto "                  },;
                {"D2_PRCVEN", "Vlr.Unitario", "currency","BRL"  },;
                {"D2_QUANT" , "Quantidade","number",'1.2-5'     },;
                {"D2_TOTAL" , "Vlr. Total", "currency","BRL"    },;
                {"D2_LOCAL" , "Armazem"                         };
                }

            aItems := {;
                {"D2_ITEM"      , "D2_ITEM"},;
                {"D2_COD"       , "D2_COD"},;
                {"B1_DESC"      , "B1_DESC"},;
                {"D2_PRCVEN"    , "D2_PRCVEN"},;
                {"D2_QUANT"     , "D2_QUANT"},;
                {"D2_TOTAL"     , "D2_TOTAL"},;
                {"D2_LOCAL"     , "D2_LOCAL"};
                }

            cSelect := " D2_ITEM, D2_COD, B1_DESC, D2_PRCVEN, D2_QUANT, D2_TOTAL, D2_LOCAL "
            cWhere := " D2_DOC = '" + oJsonDD[1]['document'] + "' AND D2_SERIE = '" + oJsonDD[1]['series'] + "' "

            aRet := QuerySD2(cSelect, cWhere)       
        Endif
    Else
        //Monta o Drilldown do grafico nivel 2
        aHeader := {;
            {"document"     , "Documento"   },;
            {"series"       , "Serie"               },;
            {"state"        , "UF"                  },;
            {"documentType" , "Tipo"                },;
            {"dateOfIssue"  , "Emissão"             };
            }

        aItems := {;
            {"document"     , "F2_DOC"      },;
            {"series"       , "F2_SERIE"    },;
            {"state"        , "F2_EST"      },;
            {"documentType" , "F2_TIPO"     },;
            {"dateOfIssue"  , "F2_EMISSAO"  };
            }

        cSelect := " F2_DOC, F2_SERIE, F2_EST, F2_TIPO, F2_EMISSAO, F2_TIPO "

        aRet := QuerySF2(cSelect)
    EndIf

    oCoreDash:SetQuery(aRet[1])
    oCoreDash:SetWhere(aRet[2])    
    oCoreDash:SetFields(aItems)
    oCoreDash:SetApiQstring(Self:aQueryString)
    oCoreDash:BuildJson()

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

    oCoreDash:Destroy()
    FreeObj(oJsonDD)
    FreeObj(oJsonFilter)
    FreeObj(oBody)

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

Return lRet
//-------------------------------------------------------------------
/*/{Protheus.doc} retDados
    Retorna os dados que poderão ser apresentados no Grafico

    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function retDados(oResponse, oCoreDash, oJson)
    Local aData     := {}
    Local aDataFim  := {}
    Local aCab      := {}
    Local aCores	:= oCoreDash:GetColorChart()
    Local nLoop     := 0

    If oJson:GetJsonText("level") == "null" .Or. Len(oJson["level"]) == 0
        aCab := GetUF()

        For nLoop := 1 To Len(aCab)
            aAdd(aData, Randomize(1,999) )
        Next nLoop

        aDataFim := {}
        aAdd(aDataFim, oCoreDash:SetChart(aCab,aData,/*lCurrency*/,,"Nota fiscal por Estado"))
    ElseIf Len(oJson["level"]) == 1
        aCab := GetTipoNF()

        For nLoop := 1 To Len(aCab)
            aAdd(aData, Randomize(1,999) )
        Next nLoop

        aAdd(aDataFim, oCoreDash:SetChart(aCab,aData,/*lCurrency*/,"pie","Quantidade de Notas por Tipos"))

    ElseIf Len(oJson["level"]) == 2

        aCab := GetTopCli()

        For nLoop := 1 To Len(aCab)
            aAdd(aData, Randomize(1, 999) )
        Next nLoop

        oCoreDash:SetChartInfo( aData, 'Notas', 'bar', aCores[8][3] ) //Cor utilizada: OrangeLht
        aAdd(aDataFim, oCoreDash:SetChart(aCab,,/*lCurrency*/,"bar","TOP 10 Clientes por Tipo de Nota"))

    Endif

    oResponse["items"] := aDataFim

Return Nil


//-------------------------------------------------------------------
/*/{Protheus.doc} QuerySF2
    Monta a query responsável por trazer os registro da Nota fiscal

    @param cSelect, Caractere, Campos que serão retornados no SELECT
    @param cFilter, Caractere, Filtro complementar utilizado na clausula WHERE
    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function QuerySF2(cSelect, cFilter )
    Local cQuery
    Local cWhere 

    Default cSelect := " SF2.F2_DOC, SF2.F2_SERIE, SF2.F2_CLIENTE, SF2.F2_LOJA, SF2.F2_TIPO "
    Default cFilter := ""

    cQuery := " SELECT " + cSelect + " FROM " + RetSqlName("SF2") + " SF2 "
    cWhere := " SF2.F2_FILIAL = '" + xFilial("SF2") + "' "
    If !Empty(cFilter)
        cWhere += " AND " + cFilter
    Endif
    cWhere += " AND SF2.D_E_L_E_T_ = ' ' "

Return { cQuery, cWhere }

//-------------------------------------------------------------------
/*/{Protheus.doc} QuerySD2
    Monta a query responsável por trazer os registro da Nota fiscal

    @param cSelect, Caractere, Campos que serão retornados no SELECT
    @param cFilter, Caractere, Filtro complementar utilizado na clausula WHERE
    @author Squad CRM & Faturamento
    @since 28/07/2020
    @version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function QuerySD2(cSelect, cFilter)
    Local cQuery
    Local cWhere

    Default cSelect := " SD2.D2_DOC, SD2.D2_ITEM, SD2.D2_COD "
    Default cFilter := ""

    cQuery := " SELECT " + cSelect + " FROM " + RetSqlName("SD2") + " SD2 "
    cQuery += " INNER JOIN SB1T10 SB1 "
    cQuery += " ON B1_COD = D2_COD AND SB1.D_E_L_E_T_ = ' ' AND B1_FILIAL = '" + xFilial("SB1") + "' "

    cWhere := " SD2.D2_FILIAL = '" + xFilial("SD2") + "' "
    If !Empty(cFilter)
        cWhere += " AND " + cFilter
    Endif
    cWhere += " AND SD2.D_E_L_E_T_ = ' ' "

Return {cQuery, cWhere}

//-------------------------------------------------------------------
/*/{Protheus.doc} GetUF
Retorna UF

@author Aline Navarro
@since 22/12/2020
@version 12.1.27
/*/
//-------------------------------------------------------------------
Static Function GetUF()

	Local aUF       := {}
	Local aUFX5     := {}
	Local nX        := 0
	Local nLenAUFX5 := 0

	aUFX5 := FWGetSX5("12")
	nLenAUFX5 := Len(aUFX5)
	For nX := 1 To nLenAUFX5
		aAdd(aUF,RTrim(aUFX5[nX,3])) //X5_CHAVE
	Next nX

Return aUF

Disponibiliza uma API REST no Dashboard para visualizar um gráfico de Pizza ou Polar.




#INCLUDE "TOTVS.CH"
#INCLUDE "RESTFUL.CH"

//------------------------------------------------------------------------
/*/{Protheus.doc} Exemplo3
    Exemplo de API de integração de Graficos de Barra e Linha

    @author     Squad CRM & Faturamento
    @since      28/07/2020
    @version    12.1.27  
/*/
//------------------------------------------------------------------------
WSRESTFUL Exemplo3 DESCRIPTION "Exemplo de API - Grafico Barra e Linha"
    WSDATA JsonFilter       AS STRING	  OPTIONAL
    WSDATA drillDownFilter  AS STRING	  OPTIONAL
    WSDATA Fields           AS STRING	  OPTIONAL
    WSDATA Order            AS STRING	  OPTIONAL
    WSDATA Page             AS INTEGER	OPTIONAL
    WSDATA PageSize         AS INTEGER	OPTIONAL

    WSMETHOD GET form ;
        DESCRIPTION "Formulario de Cadastro do Gráfico" ;
        WSSYNTAX "/charts/form/" ;
        PATH "/charts/form";
        PRODUCES APPLICATION_JSON

    WSMETHOD GET filterItens ;
        DESCRIPTION "Retorna todos os filtros adicionar do gráfico." ;
        WSSYNTAX "/charts/filterItens/" ;
        PATH "/charts/filterItens";
        PRODUCES APPLICATION_JSON

    WSMETHOD POST retDados ;
        DESCRIPTION "Deverá retornar as informações apresentadas no gráfico." ;
        WSSYNTAX "/charts/retDados/{JsonFilter}" ;
        PATH "/charts/retDados";
        PRODUCES APPLICATION_JSON

    WSMETHOD POST itemsDetails ;
        DESCRIPTION "Carrega o detalhamento do gráfico" ;
        WSSYNTAX "/charts/itemsDetails/{JsonFilter}" ;
        PATH "/charts/itemsDetails";
        PRODUCES APPLICATION_JSON

ENDWSRESTFUL

//-------------------------------------------------------------------
/*/{Protheus.doc} GET form
  Retorna os campos que serão apresentados no formulário.
  O padrão do campo deve seguir o Dynamic Form do Portinari.

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET form WSSERVICE Exemplo3

    Local oResponse   := JsonObject():New()
    Local oCoreDash   := CoreDash():New()

    oCoreDash:SetPOForm("Tipo de Gráfico", "charttype"       , 6, "Tipo de Gráfico"        , .T., "string" , oCoreDash:SetPOCombo({{"line","Linha"}, {"bar","Barra"}}))
    oCoreDash:SetPOForm("Filtros"        , "dateIni"         , 6, "Data Inicial"           , .T., 'date'   , , .T.)
    oCoreDash:SetPOForm(""               , "dateFim"         , 6, "Data Final"             , .T., 'date'   , , .T.)

    oResponse  := oCoreDash:GetPOForm()

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

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} GET filterItens
  Retorna os campos que poderão ser filtrados no Gráfico

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD GET filterItens WSSERVICE Exemplo3

    Local aItems    := {}
    Local oItem
    Local oResponse		:=	JsonObject():New()

    oItem := JsonObject():New()
    oItem["property"]  :=	"product"
    oItem["label"] :=	"Produto"
    aAdd(aItems, oItem)

    oItem := JsonObject():New()
    oItem["property"]  :=	"salesman"
    oItem["label"] :=	"Vendedor"
    aAdd(aItems, oItem)

    oItem := JsonObject():New()
    oItem["property"]  :=	"cod"
    oItem["label"] :=	"Código"
    aAdd(aItems, oItem)

    oResponse["items"]      := aItems

    Self:SetResponse( EncodeUtf8(oResponse:ToJson()))
Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} POST retDados
  Retorna os dados do Gráfico

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD POST retDados WSRECEIVE JsonFilter WSSERVICE Exemplo3

    Local oResponse   := JsonObject():New()
    Local oCoreDash   := CoreDash():New()
    Local oJson       := JsonObject():New()

    oJson:FromJson(DecodeUtf8(Self:GetContent()))

    retDados(@oResponse, oCoreDash, oJson)

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

    oResponse := Nil
    FreeObj( oResponse )

    oCoreDash:Destroy()
    FreeObj( oCoreDash )

Return .T.

//-------------------------------------------------------------------
/*/{Protheus.doc} GET retDados
  Retorna o valor das Meta e o Valor Vendido de acordo com parâmetros
  informados

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
Static Function retDados(oResponse, oCoreDash, oJson)
    Local aData    := {}
    Local aDataFim := {}
    Local aData1   := {}
    Local aData2   := {}
    Local aData3   := {}
    Local aData4   := {}
    Local aData5   := {}
    Local aCab     := {}
	Local aCores	:= oCoreDash:GetColorChart()
    Local aSaldo   := {}
    Local nSaldo   := 0

    If oJson:GetJsonText("level") == "null" .Or. Len(oJson["level"]) == 0
        aCab := {'Janeiro', 'Fevereiro', 'Março' }

        aData1 := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ) }
        aData2 := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ) }
        aData3 := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ) }
        aData4 := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ) }

        oCoreDash:SetChartInfo( aData1, 'Vendedor 01',,aCores[8][3] ) //Cor utilizada: OrangeLht 
        oCoreDash:SetChartInfo( aData2, 'Vendedor 02',,aCores[1][3] ) //Cor utilizada: GreenDk
        oCoreDash:SetChartInfo( aData3, 'Vendedor 03',,aCores[6][3] ) //Cor utilizada: YellowDk
        oCoreDash:SetChartInfo( aData4, 'Vendedor 04',,aCores[15][3] ) //Cor utilizada: BrowDk

        nSaldo := (aData1[1] + aData2[1] + aData3[1] + aData4[1] ) / 4
        aAdd(aSaldo, nSaldo)
        nSaldo := (aData1[2] + aData2[2] + aData3[2] + aData4[2] ) / 4
        aAdd(aSaldo, nSaldo)
        nSaldo := (aData1[3] + aData2[3] + aData3[3] + aData4[3] ) / 4
        aAdd(aSaldo, nSaldo)

        oCoreDash:SetChartInfo( aSaldo, 'Média', 'line', aCores[9][3] ,,.F.) //Cor utilizada: BlueDk       

        aDataFim := {}
        aAdd(aDataFim, oCoreDash:SetChart(aCab,,.T.))
    ElseIf Len(oJson["level"]) == 1
        aCab := {'Semana 1', 'Semana 2', 'Semana 3', 'Semana 4' }

        aData1          := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 )}
        aData2          := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 )}
        aData3          := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 )}
        aData4          := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 )}
        aData5          := { Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 ), Randomize( 100000000.00, 999000000.00 )}

        oCoreDash:SetChartInfo( aData1, '00000101 - Cliente 000001',,aCores[8][3] ) //Cor utilizada: OrangeLht 
        oCoreDash:SetChartInfo( aData2, '00000102 - Cliente 000002',,aCores[1][3] ) //Cor utilizada: GreenDk
        oCoreDash:SetChartInfo( aData3, '00543501 - Cliente 000003',,aCores[6][3] ) //Cor utilizada: YellowDk
        oCoreDash:SetChartInfo( aData4, '00543502 - Cliente 000004',,aCores[15][3] ) //Cor utilizada: BrowDk
        oCoreDash:SetChartInfo( aData5, '00543503 - Cliente 000005',,aCores[10][3] ) //Cor utilizada: BlueLht

        aDataFim := {}
        aAdd(aDataFim, oCoreDash:SetChart(aCab,,.T., ,"Maiores Vendas - " + oJson["level"][1]["labelDataSet"] + " - " + oJson["level"][1]["label"]))
    ElseIf Len(oJson["level"]) == 2
        aCab := {"Pedido - 234323", "Pedido - 234322", "Pedido - 234456", "Pedido - 234533", "Pedido - 234222" }

        oData       := JsonObject():New()

        aData   := { 26589, 25000,23560,10000,35000}

        aDataFim := {}
        aAdd(aDataFim, oCoreDash:SetChart(aCab, aData, .T.,"pie", "Maiores Clientes - " + oJson["level"][2]["labelDataSet"] + " - " + oJson["level"][1]["label"]))
    EndIf
    oResponse["items"] := aDataFim

Return

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

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
WSMETHOD POST itemsDetails WSRECEIVE JsonFilter, drillDownFilter WSRESTFUL Exemplo3

  Local aHeader     := {}
  Local aItems      := {}
  Local aRet        := {}
  Local cBody       := DecodeUtf8(Self:GetContent())
  Local cError		  := "Erro na Requisição"
  Local lRet			  := .T.
  Local oCoreDash   := CoreDash():New()
  Local oBody       := JsonObject():New()
  Local oJsonFilter := JsonObject():New()
  Local oJsonDD     := JsonObject():New()

  If !Empty(cBody)
    oBody:FromJson(cBody)
    If ValType(oBody["chartFilter"]) == "J"
        oJsonFilter := oBody["chartFilter"]
    EndIf
    If ValType(oBody["detailFilter"]) == "A"
        oJsonDD := oBody["detailFilter"]
    EndIf
  EndIf

  Self:SetContentType("application/json")
  //Verifico o Nivel do grafico
  If oJsonFilter:GetJsonText("level") == "null" .Or. Len(oJsonFilter["level"]) == 0
    //Verifico o nivel do Drilldpwn
    If Len(oJsonDD) == 0
      aHeader := {;
          {"codigo"     , "Código"        ,"link"               },;
          {"nome"	      , "Nome Vendedor"                       },;
          {"totalItens" , "Total de Itens","number",'1.2-5',.F. },;
          {"totalValor" , "Valor Total"   , "currency","BRL",.F.};
          }

      aItems := {;
          {"codigo"     , "SA3.A3_COD"    },;
          {"nome"	      , "SA3.A3_NOME"   },;
          {"totalItens" , "QTDITEM"       },;
          {"totalValor" , "TOTAL","N"     };
          }

      aRet := MntQuery1()
    ElseIf Len(oJsonDD) == 1
      //Caso eu queira pegar o nome do nível selecionado : oJsonFilter["level"][1]["labelDataSet"]
      // Se fosse gráfico do tipo pizza: oJsonFilter["level"][1]["label"]
      aHeader := {;
          {"codigoPed"  , "Código do Pedido"    },;
          {"codigoCli"  , "Código do Cliente"   },;
          {"nome"	      , "Nome" 	              },;
          {"totalValor" , "TOTAL","currency","BRL",.F.};
          }

      aItems := {;
          {"codigoPed"  , "SC5.C5_NUM"   },;
          {"codigoCli"	, "SC5.C5_CLIENTE"  },;
          {"nome"       , "SA1.A1_NOME"      },;
          {"totalValor" , "TOTAL","N"        };
          }
      aRet := MntQuery2("SC5.C5_VEND1 = '" + oJsonDD[1]["codigo"] + "'")
    EndIf
  ElseIf Len(oJsonFilter["level"]) == 1
    aHeader := {;
        {"codigo"     , "Código"        },;
        {"nome"	      , "Nome Vendedor" },;
        {"totalItens" , "Total de Itens","number",'1.2-5',.F.},;
        {"totalValor" , "Valor Total", "currency","BRL",.F.};
        }

    aItems := {;
        {"codigo"     , "SA3.A3_COD"   },;
        {"nome"	      , "SA3.A3_NOME"  },;
        {"totalItens" , "QTDITEM"      },;
        {"totalValor" , "TOTAL","N" };
        }

    aRet := MntQuery1()
  EndIf

  oCoreDash:SetQuery(aRet[1])
  oCoreDash:SetWhere(aRet[2])
  oCoreDash:SetGroupBy(aRet[3])
  oCoreDash:SetFields(aItems)
  oCoreDash:SetApiQstring(Self:aQueryString)
  oCoreDash:BuildJson()

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

  oCoreDash:Destroy()

  FreeObj(oBody)
  FreeObj(oJsonFilter)
  FreeObj(oJsonDD)
  FreeObj(oCoreDash)

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

Return( lRet )

//-------------------------------------------------------------------
/*/{Protheus.doc} MntQuery1
  Monta a Query o Total dos Pedidos de Venda

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
Static Function MntQuery1()
  Local cQuery  := ""
  Local cWhere  := ""
  Local cGroup  := ""
  
  cQuery := " SELECT SA3.A3_COD, SA3.A3_NOME, COUNT(C6_ITEM) QTDITEM, SUM(C6_VALOR) TOTAL " 
  cQuery += " FROM " + RetSqlName("SC5") + " SC5 "

  cQuery += " INNER JOIN " + RetSqlName("SC6") + " SC6 ON SC6.C6_NUM = SC5.C5_NUM "
  cQuery += " INNER JOIN " + RetSqlName("SA3") + " SA3 ON SA3.A3_COD = SC5.C5_VEND1 "

  cWhere := " SC5.D_E_L_E_T_ = ' ' "
  cWhere += " AND SC6.D_E_L_E_T_ = ' ' "
  cWhere += " AND SA3.D_E_L_E_T_ = ' ' "
  cWhere += " AND SC5.C5_FILIAL = '" + xFilial("SC5") + "'   "
  cWhere += " AND SC6.C6_FILIAL = '" + xFilial("SC6") + "'   "
  cWhere += " AND SA3.A3_FILIAL = '" + xFilial("SA3") + "'   "

  cGroup := " SA3.A3_COD, SA3.A3_NOME "

Return {cQuery, cWhere, cGroup}

//-------------------------------------------------------------------
/*/{Protheus.doc} MntQuery2
  Monta Query Pedido de vendas

  @author Squad CRM & Faturamento
  @since 27/03/2020
  @version Protheus 12.1.27
/*/
//-------------------------------------------------------------------
Static Function MntQuery2(cFilter)
  Local cQuery  := ""
  Local cGroup  := ""
  Local cWhere  := ""

  Default cFilter := "" 

  cQuery := " SELECT SC5.C5_NUM, SC5.C5_CLIENTE, SA1.A1_NOME, SUM(C6_VALOR) TOTAL "
  cQuery += " FROM " + RetSqlName("SC5") + " SC5 "
  cQuery += " INNER JOIN " + RetSqlName("SC6") + " SC6 ON SC6.C6_NUM = SC5.C5_NUM "
  cQuery += " INNER JOIN " + RetSqlName("SA1") + " SA1 ON SA1.A1_COD = SC5.C5_CLIENTE

  if !Empty(cFilter)
      cWhere += cFilter + " AND "
  EndIf

  cWhere += " SC5.D_E_L_E_T_ = ' ' "
  cWhere += " AND SC6.D_E_L_E_T_ = ' ' "
  cWhere += " AND SA1.D_E_L_E_T_ = ' ' "
  cWhere += " AND SC5.C5_FILIAL = '" + xFilial("SC5") + "'   "
  cWhere += " AND SC6.C6_FILIAL = '" + xFilial("SC6") + "'   "
  cWhere += " AND SA1.A1_FILIAL = '" + xFilial("SA1") + "'   "

  cGroup := " C5_NUM, C5_CLIENTE, SA1.A1_NOME "

Return {cQuery, cWhere, cGroup}

03. MÉTODOS

Sintaxe:

CoreDash():New()

Descrição:

Método construtor da classe.

Local oCoreDash := CoreDash():New() 

Sintaxe:

CoreDash():SetFields(aCampos)

Descrição:

Método que define os campos que serão retornados no JSON do serviço.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aCamposArrayArray que contém o De / Para dos campos que serão apresentados no serviço
X
Local oCoreDash := CoreDash():New() 
Local aCampos 	 := {} 
 
Aadd(aCampos, {"code", "A1_CODIGO"}) 
Aadd(aCampos, {"name", "A1_NOME"}) 
oCoreDash:SetFields(aCampos) 

Sintaxe:

CoreDash():SetQuery(cQuery)

Descrição:

Método que define a query que será utilizada no serviço.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cQueryCaractereRecebe a query que será executada. 
X
Local oCoreDash := CoreDash():New() 
Local cQuery 	 := "" 

cQuery := " SELECT A1_COD, A1_NOME FROM " + RetSqlName("SA1") + " SA1 "
oCoreDash:SetQuery(cQuery)

Sintaxe:

CoreDash():SetWhere(cWhere)

Descrição:

Método que define a clausula where que será no método SetQuery().

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cWhereCaractereWhere que será utilizado na query enviada para o método SetQuery()  


Local oCoreDash := CoreDash():New() 
Local cQuery 	 := " SELECT A1_COD, A1_NOME FROM "+ RetSqlName("SA1") + " SA1 "
Local cWhere 	 := "" 

oCoreDash:SetQuery(cQuery)

cWhere := " SA1.D_E_L_E_T = ' ' "
oCoreDash:SetWhere(cWhere)

Sintaxe:

CoreDash():SetIndexKey(cIndexFather)

Descrição:

Método que atribui a ordenação do Alias principal.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cIndexFatherCaractereOrdem utilizada no alias


Local oCoreDash := CoreDash():New() 

//Ordenação Crescente (ASC)
oCoreDash:SetIndexKey("A1_NOME")

//Ordenação Decrescente (DESC)
oCoreDash:SetIndexKey("-A1_NOME")

Sintaxe:

CoreDash():SetGroupBy(cGroup)

Descrição:

Método responsável por definir um agrupador na query utilizada no serviço.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cGroupCaractere

Campos que devem compor o agrupador


X
Local oCoreDash := CoreDash():New() 
Local cQuery	 := " SELECT tbl.CAMPO1, tbl.CAMPO2, COUNT(1) COUNT FROM TABLE tbl "
Local cWhere	 := " WHERE FILIAL = 'valor' AND D_E_L_E_T_ = ' ' "

oCoreDash:SetQuery(cQuery)
oCoreDash:SetWhere(cWhere)
oCoreDash:SetGroupBy(" tbl.CAMPO1, tbl.CAMPO2 ")
oCoreDash:SetIndexKey("tbl.CAMPO1")

Sintaxe:

CoreDash():SetPage(nPage)

Descrição:

Método que atribui o número da página em que o usuário vai navegar.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
nPageNuméricoNúmero da página que será apresentada para o usuário1

Local oCoreDash := CoreDash():New()
Local nPage 	 := 8 

oCoreDash:SetPage(nPage)

Sintaxe:

CoreDash():SetPageSize(nPageSize)

Descrição:

Método que atribui a quantidade máxima de registros que serão exibidos por página.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
nPageSizeNuméricoQuantidade máxima de registros apresentados por página para o usuário.10

Local oCoreDash := CoreDash():New()
Local nPageSize	 := 20

oCoreDash:SetPageSize(nPageSize)

Sintaxe:

CoreDash():DefFields(lConvProt, cField)

Descrição:

Método que efetua a conversão entre campos do Objeto e Protheus

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
lConvProtLógicoDefine se deve converter os campos para padrão Protheus.T.

cFieldCaractereCampo que será convertido


Local oCoreDash := CoreDash():New()

oCoreDash:DefFields(.T.,"CAMPO")

Sintaxe:

CoreDash():GetDataType(lConvProt, cField)

Descrição:

Retorna o tipo do dado de um determinado campo.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
lConvProtLógicoDefine se deve converter os campos para padrão Protheus.T.

cFieldCaracteresCampo que será convertido


Local oCoreDash := CoreDash():New()
Local dData

If oCoreDash:GetDataType(.T.,"CAMPO") == "D"
	dData := Date()
Endif

Sintaxe:

CoreDash():SetFieldsFilt(cFields) 

Descrição:

Método que define quais campos serão retornados pelo serviço.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cFieldsCaractereCampos que serão retornados no JSON.
X
Local oCoreDash := CoreDash():New()
Local cFields 	 := "order, totValue, product"

oCoreDash:SetFieldsFilt(cFields) 

Sintaxe:

CoreDash():ToObjectJson()

Descrição:

Método que retorna o JSON serializado.

Local oCoreDash := CoreDash():New()
Local lRet 		 := .T. 
Local cError := "Erro na requisição"
 
If lRet 
	Self:SetResponse( oCoreDash:ToObjectJson())
Else 
	cError := oCoreDash:GetJsonError() 
	SetRestFault( 500,  EncodeUtf8(cError) ) 
EndIf 

Sintaxe:

CoreDash():ToSingleObject()

Descrição:

Método que retorna um JSON serializado para apenas um objeto.

Utilizado em requisições do tipo GET que retornam informações de apenas um registro.

Local oCoreDash := CoreDash():New()
Local cError     := "Erro na requisição"
Local lRet 		 := .T. 
 
If lRet 
	Self:SetResponse(oCoreDash:ToSingleObject()) 
Else 
	cError := oCoreDash:GetJsonError() 
	SetRestFault( 500,  EncodeUtf8(cError) ) 
EndIf 

Sintaxe:

CoreDash():GetJsonObject()

Descrição:

Método que retorna o objeto JSON da classe

Local oCoreDash := CoreDash():New()
Local oJson

oJson:= oCoreDash:GetJsonObject()

If oJson["items"] != Nil
	...
Endif

Sintaxe:

CoreDash():SetApiQstring(aQueryString)

Descrição:

Método que define os campos (Retornados pelo JSON), page (página que será apresentada) e pagesize (Quantidade máxima de registros por página) e filtros.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aQueryStringArrayRecebe o filtro a ser utilizado quando retornado o JSON


Local oCoreDash 	:= CoreDash():New()
Local aQueryString 	:= {} 

aAdd(aQueryString, {"fields"	, "order, totValue"	}) 
aAdd(aQueryString, {"page"		, 10				}) 
aAdd(aQueryString, {"pagesize"	, 5					}) 

oCoreDash:SetApiQString(aQueryString) 

Sintaxe:

CoreDash():SetApiFilter(aFilter)

Descrição:

Método que atribui um filtro de pesquisa.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aFilterArrayArray com expressões de filtro que serão utilizadas
X
Local oCoreDash 	:= CoreDash():New()
Local aFilter		:= {} 

aAdd(aFilter, {"A1_COD = '000001'"}) 

oCoreDash:SetApiFilter(aFilter)

Sintaxe:

CoreDash():GetApiFilter()

Descrição:

Método que retorna o filtro de pesquisa.

Local oCoreDash 	:= CoreDash():New()

oCoreDash:GetApiFilter()

Sintaxe:

CoreDash():BuildJson()

Descrição:

Método que responsável por construir o objeto JSON.

Local oCoreDash  := CoreDash():New() 
 
Self:SetContentType("application/json") 
 
oCoreDash:SetQuery(cQuery) 
oCoreDash:SetWhere(cWhere) 
oCoreDash:SetFields(aCampos) 
oCoreDash:SetApiQstring(aQueryString) 
oCoreDash:BuildJson() 

Sintaxe:

CoreDash():SetJson(lHasNext, aItems)

Descrição:

Método que responsável por atribuir um objeto JSON, de acordo com o contrato estabelecido pela TOTVS, contento o [items] e o [hasNext].

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
lHasNextLógicoIndica se o objeto possui próxima página..T.

aItemsArrayArray com os valores do objeto.


Local aItems 		:= {} 
Local lHasNext 		:= .T. 
Local oCoreDash  	:= CoreDash():New() 
Local oItem 		:= JsonObject():New()
 
If (cTemp)->(Eof()) 
	lHasnext := .F. 
EndIf 
 
aAdd(aItems, oItem) 
oCoreDash:SetJson(lHasNext, aItems) 

Sintaxe:

CoreDash():SetTable(cAlias)

Descrição:

Método que recebe o alias que será responsável pela geração do JSON.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cAliasCaractereAlias recebido para a geração do JSON.
X
Local oCoreDash := CoreDash():New() 
Local cAlias 	 := GetNextArea() 
 
oCoreDash:SetTable(cAlias) 

Sintaxe:

CoreDash():SetUpsertData(cAlias, cIndex, cBody)

Descrição:

Método que efetua a inclusão ou alteração de registros.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cAliasCaractereAlias recebido para a geração do JSON.
X
cIndexCaractereÍndice utilizado na busca.


cBodyCaractereJSON recebido no Body da mensagem.
X
Local oCoreDash := CoreDash():New() 

If oCoreDash:SetUpsertData(cAlias, Nil, cBody)
	Self:SetResponse( EncodeUtf8("Registro incluído com sucesso"))
Else
	SetRestFault( 500,  EncodeUtf8("Falha ao converter o arquivo.") )
Endif 

Sintaxe:

CoreDash():Destroy()

Descrição:

Método responsável por destruir o objeto.

Local oCoreDash := CoreDash():New() 

If oCoreDash:SetUpsertData(cAlias, Nil, cBody)
	Self:SetResponse( EncodeUtf8("Registro incluído com sucesso"))
Else
	SetRestFault( 500,  EncodeUtf8("Falha ao converter o arquivo.") )
Endif 

oCoreDash:Destroy()

Sintaxe:

CoreDash():SetPOHeader(aFields)

Descrição:

Método responsável por retornar um Array conforme esperado na propriedade p-columns do componente Table da biblioteca de componentes PO-UI

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aFieldsArray

Array de até quatro dimensões com os dados:

aFields[n, 1] = Property

aFields[n, 2] = Label - Descrição apresentada na tabela.

aFields[n, 3] = Determina se a propriedade Action possui um link para o próximo nivel da visão.

aFields[n, 3] = Formato


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

aAdd(aFields, { "A1_COD"	, "Código"		,"Link"	})
aAdd(aFields, { "A1_LOJA"	, "Loja"				})
aAdd(aFields, { "A1_NOME"	, "Nome"				})
aAdd(aFields, { "total"		, "Total Faturado"		})

aItems := oCoreDash:SetPOHeader(aFields)

oResponse["items"]      := aItems

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

Sintaxe:

CoreDash():SetPOCombo(aOptions)

Descrição:

Método responsável por retornar um Array conforme esperado na propriedade p-options do componente Combo da biblioteca de componentes PO-UI.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aOptionsArray

Array de duas dimensões com as seguintes informações:

aOptions[n, 1] = Valor (Value)

aOptions[n, 2] = Rotulo (Label)


X
Local oCoreDash := CoreDash():New() 
Local aOptions	 := {}

aAdd(aOptions, {"phone"		,"Telefono"	})
aAdd(aOptions, {"cellPhone"	,"Celular"	})

oCoreDash:SetPOCombo(aOptions)

Sintaxe:

CoreDash():SetPOForm(cDivider, cProperty, cGridColumns, cLabel, lRequired, cType, aOptions, loptionsMulti)

Descrição:

Método responsável por construir um Formulário utilizando como base o componente DynamicForm do da biblioteca da PO-UI.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
cDividerCaractere

Cria uma divisória entre os campos, utilizando o nome definido na propriedade cDivider.




cPropertyCaractereNome da Propriedade.


cGridColumnsCaractere

Número de Colunas Ocupado pelo Campo.




cLabelCaractereRotulo/Label do Campo.


lRequiredLógicoDefine se o campo é obrigatório.


cTypeCaractereTipo do Campo.


aOptionsArrayLista de opções do campo.


loptionsMultiCaractereDefine se o campo é MultSelect.


Local oResponse   := JsonObject():New()
Local oCoreDash  := CoreDash():New()

oCoreDash:SetPOForm("Tipo de Gráfico", "graphictype"     , 6  , "Tipo de Gráfico"    , .T., "string", oCoreDash:SetPOCombo({{"pie","Pizza"},{"polarArea","Radar"}}))
oCoreDash:SetPOForm("Filtros"        , "typesearchcombo" , 12 , "Tipo de Pesquisa"   , .T., "string", oCoreDash:SetPOCombo({{"mensal","Mensal"},{"anual","Anual"}}))
oCoreDash:SetPOForm(""               , "datadereferencia", 6  , "Data de Referência" , .T., "date")

oResponse  := oCoreDash:GetPOForm()

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

Sintaxe:

CoreDash():GetPOForm()

Descrição:

Método responsável por retornar o Formulário, construído através do método SetPOForm.

Local oResponse   := JsonObject():New()
Local oCoreDash  := CoreDash():New()

oCoreDash:SetPOForm("Tipo de Gráfico", "graphictype"     , 6  , "Tipo de Gráfico"    , .T., "string", oCoreDash:SetPOCombo({{"pie","Pizza"},{"polarArea","Radar"}}))
oCoreDash:SetPOForm("Filtros"        , "typesearchcombo" , 12 , "Tipo de Pesquisa"   , .T., "string", oCoreDash:SetPOCombo({{"mensal","Mensal"},{"anual","Anual"}}))
oCoreDash:SetPOForm(""               , "datadereferencia", 6  , "Data de Referência" , .T., "date")

oResponse  := oCoreDash:GetPOForm()

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

Sintaxe:

CoreDash():SetChartnfo(aDados, cLegenda, cTipo, cBgColor, lBackGround, lDrillDown)

Descrição:

Método responsável por adicionar linhas e/ou colunas em um Gráfico de Barra ou Linha.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aDadosCaractere

Cria uma divisória entre os campos, utilizando o nome definido na propriedade cDivider.


X
cLegendaCaractereNome da Propriedade.
X
cTipoCaractere

Número de Colunas Ocupado pelo Campo.




cBgColorCaractereRotulo/Label do Campo.


lBackGroundLógicoDefine se o campo é obrigatório..F.

lDrillDownCaractereTipo do Campo..T.

Local oCoreDash  := CoreDash():New()
Local aHeader	  := {"2019","2020","2021"}
Local aData1	  := { Randomize(1,99), Randomize(1,99), Randomize(1,99) }
Local aData2	  := { Randomize(1,99), Randomize(1,99), Randomize(1,99) }
Local aSaldo	  := {}
Local nSaldo	  := 0

oCoreDash:SetChartInfo( aData1, 'Vendedor 01' )
oCoreDash:SetChartInfo( aData2, 'Vendedor 02' )

nSaldo := aData1[1] + aData2[1]
aAdd(aSaldo, nSaldo)
nSaldo := aData1[2] + aData2[2]
aAdd(aSaldo, nSaldo)
nSaldo := aData1[3] + aData2[3]
aAdd(aSaldo, nSaldo)

oCoreDash:SetChartInfo( aSaldo, "Média", "line", "rgba(255,240,210,0.0)", .F., .F.)

Sintaxe:

CoreDash():GetChartInfo()

Descrição:

Método responsável por retornar todos os gráficos adicionados através do método SetChartInfo.

Local aGraphic 	  := {}
Local oCoreDash  := CoreDash():New()

oCoreDash:SetChartInfo( aSaldo, "Média", "line", "rgba(23,132,175,0.59)", .F., .F.)
aGraphic := oCoreDash:GetChartInfo()

Sintaxe:

CoreDash():SetChart( aLegenda, aDados, lCurrency, cType, cTitle ) Class CoreDash

Descrição:

Método responsável por adicionar linhas e/ou colunas em um Gráfico de Barra ou Linha.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatórioReferência
aLegendaArrayLegendas apresentadas no Gráfico
X
aDadosArray

Dados impressos no Gráfico.

Observação: Para gráficos do tipo barra/linha, pode se usar o próprio GetChartInfo




lCurrencyLógicoInforma se a máscara retornada será ou não do tipo moeda.F.

cTypeCaractereTipo de Gráfico que será retornado.


cTitleCaractereTítulo apresentado no Gráfico.




Sintaxe:

CoreDash():GetCposLGPD()

Descrição:

Método responsável por retornar array com os campos sensíveis que deverão ter exibição restrita de acordo com o Usuário logado.

Local oCoreDash := CoreDash():New() 
Local aCampos 	:= {}
Local aCposLGPD	:= {} 
 
Aadd(aCampos, {"code", "A1_CODIGO"}) 
Aadd(aCampos, {"name", "A1_NOME"}) 

oCoreDash:SetFields(aCampos) 

aCposLGPD := oCoreDash:GetCposLGPD()

Sintaxe:

CoreDash():GetColorChart()

Descrição:

Método responsável por retornar em um array todas as cores padronizadas para uso de gráficos DASH.

Se for passado ao metodo o ID da cor, será retornado somente a cor solicitada.

CoreDash():GetColorChart(X);

Onde X é o ID da cor solicitada.

Parâmetros:

Cor (Variável)Descrição da CorIDCódigo RGBAPosição ArrayExemplo Cor
cGreenDkVerde Escuro1rgba( 0,178,142, 1)aArray[1][3]

cGreenLhtVerde Claro2

rgba( 0,201,161, 1)

aArray[2][3]

cRedDkVermelho Escuro3rgba(198, 72, 64, 1)aArray[3][3]

cRedLhtVermelho Claro4rgba(227, 73, 64, 1)aArray[4][3]

cYellDkAmarelo Escuro5rgba(252,203, 76, 1)aArray[5][3]

cYellLhtAmarelo Claro6rgba(255,212,100, 1)aArray[6][3]

cOrangeDkLaranja Escuro7rgba(234,155, 62, 1)aArray[7][3]

cOrangeLhtLaranja Claro8rgba(255,162, 54, 1)aArray[8][3]

cBlueDkAzul Escuro9rgba( 0,120,255, 1)aArray[9][3]

cBlueLhtAzul Claro10rgba( 50,165,255, 1)aArray[10][3]

cGreyDkCinza Escuro11rgba(192,192,192, 1)aArray[11][3]

cGreyLhtCinza Claro12rgba(200,200,210, 1)aArray[12][3]

cPurpleDkRoxo Escuro13rgba(128, 0,128, 1)aArray[13][3]

cPurpleLhtRoxo Claro14rgba(185, 35,185, 1)aArray[14][3]

cBrownDkMarron Escuro15rgba(128, 0, 0, 1)aArray[15][3]

cBrownLhtMarron Claro16rgba(160, 80, 40, 1)aArray[16][3]

cFuchsiaDkPink Escuro17rgba(255, 0,255, 1)aArray[17][3]

cFuchsiaLhtPink Claro18rgba(255,120,255, 1)aArray[18][3]

cMnightBlueAzul Meia Noite19rgba( 25, 25,112, 1)aArray[19][3]

cMediumBlueAzul Médio20rgba( 0, 0,205, 1)aArray[20][3]

cDGreenVerde21rgba( 0,100, 0, 1)aArray[21][3]

cFGreenVerde Floresta22rgba( 34,139, 34, 1)aArray[22][3]

cGreenYelVerde Limão23rgba(173,255, 47, 1)aArray[23][3]

cSalmonSalmão24rgba(250,128,114, 1)aArray[24][3]

cTanRosa Queimado25rgba(210,180,140, 1)aArray[25][3]

cWheatRosa Trigo26rgba(245,222,179, 1)aArray[26][3]

cSlateGrayCinza Ardósia27rgba(112,128,144, 1)aArray[27][3]

cMistyRoseRosa Claro28rgba(255,228,225, 1)aArray[28][3]

04. DEMAIS INFORMAÇÕES

  • Não há.