Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Linha de Produto:Microsiga Protheus®
Segmento:Backoffice
Módulo:Financeiro
Idiomas:Português
Função: Portal do Cliente

02. DESCRIÇÃO

...

Aviso
titleAtenção

O ponto de entrada foi liberado através do pacote de expedição continua do módulo financeiro após Outubro.

O ponto de entrada PCBROWSE permite incluir menus 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, o json de cada posição do array deve conter as seguintes propriedades da seguinte forma:.

03. CONFIGURAÇÃO

Parâmetros disponibilizados no ponto de entrada:

PARAMIXB

Tipo

Descrição

1º PosiçãoCharacterUsuário de login do Portal do cliente.


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.

Image Added

PropriedadeObrigatoriedadeDescrição
tituloMenuObrigatório

Título

PropriedadeObrigatoriedadeDescrição
tituloMenuObrigatório

Titulo apresentado no menu.

iconeMenuOpcional

Ícone para o menu. Lista de ícones PO UI que podem ser usados nesta propriedade. https://po-ui.io/guides/icons

tituloPaginaObrigatório

Titulo Título apresentado na paginapágina.

funcaoQueryObrigatório

Nome da user function User Function que vai retornar a query para buscar os dados.

tabelaorderQueryOpcional

Campo no qual a ordenação da tabela vai se basear.

tabelaObrigatórioObrigatório

Alias da tabela utilizada para tratamento interno.

colunasObrigatório se não enviar fields

Lista Array de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada.

legendasfieldsOpcional

Configuração das legendas. Array com value, color e label.

campoLegendasOpcional

Campo utilizado para legenda.

tituloLegendasOpcional

Titulo da legenda.

campoBuscaOpcional

Campo para busca rápida.

camposBuscaAvancadaOpcional

Lista de campos para busca avançada, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada.

de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):

  • property: string contendo o nome do campo.
  • type: string contendo o tipo do campo (Tipos aceitos: currency, date, number, string).
  • label: string que contém o título do campo.
legendasOpcional

Configuração das legendas. Array de json com as propriedades  value, color e label. (labels do PoTableColumnLabel) Image Added

campoLegendasOpcional

Campo utilizado para legenda.

tituloLegendasOpcional

Título da legenda.

detalhesOpcionaldetalhesObrigatório

Json com as propriedades para ser exibido na tela de detalhes do registro. "jDetalhes"

...

. Consulte o item 03.02 Configuração de detalhes.


03.01. CONFIGURAÇÃO DE PESQUISA

É possível configurar a pesquisa simples e avançada através da configuração:

PropriedadeObrigatoriedadeDescrição
tituloPagina
campoBusca
ObrigatórioTitulo apresentado na pagina de detalhes
Opcional

Campo para busca rápida.

tituloAbaPrincipalcamposDetalhesObrigatório
camposBuscaAvancada
ObrigatórioTitulo apresentado na aba principal.
Opcional

Lista de campos

que serão apresentados

para busca avançada, o sistema vai utilizar o titulo da SX3. Se informar

fields Detalhes

fieldsBuscaAvancada essa propriedade é ignorada.

tituloAbaItens
fieldsBuscaAvancada Opcional

Array de json com os campos para utilizar na busca avançada. Cada campo deve ter as propriedades property, type e label (PoDynamicFormField):

  • property: string contendo o nome do campo.
  • type: string contendo o tipo do campo (Tipos aceitos: currency, date, number, string).
  • label: string que contém o título do campo.

03.02. CONFIGURAÇÃO DE DETALHES

Caso seja configurado os detalhes, será apresentado no item a opção "visualizar" para exibição de informaçõese listagem de itens.

Image AddedImage Added

PropriedadeObrigatoriedadeDescrição
tituloPaginaObrigatórioTítulo apresentado na página de detalhes.
tituloAbaPrincipalObrigatórioTítulo apresentado na aba principal.
camposDetalhesObrigatórioLista de campos que serão apresentados
ObrigatórioTitulo apresentado na aba itens.
funcaoQueryItensObrigatórioUser funcion que vai retornar a query dos itens.
tabelaItensObrigatórioAlias dos itens.
colunasObrigatórioLista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields fieldsDetalhes essa propriedade é ignorada.

03. DESCRIÇÃO 'funcaoQuery - PCQRY01'

A função passada na propriedade 'funcaoQuery' será chamada pelo portal do cliente e aguarda a query que será executada para buscar os dados do menu customizado.

...

PARAMIXB

...

Tipo

...

Descrição

...

Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja.

...

fieldsDetalhesOpcionalArray de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):
  • property: string contendo o nome do campo.
  • type: string contendo o tipo do campo (Tipos aceitos: date, number, string).
  • label: string que contém o título do campo.
  • divider: string contendo o título para definição da seção (Os campos adicionados após este farão parte desta divisão/seção).
orderQueryItensOpcionalCampo no qual a ordenação da tabela vai se basear.
tituloAbaItensOpcionalTítulo apresentado na aba itens.
funcaoQueryItensObrigatório se informado tituloAbaItensUser Funcion que vai retornar a query dos itens.
tabelaItensObrigatório se informado tituloAbaItensAlias dos itens.
colunasObrigatório se informado tituloAbaItens

Lista de campos do browse, o sistema vai utilizar o título da SX3. Se informar fields essa propriedade é ignorada.

fieldsObrigatório se informado tituloAbaItens

Array de json com os campos do browse. Cada campo deve ter as propriedades property, type e label (PoTableColumn):

  • property: string contendo o nome do campo.
  • type: string contendo o tipo do campo (Tipos aceitos: date, number, string).
  • label: string que contém o título do campo.

04. USER FUNCTION QUERY

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. 

funcaoQuery recebe os parâmetros: 

Retorno do ponto de entrada:

A função deve retornar a query personalizada:

...

Query personalizada para listagem dos registros do menu customizado.

Aviso
titleAtenção
  • A seção SELECT da query deve contar a sintaxe #QueryFields# para uso interno em sua execução.
  • A seção WHARE da query deve contar a sintaxe #QueryWhere# para uso interno em sua execução.

04. DESCRIÇÃO 'funcaoQueryItens - PCITEM'

A função passada na propriedade 'funcaoQueryItens' será chamada pelo portal do cliente e aguarda a query que será executada para buscar os dados detalhados.

...

PARAMIXB

PARAMIXB

Tipo

Descrição

1º PosiçãoArrayConté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çãoCaracterUsuário de login do Portal do cliente
3º PosiçãoJsonJson contendo os dados detalhados da linha selecionada.

Retorno do ponto de entrada:

A função deve retornar a query personalizada:

funcaoQueryItens recebe os parâmetros: 

PARAMIXB

Tipo

Descrição

1º PosiçãoArrayConté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çãoCaracterUsuário de login do Portal do cliente
2º PosiçãoJson

Json da linha selecionada no formato "{ Campo: Valor } " Ex.: "{ E1_FILIAL: '01', E1_NUM: '000001' }"


Retorno do ponto de entrada:

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


TipoObrigatoriedadeDescrição
CaractereObrigatório

Query personalizada para listagem dos registros do menu customizado

TipoObrigatoriedadeDescriçãoCaractereObrigatório

Query personalizada para listagem dos registros do menu customizado.

Aviso
titleAtenção
  • A seção SELECT da query deve contar a sintaxe #QueryFields# para uso interno em sua execução.
  • A seção WHARE da query deve contar a sintaxe #QueryWhere# para uso interno em sua execução

    .

    05. EXEMPLO DE UTILIZAÇÃO

    Bloco de código
    languagejava
    themeMidnight
    firstline1
    titlePCBROWSE
    linenumberstrue
    collapsetruetrue
    #Include 'Protheus.ch'
     
    /*/{Protheus.doc} PCBROWSE
        Ponto de entrada para adicionar opcoes de menu no Portal do cliente
        @type function
        @return array, array de configuracao
    /*/
    User Function PCBROWSE()
        Local cUser := PARAMIXB[1] as Character // Codigo do usuario logado no portal.
        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'
    
        //campo que vai ser ordenado
        jMenu['orderQuery']  := 'C5_EMISSAO DESC'
    
        //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'
    
        //campo que vai ser ordenado
        jDetalhes['orderQueryItens'] := 'c6_item desc'
    
        //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['orderQuery']   := 'C5_DATA1 ASC'
        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#Include 'Protheus.ch'
    
    user Function PCBROWSE()
    	Local aMenu := {} as Array
    
    	aAdd(aMenu, MENU1())
    	aAdd(aMenu, MENU2())
    
    Return aMenu
    
    
    Static Function MENU1()
    	Local jMenu     := JsonObject():new() as Json
    	Local jDetalhes := JsonObject():new() as Json
    	//titulo apresentado no menu
    	jMenu['tituloMenu'] := 'Pedidos'
    	//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 Pedidos'
    	//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
    
    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_numfrete'    , 'string', 'PedidoValor do frete'            , 'Dados'     ))
    	aAdd    AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tiposeguro'   , 'string', 'TipoValor do pedidoseguro'                  ))
    	aAdd( 
        //titulo apresentado na aba itens
        jDetalhes['fieldsDetalhestituloAbaItens'], := prepareField('c5_notaProdutos'
    
       , 'string', 'Nota'        //user funcion que vai retornar a query dos itens
            jDetalhes['funcaoQueryItens'] := 'PCITEM'
    
        //alias dos itens
           ))
    	aAdd(jDetalhes['fieldsDetalhestabelaItens'], prepareField('c5_emissao', := 'dateSC6'
    
      , 'Data' //lista de campos do browse, deve ser um array de json com as propriedades property, type e label
        jDetalhes['fields'] := {}
    
        ))
    	aAddAAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_vend1item'   , 'string'  , 'VendedorItem'))
        AAdd(jDetalhes['fields'], prepareField('c6_produto', 'string'  , 'Código'))
                   ))
    	aAddAAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_tabelaqtdven' , 'string'  , 'Tabela de preços'Quantidade'))
                    ))
    	aAddAAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_clienteprcven', 'string', 'Códigocurrency', 'CompradorPreço'))
                 ))
    	aAddAAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5_lojacli'c6_valor'  , 'currency', 'string', 'Loja'     Valor'))
     
        jMenu['detalhes'] := jDetalhes
    Return jMenu
     
    /*/{Protheus.doc} prepareField
        funcao auxiliar para preparar as propriedades do field
        @type function
        @param cCampo, character, ))
    	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'        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
    
    	//titulo apresentado na aba itens
    	jDetalhes['tituloAbaItens'jField["property"] := 'Produtos'
    	//user funcion que vai retornar a query dos itens
    	jDetalhes['funcaoQueryItens']cCampo
        jField["type"]     := '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
    
    Static Function prepareField(cCampo as Character, cTipocTipo
        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,)
      cDivisor as Character)
    	Local jFieldjStatus    := JsonObject():new() as Json
    	jField
        jStatus["propertyvalue"] := cCampo
    	jFieldcValor
        jStatus["typecolor"] := cCor
       := cTipo
    	jField jStatus["label"]    := cTitulo
    	if !Empty(cDivisor)
    		jField["divider"] := cDivisor
    	endIf
    Return jField
    
    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
    
    
    user function PCITEM()
        local aSA1   
    Return jStatus
    Bloco de código
    languagecpp
    themeMidnight
    firstline1
    titleFUNCTION QUERY
    linenumberstrue
    collapsetrue
    #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[12] // Clientes
        local cUser Login do portal 
    	Local cQuery := ""
    	Local cAlias := "SC5"
    	Local nCli   := 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_FILIAL1
    	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 = '" + jFilter['C5_FILIAL'] + "' AND "
        aSA1[nCli][3]+"')" 
    	Next
    
    	cQuery += ")"
    	cQuery += " C6_NUM = '" + jFilter['C5_NUM'] + "'"
        cQuery += " #QueryWhere# "
    return cQuery
    
    
    User function PCQRY01()
    	local#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] //{{"D MG    ", "000002", "02"}, {"D RJ    ", "000002", "12"}}
    	local cLogin Clientes
        Local cUser   := Paramixb[2] // Login do portal
        Local jFilter := Paramixb[23] // Login do portal
    	local cQuery := ""
    	local cAliasLinha selecionada para os detalhes
        Local cAlias  := "SC5SC6"
    	local nCli  := 1
    	local cOr := ""
    
    	
        cQuery := " SELECT #QueryFields#  "
    	    cQuery += " FROM " + RetSqlName(cAlias)cAlias) + " " + cAlias
        cQuery += " SC5WHERE  "
    	cQuery += "cAlias WHERE+ SC5".D_E_L_E_T_ = ' ' AND "
    	cQuery += "("
    
    	for nCli := 1 to len(aSA1)
    		if (nCli > 1)
    			cOr := " OR "
    		endIf
    		cQuery +=  cOrcQuery += "(SC5.C5_CLIENTE C6_FILIAL = '" + aSA1[nCli][2]jFilter['C5_FILIAL'] + "' AND SC5.C5_LOJACLI "
        cQuery += " C6_NUM = '" + aSA1[nCli][3]+"')" 
    	next
    	cQuery += ")"
    	jFilter['C5_NUM'] + "'"
        cQuery += " #QueryWhere# "
    Return cQuery