Á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 PCBROWSE

Aviso
titleFuncionalidade em desenvolvimento

O ponto de entrada PCBROWSE está em fase de desenvolvimento em breve entrará em testes com clientes piloto, portanto ainda não está liberada em nenhum release do Protheus!

Será liberado através de pacote de expedição acumulado do módulo financeiro em data ainda a ser informada.

Essa página poderá sofrer alterações até a data de liberação da funcionalidade!


O ponto de entrada PCBROWSE permite incluir opções de menu para listagem de itens customizados ao Portal do Cliente - SIGAFIN.

O ponto de 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 opcao 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

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

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

legendasOpcionalConfiguração das legendas.

Array de json com as propriedades  value, color e label. (labels do PoTableColumnLabel) Image Added

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 02 Configuração de detalhes.

...

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

  • property: string contendo o nome do campo.
(PoDynamicFormField)
  • 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ó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 fieldsDetalhes 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.
:
  • 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).
tituloAbaItensOpcionalTitulo apresentado na aba itens.
funcaoQueryItensObrigatório se informado tituloAbaItensUser funcion que vai retornar a query dos itens.
tabelaItensObrigatório se informado tituloAbaItensAlias tabelaItensObrigatórioAlias dos itens.
colunasObrigatório se informado tituloAbaItens

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

fieldsObrigatório se informado tituloAbaItens

Array de json com os campos do browse. Cada  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. 04. USER FUNCTION QUERY

A função passada na propriedade 'funcaoQuery'   e  e 'funcaoQueryItens' serão chamadas será chamada pelo Portal do cliente par Cliente para que retorne a query customizada para 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á Deverão ser utilizado 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

...

Bloco de código
languagejava
themeMidnight
firstline1
titlePCBROWSE
linenumberstrue
collapsetrue
#Include 'Protheus.ch'

user Function /*/{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())

Return aMenu

 // 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'] := 'PedidosPedidos1'
	//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 PedidosPedidos1'
	//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/*/{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)
	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_condpag"num'    , "string", "Forma de pagamento"'string', 'Pedido'            , 'Dados'     ))
	aAdd(jMenujDetalhes['fieldsfieldsDetalhes'], 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"'c5_tipo'   , 'string', 'Tipo do pedido'                  ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_nota'   , 'string', 'Nota'                            ))
	aAdd(jMenujDetalhes['fieldsBuscaAvancadafieldsDetalhes'], prepareField("'c5_filial"emissao', "string", "Filial"))
	aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_nota", "string", "NF"'date'  , 'Data'                            ))
	aAdd(jMenujDetalhes['fieldsBuscaAvancadafieldsDetalhes'], prepareField("'c5_num"vend1'  , "'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'] := {}', 'Vendedor'                        ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_num'    tabela' , 'string', 'Pedido'Tabela de preços'          , 'Dados'     ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tipocliente'   , 'string', 'Código'Tipo do pedido'  , 'Comprador'                ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_notalojacli'   , 'string', 'NotaLoja'                            ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_emissao', 'datetransp' , 'string', 'Código transportadora', 'Entrega'))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_frete'  , 'Datastring', 'Valor         do frete'                  ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_vend1seguro'  , 'string', 'Vendedor'Valor do seguro'                 ))

	//titulo apresentado na aba  ))itens
	aAdd(jDetalhes['fieldsDetalhestituloAbaItens'], prepareField('c5_tabela' , 'string', 'Tabela de preços'                ))
	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_cliente', 'string', 'Código', 'Comprador'             )) := '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['fieldsDetalhesfields'], prepareField('c5c6_lojacliitem'   , 'string', 'Loja'                          ,  'Item'))
	aAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_transpproduto' , 'string', 'Código transportadora', 'EntregaCódigo'))
	aAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_freteqtdven'  , 'string'  , 'Valor do frete'                  'Quantidade'))
	aAdd(jDetalhes['fields'], prepareField('c6_prcven' , 'currency', 'Preço'))
	aAdd(jDetalhes['fieldsDetalhesfields'], prepareField('c5c6_segurovalor'  , 'stringcurrency', '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 '))

	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 jFieldjStatus  := JsonObject():new() as Json
	jFieldjStatus["propertyvalue"] := cCampocValor
	jFieldjStatus["typecolor"]     := cTipocCor
	jFieldjStatus["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   := 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 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 = '" + jFilter['C5_FILIAL'] + "' AND "
    aSA1[nCli][3]+"')" 
	next
	cQuery += ")" C6_NUM 
	cQuery += '" + jFilter['C5_NUM'] + "'"
    cQuery += " #QueryWhere# "
return cQuery


User function PCQRY01()
	local aSA1#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 cQueryjFilter := ""
	local cAlias := "SC5"
	local nCli  := 1
	local cOr Paramixb[3] // Linha selecionada para os detalhes
    local cAlias := "SC6"

	    cQuery := " SELECT #QueryFields#  "
	    cQuery += " FROM " + RetSqlName(cAlias) + " " SC5+ "
	cAlias
    cQuery += " WHERE SC5  " + cAlias + ".D_E_L_E_T_ = ' ' AND "
	cQuery += "("

	for nCli := 1 to len(aSA1)
		if (nCli > 1)
			cOr := " OR "
		endIf
		cQuery +=  cOr += "(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# "
Returnreturn cQuery