SUBROUTINE CalcSaisieArret (CodeContrat,NetAPayer,PeriodePaie,MontSaisieArret)

*************************************************************** 
* Subroutine de calcul du montant de saisie/arrt sur salaire *
* aot 1999                                                   *
* Vanessa                                                     * 
*************************************************************** 

IF NetAPayer <= 0 THEN
   MontSaisieArret=0
   RETURN
END

EXECUTE "SET-THOUS ."
EXECUTE "SET-DEC ,"
EXECUTE "DATE.FORMAT"
OPEN "","OPPOSITION" TO F.OPPOSITION ELSE RETURN
OPEN "","CIVILAIDANT" TO F.CIVILAIDANT ELSE RETURN
OPEN "","SAISIEARRET" TO F.SAISIEARRET ELSE RETURN
OPEN "","PERIODESPAIE" TO F.PERIODESPAIE ELSE RETURN

ENR_OPPOSITION = ""
W_TrancheSaisieMaj = ""
W_RequeteOpposition=""
W_Temp = 0
W_CountPrio1 = 0
W_CountPrio2 = 0
W_MontantARecouvrer = 0
W_MontantARecouvrer1 = 0
W_MontantARecouvrer2 = 0
W_Reste = 0
MontSaisieArret = 0
W_TempSommeSaisi = 0

 * lecture du fichier OPPOSITION

   i=1
   W_Fini = "FAUX"
   l=1
   READ ENR_PERIODESPAIE FROM F.PERIODESPAIE,"1" ELSE ENR_PERIODESPAIE=""

   LOOP
      W_CleOpposition = CodeContrat:i "R%2"
      READ ENR_OPPOSITION FROM F.OPPOSITION,W_CleOpposition ELSE W_Fini = "VRAI"

   WHILE W_Fini = "FAUX" DO

* Debut modif MicHael le 08/11 : ajour des quatres lignes ci dessous pour gerer nouvelles oppo
      IF (ENR_OPPOSITION<23> = "" AND ENR_OPPOSITION<19> = "") THEN
	ENR_OPPOSITION<23> = ENR_OPPOSITION<18>
	WRITE ENR_OPPOSITION ON F.OPPOSITION,W_CleOpposition
      END
* Fin modif 08/11


      GOSUB 400

      W_DateFin=ICONV("01/":ENR_PERIODESPAIE<2>[5,2]:"/":ENR_PERIODESPAIE<2>[1,4],"D4/")-1
      IF ENR_OPPOSITION<23> > 0 AND (ENR_OPPOSITION<3> = "" OR ENR_OPPOSITION<3> > W_DateFin) THEN
         GOSUB 100
      END
      i=i+1
   REPEAT



   IF W_RequeteOpposition # "" THEN

      READ ENR_CIVILAIDANT FROM F.CIVILAIDANT,CodeContrat[1,5] ELSE ENR_CIVILAIDANT=""

      * compte le nombre de personnes  charge
      W_NbrePersChg = DCOUNT(ENR_CIVILAIDANT<23>,CHAR(253))  

      READ ENR_SAISIEARRET FROM F.SAISIEARRET,"1" ELSE ENR_SAISIEARRET=""
      W_Majoration = W_NbrePersChg * ENR_SAISIEARRET<4>

      * calcule la somme potentiellement saisissable
      W_Count = DCOUNT(ENR_SAISIEARRET<2>,CHAR(253))
      W_Temp = 0

      FOR j = 1 TO W_Count
         W_TrancheSaisieMaj <j> = ENR_SAISIEARRET <2,j>  + W_Majoration

        IF W_TrancheSaisieMaj<j> < NetAPayer THEN 
            IF j=1 THEN
               W_Temp = W_Temp + ((W_TrancheSaisieMaj<j>) * (ENR_SAISIEARRET<3,j>/100))/100
            END ELSE
               W_Temp = W_Temp + ((W_TrancheSaisieMaj<j>-W_TrancheSaisieMaj<j-1>) * (ENR_SAISIEARRET<3,j>/100))/100
	        END
			
        END ELSE
			IF j=1 THEN
               W_Temp = W_Temp + ((NetAPayer) * (ENR_SAISIEARRET<3,j>/100))/100    
			END ELSE
               W_Temp = W_Temp + ((NetAPayer-W_TrancheSaisieMaj<j-1>) * (ENR_SAISIEARRET<3,j>/100))/100
			END
			
            EXIT
         END
      NEXT j

      W_SommeSaisissable = INT(W_Temp+(1/2))

      * calcule le nombre d'oppositions de mme priorit
      * et le montant total pour la mme priorit
      i=1
      LOOP 
      UNTIL W_RequeteOpposition<i,2> = "" DO
         IF W_RequeteOpposition<i,2> = "1" THEN
            W_CountPrio1 = W_CountPrio1 + 1
            W_MontantARecouvrer1 = W_MontantARecouvrer1 + W_RequeteOpposition<i,3>
         END ELSE
            W_CountPrio2 = W_CountPrio2 + 1
            W_MontantARecouvrer2 = W_MontantARecouvrer2 + W_RequeteOpposition<i,3>
         END
         i=i+1
      REPEAT
	
      W_SauvePriorite = "1"
      GOSUB 200
      IF W_CountPrio2 > 0 AND MontSaisieArret < W_SommeSaisissable THEN
         W_SauvePriorite = "2"
         GOSUB 200
      END

   END

RETURN

*****************************************************************************************
* Remplit le tableau dynamique des oppositions tries par priorit

100

   IF ENR_OPPOSITION<17> = "1" THEN

      W_RequeteOpposition = INSERT(W_RequeteOpposition,l;W_CleOpposition)
      W_RequeteOpposition = REPLACE(W_RequeteOpposition,l,2;ENR_OPPOSITION<17>)
      W_RequeteOpposition = REPLACE(W_RequeteOpposition,l,3;ENR_OPPOSITION<18>)
      W_Existe = "FAUX"

      W_RequeteOpposition = REPLACE(W_RequeteOpposition,l,4;ENR_OPPOSITION<23>)

      l=l+1
   END ELSE
      W_Rang = DCOUNT(W_RequeteOpposition,CHAR(254))

      W_RequeteOpposition = REPLACE(W_RequeteOpposition,W_Rang+1,1;W_CleOpposition)
      W_RequeteOpposition = REPLACE(W_RequeteOpposition,W_Rang+1,2;ENR_OPPOSITION<17>)
      W_RequeteOpposition = REPLACE(W_RequeteOpposition,W_Rang+1,3;ENR_OPPOSITION<18>)

      W_Existe = "FAUX"

      W_RequeteOpposition = REPLACE(W_RequeteOpposition,W_Rang+1,4;ENR_OPPOSITION<23>)

   END

RETURN

*****************************************************************************************
* Rpartit la somme potentiellement saisissable au prorata du montant  recouvrer

200

   IF W_SauvePriorite = "1" THEN
      W_Count = W_CountPrio1
      W_MontantARecouvrer = W_MontantARecouvrer1
   END ELSE
      W_Count = W_CountPrio2
      W_MontantARecouvrer = W_MontantARecouvrer2
   END

   IF W_Count > 1 THEN

      FOR i = 1 TO W_Count
         IF W_SauvePriorite = "2" THEN
            i = i + W_CountPrio1
         END


         W_SommeAPrelever = W_RequeteOpposition<i,4>
         
         IF W_Count <> i THEN
            W_MontantPreleve = (INT((W_RequeteOpposition<i,3> * W_SommeSaisissable) / W_MontantARecouvrer+(1/2))) + W_Reste
         END ELSE
            W_MontantPreleve=W_SommeSaisissable-MontSaisieArret
         END
     
         IF W_SommeAPrelever < W_MontantPreleve THEN
            W_Reste = W_MontantPreleve - W_SommeAPrelever
            W_MontantPreleve = W_SommeAPrelever 
         END ELSE
            IF W_Reste # 0 THEN
               W_MontantPreleve = W_MontantPreleve + W_Reste
               W_Reste = 0
            END
         END
         GOSUB 300

         IF W_SauvePriorite = "2" THEN
            i = i - W_CountPrio1
         END

      NEXT i
      i=i-1
   END ELSE
      IF W_SauvePriorite = "2" THEN
         i = i + W_CountPrio1
      END ELSE
         i = 1
      END
      W_SommeAPrelever = W_RequeteOpposition<i,4>
      
      W_TempSommeSaisi = W_SommeSaisissable
      IF W_Reste # 0 THEN
         W_TempSommeSaisi = W_Reste
      END

      IF W_TempSommeSaisi > W_SommeAPrelever THEN
         W_MontantPreleve = W_SommeAPrelever
         W_Reste = W_TempSommeSaisi - W_SommeAPrelever
      END ELSE
         W_MontantPreleve = W_TempSommeSaisi
      END
      GOSUB 300
   END

RETURN

*****************************************************************************************
* Mise  jour du fichier OPPOSITION

300

   READ ENR_OPPOSITION FROM F.OPPOSITION,W_RequeteOpposition<i,1> ELSE ENR_OPPOSITION=""

   W_CountAtt19 = DCOUNT(ENR_OPPOSITION<19>,CHAR(253))
   IF W_CountAtt19 = 0 THEN

      ENR_OPPOSITION = INSERT(ENR_OPPOSITION,19,1;PeriodePaie)
      ENR_OPPOSITION = INSERT(ENR_OPPOSITION,20,1;INT(W_MontantPreleve))
      ENR_OPPOSITION = INSERT(ENR_OPPOSITION,21,1;"")   

   END ELSE

      FOR j = W_CountAtt19 TO 1 STEP -1
 
         IF ENR_OPPOSITION<19,j> = PeriodePaie THEN
            ENR_OPPOSITION = REPLACE(ENR_OPPOSITION,20,j;INT(W_MontantPreleve))
            ENR_OPPOSITION = REPLACE(ENR_OPPOSITION,21,j;"")
            EXIT       
         END ELSE

            IF ENR_OPPOSITION<19,j> < PeriodePaie THEN
               ENR_OPPOSITION = INSERT(ENR_OPPOSITION,19,j+1;PeriodePaie)
               ENR_OPPOSITION = INSERT(ENR_OPPOSITION,20,j+1;INT(W_MontantPreleve))
               ENR_OPPOSITION = INSERT(ENR_OPPOSITION,21,j+1;"")     
               EXIT  
            END
         END

      NEXT j
   END

   MontSaisieArret = MontSaisieArret + INT(W_MontantPreleve)

   ENR_OPPOSITION<23> = ENR_OPPOSITION<23> - W_MontantPreleve 

   WRITE ENR_OPPOSITION ON F.OPPOSITION,W_RequeteOpposition<i,1>

RETURN

*****************************************************************************************
* Supprime les priodes de prlvement sur les oppositions restantes

400
      k = DCOUNT(ENR_OPPOSITION<19>,CHAR(253))

      IF PeriodePaie = ENR_OPPOSITION<19,k> THEN
         ENR_OPPOSITION<23> = ENR_OPPOSITION<23> + ENR_OPPOSITION<20,k>
         ENR_OPPOSITION = DELETE(ENR_OPPOSITION,19,k)
         ENR_OPPOSITION = DELETE(ENR_OPPOSITION,20,k)
         ENR_OPPOSITION = DELETE(ENR_OPPOSITION,21,k)
         WRITE ENR_OPPOSITION ON F.OPPOSITION,W_CleOpposition
      END

RETURN
