Calculo vencimiento con clientes de dia de pago fijo.

Recortes de código. trucos rápidos

Calculo vencimiento con clientes de dia de pago fijo.

Notapor Jesus-DBFile » 14 Abr 2008, 10:23

En este caso la formula es un poco más compleja:
Dias_Pago es el dia de pago fijo que tiene el cliente.
Dias para vencimiento viene dado por su forma de pago, 30-60-90 ... dias
Los campos Dia, Mes y Año son los 3 de calculo sobre la fecha de factura.
El resultado del campo de calculo es tipo Fecha.

Case(
Dias_pago = 0 and Dias para vencimiento = 0; Fecha factura;
Dias_pago = 0 and Dias para vencimiento = ""; Fecha factura;
Dias_pago = "" and Dias para vencimiento = 0 ;Fecha factura;
Dias_pago = "" and Dias para vencimiento = "" ;Fecha factura;

Dias_pago = "" and Dias para vencimiento = 30; Fecha factura + 30;
Dias_pago = "" and Dias para vencimiento = 60; Fecha factura + 60;
Dias_pago = "" and Dias para vencimiento = 90; Fecha factura + 90;
Dias_pago = "" and Dias para vencimiento = 45; Fecha factura + 45;

Dias_pago <> "" and Mes = 12 and Dias para vencimiento = 30 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) - 11) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 12 and Dias para vencimiento = 30 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) + 1) & "/" & Año);
Dias_pago <> "" and Mes >= 11 and Dias para vencimiento = 30 and Dia > (Dias_pago) ;TextToDate(NumToText(Dias_pago) & "/" & NumToText((Mes) -10) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 11 and Dias para vencimiento = 30 and Dia > (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) + 2) & "/" & Año);

Dias_pago <> "" and Mes >= 11 and Dias para vencimiento = 60 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) - 10) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 11 and Dias para vencimiento = 60 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) + 2) & "/" & Año);
Dias_pago <> "" and Mes >= 10 and Dias para vencimiento = 60 and Dia > (Dias_pago) ;TextToDate(NumToText(Dias_pago) & "/" & NumToText((Mes) -9) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 10 and Dias para vencimiento = 60 and Dia > (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) + 3) & "/" & Año);

Dias_pago <> "" and Mes >= 10 and Dias para vencimiento = 90 and Dia > (Dias_pago) ;TextToDate(NumToText(Dias_pago) & "/" & NumToText((Mes) -8) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 10 and Dias para vencimiento = 90 and Dia > (Dias_pago); TextToDate(NumToText(Dias_pago) & "/" & NumToText(TextToNum(Mes) + 4) & "/" & Año);
Dias_pago <> "" and Mes < 10 and Dias para vencimiento = 90 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) + 3) & "/" & Año);
Dias_pago <> "" and Mes >= 10 and Dias para vencimiento = 90 and Dia <= (Dias_pago); TextToDate(Dias_pago & "/" & NumToText(TextToNum(Mes) - 9) & "/" & NumToText((Año) + 1));

Dias_pago <> "" and Mes < 12 and Dias para vencimiento = 45 and Dia <= (Dias_pago); TextToDate( NumToText(TextToNum(Dias_pago)+45) & "/" & NumToText(TextToNum(Mes) + 1) & "/" & Año);
Dias_pago <> "" and Mes = 12 and Dias para vencimiento = 45 and Dia <= (Dias_pago); TextToDate( NumToText(TextToNum(Dias_pago)+45) & "/" & NumToText(TextToNum(Mes) - 11) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes >= 11 and Dias para vencimiento = 45 and Dia > (Dias_pago) ;TextToDate( NumToText(TextToNum(Dias_pago)+45) & "/" & NumToText((Mes) -10) & "/" & NumToText((Año) + 1));
Dias_pago <> "" and Mes < 11 and Dias para vencimiento = 45 and Dia > (Dias_pago); TextToDate( NumToText(TextToNum(Dias_pago)+45) & "/" & NumToText(TextToNum(Mes) + 2) & "/" & Año);

Fecha factura)


Jesus Sanchez
Database Developer
info@dbfile.es
Avatar de Usuario
Jesus-DBFile
 
Mensajes: 176
Registrado: 10 Abr 2008, 19:56
Ubicación: Valencia, España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor ialbizu » 16 Abr 2008, 09:07

No se si lo he entendido bien, pero si lo que quieres calcular es el día de pago siguiente a las condiciones de pago(30-45-60-90), creo que hay formulas mas sencillas:

Con una customFuncion recursiva sería lo más adecuado (si dispones de ello):

vencimiento(diaPago;diasParaVencimiento;fechaFactura)

  1. si(    day( fechaFactura + diasParaVencimiento ) = diaPago;    fechaFactura + diasParaVencimiento;    vencimiento( diaPago; diasParaVencimiento + 1; fechaFactura ))


Si no tienes la posibilidad de las funciones personalizadas:

  1. Let(    f = fechaFactura + diasParaVencimiento;    f +    (        getasdate(            If(                diaPago > Day( f );                Month( f );                If( Month( f ) = 12; 1; Month( f ) + 1 );                diaPago;                If(                    diaPago < Day( f ) and Month( f ) = 12 Year( f ) + 1;                    Year( f )                ) - f            )        )    )


(Ojo lo he escrito sobre la marcha, no está comprobado que funcione.)
Avatar de Usuario
ialbizu
 
Mensajes: 200
Registrado: 11 Abr 2008, 09:09
Ubicación: Zaragoza, España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Jesus-DBFile » 16 Abr 2008, 20:20

El poner la fecha de factura segun un plazo determinado es tan facil como tu lo has puesto.

Esta formula lo que hace es poner la fecha en funcion del vencimiento (30-60-90-...) y tambien en funcion de si el cliente tiene un dia de pago fijo.

Ejemplo, un cliente paga los dias 10 de cada mes y hoy le hago una factura a 90 dias, por lo que el vencimiento no es 16/07/2008 sino el 10/08/2008.

Un saludo.
Avatar de Usuario
Jesus-DBFile
 
Mensajes: 176
Registrado: 10 Abr 2008, 19:56
Ubicación: Valencia, España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor ialbizu » 17 Abr 2008, 09:36

Jesus-DBFile escribió:Ejemplo, un cliente paga los dias 10 de cada mes y hoy le hago una factura a 90 dias, por lo que el vencimiento no es 16/07/2008 sino el 10/08/2008.


Exácto, es lo que hace las dos funciones que te he puesto. Y según leo en la ayuda: Date ( 13 ; 1 ; 2007 ) devuelve 1/1/2008 (un mes después del 1 de diciembre del 2007), se puede siplificar la formula segunda

let(
    f = fechaFactura + diasParaVencimiento;
    f +
    (
        date(
            if( diaPago > day( f ); month( f ); month( f ) + 1 );
            diaPago;
            year( f )
        ) - f
    )
)
Avatar de Usuario
ialbizu
 
Mensajes: 200
Registrado: 11 Abr 2008, 09:09
Ubicación: Zaragoza, España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Jesus-DBFile » 19 Abr 2008, 10:28

Iñaki, funciona perfecta. Con la Fucnion personalizada mucho mas sencillo.
Cuando cree este calculo era con FM6 y de las CF no se sabia nada.

Lo he probado y lo calcula bien.

Gracias por la contribucion. Salu2.
Avatar de Usuario
Jesus-DBFile
 
Mensajes: 176
Registrado: 10 Abr 2008, 19:56
Ubicación: Valencia, España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Alquimista » 23 Ene 2009, 22:00

¿Posibilidad de convertir esta función a una que maneje 3 posibles días de pago?
La repanocha sería que manejara:
fecha fra., nº de vtos., días a primer vto., días entre vtos., día de pago 1, día de pago 2, día de pago 3.

fecha fra.: 6-1-09
nº de vtos.: 3
días a primer vto.: 60
días entre vtos.: 30
día de pago 1: 5
día de pago 2: 15
día de pago 3: 30
Fechas vtos: 15-3-09, 15-4-09 y 15-5-09.
Pero esto ya sería para nota ;-)



Por otra parte, estas fórmulas siempre trabajan con días naturales:
Fecha fra.: 1-1-09
Dias vto.: 30
Dias pago: 0
Fecha vto.: 31-1-09 cuando lo normal sería esperar un 1-2-09, ¿no?
Últimamente estoy trabajando en un cliente con Unisys Mapper (además de con FM: no sé si 20mg. diarios de Omeprazol serán suficientes); éste tiene una fórmula de cálculo que te permite sumar un mes a una fecha.
Así, 1-1-09 + 1m = 1-2-09. Pero lo más sorprendente es cuando 31-1-09 + 1m = ¡28-2-09! Pero si hago 1-1-09 + 30d = 31-1-09. La instrucción distingue perfectamente cuando quieres sumar un mes o 30 días porque no es lo mismo desde el punto de vista humano.
Avatar de Usuario
Alquimista
 
Mensajes: 269
Registrado: 11 Abr 2008, 09:02
Ubicación: Pamplona - Navarra - España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Alquimista » 01 Feb 2009, 20:20

Hola.

De momento he creado una fórmula para sumar meses al estilo humano. Así, 31-1-2009 + 30 = 28-2-2009 en vez de 2-3-2009.

SumarMes ( Fecha ; NumDias )
  1. /*
  2. Ejemplo:
  3. Fecha=30-1-2009
  4. NumDias=30
  5. */
  6.  
  7. Let(
  8. [
  9. D=Day (Fecha);  //=30
  10. M=Month (Fecha);  //=1
  11. A=Year (Fecha);  //=2009
  12.  
  13. F2=NumDias+Date ( M ; 10 ; A );  //=10-2-2009
  14. M2=Month (F2);  //=2
  15. A2=Year (F2);  //=2009
  16.  
  17. F3a=30+F2;  //=10-3-2009
  18. F3b=Date ( Month (F3a) ; 1 ; Year (F3a) ) - 1;  //=28-2-2009
  19.  
  20. D2=Min ( D ; Day (F3b) );  //=28
  21. F4=Date ( M2 ; D2 ; A2 )
  22. ];
  23. F4
  24. )


Sí, ya sé, la fórmula se puede comprimir mucho más, pero de momento la dejo así para que se vea claro qué pasos hace.
Los meses se los pasamos como días: 30 días=1 mes, 60 días=2 meses, etc.
Última edición por Alquimista el 01 Feb 2009, 21:59, editado 1 vez en total
Avatar de Usuario
Alquimista
 
Mensajes: 269
Registrado: 11 Abr 2008, 09:02
Ubicación: Pamplona - Navarra - España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Alquimista » 01 Feb 2009, 21:58

Y ahora la fórmula completa contemplando tres posibles días de pago:
  1. Let(
  2. [
  3. FF=FechaFactura;
  4. DV=If ( DiasParaVencimiento < 1 ; 0 ; DiasParaVencimiento );
  5. DP1=diaPago1;
  6. DP2=diaPago2;
  7. DP3=diaPago3;
  8. f = SumarMes ( FF ; DV ); //fecha de vto. bruto
  9. F1=Let( dP= If ( DP1 < 1 ; 0 ; DP1) ; If ( dP = 0 ; f ; f +( Date( If( dP > Day( f ); Month( f ) ; Month( f ) + 1 ) ; dP; Year( f ) ) - f ) ) );
  10. F2=Let( dP= If ( DP2 < 1 ; 999 ; DP2 ) ; If ( Day (FF) = dP ; f ; f +( Date( If( dP > Day( f ); Month( f ) ; Month( f ) + 1 ) ; dP; Year( f ) ) - f ) ) );
  11. F3=Let( dP= If ( DP3 < 1 ; 999 ; DP3 ) ; If ( Day (FF) = dP ; f ; f +( Date( If( dP > Day( f ); Month( f ) ; Month( f ) + 1 ) ; dP; Year( f ) ) - f ) ) )
  12. ];
  13. Min ( F1 ; F2 ; F3 )
  14. )


Hago las variables FF, DV y DPx para que esas sean las únicas referencias a campos de la tabla. Además, eso nos permite convertir fácilmente este cálculo en una función personalizada: FechaVto ( FechaFactura ; DiasParaVto ; DiaPago1 ; DiaPago2 ; DiaPago3).
En f calculo la fecha del vto. en bruto según el cálculo natural expuesto arriba.
Calculo luego tres fechas de vto. para cada posible día de pago. Aquí uso la fórmula de ialbizu -gracias- ligeramente adaptada (y aquí sí, reducida a una sóla línea). Básicamente lo que hago es calcular dP de forma que:
- Si no hay día de pago 1 cojo la fecha f;
- Si no hay día de pago 2 ó 3 dP=999, es decir, me daría un fecha muy lejana.
Finalmente, calculo la fecha de vto. quedándome con la más próxima de las tres.

¡Hala, ya me he ganado una cena tranquila!.
Avatar de Usuario
Alquimista
 
Mensajes: 269
Registrado: 11 Abr 2008, 09:02
Ubicación: Pamplona - Navarra - España

Re: Calculo vencimiento con clientes de dia de pago fijo.

Notapor Surfer » 21 Feb 2013, 21:24

hola alquimista,
te agradeceria que me ayudaras ya que estoy intentando usar tu formula pero no me funciona del todo bien y no se si es porque estoy haciendo algo mal.
me explico: si la fecha factura es el 16/12/2012, vencimiento a 60 días y dias de pago 15 y 30 el resultado que me sale con tu formula es el 2/3/2013 cuando lo que debería salirme es el 28/2/2013.
¿hago algo mal o es un problema de la formula?
muchas gracias
saludos
Surfer
 
Mensajes: 1
Registrado: 29 Dic 2010, 01:38


Volver a Recortes de código



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron