01. DATOS GENERALES


Producto

Línea de producto: 

Segmento:

Módulo:SIGAFIN - FINANCIERO
Función:
RutinaNombre TécnicoFecha
FINA998.APPAplicativo de TOTVS Recibo (Front-end)
FINA998.PRWAplicativo de TOTVS Recibo (Back-end)
 
FINA998A.PRWLlamada de servicios por ADVPL
GETCONTENTINI.SERVICE.TLPPServicio para obtener las configuraciones iniciales
FINANCIAL-TITLES.CONTROLLER.TLPPControlador para obtener los títulos financieros
FINANCIAL-TITLES.SERVICE.TLPPServicio para obtener los títulos financieros
SAVE-RECEIPT.SERVICE.TLPPServicio para guardar los recibos
País:Todos
Ticket:N/A
Requisito/Story/Issue (informe el requisito vinculado):DMINA-23387


02. 
DESCRIPCIÓN

Se requiere habilitar el punto de entrada F998VALBX el cual tiene el objetivo de habilitar la opción de "Descuento por pronto pago" en la ventana "Edición de cobro" y realizar un descuento al título seleccionado por un porciento (%).


03. INFORMACIÓN ADICIONAL

Se realizan cambios en los siguientes fuentes:

Importante

La solución estará presente en el patch de expedición continua (fin_recibo_mi) con fecha  superior  al 01/08/2024, para un funcionamiento correcto de la solución compilar de la siguiente manera:

  1. Patch de la issue
  2. Patch de expedición continua superior a la fecha 01/08/2024.



  1. Por medio del módulo configurador (SIGACFG) damos de alta los siguientes campos
    1. E1_XPERDES - En el cual se guardara el descuento aplicado al título.
      1. Campo = E1_XPERDES.
      2. Tipo = Numerico.
      3. Tamaño = 5
      4. Decimal = 2
      5. Formato = @99.99
      6. Contexto = Real
      7. Propiedad = Modificar
      8. Nombre = Desc. PP
    2. E1_XCONDPP - En donde se indica la condición de pago.
      1. Campo = E1_XCONDPP.
      2. Tipo = Caracter.
      3. Tamaño = 3
      4. Decimal = 0
      5. Formato = @!
      6. Contexto = Real
      7. Propiedad = Modificar
      8. Nombre = Cond. PP
    3. E4_XDESCON - En el cual se guardara el límite de descuento aplicado al título.
      1. Campo = E4_XDESCON.
      2. Tipo = Numerico.
      3. Tamaño = 5
      4. Decimal = 2
      5. Formato = @99.99
      6. Contexto = Real
      7. Propiedad = Modificar
      8. Nombre = Lim Desc. PP
  1. Realizar un respaldo del repositorio (RPO).
  2. Aplicar el paquete de expedición continua Financiero - Totvs Recibo MI con fecha del o posterior.  
  3. Aplicar el parche correspondiente al issue DMINA-23387.
  4. Validar que las rutinas actualizadas en el repositorio, coincidan con las descritas en el encabezado del presente Documento Técnico, así como las fechas.
  5. Crear la función de usuario "Descuento por pronto pago" (F998VALBX) el cual retornará un objeto Json con las siguientes opciones:
    1. Nombre del campo nuevo a mostrar.
    2. Deshabilitar o habilitar el campo de descuento, multa o interés.
    3. Habilitar o deshabilitar el campo "Descuento por pronto pago".
  6. Compilar el PE F998NRG1 el cual llame la función de usuario U_TAFINE45().
  7. Dentro del módulo Financiero ejecutar la rutina TOTVS Recibo (Actualizaciones | Cuentas por cobrar).
  8. En la rutina de Clientes (MATA030), ubicada en el módulo Financiero (Actualizaciones | Archivos) registré un cliente.

  9. En la rutina de Productos (MATA010), ubicada en el módulo Facturación (Actualizaciones | Archivos), incluir un nuevo producto.

  10. En la rutina de Tipos de Entrada y Salida (MATA080), ubicada en el módulo Facturación (Actualizaciones | Archivos), incluir una TES de salida.
  11. En la rutina de Facturaciones (MATA467N), ubicada en el módulo de Facturación (Actualizaciones | Facturaciones) generamos una factura que genere un título financiero al cliente configurado anteriormente.
  1. Ingresar a la rutina TOTVS Recibo; SIGAFIN - Actualizaciones | Cuentas por Cobrar | TOTVS Recibo.

    1. Ingresar a la opción Nuevo Recibo.

      1. Informe el encabezado del recibo con los datos configurados anteriormente y damos clic en "Extraer Títulos". 

      2. Localizamos el título generado anteriormente y damos clic en "Editar cobro".
        1. Verificamos que se visualice el nuevo campo configurado "Descuento por pronto pago".
        2. Verificamos que se realice la lógica matemática adecuadamente proporcionada al descuento.
      3. Agregamos una forma de pago por el valor restante del título financiero.
      4. Guardamos el recibo:
        1. Verificamos que el valor se haya guardado correctamente en el campo configurado en el PE.
  2. Actualización de la función de usuario U_TAFINE45() en el PE F998NRG1, para la generación de la NCC al momento de guardar el recibo.

    Hay que adaptar la manera de obtener la información del recibo y/o títulos en la función de usuario TAFINE45(), ya que en la nueva rutina de TOTVS Recibo no hay variables privadas como aCols.

    • El objeto Json obtiene los siguientes objetos:
      • Encabezado - Valores ingresados en el encabezado del recibo.
      • Títulos - Array de valores con los datos de cada título seleccionado.
      • Monedas - Array con los valores de cada moneda registrada.
      • Formas de pago - Array de valores por cada una de las formas de pago registradas en el recibo.
      • Params - Parámetros registrados en el sistema.
    • Ejemplo para obtener el descuento por pronto pago en el título seleccionado es de la siguiente manera:
      • oJson['titulos'][1]['percentDiscount'], en donde se busca el descuento por pronto pago del título número uno del objeto títulos.


DescripciónActualizaciones
Nombre del programa fuente:FINANCIAL-TITLES.SERVICE.TLPP
Parámetros recibidos
NombreTipoDescripción
PARAMIXB[1]OSi el parámetro PARAMIXB[2] == .T. trae un objeto json con la información del título seleccionado.
Si el parámetro PARAMIXB[2] == .F. trae un objeto json con toda la información del recibo.
PARAMIXB[2]LTrue (.T.) si es momento del guardado y False (.F.) si es configuración de la vista
Punto de entrada:F998VALBX
Respuesta:

Objeto json con las siguientes opciones:

Nombre

Tipo

Descripción

Obligatorio

oJson['label']L

Nombre del campo nuevo a mostrar.

Si
oJson['disabledDiscount']LDeshabilitar o habilitar el campo de descuento.Si
oJson['disabledInterest']LDeshabilitar o habilitar el campo de Intereses.Si
oJson['disabledFine']LDeshabilitar o habilitar el campo de Multa.Si
oJson['disabledInput']LDeshabilitar o habilitar el input nuevoSi
oJson['maxDiscount']NSe informa el descuento permitido debe tener un rango mayor a 0 y menor a 100Si
oJson['warningMaxDiscount']C Mensaje personalizado por si se excede el descuento permitido, si no se informa el front mandará uno por defaultNo
#Include 'Protheus.ch'

User Function F998VALBX()

    Local oResponse := JsonObject():New() as Object
    
    IF PARAMIXB[2]  //Vista 
        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']      := .T.//Deshabilitar o habilitar el input nuevo
        oResponse['maxDiscount']        := 50 //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
    ELSE 
       SaveData(PARAMIXB[1]) //Grabación
    ENDIF

Return oResponse

/*/{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 

04. ASUNTOS RELACIONADOS