Pone a disposición una API REST en el Dashboard para visualizar un gráfico de Pizza o Polar.
#INCLUDE "TOTVS.CH" #INCLUDE "RESTFUL.CH" //------------------------------------------------------------------------ /*/{Protheus.doc} Ejemplo2 Ejemplo de API de integración de Graficos de Pizza y/o Polar @author Squad CRM & Facturación @since 26/03/2020 @version 12.1.27 /*/ //------------------------------------------------------------------------ WSRESTFUL Exemplo2 DESCRIPTION "Exemplo de API - Grafico Pizza y 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 registro do Gráfico" ; WSSYNTAX "/charts/form/" ; PATH "/charts/form"; PRODUCES APPLICATION_JSON WSMETHOD GET filterItens ; DESCRIPTION "Carga los filtros adicionales disponibles para el gráfico" ; WSSYNTAX "/charts/filterItens/" ; PATH "/charts/filterItens"; PRODUCES APPLICATION_JSON WSMETHOD POST retdados ; DESCRIPTION "Devuelve las informaciones del gráfico" ; WSSYNTAX "/charts/retdados/{JsonFilter}" ; PATH "/charts/retdados"; PRODUCES APPLICATION_JSON WSMETHOD POST itemsDetails ; DESCRIPTION "Carga los detalles del gráfico" ; WSSYNTAX "/charts/itemsDetails/{JsonFilter}" ; PATH "/charts/itemsDetails"; PRODUCES APPLICATION_JSON ENDWSRESTFUL //------------------------------------------------------------------- /*/{Protheus.doc} GET form Devuelve los campos que se presentan en el registro del gráfico. Debe seguir el formato del Dynamic Form del PO-UI. https://po-ui.io/tools/dynamic-form @author Squad CRM & Facturación @since 28/07/2020 @version 12.1.27 /*/ //------------------------------------------------------------------- WSMETHOD GET form WSSERVICE Ejemplo2 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 , "De Fch. Emisión" , .T., "date") oCoreDash:SetPOForm("" , "datafim" , 6 , "A Fch. Emisión" , .T., "date") oResponse := oCoreDash:GetPOForm() Self:SetResponse( EncodeUtf8(oResponse:ToJson())) Return .T. //------------------------------------------------------------------- /*/{Protheus.doc} GET filterItens Devuelve los campos que se podrán filtrar @author Squad CRM & Facturación @since 28/07/2020 @version 12.1.27 /*/ //------------------------------------------------------------------- WSMETHOD GET filterItens WSSERVICE Ejemplo2 Local aItems := {} Local oResponse := JsonObject():New() Local oCoreDash := CoreDash():New() aAdd(aItems, { "customerId" , "Cód. Cliente" }) aAdd(aItems, { "store" , "Tienda" }) aAdd(aItems, { "state" , "Estado" }) /*Devuelve un Objeto en el formato de property y Label*/ oResponse["items"] := oCoreDash:SetPOHeader(aItems) Self:SetResponse( EncodeUtf8(oResponse:ToJson())) Return .T. //------------------------------------------------------------------- /*/{Protheus.doc} POST retdados Devuelve un objeto JSON con las informaciones y valores del gráfico @author Squad CRM & Facturación @since 28/07/2020 @version 12.1.27 /*/ //------------------------------------------------------------------- WSMETHOD POST retdados WSRECEIVE JsonFilter WSSERVICE Ejemplo2 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 Devuelve los ítems utilizado en el Drilldown @author Squad CRM & Facturación @since 28/07/2020 @version 12.1.27 /*/ //------------------------------------------------------------------- WSMETHOD POST itemsDetails WSRECEIVE JsonFilter, drillDownFilter WSRESTFUL Ejemplo2 Local aHeader := {} Local aItems := {} Local aRet := {} Local cBody := DecodeUtf8(Self:GetContent()) Local cError := "Error en el requerimiento" 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" ,"Enlace" },; {"series" , "Serie" },; {"state" , "UF" },; {"documentType" , "Tipo" },; {"dateOfIssue" , "Emisión" }; } 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 del Drilldown aHeader := {; {"D2_ITEM" , "Ítem" },; {"D2_COD" , "Cód. Producto", "Enlace" },; {"B1_DESC" , "Desc. Producto " },; {"D2_PRCVEN", "Val.Unitrio", "currency","BRL" },; {"D2_QUANT" , "Cantidad","number",'1.2-5' },; {"D2_TOTAL" , "Val. Total", "currency","BRL" },; {"D2_LOCAL" , "Almacén" }; } 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 el Drilldown del gráfico nivel 2 aHeader := {; {"document" , "Documento" },; {"series" , "Serie" },; {"state" , "UF" },; {"documentType" , "Tipo" },; {"dateOfIssue" , "Emisión" }; } 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 Devuelve los datos que se podrán presentar en el gráfico @author Squad CRM & Facturación @since 28/07/2020 @version 12.1.27 /*/ //------------------------------------------------------------------- Static Function retDados(oResponse, oCoreDash, oJson) Local aData := {} Local aDataFim := {} Local aCab := {} 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*/,,"Factura 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","Cantidad de facturas por Tipos")) ElseIf Len(oJson["level"]) == 2 aCab := GetTopCli() For nLoop := 1 To Len(aCab) aAdd(aData, Randomize(1, 999) ) Next nLoop oCoreDash:SetGraphInfo( aData, 'Notas', 'bar', "rgba(58,145,231,0.92)" ) aAdd(aDataFim, oCoreDash:SetChart(aCab,,/*lCurrency*/,"bar","TOP 10 Clientes por Tipo de Nota")) Endif oResponse["items"] := aDataFim Return Nil //------------------------------------------------------------------- /*/{Protheus.doc} QuerySF2 Monta la query responsable por traer los registros de la factura @param cSelect, Caractere, Campos que se devolverán en el SELECT @param cFilter, Caractere, Filtro complementario utilizado en la cláusula WHERE @author Squad CRM & Facturación @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 la query responsable por traer los registros de la factura @param cSelect, Carácter, Campos que se devolverán en el SELECT @param cFilter, Carácter, Filtro complementario utilizado en la cláusula WHERE @author Squad CRM & Facturación @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}
Consulte la documentación del CoreDash.