| Linha de Produto: | Microsiga Protheus® |
|---|---|
| Segmento: | Backoffice |
| Módulo: | Financeiro |
| Idiomas: | Português |
| Função: | Portal do Cliente |
O ponto de entrada PCBROWSE permite incluir opções de menu para listagem de itens customizados ao Portal do Cliente - SIGAFIN.
O ponto de entrada deve retornar um array com o json de configuração de cada menu que deseja adicionar.
Configuração necessário para que seja carregada a opção de menu no portal do cliente. Caso alguma informação obrigatória, função de usuário informada não compilada ou erro de execução ocorra o menu não será carregado.
![]()
| Propriedade | Obrigatoriedade | Descrição |
|---|---|---|
| tituloMenu | Obrigatório | Titulo apresentado no menu. |
| iconeMenu | Opcional | Ícone para o menu. Lista de ícones PO UI que podem ser usados nesta propriedade. https://po-ui.io/guides/icons |
| tituloPagina | Obrigatório | Titulo apresentado na pagina. |
| funcaoQuery | Obrigatório | Nome da user function que vai retornar a query para buscar os dados. |
| tabela | Obrigatório | Alias da tabela utilizada para tratamento interno. |
| colunas | Obrigatório se não enviar fields | Array de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada. |
| fields | Opcional | Array de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):
|
| legendas | Opcional | Configuração das legendas. Array de json com as propriedades value, color e label. (labels do PoTableColumnLabel) |
| campoLegendas | Opcional | Campo utilizado para legenda. |
| tituloLegendas | Opcional | Titulo da legenda. |
| detalhes | Opcional | Json com as propriedades para ser exibido na tela de detalhes do registro. Consulte o item 03.02 Configuração de detalhes. |
É possível configurar a pesquisa simples e avançada através da configuração:
| Propriedade | Obrigatoriedade | Descrição |
|---|---|---|
| campoBusca | Opcional | Campo para busca rápida. |
| camposBuscaAvancada | Opcional | Lista de campos para busca avançada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada. |
| fieldsBuscaAvancada | Opcional | Array de json com os campos do para utilizar na busca avançada. Cada campo deve ter as propriedades property, type e label (PoDynamicFormField):
|
Caso seja configurado os detalhes, será apresentado no item a opção "visualizar" para exibição de informações e listagem de itens.


| Propriedade | Obrigatoriedade | Descrição |
|---|---|---|
| tituloPagina | Obrigatório | Titulo apresentado na pagina de detalhes. |
| tituloAbaPrincipal | Obrigatório | Titulo apresentado na aba principal. |
| camposDetalhes | Obrigatório | Lista de campos que serão apresentados, o sistema vai utilizar o titulo da SX3. Se informar fieldsDetalhes essa propriedade é ignorada. |
| fieldsDetalhes | Opcional | Array de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):
|
| tituloAbaItens | Opcional | Titulo apresentado na aba itens. |
| funcaoQueryItens | Obrigatório se informado tituloAbaItens | User funcion que vai retornar a query dos itens. |
| tabelaItens | Obrigatório se informado tituloAbaItens | Alias dos itens. |
| colunas | Obrigatório se informado tituloAbaItens | Lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada. |
| fields | Obrigatório se informado tituloAbaItens | Array de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):
|
A função passada na propriedade 'funcaoQuery' e 'funcaoQueryItens' será chamada pelo Portal do Cliente para que retorne a query customizada que será utilizada na busca dos itens.
PARAMIXB | Tipo | Descrição |
|---|---|---|
| 1º Posição | Array | Contém um Array com as chaves (FILIAL+CODIGO+LOJA) dos clientes selecionados no portal. Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja. |
| 2º Posição | Caracter | Usuário de login do Portal do cliente |
PARAMIXB | Tipo | Descrição |
|---|---|---|
| 1º Posição | Array | Contém um Array com as chaves (FILIAL, CODIGO, LOJA) dos clientes selecionados no portal. Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja. |
| 2º Posição | Caracter | Usuário de login do Portal do cliente |
| 2º Posição | Json | json da linha selecionada no formato "{ Campo: Valor} " Ex.: "{E1_FILIAL: '01', E1_NUM: '000001'}" |
A função deve retornar a query personalizada:
Deverão ser utilizados os Id's:
#QueryFields# Campos do SELECT, existe tratamento para o FIELDS no QueryParam
#QueryWhere# Condições do WHERE, existe tratamento para FILTER no QueryParam
| Tipo | Obrigatoriedade | Descrição |
|---|---|---|
| Caractere | Obrigatório | Query personalizada para listagem dos registros do menu customizado. |
#Include 'Protheus.ch'
/*/{Protheus.doc} PCBROWSE
Ponto de entrada para adicionar opcoes de menu no Oortal do cliente
@type function
@return array, array de configuracao
/*/
user Function PCBROWSE()
Local aMenu := {} as Array
aAdd(aMenu, MENU1()) // exemplo utilizando colunas SX3
aAdd(aMenu, MENU2()) // exemplo configurando fields
Return aMenu
/*/{Protheus.doc} MENU1
Configuracao do menu
@type function
@return json, configuracao do browse
/*/
Static Function MENU1()
Local jMenu := JsonObject():new() as Json
Local jDetalhes := JsonObject():new() as Json
//titulo apresentado no menu
jMenu['tituloMenu'] := 'Pedidos1'
//icone para o menu, lista de icones https://po-ui.io/guides/icons
jMenu['iconeMenu'] := 'po-icon po-icon-manufacture'
//titulo apresentado na pagina
jMenu['tituloPagina'] := 'Meus Pedidos1'
//user funcion que vai retornar a query de busca
jMenu['funcaoQuery'] := 'PCQRY01'
//alias da tabela utilizada para tratamentos internos
jMenu['tabela'] := 'SC5'
//lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada
jMenu['colunas'] := {'c5_filial', 'c5_condpag', 'c5_num', 'c5_vend1', 'c5_nota', 'c5_emissao'}
//configuracao de legendas, array com value, color e label
jMenu['legendas'] := {}
aAdd(jMenu['legendas'], prepareStatus("N", "color-01", "Normal"))
aAdd(jMenu['legendas'], prepareStatus("C", "color-02", "Compl.PrecIo/Cantidad"))
aAdd(jMenu['legendas'], prepareStatus("I", "color-03", "Compl.ICMS"))
aAdd(jMenu['legendas'], prepareStatus("P", "color-04", "Compl.IPI"))
aAdd(jMenu['legendas'], prepareStatus("D", "color-05", "Dev.Compras"))
aAdd(jMenu['legendas'], prepareStatus("B", "color-06", "Utiliza proveedor"))
jMenu['campoLegendas'] := 'c5_tipo'
jMenu['tituloLegendas'] := 'Tipo'
//campo para busca rapida, Se informar fieldBusca essa propriedade é ignorada
jMenu['campoBusca'] := 'c5_num'
//lista de campos apra busca avancada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada
jMenu['camposBuscaAvancada'] := {'c5_filial', 'c5_vend1', 'c5_nota', 'c5_emissao', 'c5_transp'}
//exemplo de configuracao de detalhes
//titulo apresentado na pagina de detalhes
jDetalhes['tituloPagina'] := 'Detalhes do pedido'
//titulo apresentado na aba principal
jDetalhes['tituloAbaPrincipal'] := 'Dados gerais'
//lista de campos que serao apresentados, o sistema vai utilizar o titulo da SX3. Se informar fieldsDetalhes essa propriedade é ignorada
jDetalhes['camposDetalhes'] := {'c5_num','c5_tipo', 'c5_nota', 'c5_emissao', 'c5_vend1', 'c5_tabela', 'c5_cliente', 'c5_lojacli', 'c5_transp', 'c5_frete', 'c5_seguro',}
//titulo apresentado na aba itens
jDetalhes['tituloAbaItens'] := 'Produtos'
//user funcion que vai retornar a query dos itens
jDetalhes['funcaoQueryItens'] := 'PCITEM'
//alias dos itens
jDetalhes['tabelaItens'] := 'SC6'
//lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada
jDetalhes['colunas'] := {'c6_item', 'c6_produto', 'c6_descri', 'c6_qtdven', 'c6_prcven', 'c6_valor'}
jMenu['detalhes'] := jDetalhes
return jMenu
/*/{Protheus.doc} MENU2
Configuracao do menu utilizando as propriedades fields
@type function
@return json, configuracao do browse
/*/
Static Function MENU2()
Local jMenu := JsonObject():new() as Json //Json com as propriedades esperadas.
Local jDetalhes := JsonObject():new() as Json
jMenu['tituloMenu'] := 'Pedidos2'
jMenu['iconeMenu'] := 'po-icon po-icon-manufacture'
jMenu['tituloPagina'] := 'Meus Pedidos2'
jMenu['funcaoQuery'] := 'PCQRY01'
jMenu['tabela'] := 'SC5'
//lista de campos do browse, utilizado quando nao quer pegar dados da SX3.
//deve ser um array de json com as propriedades property, type e label
jMenu['fields'] := {}
aAdd(jMenu['fields'], prepareField("c5_filial" , "string", "Filial do pedido"))
aAdd(jMenu['fields'], prepareField("c5_num" , "string", "Pedido"))
aAdd(jMenu['fields'], prepareField("c5_vend1" , "string", "Vendedor"))
aAdd(jMenu['fields'], prepareField("c5_condpag", "string", "Forma de pagamento"))
aAdd(jMenu['fields'], prepareField("c5_nota" , "string", "NF"))
//campo para busca rapida, utilizado quando nao quer pegar dados da SX3.
//deve ser um array de json com as propriedades property, type e label
jMenu['fieldBusca'] := prepareField("c5_num", "string", "Pesquisa por pedido")
//lista de campos apra busca avancada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada
jMenu['fieldsBuscaAvancada'] := {}
aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_emissao", "date" , "Data"))
aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_filial" , "string", "Filial"))
aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_nota" , "string", "NF"))
aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_num" , "string", "Pedido"))
//exemplo de configuracao de detalhes
//titulo apresentado na pagina de detalhes
jDetalhes['tituloPagina'] := 'Detalhes do pedido'
//titulo apresentado na aba principal
jDetalhes['tituloAbaPrincipal'] := 'Dados gerais'
//Utiliza as propriedades PoDynamicViewField do po-dynamic-view poui. https://po-ui.io/documentation/po-dynamic-view
jDetalhes['fieldsDetalhes'] := {}
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_num' , 'string', 'Pedido' , 'Dados' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tipo' , 'string', 'Tipo do pedido' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_nota' , 'string', 'Nota' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_emissao', 'date' , 'Data' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_vend1' , 'string', 'Vendedor' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tabela' , 'string', 'Tabela de preços' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_cliente', 'string', 'Código', 'Comprador' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_lojacli', 'string', 'Loja' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_transp' , 'string', 'Código transportadora', 'Entrega'))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_frete' , 'string', 'Valor do frete' ))
aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_seguro' , 'string', 'Valor do seguro' ))
//titulo apresentado na aba itens
jDetalhes['tituloAbaItens'] := 'Produtos'
//user funcion que vai retornar a query dos itens
jDetalhes['funcaoQueryItens'] := 'PCITEM'
//alias dos itens
jDetalhes['tabelaItens'] := 'SC6'
//lista de campos do browse, deve ser um array de json com as propriedades property, type e label
jDetalhes['fields'] := {}
aAdd(jDetalhes['fields'], prepareField('c6_item' , 'string' , 'Item'))
aAdd(jDetalhes['fields'], prepareField('c6_produto', 'string' , 'Código'))
aAdd(jDetalhes['fields'], prepareField('c6_qtdven' , 'string' , 'Quantidade'))
aAdd(jDetalhes['fields'], prepareField('c6_prcven' , 'currency', 'Preço'))
aAdd(jDetalhes['fields'], prepareField('c6_valor' , 'currency', 'Valor'))
jMenu['detalhes'] := jDetalhes
return jMenu
/*/{Protheus.doc} prepareField
funcao auxiliar para preparar as propriedades do field
@type function
@param cCampo, character, campo
@param cTipo, character, tipo (string, date, number)
@param cTitulo, character, titulo
@param cDivisor, character, titulo do divisor (utilizado nos detalhes)
@return json, json de field
/*/
Static Function prepareField(cCampo as Character, cTipo as Character, cTitulo as Character, cDivisor as Character)
Local jField := JsonObject():new() as Json
jField["property"] := cCampo
jField["type"] := cTipo
jField["label"] := cTitulo
if !Empty(cDivisor)
jField["divider"] := cDivisor
endIf
Return jField
/*/{Protheus.doc} prepareStatus
funcao auxiliar para preparar as propriedades da legenda
@type function
@param cValor, character, valor
@param cCor, character, cor
@param cTitulo, character, label
@return variant, rconfiguracao de legenda
/*/
Static Function prepareStatus(cValor as Character, cCor as Character, cTitulo as Character)
Local jStatus := JsonObject():new() as Json
jStatus["value"] := cValor
jStatus["color"] := cCor
jStatus["label"] := cTitulo
Return jStatus |
#Include 'Protheus.ch'
/*/{Protheus.doc} PCQRY01
Query para listar os itens do PE PCBROWSE
@type function
@return character, query
/*/
User function PCQRY01()
local aSA1 := Paramixb[1] // Array de clientes {{"D MG ", "000002", "02"}, {"D RJ ", "000002", "12"}}
local cLogin := Paramixb[2] // Login do portal
local cQuery := ""
local cAlias := "SC5"
local nCli := 1
local cOr := ""
cQuery := " SELECT #QueryFields# "
cQuery += " FROM " + RetSqlName(cAlias) + " SC5 "
cQuery += " WHERE SC5.D_E_L_E_T_ = ' ' AND "
cQuery += "("
// lógica para filtro utilizando os código de clientes
for nCli := 1 to len(aSA1)
if (nCli > 1)
cOr := " OR "
endIf
cQuery += cOr + "(SC5.C5_CLIENTE = '" + aSA1[nCli][2] + "' AND SC5.C5_LOJACLI = '" + aSA1[nCli][3]+"')"
next
cQuery += ")"
cQuery += " #QueryWhere# "
Return cQuery
/*/{Protheus.doc} PCITEM
Query para listar os detalhes do item do PE PCBROWSE
@type function
@return character, query
/*/
user function PCITEM()
local aSA1 := Paramixb[1] // Clientes
local cUser := Paramixb[2] // Login do portal
local jFilter := Paramixb[3] // Linha selecionada para os detalhes
local cAlias := "SC6"
cQuery := " SELECT #QueryFields# "
cQuery += " FROM " + RetSqlName(cAlias) + " " + cAlias
cQuery += " WHERE " + cAlias + ".D_E_L_E_T_ = ' ' AND "
cQuery += " C6_FILIAL = '" + jFilter['C5_FILIAL'] + "' AND "
cQuery += " C6_NUM = '" + jFilter['C5_NUM'] + "'"
cQuery += " #QueryWhere# "
return cQuery
|