**********************************************************
*  calcul du tableau d'amortissement
*  Programme chaine  partir d'un projet VB
*  Vanessa
*  octobre 1999
**********************************************************

* Ouvertures des fichiers
EXECUTE "SET-THOUS ."
EXECUTE "SET-DEC ,"
EXECUTE "DATE.FORMAT"
OPEN "","TEMPO" TO F.TEMPO ELSE PRINT "OUVERTURE TEMPO" ;* en lecture criture
*********************************************************
* initialisation des variables


*********************************************************
* Recuperation des arguments

PROCREAD ARGUMENTS ELSE STOP
W_CodeImmo=FIELD(ARGUMENTS," ",2)
W_Type=FIELD(ARGUMENTS," ",3)
W_DateAcq=FIELD(ARGUMENTS," ",4)
W_Duree=FIELD(ARGUMENTS," ",5)
W_ValeurAcq=FIELD(ARGUMENTS," ",6)
W_Cumul=FIELD(ARGUMENTS," ",7)
W_FinExer=FIELD(ARGUMENTS," ",8)
W_DateCession=FIELD(ARGUMENTS," ",9)
*********************************************************
* PROGRAMME PRINCIPAL

   READ ENR_TEMPO FROM F.TEMPO,"IMMO":W_CodeImmo ELSE ENR_TEMPO=""
   IF W_Cumul = W_ValeurAcq THEN
      WRITE ENR_TEMPO ON F.TEMPO,"IMMO":W_CodeImmo
      STOP
   END
   W_DateAcqEx = OCONV(W_DateAcq,"D4/")
   IF W_Type = "D" THEN
      W_AnLimite = W_DateAcqEx[7,4]+W_Duree-1
      W_DateLimite = "31/12/":W_AnLimite
   END ELSE
      IF W_DateAcqEx[1,5] = "01/01" THEN
         W_AnLimite = W_DateAcqEx[7,4]+W_Duree-1
         W_DateLimite = "31/12/":W_AnLimite
      END ELSE
         W_AnLimite = W_DateAcqEx[7,4]+W_Duree
         W_DateLimite = W_DateAcqEx[1,6]:W_AnLimite
      END
   END
   W_DateLimite = ICONV(W_DateLimite,"D4/")
   IF W_DateCession = "" THEN W_DateCession = 0
   IF W_DateCession > W_DateLimite THEN
      W_DateCession = 0
   END
   IF W_Type = "L" THEN
      GOSUB 100
   END ELSE
      IF W_Type = "D" THEN
         GOSUB 200
      END
   END
   WRITE ENR_TEMPO ON F.TEMPO,"IMMO":W_CodeImmo
STOP

*****************************************************************************
*  Si amortissement de type linaire
100

   IF W_DateCession = 0 THEN
      W_Passage = W_Duree-1
   END ELSE
      W_DateCessionEx = OCONV(W_DateCession,"D4/")
      W_DateAcqEx = OCONV(W_DateAcq,"D4/")
      W_Passage = W_DateCessionEx[7,4]-W_DateAcqEx[7,4]-1
      IF W_Passage < 0 THEN
         W_Passage = 0
      END
      IF W_Passage > W_Duree-1 THEN
         W_Passage = W_Duree-1
      END
   END

   W_TauxC = INT(10000/W_Duree)
   W_Annee = W_DateAcqEx[7,4]
   W_DebDateAcq = "01/01/":W_Annee
   W_DebDateAcq = ICONV(W_DebDateAcq,"D4/")
   W_FinDateAcq = "31/12/":W_Annee
   W_FinDateAcq = ICONV(W_FinDateAcq,"D4/")
   W_TotJour = W_FinDateAcq - W_DebDateAcq + 1 
   IF W_DateCession # 0 THEN
      IF W_DateCessionEx[7,4] = W_DateAcqEx[7,4] THEN
         W_NbJour = W_DateCession-W_DateAcq+1
      END ELSE
         W_NbJour = W_FinDateAcq-W_DateAcq+1
      END
   END ELSE
      W_NbJour = W_FinDateAcq-W_DateAcq+1
   END
   W_AnnuiteC = INT((W_ValeurAcq * W_TauxC/10000)+1/2)
   W_Amort = INT((W_AnnuiteC * W_NbJour/W_TotJour)+1/2)
   IF W_Cumul = "" THEN W_Cumul = 0
   IF W_Cumul = 0 THEN
      ENR_TEMPO<1,1> = W_Annee
      ENR_TEMPO<2,1> = W_ValeurAcq
      ENR_TEMPO<3,1> = W_Amort
      ENR_TEMPO<4,1> = W_ValeurAcq-W_Amort
      ENR_TEMPO<5,1> = W_DateAcq
      ENR_TEMPO<6,1> = W_FinDateAcq
      IF INT(ENR_TEMPO<2,1>) < INT(ENR_TEMPO<3,1>) THEN
         ENR_TEMPO<3,1>=ENR_TEMPO<2,1>
         ENR_TEMPO<4,1>=0
      END
      i=2
   END ELSE
      IF W_FinExer = W_Annee THEN
         ENR_TEMPO<1,1> = W_Annee
         ENR_TEMPO<2,1> = "000"
         ENR_TEMPO<3,1> = "000"
         ENR_TEMPO<4,1> = W_ValeurAcq-W_Cumul
         ENR_TEMPO<5,1> = W_DateAcq
         ENR_TEMPO<6,1> = W_FinDateAcq
         W_Cumul=0
         i=2
      END ELSE
         i=1
      END
   END
   FOR k = 1 TO W_Passage
      W_Annee = W_Annee + 1
      IF W_Cumul = 0 THEN
         ENR_TEMPO<1,i> = W_Annee
         ENR_TEMPO<2,i> = W_ValeurAcq
         IF k=W_Passage AND W_DateAcqEx[1,5]="01/01" AND W_DateCession=0 THEN
            ENR_TEMPO<3,i> = ENR_TEMPO<4,i-1>
            ENR_TEMPO<4,i> = "000"
         END ELSE
            ENR_TEMPO<3,i> = W_AnnuiteC
            ENR_TEMPO<4,i> = ENR_TEMPO<4,i-1>-W_AnnuiteC
         END
         W_DatDeb = "01/01/":W_Annee
         W_DatDeb = ICONV(W_DatDeb,"D4/")
         ENR_TEMPO<5,i> = W_DatDeb
         W_DatFin = "31/12/":W_Annee
         W_DatFin = ICONV(W_DatFin,"D4/")
         ENR_TEMPO<6,i> = W_DatFin
         IF INT(ENR_TEMPO<2,i>) < INT(ENR_TEMPO<3,i>) THEN
            ENR_TEMPO<3,i>=ENR_TEMPO<2,i>
            ENR_TEMPO<4,i>=0
         END
         i=i+1
      END ELSE
         IF W_FinExer = W_Annee THEN
            ENR_TEMPO<1,i> = W_Annee      
            ENR_TEMPO<2,i> = "000"  
            ENR_TEMPO<3,i> = "000"  
            ENR_TEMPO<4,i> = W_ValeurAcq - W_Cumul
            W_DatDeb = "01/01/":W_Annee
            W_DatDeb = ICONV(W_DatDeb,"D4/")              
            ENR_TEMPO<5,i> = W_DatDeb
            W_DatFin = "31/12/":W_Annee
            W_DatFin = ICONV(W_DatFin,"D4/")
            ENR_TEMPO<6,i> = W_DatFin
            i=i+1
            W_Cumul=0
         END
      END
   NEXT k
   IF W_DateAcqEx[1,5] = "01/01" AND W_DateCession = 0 THEN
      RETURN
   END
   IF W_DateCession # 0 THEN
      IF W_DateCessionEx[7,4] = W_DateAcqEx[7,4] THEN
	 RETURN
      END
   END
   W_Annee = W_Annee + 1
   ENR_TEMPO<1,i> = W_Annee  
   ENR_TEMPO<2,i> = W_ValeurAcq
   W_DatDeb = "01/01/":W_Annee
   W_DatDeb = ICONV(W_DatDeb,"D4/")              
   ENR_TEMPO<5,i> = W_DatDeb
   IF W_DateLimite > W_DateCession AND W_DateCession # 0 THEN
      W_DatFin = W_DateCession
      W_Borne = "31/12/":W_Annee
      W_Borne = ICONV(W_Borne,"D4/")
      W_TotJour = W_Borne - W_DatDeb + 1
      W_NbJour = W_DatFin - W_DatDeb + 1
      W_Amort = INT((W_AnnuiteC * W_NbJour / W_TotJour)+1/2)
      ENR_TEMPO<3,i> = W_Amort
      ENR_TEMPO<4,i> = ENR_TEMPO<4,i-1> - W_Amort
   END ELSE
      W_DatFin = W_DateLimite
      ENR_TEMPO<3,i> = ENR_TEMPO<4,i-1>
      ENR_TEMPO<4,i> = "000"
   END
   ENR_TEMPO<6,i> = W_DatFin
   IF INT(ENR_TEMPO<2,i>) < INT(ENR_TEMPO<3,i>) THEN
      ENR_TEMPO<3,i>=ENR_TEMPO<2,i>
      ENR_TEMPO<4,i>=0
   END

   RETURN

*****************************************************************************
*  Si amortissement de type dgressif
200

   W_TauxC = INT(10000/W_Duree)
   IF W_DateAcq < 12055 THEN
      IF W_Duree = 3 OR W_Duree = 4 THEN
         W_Coeff = 15
      END ELSE
         IF W_Duree = 5 OR W_Duree = 6 THEN
            W_Coeff = 20
         END ELSE
            W_Coeff = 25
         END
      END
   END ELSE
      IF W_Duree = 3 OR W_Duree = 4 THEN
         W_Coeff = "12.5"
      END ELSE
         IF W_Duree = 5 OR W_Duree = 6 THEN
            W_Coeff = "17.5"
         END ELSE
            W_Coeff = "22.5"
         END
      END	
   END

   IF W_DateCession # 0 THEN
      W_DateCessionEx = OCONV(W_DateCession,"D4/")
      W_AnDateCession = W_DateCessionEx[7,4]
   END ELSE
      W_AnDateCession = 0
   END
   W_TauxD = W_TauxC * W_Coeff
   W_Annee = W_DateAcqEx[7,4]
   W_MoisAcq = W_DateAcqEx[4,2]
   IF W_DateCession # 0 THEN
      IF W_DateCessionEx[7,4] = W_Annee THEN
         W_NbMois = W_DateCessionEx[4,2]-W_MoisAcq+1
      END ELSE
         W_NbMois = 12-W_MoisAcq+1
      END
   END ELSE
      W_NbMois = 12-W_MoisAcq+1
   END
   W_AnnuiteD = INT((W_ValeurAcq * W_TauxD / 100000)+1/2)
   W_Amort = INT((W_AnnuiteD * W_NbMois/12)+1/2)
   IF W_Cumul = "" THEN W_Cumul = 0
   IF W_Cumul = 0 THEN
      ENR_TEMPO<1,1> = W_Annee
      ENR_TEMPO<2,1> = W_ValeurAcq
      ENR_TEMPO<3,1> = W_Amort
      ENR_TEMPO<4,1> = W_ValeurAcq-W_Amort
      W_DatDeb = "01/":W_DateAcqEx[4,7]
      W_DatDeb = ICONV(W_DatDeb,"D4/")
      ENR_TEMPO<5,1> = W_DatDeb
      W_DatFin = "31/12/":W_Annee
      W_DatFin = ICONV(W_DatFin,"D4/")
      ENR_TEMPO<6,1> = W_DatFin
      IF W_DateCession # 0 THEN
         IF W_Annee = W_DateCessionEx[7,4] THEN
            RETURN
         END
      END
      IF INT(ENR_TEMPO<2,1>) < INT(ENR_TEMPO<3,1>) THEN
         ENR_TEMPO<3,1>=ENR_TEMPO<2,1>
         ENR_TEMPO<4,1>=0
      END
      i=2
   END ELSE
      IF W_FinExer = W_Annee THEN
         ENR_TEMPO<1,1> = W_Annee
         ENR_TEMPO<2,1> = "000"
         ENR_TEMPO<3,1> = "000"
         ENR_TEMPO<4,1> = W_ValeurAcq-W_Cumul
         W_DatDeb = "01/":W_DateAcqEx[4,7]
         W_DatDeb = ICONV(W_DatDeb,"D4/")
         ENR_TEMPO<5,1> = W_DatDeb
         W_DatFin = "31/12/":W_Annee
         W_DatFin = ICONV(W_DatFin,"D4/")
         ENR_TEMPO<6,1> = W_DatFin
         W_Cumul = 0
         IF W_DateCession # 0 THEN
            IF W_Annee = W_DateCessionEx[7,4] THEN
               RETURN
            END
         END
         i=2
      END ELSE
         i=1
      END
   END
   W_Fini = "NON"
   W_NbAn = 1
   LOOP
      IF i > 1 THEN
         W_AnnuiteD = INT((ENR_TEMPO<4,i-1> * W_TauxD / 100000)+1/2)
      END
      UNTIL W_Fini = "OUI" DO
         W_Annee = W_Annee + 1
         W_AnCourir = W_Duree-W_NbAn
         W_TauxC = INT(100000/W_AnCourir)
         IF W_TauxC < W_TauxD THEN
            GOSUB 300
         END ELSE
            GOSUB 400
         END
         W_NbAn = W_NbAn+1
   REPEAT
   RETURN

*****************************************************************************
*  Calcul des annuits dgressives dans l'amortissement dgressif
300

   IF W_Cumul = 0 THEN
      ENR_TEMPO<1,i> = W_Annee
      ENR_TEMPO<2,i> = ENR_TEMPO<4,i-1>
      W_DatDeb = "01/01/":W_Annee
      W_DatDeb = ICONV(W_DatDeb,"D4/")
      ENR_TEMPO<5,i> = W_DatDeb
      IF W_AnDateCession = W_Annee THEN
         W_DatFin = W_DateCession
         W_NbMois = W_DateCessionEx[4,2]
         W_Amort = INT((W_AnnuiteD * W_NbMois/12)+1/2)
         ENR_TEMPO<3,i> = W_Amort
         ENR_TEMPO<4,i> = ENR_TEMPO<2,i>-W_Amort
         W_Fini = "OUI"
      END ELSE
         W_DatFin = "31/12/":W_Annee
         W_DatFin = ICONV(W_DatFin,"D4/")
         ENR_TEMPO<3,i> = W_AnnuiteD
         ENR_TEMPO<4,i> = ENR_TEMPO<2,i>-W_AnnuiteD
      END
      ENR_TEMPO<6,i> = W_DatFin
      IF INT(ENR_TEMPO<2,i>) < INT(ENR_TEMPO<3,i>) THEN
         ENR_TEMPO<3,i>=ENR_TEMPO<2,i>
         ENR_TEMPO<4,i>=0
      END
      i=i+1
   END ELSE
      IF W_FinExer = W_Annee THEN
         ENR_TEMPO<1,i> = W_Annee
         ENR_TEMPO<2,i> = "000"
         ENR_TEMPO<3,i> = "000"
         ENR_TEMPO<4,i> = W_ValeurAcq - W_Cumul
         W_DatDeb = "01/01/":W_Annee
         W_DatDeb = ICONV(W_DatDeb,"D4/")
         ENR_TEMPO<5,i> = W_DatDeb
         W_DatFin = "31/12/":W_Annee
         W_DatFin = ICONV(W_DatFin,"D4/")
         ENR_TEMPO<6,i> = W_DatFin
         W_Cumul = 0
         i=i+1
      END
   END
   RETURN

*****************************************************************************
*  Calcul des annuits constantes dans l'amortissement dgressif
400

   IF i > 1 THEN
      W_AnnuiteC = INT((ENR_TEMPO<4,i-1> * W_TauxC/100000)+1/2)
   END
   FOR k = 1 TO W_AnCourir
      IF W_Cumul = 0 THEN
         ENR_TEMPO<1,i> = W_Annee           
         ENR_TEMPO<2,i> = ENR_TEMPO<4,i-1>
         W_DatDeb = "01/01/":W_Annee
         W_DatDeb = ICONV(W_DatDeb,"D4/")
         ENR_TEMPO<5,i> = W_DatDeb
         IF W_AnDateCession = W_Annee THEN
            W_DatFin = W_DateCession
            W_NbMois = W_DateCessionEx[4,2]
            W_Amort = INT((W_AnnuiteC * W_NbMois/12)+1/2)
            ENR_TEMPO<3,i> = W_Amort  
            ENR_TEMPO<4,i> = ENR_TEMPO<2,i>-W_Amort  
            k = W_AnCourir+1
         END ELSE
            W_DatFin = "31/12/":W_Annee
            W_DatFin = ICONV(W_DatFin,"D4/")
            ENR_TEMPO<3,i> = W_AnnuiteC
            ENR_TEMPO<4,i> = ENR_TEMPO<2,i>-W_AnnuiteC
         END
         ENR_TEMPO<6,i> = W_DatFin    
         IF INT(ENR_TEMPO<2,i>) < INT(ENR_TEMPO<3,i>) OR k = W_AnCourir THEN
            ENR_TEMPO<3,i>=ENR_TEMPO<2,i>
            ENR_TEMPO<4,i>=0
         END
         i=i+1
      END ELSE
         IF W_FinExer = W_Annee THEN
            ENR_TEMPO<1,i> = W_Annee  
            ENR_TEMPO<2,i> = "000"
            ENR_TEMPO<3,i> = "000"
            ENR_TEMPO<4,i> = W_ValeurAcq - W_Cumul
            W_DatDeb = "01/01/":W_Annee
            W_DatDeb = ICONV(W_DatDeb,"D4/")
            ENR_TEMPO<5,i> = W_DatDeb
            W_DatFin = "31/12/":W_Annee
            W_DatFin = ICONV(W_DatFin,"D4/")
            ENR_TEMPO<6,i> = W_DatFin
            W_AnnuiteC = INT((ENR_TEMPO<4,i>/(W_AnCourir-k))+1/2)
            W_Cumul=0
            i=i+1
         END
      END
      W_Annee = W_Annee + 1
   NEXT k
   W_Fini = "OUI"
   RETURN
