créer un échéancier

Mammouth du PHP | 702 Messages

09 oct. 2012, 16:47

Bonjour à toutes et à tous,

j'essai de faire un script pour échelonner un montant, dans un premier temps sans intérêts,

j'ai donc ce formulaire ci:
<form action="#" method="post"><fieldset><legend>PARAM&Egrave;TRES DE L'&Eacute;CH&Eacute;ANCIER</legend>
     
    <br />
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td><label>Montant &agrave; &eacute;chelonner: </label><input type="text" name="montantdu" value="<?php echo $reste ; ?>" />
        &euro;<br /><label>Type: </label><select name="echeance" class="01" id="echeance" style="width:149px" required="true">
 					  <option></option>	
                      <option value="1">Annuel</option>
                      <option value="2">Semestriel</option>
                      <option value="4">Trimestriel</option>
                      <option value="6">Bimensuel</option>
                      <option value="12">Mensuel</option>
                    </select></td>
      </tr>
      <tr>
        <td><label>Montant  d'&eacute;ch&eacute;ance: </label><input  type="text" name="montantecheance" /> 
        &euro; ou<br />
        <label>Nombre d'&eacute;ch&eacute;ance: </label><input type="text" name="nombre_echeance" /><br />
        <label>D&eacute;part: </label><input type="date" name="date_depart" required="true" /><br /></td>
      </tr>
    </table>
    <input type="submit" name="enreg" value="VALIDER" /></fieldset></form>

Et donc pour le traitement j'ai pu faire ce début:
  <?php
    if(isset($_POST['enreg']))
	{
		if(empty($_POST['nombre_echeance']) AND !empty($_POST['montantecheance']))
		{
			$montantdu=$_POST['montantdu'];
			$montantecheance=$_POST['montantecheance'];
			$i=ceil($montantdu/$montantecheance);
			$i2=0;
			echo '<table style=\'width:100%\'><tr><td><b>Capital Principal</b></td><td><b>Date d\'&eacute;ch&eacute;ance</b></td><td><b>Montant de l\'&eacute;ch&eacute;ance</b></td><td><b>Capital restant d&ucirc;</b></td></td></tr>';
			while($i2<$i)
			{ 
			
				if($i2==0){$reste=$montantdu ;}else{$reste=$montantdu-$montantecheance;};
				echo '<tr><td>'.$reste.'</td><td></td><td></td><td>Ceci est une &eacute;ch&eacute;ance</td></tr>' ;
				++$i2;
			}
			echo '</table>';
		}
	}
	?>
Mais la je sèche en fait, dans la colone de gauche j'ai reste, et cela me déduit une échéance mais après cela ne me déduit plus rien.

Je suis un peu bloqué pourtant ça doit être simple, j'ai bien concaténé comme il se devait mais rien n'y fait.

Toute forme d'aide ou conseils sera grandement appréciée.

Bien à vous.

SP.

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 08:36

Il faut faire 2 calculs :
- Si as le montant, tu l'appliques en calculant la date et le reste à payer échéance par échéance
- Si tu as le nombre de mensualité, tu en déduit le montant et tu appliques le cas précédent (j'ai un trou pour le calcul d'une échéance avec intéret, mais ca doit se retrouver)

Ca permet de calculer le montant de la dernière échéance et éventuellement sa date.

Mammouth du PHP | 702 Messages

10 oct. 2012, 10:46

Bonjour,

en fait c'est pour récupérer les variables que je bloque, car j'essai de récupérer la variable précédente a chaque itération pour faire le calcul du capital restant du en fonction du capital initila mais je bloque, en fait j'arrive a faire seuelement la première soustraction pour le reste je bloque, j'ai beau essayer de concaténer la variable avec le $i mais rien n'y fait.

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 11:03

Tu initialises des tableaux :
date[0] = datePremiereEcheance - période
capitalDu[0] = capitalRestantDu
Montant[0] = montantPayé
nbEcheance = 0

while (capitalDu[nbEcheance] > 0) {
nbEcheance++
date[nbEcheance] = datePremiereEcheance[nbEcheance-1] + période
capitalDu[nbEcheance] = capitalDu[nbEcheance-1] - montantPaye + interet
Montant[nbEcheance] = montantPayé
}

Montant[nbEcheance] = Montant[nbEcheance] + capitalDu[nbEcheance]
capitalDu[nbEcheance] = 0

Tu as alors un échéancier dans 3 tableaux avec dates, capital du et un montant à payer (tu peux ajouter un tableau d'intéret)

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 11:03

post en double, désolé :oops:

Mammouth du PHP | 702 Messages

10 oct. 2012, 11:16

je vais potasser tout cela, en fait je ne savais pas qu'on pouvait initialiser des tableaux sans utiliser de balises de type input. A chaque fois je faisais mes tableaux en faisant des trucs du genre
 <input type='text' name='date[<?php echi $i ; ?>]['nomduchamp']'>
Merci beaucoup pour votre aide,
je vais potasser tout cela

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 11:28

J'ai un doute sur ma compréhension de ton problème.

Ce que je t'ai proposé correspondait à un calcul de l'échéancier à partir d'un capital restant du et d'une mensualité. Pas à partir de la saisie d'un échéancier complet.

Le principe reste, c'est à dire de créer une "ligne" fictive pour faire le traitement avec $i-1 et $i dès le début.

Mammouth du PHP | 702 Messages

10 oct. 2012, 11:31

bien le calcul se fait a partir d'informations que j'entre, comme le nombre d'échéances ou alors le montant de l'échéance en fonction de cela je m'adapterais

Mammouth du PHP | 2278 Messages

10 oct. 2012, 11:35

Petits détails
<?php
if(isset($_POST['enreg']))
{
$montantdu=$_POST['montantdu'];
$nombre_echeances = isset($_POST['nombre_echeance']) ? $_POST['nombre_echeance']: 1;
$montant_echeance= isset($_POST['montantecheance']) ? $_POST['montantecheance']: "";
print "<br>dû $montantdu nombre $nombre échéances montant $montant_echeance"
if(empty($nombre_echeances) // si le nombre d'échéances n'a pas été donné
{
if (!empty($_POST['montant_echeance'])//si le montant d'échéance est précisé on calcule le nombre d'échéances
{
$nombre_echeances = ceil ($montantdu / $montant_echeance);
}
else
{
print "calcul impossible : il faut préciser le nombre d'échéances ou le montant";
}
}
else //le nombre d'échéances a été donné
{
// on calcule le montant de l'échéance
}
//calcul et affichage commun
?>
Pour le calcul, il n'y a rien d'étonnant à ce qu'il délire. Puis alors, la présentation toujours aussi dégueulasse : tout sur la même ligne, il faut un démêloir pour s'y retrouver; variables aux noms d'une clarté éblouissante $i, $i2....
voici une suggestion
  <?php
 $nombre_echeances = 12;
 $montant_du = 11237;
 $chaine ="
 <table style='width:100%'>
 <tr>
 <th>Capital Principal</th>
 <th>Date d'&eacute;ch&eacute;ance</th>
 <th>Montant de l'&eacute;ch&eacute;ance</th>
 <th>Capital restant d&ucirc;</th>
 </tr>";
 $i2=0;
 $montant_echeance = round($montant_du / $nombre_echeances, 2);
 $reste=$montant_du ;
 while($i2 <= $nombre_echeances)
 {
                       
	if ($i2 == $nombre_echeances)
	{
		$montnt_echeance = $reste;
		$reste = 0;
	}
     $chaine .= "<tr>
     <td>$montant_du</td>
      <td>date</td>
     <td>$montant_echeance</td>
     <td>$reste</td></tr>'";
           $reste = $reste-$montant_echeance;
     $i2++;
	}
$chaine .="</table>";
print "$chaine";
        
        ?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 702 Messages

10 oct. 2012, 11:58

La présentation toujours aussi dégelasse? Je t'en prie, regarde le code initial il est correctement indenté. je vais poasser ton code, merci pour le conseil.

Mammouth du PHP | 2278 Messages

10 oct. 2012, 12:53

La présentation toujours aussi dégelasse? Je t'en prie, regarde le code initial il est correctement indenté.

La preuve:
echo '<table style=\'width:100%\'><tr><td><b>Capital Principal</b></td><td><b>Date d\'&eacute;ch&eacute;ance</b></td><td><b>Montant de l\'&eacute;ch&eacute;ance</b></td><td><b>Capital restant d&ucirc;</b></td></td></tr>';
if($i2==0){$reste=$montantdu ;}else{$reste=$montantdu-$montantecheance;};
je vais poasser ton code, merci pour le conseil.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 702 Messages

10 oct. 2012, 15:52

salut, merci pour ton aide.

J'ai un tout petit soucis au niveau des dates, comme en fait j'ai prévu une périodicité différente,

j'ai donc créé la fonction suivante:
function periode($var)
	{
		if($var=='52')
		{
			echo '+ $i2 week';
		}
		if($var=='26')
		{
			echo '+ ($i2 +1) week';
		}
		if($var=='12')
		{
			echo '+ $i2 month';
		}
		if($var=='6')
		{
			echo '+ ($i2 +1) month';
		}
		if($var=='2')
		{
			echo '+ ($i2 +6) month';
		}
		if($var=='1')
		{
			echo '+ ($i2 +12) month';
		}
		
		
	}
sauf qu'au lieu de l'interpreter en fait j'ai mis cela
$chaine .= "<tr>
     <td>$montant_du</td>
      <td>".$date = date("d-m-Y",strtotime(date("Y-m-d", strtotime($debut)) . " periode($pay_periodicity)"))."</td>
     <td>$montant_echeance</td>
     <td>$reste</td></tr>'";
           $reste = $reste-$montant_echeance;
     $i2++;
        }
$chaine .="</table>";
et puis il affiche juste le contenu de la fonction mais elle n'est pas interprétée.

j'ai essayé en concaténant également mais rien n'y fait. bien il m'affiche cela
+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month+ ($i2 +1) month

mais il n'interprete pas j'ai essayé avec eval aussi mais rien n'y fait.

Mammouth du PHP | 2278 Messages

10 oct. 2012, 17:42

calcule ta date avant de la mettre dans $chaine
$date_affichee = ton_calcul();
comme ça, tu pourras vérifier que ta date est juste
Avec ma façon deprocéder, il y a intérêt à faire comme ça même si ça marche autrement
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 702 Messages

11 oct. 2012, 07:57

salut, j'ai essayé comme tu m'as dit:

du coup j'ai fais cela:
function periode($var, $i2)
	{
		if($var=='52')
		{
			echo '"+ '.$i2.' week"';
		}
		if($var=='26')
		{
			echo '"+ ('.$i2.' +1) week"';
		}
		if($var=='12')
		{
			echo '"+ '.$i2.' month"';
		}
		if($var=='6')
		{
			echo '"+ ('.$i2.' +1) month"';
		}
		if($var=='2')
		{
			echo '"+ ('.$i2.' +6) month"';
		}
		if($var=='1')
		{
			echo '"+ ('.$i2.' +12) month"';
		}
		
		
	}
 $chaine ="
 <table style='width:100%'>
 <tr>
 <th>Capital Principal</th>
 <th>Date d'&eacute;ch&eacute;ance</th>
 <th>Montant de l'&eacute;ch&eacute;ance</th>
 <th>Capital restant d&ucirc;</th>
 </tr>";
 $i2=0;
 $montant_echeance = round($montant_du / $nombre_echeances, 2);
 $reste=$montant_du ;
 while($i2 <= $nombre_echeances)
 {
     echo  $date =date("d-m-Y", strtotime($debut) .periode($pay_periodicity, $i2));             
        if ($i2 == $nombre_echeances)
        {
                $montnt_echeance = $reste;
                $reste = 0;
        }
     $chaine .= "<tr>
     <td>$montant_du</td>
      <td>".$date."</td>
     <td>$montant_echeance</td>
     <td>$reste</td></tr>'";
           $reste = $reste-$montant_echeance;
     $i2++;
        }
$chaine .="</table>";
print "$chaine";
	
	
	}
	
mais cela n'interpète pas les dates en fait cela me renvoi

ca:
+ 0 month+ 1 month+ 2 month+ 3 month+ 4 month+ 5 month+ 6 month+ 7 month+ 8 month+ 9 month+ 10 month+ 11 month+ 12 month+ 13 month+ 14 month+ 15 month+ 16 month+ 17 month+ 18 month+ 19 month+ 20 month+ 21 month+ 22 month+ 23 month+ 24 month+ 25 month+ 26 month+ 27 month+ 28 month+ 29 month+ 30 month '''''''''''''''''''''''''''''''
Capital Principal Date d'échéance Montant de l'échéance Capital restant dû
6210.04 11-10-2012 207 6210.04
6210.04 11-10-2012 207 6003.04
6210.04 11-10-2012 207 5796.04
6210.04 11-10-2012 207 5589.04

ViPHP
ViPHP | 2577 Messages

11 oct. 2012, 09:27

Peut être :
<?PHP
function add($date,$mois,$jour) {
   $tab = date_parse_from_format('d/m/Y',$date); 
   $retour = date('d/m/Y', mktime(12,0,0,$tab['month']+$mois,$tab['day']+$jour,$tab['year'])); 
}
?>
Le 12 sert à éviter les problèmes heure été/hiver : ajout d'1jours = ajout de 23h donc perte d'1jour.

Il faut voir comment tu gères les fins de mois : 31/03 => 01/05 ou 30/04 (problème pour 28, 29, 30 et 31. Tu peux utiliser le fait que le 00/12 => 30/11.