#!/bin/bash
# monthlypmt.sh : Calcule le paiement mensuel d'une hypothèque.


#  C'est une modification du code du paquetage "mcalc" (mortgage calculator,
#+ c'est-à-dire calcul d'hypothèque), de Jeff Schmidt et Mendel Cooper
#+ (l'auteur du guide ABS).
#   http://www.ibiblio.org/pub/Linux/apps/financial/mcalc-1.6.tar.gz  [15k]

echo
echo "Étant donné le montant principal, le taux d'intérêt et la fin de l'hypothèque,"
echo "calcule le paiement mensuel."

bas=1.0

echo
echo -n "Entrez le montant principal (sans virgule) "
read principal
echo -n "Entrez le taux d'intérêt (pourcentage) "
  # Si 12%, entrez "12" et non pas ".12".
read taux_interet
echo -n "Entrez le nombre de mois "
read nb_mois


 taux_interet=$(echo "scale=9; $taux_interet/100.0" | bc) # Convertit en décimal
                 #             ^^^^^^^^^^^^^^^^^^^ Diviser par 100.
                 # "scale" détermine le nombre de décimales.

 taux_interet_tmp=$(echo "scale=9; $taux_interet/12 + 1.0" | bc)
 

 top=$(echo "scale=9; $principal*$taux_interet_tmp^$nb_mois" | bc)
                 #    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                 #    Formule standard pour calculer un intérêt.

 echo; echo "Merci d'être patient. Ceci peut prendre longtemps."

 let "mois = $nb_mois - 1"
# ==================================================================== 
 for ((x=$mois; x > 0; x--))
 do
   bot=$(echo "scale=9; $taux_interet_tmp^$x" | bc)
   bas=$(echo "scale=9; $bas+$bot" | bc)
#  bas = $(($bas + $bot"))
 done
# ==================================================================== 

# -------------------------------------------------------------------- 
#  Rick Boivie indique une implémentation plus efficace que la boucle
#+ ci-dessus, ce qui réduit le temps de calcul de 2/3.

# for ((x=1; x <= $mois; x++))
# do
#   bas=$(echo "scale=9; $bas * $taux_interet_tmp + 1" | bc)
# done


#  Puis, il est revenu avec une alternative encore plus efficace,
#+ car elle descend le temps d'exécution de 95%!

# bas=`{
#     echo "scale=9; bas=$bas; taux_interet_tmp=$taux_interet_tmp"
#     for ((x=1; x <= $mois; x++))
#     do
#          echo 'bas = bas * taux_interet_tmp + 1'
#     done
#     echo 'bas'
#     } | bc`       # Intègre une 'boucle for' dans la substitution de commande.

# --------------------------------------------------------------------------
#  D'un autre côté, Frank Wang suggère :
#  bottom=$(echo "scale=9; ($interest_rate^$term-1)/($interest_rate-1)" | bc)

#  Car
#  L'algorithme de la boucle est une somme de série géométrique de proportion.
#  La formule de la somme est e0(1-q^n)/(1-q),
#+ où e0 est le premier élément et q=e(n+1)/e(n)
#+ et n est le nombre d'éléments.
# --------------------------------------------------------------------------

 # let "paiement = $top/$bas"
 paiement=$(echo "scale=2; $top/$bas" | bc)
 # Utilise deux décimales pour les dollars et les cents.
 
 echo
 echo "paiement mensuel = \$$paiement"
    # Affiche un signe dollar devant le montant.
 echo


 exit 0

 #  Exercices :
 #    1) Filtrez l'entrée pour permettre la saisie de virgule dans le montant.
 #    2) Filtrez l'entrée pour permettre la saisie du taux d'intérêt en
 #+      pourcentage ou en décimale.
 #    3) Si vous êtes vraiment ambitieux, étendez ce script pour afficher
 #+      les tables d'amortissement complètes.
