Calcul 45 jours fin de mois

Résolu
opbrun Messages postés 4 Date d'inscription jeudi 7 avril 2011 Statut Membre Dernière intervention 12 avril 2011 - 7 avril 2011 à 01:39
opbrun Messages postés 4 Date d'inscription jeudi 7 avril 2011 Statut Membre Dernière intervention 12 avril 2011 - 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.
A voir également:

6 réponses

007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
7 avril 2011 à 14:39
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))
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
12 avril 2011 à 18:44
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 
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
7 avril 2011 à 14:53
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))
0
opbrun Messages postés 4 Date d'inscription jeudi 7 avril 2011 Statut Membre Dernière intervention 12 avril 2011
11 avril 2011 à 01:31
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
opbrun Messages postés 4 Date d'inscription jeudi 7 avril 2011 Statut Membre Dernière intervention 12 avril 2011
11 avril 2011 à 01:59
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;
}
0
opbrun Messages postés 4 Date d'inscription jeudi 7 avril 2011 Statut Membre Dernière intervention 12 avril 2011
12 avril 2011 à 20:55
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;
}
0
Rejoignez-nous