Calcul 45 jours fin de mois [Résolu]

opbrun 4 Messages postés jeudi 7 avril 2011Date d'inscription 12 avril 2011 Dernière intervention - 7 avril 2011 à 01:39 - Dernière réponse : opbrun 4 Messages postés jeudi 7 avril 2011Date d'inscription 12 avril 2011 Dernière intervention
- 12 avril 2011 à 20:55
bonjour,

j'utilise ms CRM 4.0 et tente d'utiliser java script pour personnaliser certains formulaires. voici mon problème :
onjour,

je cherche à rédiger un petit programme me permettant de faire le calcul, à partir d'une date d'émission de facture, de la date de règlement attendue selon que cette échéance de paiement est due :

- à 45 jours fin de mois (soit +45 jours par rapport à la date de l'émission de la facture, la date recherchée est ensuite celle correspondant au dernier jour du mois résultant de ce premier calcul - correspond à la fonction fin.mois sur XL)
- à 60 jours calendaires (soit +60 jours par rapport à la date d'émission de facture)
- à vue ( = la date d'émission de la facture)

on utilise un menu déroulant qui détermine le cas à utiliser (45j fdm, 60j ou à vue)
on utilise un premier champ qui contient la date d'emission de la facture
on affiche le résultat du calcul dans un deuxième champ

encore merci d'avance.
Afficher la suite 

Votre réponse

6 réponses

007Julien 279 Messages postés mercredi 22 septembre 2010Date d'inscription 8 janvier 2014 Dernière intervention - 7 avril 2011 à 14:39
+3
Utile
Même si le formalisme est un peu lourd, l'utilisation de l'objet Date facilite ce genre de calcul ici effectué à partir de la date d'ouverture de la page (tdy comme to day). Seule précaution retrancher -45 ou -60 jours pour être certain d'ajouter (javascript concatène souvent à mauvais escient)

var tdy=new Date();
var an=tdy.getFullYear(),mo=tdy.getMonth(),jr=tdy.getDate();

var tdy45=new Date(an,mo,jr-(-45));
var an45=tdy.getFullYear(),mo45=tdy45.getMonth(),jr45=tdy45.getDate();

var tdy60=new Date(an,mo,jr-(-60));
var an60=tdy.getFullYear(),mo60=tdy60.getMonth(),jr60=tdy60.getDate();

var ms='janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novemenbre,décenmbre'.split(/,/g);

function chnDte(a,m,j){
 return j+(j==1?'er ':' ')+ms[m]+' '+a
}
alert("Aujourd'hui "+chnDte(an,mo,jr)+'\n'+"à 45 jours "+chnDte(an45,mo45,jr45)+'\n'+"à 60 jours "+chnDte(an60,mo60,jr60))


S'il fallait écrire une fonction ajoutant un délai à une date donnée, celle-ci pourrait être la suivante

var ms='janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novemenbre,décenmbre'.split(/,/g);

function chnDtePls(a,m,j,d){
var dt=new Date(a,m,j-(-d)),ad=dt.getFullYear(),md=dt.getMonth(),jd=dt.getDate();
return jd+(jd==1?'er ':' ')+ms[md]+' '+ad
}
var j=14,m=6,a=2011;// attention les mois sont décalés en javascript m=0 janvier
alert(chnDte(a,m,j)+"\nà 45 jours "+chnDtePls(a,m,j,45)+"\nà 60 jours "+chnDtePls(a,m,j,60))
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de 007Julien
007Julien 279 Messages postés mercredi 22 septembre 2010Date d'inscription 8 janvier 2014 Dernière intervention - 12 avril 2011 à 18:44
+3
Utile
La méthode Date permet d'ajouter ou de retrancher des délais variables exprimés en années, en mois ou en jours à une date donnée. Elle est inutile pour trouver le premier jour du mois suivant un mois donné puisque le quantième et le mois sont alors connus.

Par contre, elle trouve toute son utilité pour trouver la veille, c'est-à-dire, le dernier jour du mois précédent dont le quantième peut varier entre 28, 29, 30 et 31.

Pour calculer la date 45 jours fin de mois, on effectue d'abord le calcul à 45 jours pour trouver l'échéance. Connaissant alors le mois et l'année d'échéance, on recherche alors le jour zéro du mois suivant (qui précédant algébriquement le 1 du mois suivant sera le dernier du mois d'échéance).

// Calcul à 45 jours
var tdy45= new Date(an,mo,jr-(-45));
var an45=tdy.getFullYear(),mo45=tdy45.getMonth(),jr45=tdy45.getDate();

// Calcul du dernier jour du mois mo45 de l'année an45
// Ajouter 1 au mois et fixer le quantième à zéro
// Pour trouver le quantième jd
jd=new Date(an45,mo45-(-1),0).getDate();

La fonction proposée chnDtePls(a,m,j,d,f), vise à éviter simplement de refaire les calcul avec différentes données, elle comporte 5 arguments (le dernier étant facultatif) qui sont l'année a , le mois m, le jour j et le délai d ainsi qu'un booléen f (qui lorsqu'il est présent et non nul calcule la date fin de mois) et retourne une chaîne de caractères décrivant en clair la date demandée. Différents appels de fonction sont donnés en exemple dans la chaîne proposée.

// Ainsi avec 
var j =14,m=6,a=2011;

var chnDt45=chnDte(a,m,j,45) //  donne la date à 45 jours
var chnDt45Fin=chnDtePls(a,m,j,45,1) // donne la date à 45 jours fin de mois 
var chnDt60=chnDte(a,m,j,60) //  donne la date à 60 jours
var chnDt60Fin=chnDtePls(a,m,j,60,1) // donne la date à 60 jours fin de mois 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de 007Julien
007Julien 279 Messages postés mercredi 22 septembre 2010Date d'inscription 8 janvier 2014 Dernière intervention - 7 avril 2011 à 14:53
0
Utile
J'ai oublié le fin de mois ! « The last but not the least »

En javascript, le dernier jour du mois est le jour zéro du mois suivant. D'où une nouvelle fonction avec un 5ème argument (non nul) pour la fin de mois.

var ms='janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novemenbre,décenmbre'.split(/,/g);

function chnDtePls(a,m,j,d,f){
var dt=new Date(a,m,j-(-d)),ad=dt.getFullYear(),md=dt.getMonth(),jd=dt.getDate();
if (f) jd=new Date(a,md-(-1),0).getDate();
return jd+(jd==1?'er ':' ')+ms[md]+' '+ad
}

var j=14,m=6,a=2011;// attention les mois sont décalés en javascript m=0 janvier
alert(chnDte(a,m,j)+"\nà 45 jours "+chnDtePls(a,m,j,45)+"\nà 45 jours fin de mois "+chnDtePls(a,m,j,45,1)+"\nà 60 jours "+chnDtePls(a,m,j,60))
Commenter la réponse de 007Julien
opbrun 4 Messages postés jeudi 7 avril 2011Date d'inscription 12 avril 2011 Dernière intervention - 11 avril 2011 à 01:31
0
Utile
Bonsoir,

un tout grand merci pour votre réponse mais elle ne répond pas tout à fait à ma demande. Ainsi, j'ai un premier champ qui s'appelle "new_emissionfacture" qui contient la date de départ (celle de l'émission de ma facture).
j'ai un deuxième champ qui s'appelle "new_echeancedatereglement" qui est le champ objet du calcul.
je dois pouvoir choisir le cas (0, 30, 45j fdm ou 60)jours selon le cas à l'aide d'une liste déroulante qui s'appelle "paymenttermcode".

Pour le moment, je progresse pas à pas et la date d'emission de la facture + 45j s'affiche bien (dernière ligne du code joint)à l'aide de ce premier bout de code :

j'ai donc modifié comme suit le script :
var dateemission=crmForm.all.new_emissionfacture.DataValue;
var an=dateemission.getYear(),mo=dateemission.getMonth(),jr=dateemission.getDate();
var tdy45=new Date(an,mo,jr-(-45));
var an45=dateemission.getYear(),mo45=tdy45.getMonth(),jr45=tdy45.getDate();
var tdy60=new Date(an,mo,jr-(-60));
var an60=dateemission.getYear(),mo60=tdy60.getMonth(),jr60=tdy60.getDate();

crmForm.all.new_echeancedatereglement.DataValue=tdy45

Il me reste maintenant à trouver une méthode de calcul simple pour la fin du mois correspondant à la date retournée par tdy45 (je n'ai pas bien compris le coup de la fonction). Par exemple si tdy45 = 18/05/11, alors tdy45FDM doit retourner : 31/05/11 ou 1/6/11 ce qui est plus simple et revient au même.

en vous remerciant par avance (une nouvelle fois)
Commenter la réponse de opbrun
opbrun 4 Messages postés jeudi 7 avril 2011Date d'inscription 12 avril 2011 Dernière intervention - 11 avril 2011 à 01:59
0
Utile
J'ai à nouveau simplifié et ajouté la sélection du cas de figure correspondant avec la sélection du cas de figure en utilisant la liste déroulante, voici ce que cela donne, ça marche très bien. Il ne me manque plus maintenant que le calcul des 45 FDM (voir mon post précédent) :
var dateemission=crmForm.all.new_datedereglement.DataValue;
var an=dateemission.getYear(),mo=dateemission.getMonth(),jr=dateemission.getDate();
var tdy30=new Date(an,mo,jr-(-30));
var tdy45=new Date(an,mo,jr-(-45));
var tdy60=new Date(an,mo,jr-(-60));

switch(crmForm.all.paymenttermscode.DataValue) {

case "17":
crmForm.all.new_echeancedatereglement.DataValue=crmForm.all.new_datedereglement.DataValue;
break;
case "1":
crmForm.all.new_echeancedatereglement.DataValue=tdy30;
break;
case "4":
crmForm.all.new_echeancedatereglement.DataValue=tdy45;
break;
case "10":
crmForm.all.new_echeancedatereglement.DataValue=tdy60;
break;
}
Commenter la réponse de opbrun
opbrun 4 Messages postés jeudi 7 avril 2011Date d'inscription 12 avril 2011 Dernière intervention - 12 avril 2011 à 20:55
0
Utile
bonjour et merci pour toutes vos réponse, voici comment j'ai résolu mon problème :

var dateemission=crmForm.all.new_emissionfacture.DataValue;
var an=dateemission.getYear(),mo=dateemission.getMonth(),jr=dateemission.getDate();
var tdy30=new Date(an,mo,jr-(-30));
var tdy45=new Date(an,mo,jr-(-45));
var tdy60=new Date(an,mo,jr-(-60));

function LastDayOfMonth(Year, Month)
{
return new Date(Year, Month+1, 0).getDate();
}
var an45=tdy45.getYear(),mo45=tdy45.getMonth(), jr45=tdy45.getDate();
var tdy45fdm = new Date(an45,mo45, LastDayOfMonth(an45, mo45));

switch(crmForm.all.paymenttermscode.DataValue)
{
case "17":
crmForm.all.new_echeancedatereglement.DataValue=crmForm.all.new_emissionfacture.DataValue;
break;
case "1":
crmForm.all.new_echeancedatereglement.DataValue=tdy30;
break;
case "4":
crmForm.all.new_echeancedatereglement.DataValue=tdy45fdm;
break;
case "10":
crmForm.all.new_echeancedatereglement.DataValue=tdy60;
break;
}
Commenter la réponse de opbrun

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.