Línea de producto: | Microsiga Protheus® |
Segmento: | Backoffice |
Módulo: | Financiero |
Idiomas: | Portugués |
Función: | Portal del cliente |
El punto de entrada se liberó por medio del paquete de expedición continua del módulo Financiero después del mes de octubre. |
El punto de entrada PCBROWSE permite incluir opciones de menú para el listado de ítems personalizados en el Portal del cliente - SIGAFIN.
El punto de entrada debe devolver un array con el json de configuración de cada menú que desea agregar.
PARAMIXB | Tipo | Descripción |
1º Posición | Character | Usuario de login del Portal del cliente. |
Configuración necesaria para que se cargue la opción de menú en el portal del cliente. Si alguna información obligatoria, función de usuario informada no compilada o error de ejecución ocurriera, no se cargará el menú.

Propiedad | Obligatoriedad | Descripción |
tituloMenu | Obligatorio | Título mostrado en el menú. |
iconeMenu | Opcional | Ícono para el menú. Lista de íconos PO UI que pueden utilizarse en esta propiedad. https://po-ui.io/guides/icons |
tituloPagina | Obligatorio | Titulo mostrado en la página. |
funcaoQuery | Obligatorio | Nombre de la User Function que devolverá la query para buscar los datos. |
orderQuery | Opcional | Campo en el cual se basará el orden de la tabla. |
tabla | Obligatorio | Alias de la tabla utilizada para tratamiento interno. |
columnas | Es obligatorio si no se envían fields | Array de campos del browse, el sistema utilizará el título de la SX3. Si se informan fields, se ignorará esta propiedad. |
fields | Opcional | Array de json con los campos del browse. Cada campo debe tener las propiedades property, type y label (PoTableColumn):
|
leyeendas | Opcional | Configuración de las leyendas. Array de json con las propiedades value, color y label. (labels del PoTableColumnLabel) |
campoLegendas | Opcional | Campo utilizado para leyenda. |
tituloLegendas | Opcional | Título de la leyenda. |
detalles | Opcional | Json con las propiedades para que se muestre en la pantalla de detalles del registro. Consulte el ítem 03.02 Configuración de detalles. |
Es posible configurar la búsqueda simple y avanzada por medio de la configuración:
Propiedad | Obligatoriedad | Descripción |
campoBusca | Opcional | Campo para búsqueda rápida. |
camposBuscaAvancada | Opcional | Lista de campos para búsqueda avanzada, el sistema utilizará el título de la SX3. Si se informa fieldsBuscaAvancada , se ignorará esta propiedad. |
fieldsBuscaAvancada | Opcional | Array de json con los campos para utilizar en la búsqueda avanzada. Cada campo debe tener las propiedades property, type y label (PoDynamicFormField):
|
Si se configuran los detalles, se muestra en el ítem la opción "visualizar" para la exhibición de las informaciones y el listado de ítems.


Propiedad | Obligatoriedad | Descripción |
tituloPagina | Obligatorio | Título que se muestra en la página de detalles. |
tituloAbaPrincipal | Obligatorio | Título que se muestra en la solapa principal. |
camposDetalhes | Obligatorio | Lista de campos que se mostrarán, el sistema utilizará el título de la SX3. Si se informa fieldsDetalhes , se ignorará esta propiedad. |
fieldsDetalhes | Opcional | Array de json con los campos del browse. Cada campo debe tener las propiedades property, type y label (PoTableColumn):
|
orderQueryItens | Opcional | Campo en el cual se basará el orden de la tabla. |
tituloAbaItens | Opcional | Título que se muestra en la solapa Ítems. |
funcaoQueryItens | Es obligatorio si se informa tituloAbaItens | User Funcion que devolverá la query de los ítems. |
tabelaItens | Es obligatorio si se informa tituloAbaItens | Alias dos itens. |
columnas | Es obligatorio si se informa tituloAbaItens | Lista de campos del browse, el sistema utilizará el título de la SX3. Si se informa fields , se ignorará esta propiedad. |
fields | Es obligatorio si se informa tituloAbaItens | Array de json con los campos del browse. Cada campo debe tener las propiedades property, type y label (PoTableColumn):
|
La función pasada en la propiedad 'funcaoQuery' y 'funcaoQueryItens' se llamará por el Portal del cliente para que devuelva la query personalizada que se utilizará en la búsqueda de los ítems.
PARAMIXB | Tipo | Descripción |
1º Posición | Array | Contiene un Array con las claves (SUCURSAL+CÓDIGO+TIENDA) de los clientes seleccionados en el portal. Cada posición del Array contiene un objeto Json con las propiedades: sucursal, código y tienda. |
2º Posición | Carácter | Usuario de login del Portal del cliente |
PARAMIXB | Tipo | Descripción |
1º Posición | Array | Contiene un Array con las claves (SUCURSAL, CÓDIGO, TIENDA) de los clientes seleccionados en el portal. Cada posición del Array contiene un objeto Json con las propiedades: sucursal, código y tienda. |
2º Posición | Carácter | Usuario de login del Portal del cliente |
2º Posición | Json | Json de la línea seleccionada en el formato "{ Campo: Valor} " Ej.: "{E1_FILIAL: '01', E1_NUM: '000001'}" |
La función debe devolver la query personalizada:
Deben utilizarse los Id:
#QueryFields# Campos del SELECT, existe tratamiento para el FIELDS en el QueryParam
#QueryWhere# Condiciones del WHERE, existe tratamiento para FILTER en el QueryParam
Tipo | Obligatoriedad | Descripción |
Carácter | Obligatorio | Query personalizada para listado de los registros del menú personalizado. |
#Include 'Protheus.ch'
/*/{Protheus.doc} PCBROWSE
Punto de entrada para incluir opciones de menú en el Portal del cliente
@type function
@return array, array de configuración
/*/
User Function PCBROWSE()
Local cUser := PARAMIXB[1] as Character // Codigo del usuario conectado al portal.
Local aMenu := {} as Array
AAdd(aMenu, MENU1()) // ejemplo utilizando columnas SX3
AAdd(aMenu, MENU2()) // ejemplo configurando fields
Return aMenu
/*/{Protheus.doc} MENU1
Configuración del menú
@type function
@return json, configuración del browse
/*/
Static Function MENU1()
Local jMenu := JsonObject():new() as Json
Local jDetalhes := JsonObject():new() as Json
//título presentado en el menú
jMenu['tituloMenu'] := 'Pedidos1'
//ícono para el menú, lista de icones https://po-ui.io/guides/icons
jMenu['iconeMenu'] := 'po-icon po-icon-manufacture'
//título presentado en la página
jMenu['tituloPagina'] := 'Mis Pedidos1'
//user funcion que devolverá la query de búsqueda
jMenu['funcaoQuery'] := 'PCQRY01'
//campo que se ordenará
jMenu['orderQuery'] := 'C5_EMISSAO DESC'
//alias de la tabla utilizada para tratamientos internos
jMenu['tabela'] := 'SC5'
//lista de campos del browse, el sistema utilizará el título de la SX3. Si se informan fields, se ignorará esta propiedad
jMenu['colunas'] := {'c5_filial', 'c5_condpag', 'c5_num', 'c5_vend1', 'c5_nota', 'c5_emissao'}
//configuración de leyeendas, array con value, color y 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 búsqueda rápida, si se informa fieldBusca se ignorará esta propiedad
jMenu['campoBusca'] := 'c5_num'
//lista de campos para búsqueda avanzada, el sistema utilizará el título de la SX3. Si se informa fieldsBuscaAvancada se ignorará esta propiedad
jMenu['camposBuscaAvancada'] := {'c5_filial', 'c5_vend1', 'c5_nota', 'c5_emissao', 'c5_transp'}
//ejemplo de configuración de detalles
//título presentado en la página de detalles
jDetalhes['tituloPagina'] := 'Detalles del pedido'
//título presentado en la solapa principal
jDetalhes['tituloAbaPrincipal'] := 'Datos generales'
//lista de campos que se presentarán, el sistema utilizará el título de la SX3. Si se informa fieldsDetalhes se ignorará esta propiedad
jDetalhes['camposDetalhes'] := {'c5_num','c5_tipo', 'c5_nota', 'c5_emissao', 'c5_vend1', 'c5_tabela', 'c5_cliente', 'c5_lojacli', 'c5_transp', 'c5_frete', 'c5_seguro',}
//título presentado en la solapa ítem
jDetalhes['tituloAbaItens'] := 'Productos'
//user funcion que devolverá la query de los ítems
jDetalhes['funcaoQueryItens'] := 'PCITEM'
//campo que se ordenará
jDetalhes['orderQueryItens'] := 'c6_item desc'
//alias de los ítems
jDetalhes['tabelaItens'] := 'SC6'
//lista de campos del browse, el sistema utilizará el título de la SX3. Si se informa fields se ignorará esta propiedad
jDetalhes['colunas'] := {'c6_item', 'c6_produto', 'c6_descri', 'c6_qtdven', 'c6_prcven', 'c6_valor'}
jMenu['detalhes'] := jDetalhes
Return jMenu
/*/{Protheus.doc} MENU2
Configuración del menú utilizando las propiedades fields
@type function
@return json, configuración browse
/*/
Static Function MENU2()
Local jMenu := JsonObject():new() as Json //Json con las propiedades esperadas.
Local jDetalhes := JsonObject():new() as Json
jMenu['tituloMenu'] := 'Pedidos2'
jMenu['iconeMenu'] := 'po-icon po-icon-manufacture'
jMenu['tituloPagina'] := 'Mis Pedidos2'
jMenu['funcaoQuery'] := 'PCQRY01'
jMenu['orderQuery'] := 'C5_DATA1 ASC'
jMenu['tabela'] := 'SC5'
//lista de campos del browse, utilizado cuando no se quiere usar datos de la SX3.
//debe ser un array de json con las propiedades property, type y label
jMenu['fields'] := {}
AAdd(jMenu['fields'], prepareField("c5_filial" , "string", "Sucursal del 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 pago"))
AAdd(jMenu['fields'], prepareField("c5_nota" , "string", "Fact"))
//campo para búsqueda rápida, utilizado cuando no se quiere usar datos de la SX3.
//debe ser un array de json con las propiedades property, type y label
jMenu['fieldBusca'] := prepareField("c5_num", "string", "Búsqueda por pedido")
//lista de campos para búsqueda avanzada, el sistema utilizará el título de la SX3. Si se informa fieldsBuscaAvancada se ignorará esta propiedad
jMenu['fieldsBuscaAvancada'] := {}
AAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_emissao", "date" , "Fecha"))
AAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_filial" , "string", "Sucursal"))
AAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_nota" , "string", "Fact"))
AAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_num" , "string", "Pedido"))
//ejemplo de configuración de detalles
//título presentado en la página de detalles
jDetalhes['tituloPagina'] := 'Detalles del pedido'
//título presentado en la solapa principal
jDetalhes['tituloAbaPrincipal'] := 'Datos generales'
//Utiliza las propiedades PoDynamicViewField do po-dynamic-view poui. https://po-ui.io/documentation/po-dynamic-view
jDetalhes['fieldsDetalhes'] := {}
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_num' , 'string', 'Pedido' , 'Datos' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tipo' , 'string', 'Tipo de pedido' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_nota' , 'string', 'Factura' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_emissao', 'date' , 'Fecha' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_vend1' , 'string', 'Vendedor' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tabela' , 'string', 'Lista de precios' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_cliente', 'string', 'Código', 'Comprador' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_lojacli', 'string', 'Tienda' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_transp' , 'string', 'Cód Emp Transportes', 'Entrega' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_frete' , 'string', 'Valor de flete' ))
AAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_seguro' , 'string', 'Valor de seguro' ))
//título presentado en la solapa ítems
jDetalhes['tituloAbaItens'] := 'Productos'
//user funcion que devolverá la query de los ítems
jDetalhes['funcaoQueryItens'] := 'PCITEM'
//alias de los ítems
jDetalhes['tabelaItens'] := 'SC6'
//lista de campos del browse, debe ser un array de json con las propiedades property, type y 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' , 'Cantidad'))
AAdd(jDetalhes['fields'], prepareField('c6_prcven' , 'currency', 'Precio'))
AAdd(jDetalhes['fields'], prepareField('c6_valor' , 'currency', 'Valor'))
jMenu['detalhes'] := jDetalhes
Return jMenu
/*/{Protheus.doc} prepareField
función auxiliar para preparar las propiedades del field
@type function
@param cCampo, character, campo
@param cTipo, character, tipo (string, date, number)
@param cTitulo, character, título
@param cDivisor, character, título del divisor (utilizado en los 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
función auxiliar para preparar las propiedades de la leyenda
@type function
@param cValor, character, valor
@param cCor, character, cor
@param cTitulo, character, label
@return variant, rconfiguracao de leyenda
/*/
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 los ítems del 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 del 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 los 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 los detalles del ítem del PE PCBROWSE
@type function
@return character, query
/*/
User Function PCITEM()
Local aSA1 := Paramixb[1] // Clientes
Local cUser := Paramixb[2] // Login del portal
Local jFilter := Paramixb[3] // Línea seleccionada para los detalles
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 |