Árvore de páginas

01. DADOS GERAIS

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

02. DESCRIÇÃO

Atençã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 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.

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.

PropriedadeObrigatoriedadeDescrição
tituloMenuObrigatório

Título 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

Título apresentado na página.

funcaoQueryObrigatório

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

orderQueryOpcional

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

tabelaObrigatório

Alias da tabela utilizada para tratamento interno.

colunasObrigató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.

fieldsOpcional

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: 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)

campoLegendasOpcional

Campo utilizado para legenda.

tituloLegendasOpcional

Título da legenda.

detalhesOpcional

Json com as propriedades para ser exibido na tela de detalhes do registro. 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
campoBuscaOpcional

Campo para busca rápida.

camposBuscaAvancadaOpcional

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 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ções e listagem de itens.

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, o sistema vai utilizar o titulo da SX3. Se informar fieldsDetalhes essa propriedade é ignorada.
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: 

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

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.

05. EXEMPLO DE UTILIZAÇÃO

PCBROWSE
#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(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
FUNCTION QUERY
#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