01. DATOS GENERALES

Línea de producto:

Microsiga Protheus®

Segmento:

Backoffice

Módulo:

Financiero

Idiomas:

Portugués, Español

Función: 

Portal del cliente

02. DESCRIPCIÓN

Atenção

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.

03. CONFIGURACIÓN

Parámetros puestos a disposición en el punto de entrada:


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

  • property: string con el nombre del campo.
  • type: string con el tipo del campo (Tipos aceptados: currency, date, number, string).
  • label: string que contiene el título del campo.

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.


03.01. CONFIGURACIÓN DE BÚSQUEDA

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

  • property: string con el nombre del campo.
  • type: string con el tipo de campo (Tipos aceptados: currency, date, number, string).
  • label: string que contiene el título del campo.

03.02. CONFIGURACIÓN DE DETALLES

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

  • property: string con el nombre del campo.
  • type: string con el tipo de campo (Tipos aceptadoss: date, number, string).
  • label: string que contiene el título del campo.
  • divider: string con el título para la definición de la sección (Los campos agregados después de este, formarán parte de esta división/sección).

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

  • property: string con el nombre del campo.
  • type: string con el tipo do campo (Tipos aceptados: date, number, string).
  • label: string que contiene el título del campo.

04. USER FUNCTION QUERY

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. 

funcaoQuery recibe los parámetros: 

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

funcaoQueryItens recibe los parámetros: 

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'}"

Devolución del punto de entrada:

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.

05. EJEMPLO DE UTILIZACIÓN

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