Calculo vencimiento con clientes de dia de pago fijo.

Retalls de codi, trucs ràpids

Calculo vencimiento con clientes de dia de pago fijo.

EntradaAutor: 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 l’usuari
Jesus-DBFile
 
Entrades: 176
Membre des de: 10 abr. 2008, 19:56
Ubicació: Valencia, España

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

EntradaAutor: 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 l’usuari
ialbizu
 
Entrades: 200
Membre des de: 11 abr. 2008, 09:09
Ubicació: Zaragoza, España

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

EntradaAutor: 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 l’usuari
Jesus-DBFile
 
Entrades: 176
Membre des de: 10 abr. 2008, 19:56
Ubicació: Valencia, España

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

EntradaAutor: ialbizu » 17 abr. 2008, 09:36

Jesus-DBFile ha escrit: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 l’usuari
ialbizu
 
Entrades: 200
Membre des de: 11 abr. 2008, 09:09
Ubicació: Zaragoza, España

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

EntradaAutor: 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 l’usuari
Jesus-DBFile
 
Entrades: 176
Membre des de: 10 abr. 2008, 19:56
Ubicació: Valencia, España

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

EntradaAutor: Alquimista » 23 gen. 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 l’usuari
Alquimista
 
Entrades: 269
Membre des de: 11 abr. 2008, 09:02
Ubicació: Pamplona - Navarra - España

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

EntradaAutor: 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.
Alquimista l’ha editat per darrera vegada el dia: 01 feb. 2009, 21:59, en total s’ha editat 1 vegada.
Avatar de l’usuari
Alquimista
 
Entrades: 269
Membre des de: 11 abr. 2008, 09:02
Ubicació: Pamplona - Navarra - España

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

EntradaAutor: 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 l’usuari
Alquimista
 
Entrades: 269
Membre des de: 11 abr. 2008, 09:02
Ubicació: Pamplona - Navarra - España

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

EntradaAutor: 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
 
Entrades: 1
Membre des de: 29 des. 2010, 01:38


Torna a: Retalls de codi



Qui està connectat

Usuaris navegant en aquest fòrum: No hi ha cap usuari registrat i 1 visitant

cron