Histórico da Página
...
| Producto |
| ||||||
|---|---|---|---|---|---|---|---|
| Línea de producto: |
| ||||||
| Segmento: |
| ||||||
| Módulo: | SIGAFIN - Financiero | ||||||
| Función: |
| ||||||
| País: | ArgentinaTodos | ||||||
| Ticket: | N/A | ||||||
| Requisito/Story/Issue (informe el requisito vinculado): | DMINA-25574 |
...
02. SITUACIÓN/REQUISITO
En la rutina Fina998 FINA998, cuando se realiza un descuento por pronto pago utilizando el PE F998VALBX, al colocar un pago parcial de la una factura y despues después un porcentaje de descuento, no toma el valor colocado a pagaringresado en la moneda correspondiente, toma el valor total del titulo impidiento generar limitando la funcionalidad de un pago parcilparcial.
03. SOLUCIÓN
Cambios realizados en los fuentes del aplicativo:
- Front-end de Totvs Recibo (FINA99.APP): Se modificó el
json - JSON de retorno al punto de entrada F998VALBX donde se agrega un objeto de monedas el cual lleva el monto
colcado - ingresado en cada moneda, donde el
ususario - usuario puede elegir si utiliza valor del titulo completo o el
colocado - ingresado en la moneda.
| Aviso | ||
|---|---|---|
| ||
El uso de este Punto de Entrada solo está habilitado para la versión de PO UI. |
| Totvs custom tabs box | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||
|
...
| Descripción | Actualizaciones | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Punto de entrada: | F998VALBX | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Parámetros recibidos |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Respuesta: | Descripción del objeto de respuesta cuando en el Json JSON la bandera PARAMIXB[2] es Verdadera (.T.) y la bandera ["recalculate" ] este como falsa (.F.)
Descripción del objeto de respuesta cuando en el Json JSON la bandera PARAMIXB[2] es Verdadera (.T.) y la bandera ["recalculate" ] este como True (.T.)
Descripción de los objetos de respues respuesta en el Json JSON cuando la bandera PARAMIXB[2] sea Falsa (.F.) N/A |
Ejemplo donde el descuento se calcula con el saldo total del titulo
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
| Bloco de código | ||||||||
| ||||||||
#Include 'Protheus.ch'
User Function F998VALBX()
Local oResponse := JsonObject():New() as Object
IF PARAMIXB[2] //Vista
IF PARAMIXB[1]['recalculate']
oResponse:=setValues(PARAMIXB[1])
ELSE
oResponse['label'] := "% Descuento por pronto pago" //Nombre del campo nuevo a mostrar.
oResponse['readonlyDiscount'] := .T. //Deshabilitar o habilitar el campo de descuento.
oResponse['readonlyInterest'] := .T. //Deshabilitar o habilitar el campo de Intereses.
oResponse['readonlyFine'] := .T. //Deshabilitar o habilitar el campo de Multa.
oResponse['disabledInput'] := .F.//isDisable(PARAMIXB[1]) //Deshabilitar o habilitar el input nuevo
oResponse['maxDiscount'] := 50//GetLimite(PARAMIXB[1]) //Se informa el descuento permitido debe tener un rango mayor a 0 y menor a 100
oResponse['warningMaxDiscount'] := "Descuento por Pronto Pago mayor al permitido. En esta condición el tope es:"+ALLTRIM(STR(oResponse['maxDiscount'])) //Mensaje personalizado por si se excede el descuento permitido, si no se informa el front mandara uno por default
ENDIF
ELSE
SaveData(PARAMIXB[1]) //Grabación
ENDIF
Return oResponse
/*/{Protheus.doc} setValues
Esta funcion determina los valores a mostrar en los campos de descuento, residuo, multa e interesinterés
@type function
@version
@author luis.aboytes
@since 25/7/2024
@param oJson, object, param_description
@return variant, return_description
/*/
Static Function setValues(oJson)
Local oRes := JsonObject():New() }
// El cálculo se realiza por el total del título si se utiliza el dato PARAMIXB[1]['bind']['saldo']
oRes['descuento'] // si se quiere hacer el cálculo := Round(PARAMIXB[1]['bind']['discountInput']/100*PARAMIXB[1]['bind']['saldo'],2) //Calculo con el datototal ingresado en la moneda 1 o en cualquier moneda puede
// utilizar por ejemplo PARAMIXB[1]["coins"][1]['value'] para la moneda 1.
oRes['descuento']del titulo
oRes['residuo'] := Round(PARAMIXB[1]['bind']['discountInputsaldo']/100*PARAMIXB[1]['bind']['saldo-oRes['descuento'],2MsDecimais(SE1->E1_MOEDA)) //Calculo con el total del titulo
oRes['residuomulta'] := Round(PARAMIXB[1]['bind']['saldo']-oRes['descuento'],MsDecimais(SE1->E1_MOEDA)) //Calculo con el total del titulo0
//oRes['descuentointeres'] := Round(PARAMIXB[1]['bind']['discountInput']/100*PARAMIXB[1]["coins"][1]['value'],2) //Calculo con el valor ingresado a pagar
//oRes['residuo'] := Round(PARAMIXB[1]["coins"][1]['value']-oRes['descuento'],MsDecimais(SE1->E1_MOEDA)) //Calculo con el valor ingresado a pagar
oRes['multa'] := 0
oRes['interes'] := 0
0
Return oRes
/*/{Protheus.doc} SaveData
Guardamos el dato en un campo en especifico
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function SaveData(oJsonData)
Local nCont as Numeric
For nCont := 1 to LEN(oJsonData['titulos'])
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['titulos'][nCont]['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['titulos'][nCont]['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['titulos'][nCont]['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
RecLock("SE1",.F.)
SE1->E1_XPERDES := oJsonData['titulos'][nCont]['percentDiscount']
MsUnLock()
Next
Return
/*/{Protheus.doc} GetLimite
Se retorna el limite de descuento
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function GetLimite(oJsonData)
Local nTope := 0
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
nTope:=IIF(VAZIO(Posicione("SE4", 1,xFilial("SE4")+SE1->E1_XCONDPP,"E4_XDESCON")),0,Posicione("SE4", 1,xFilial("SE4")+SE1->E1_XCONDPP,"E4_XDESCON"))
Return nTope
/*/{Protheus.doc} isDisable
Funcion que retorna si es editable o no el valor del input
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function isDisable(oJsonData)
Local lRet := .t.
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
IF SE1->E1_XCONDPP == '999'
lRet := .f.
ENDIF
Return lRet
lRet
|
Ejemplo donde el descuento se calcula con el valor ingresado en la moneda 1
| Bloco de código | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
#Include 'Protheus.ch'
User Function F998VALBX()
Local oResponse := JsonObject():New() as Object
IF PARAMIXB[2] //Vista
IF PARAMIXB[1]['recalculate']
oResponse:=setValues(PARAMIXB[1])
ELSE
oResponse['label'] := "% Descuento por pronto pago" //Nombre del campo nuevo a mostrar.
oResponse['readonlyDiscount'] := .T. //Deshabilitar o habilitar el campo de descuento.
oResponse['readonlyInterest'] := .T. //Deshabilitar o habilitar el campo de Intereses.
oResponse['readonlyFine'] := .T. //Deshabilitar o habilitar el campo de Multa.
oResponse['disabledInput'] := .F.//isDisable(PARAMIXB[1]) //Deshabilitar o habilitar el input nuevo
oResponse['maxDiscount'] := 50//GetLimite(PARAMIXB[1]) //Se informa el descuento permitido debe tener un rango mayor a 0 y menor a 100 el input nuevo
oResponse['warningMaxDiscountmaxDiscount'] := "Descuento por Pronto Pago mayor al permitido. En esta condición el tope es:"+ALLTRIM(STR(oResponse['maxDiscount'])) //Mensaje personalizado por si se excede := 50//GetLimite(PARAMIXB[1]) //Se informa el descuento permitido, sidebe notener se informa el front mandara uno por default
ENDIFun rango mayor a 0 y menor a 100
ELSE
SaveData(PARAMIXB[1]) //Grabación
ENDIF
Return oResponse
/*/{Protheus.doc} setValues
Esta funcion determina los valores a mostrar en los campos de descuento, residuo,multa e interes
@type function
@version
@author luis.aboytes
@since 25/7/2024
@param oJson, object, param_description
@return variant, return_description
/*/
Static Function setValues(oJson)
Local oRes := JsonObject():New() }
// El cálculo se realiza por el total del título si se utiliza el dato PARAMIXB[1]['bind']['saldo']
// si se quiere hacer el cálculo con el dato ingresado en la moneda 1 o en cualquier moneda puede
// utilizar por ejemplo PARAMIXB[1]["coins"][1]['value'] para la moneda 1.
//oRes['descuento'] := Round(PARAMIXB[1]['bind']['discountInput']/100*PARAMIXB[1]['bind']['saldo'],2) //Calculo con el total del titulo
//oRes['residuo'] := Round(PARAMIXB[1]['bind']['saldo']-oRes['descuento'],MsDecimais(SE1->E1_MOEDA)) //Calculo con el total del titulo
oResponse['warningMaxDiscount'] := "Descuento por Pronto Pago mayor al permitido. En esta condición el tope es:"+ALLTRIM(STR(oResponse['maxDiscount'])) //Mensaje personalizado por si se excede el descuento permitido, si no se informa el front mandara uno por default
ENDIF
ELSE
SaveData(PARAMIXB[1]) //Grabación
ENDIF
Return oResponse
/*/{Protheus.doc} setValues
Esta funcion determina los valores a mostrar en los campos de descuento, residuo,multa e interes
@type function
@version
@author luis.aboytes
@since 25/7/2024
@param oJson, object, param_description
@return variant, return_description
/*/
Static Function setValues(oJson)
Local oRes := JsonObject():New()
// El cálculo se realiza con el dato ingresado en la moneda 1 o en cualquier moneda puede
// utilizar por ejemplo PARAMIXB[1]["coins"][1]['value'] para la moneda 1.
oRes['descuento'] := Round(PARAMIXB[1]['bind']['discountInput']/100*PARAMIXB[1]["coins"][1]['value'],2) //Calculo con el valor ingresado a pagar
oRes['residuo'] := Round(PARAMIXB[1]["coins"][1]['value']-oRes['descuento'],MsDecimais(SE1->E1_MOEDA)) //Calculo con el valor ingresado a pagar
oRes['multa'] := 0
oRes['interes'] := 0
Return oRes
/*/{Protheus.doc} SaveData
Guardamos el dato en un campo en especifico
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function SaveData(oJsonData)
Local nCont as Numeric
For nCont := 1 to LEN(oJsonData['titulos'])
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['titulos'][nCont]['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['titulos'][nCont]['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['titulos'][nCont]['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
RecLock("SE1",.F.)
SE1->E1_XPERDES := oJsonData['titulos'][nCont]['percentDiscount']
MsUnLock()
Next
Return
/*/{Protheus.doc} GetLimite
Se retorna el limite de descuento
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function GetLimite(oJsonData)
Local nTope := 0
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
nTope:=IIF(VAZIO(Posicione("SE4", 1,xFilial("SE4")+SE1->E1_XCONDPP,"E4_XDESCON")),0,Posicione("SE4", 1,xFilial("SE4")+SE1->E1_XCONDPP,"E4_XDESCON"))
Return nTope
/*/{Protheus.doc} isDisable
Funcion que retorna si es editable o no el valor del input
@type function
@author luis.aboytes
@since 18/7/2024
/*/
Static Function isDisable(oJsonData)
Local lRet := .t.
SE1->(dbSetOrder(1))
SE1->(dbSeek(xFilial("SE1")+PADR(oJsonData['prefix'],GetSx3Cache("E1_PREFIXO","X3_TAMANHO"))+PADR(oJsonData['billnumber'],GetSx3Cache("E1_NUM","X3_TAMANHO"))+PADR(oJsonData['installment'],GetSx3Cache("E1_PARCELA","X3_TAMANHO"))))
IF SE1->E1_XCONDPP == '999'
lRet := .f.
ENDIF
Return lRet
|
...