01. DADOS GERAIS

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

02. DESCRIÇÃO PCBROWSE

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

Configuração necessário para que seja carregada a opcao 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

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 apresentado na pagina.

funcaoQueryObrigatório

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

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)

legendasOpcional

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

campoLegendasOpcional

Campo utilizado para legenda.

tituloLegendasOpcional

Titulo da legenda.

detalhesOpcional

Json com as propriedades para ser exibido na tela de detalhes do registro. Consulte o item 03.03 Configuração de detalhes.

03.01. CONFIGURAÇÃO DE PESQUISA

É possível configurar a pesquisa simple 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 do para utilizar na busca avançada. Cada campo deve ter as propriedades property, type e label. (PoDynamicFormField)

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órioTitulo apresentado na pagina de detalhes.
tituloAbaPrincipalObrigatórioTitulo apresentado na aba principal.
camposDetalhesObrigatórioLista de campos que serão apresentados, o sistema vai utilizar o titulo da SX3. Se informar ffieldsDetalhes essa propriedade é ignorada.
fieldsDetalhesOpcionalArray de json com os campos do browse. Cada campo deve ter as propriedades property, type e label. (PoTableColumn)
tituloAbaItensObrigatórioTitulo apresentado na aba itens.
funcaoQueryItensObrigatórioUser funcion que vai retornar a query dos itens.
tabelaItensObrigatórioAlias dos itens.
colunasObrigatório

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

fieldsObrigatório

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

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.


Parâmetros disponibilizados no ponto de entrada:

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


Retorno do ponto de entrada:

A função deve retornar a query personalizada:


TipoObrigatoriedadeDescrição
CaractereObrigatório

Query personalizada para listagem dos registros do menu customizado.

  • 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.


Parâmetros disponibilizados no ponto de entrada:

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:


TipoObrigatoriedadeDescrição
CaractereObrigatório

Query personalizada para listagem dos registros do menu customizado.

  • 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

#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_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

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

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


User function PCQRY01()
	local aSA1   := Paramixb[1] //{{"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 += "("

	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