SUBROUTINE REMPLRECURSIF(RETURNVAL,W_Entree,W_Sortie)
* Nb : W_Entree contient les donnes du remplacement  tester, et W_Sortie contient le message d'avertissement resultant : 
* Contenu de W_Entree : 
* Att 1 : Cl TPSDETAILSINTERV dont il faut chercher si fait (ou doit faire) l'objet d'un remplacement
* Att 2 : Date debut de recherche
* Att 3 : Date de fin de recherche (facultative : si l'on mets une fin  activit aid, on doit traiter toutes les absences ultrieures de l'aidant qui intervenait)
* Att 4 : facultatif : cl du SAUVE-LISTE si la slection est  reprendre : ne sera jamais le cas lors d'un appel du prog par lui mme.
* Att 5 : Noms des requetes dj inscrites : ncessaire pour ne pas craser une requte de niveau suprieur !!!
* Att 6 : Nom utilisateur
* IMPORTANT : les paramtres d'appel (W_Entree, W_Sortie, RETURNVAL) ne sont pas crass , = sont persistants : ne pas les utiliser APRES un appel du prog car 
* contiendront les valeurs de la dernire excution effectue...
* Par consquent : ne jamais craser W_Sortie, toujours ajouter  la fin...

EXECUTE 'DATE.FORMAT'
EXECUTE 'SET-DEC ,'
EXECUTE 'SET-THOUS .'
*PRINT "La..."
OPEN "", "TPSREMPLACEAIDANT" TO F.TPSREMPLACEAIDANT ELSE RETURN 
OPEN "", "TPSDETAILSINTERV" TO F.TPSDETAILSINTERV ELSE RETURN
OPEN "", "ABSENCESAIDANT" TO F.ABSENCESAIDANT ELSE RETURN
OPEN "", "CIVILAIDANT" TO F.CIVILAIDANT ELSE RETURN
OPEN "", "CIVILAIDE" TO F.CIVILAIDE ELSE RETURN
OPEN "", "TPSPARAM" TO F.TPSPARAM ELSE RETURN
OPEN "","TPSTEMPO" TO F.TPSTEMPO ELSE RETURN
*PRINT "Puis la..."
CodeInterv = W_Entree<1>
DateDeb = W_Entree<2>
DateFin = W_Entree<3>

* Grgory - 19/10/07. La variable DateDeb peut potentiellement tre vide (il y a mme de forte chance pour que ce soit
* gnrablement le cas). Hors beaucoup de test sont fait en fonction de cette variable qui est cense contenir une date.
* les tests ne peuvent donc pas tre bon si l'ont compare une variable contenant une date avec DateDeb qui ne contient rien.
IF DateDeb="" THEN DateDeb=DateFin

NomRequeteOrigine = W_Entree<4>
User = W_Entree<5>

*WRITE "passe" ON F.TPSTEMPO, "RapportRemplRecursif"

W_Requete = ""

IF NomRequeteOrigine # "" THEN
   IF NomRequeteOrigine <> "AFAIRE" THEN	
	W_Entree<6> = W_Entree<4>
	W_NomReq = NomRequeteOrigine
   END ELSE
	W_Temp = 'SELECT ABSENCESAIDANT AVEC @ID = "':CodeInterv[1,5]:']" AND AVEC 2 >= "':DateDeb:'"'
	IF DateFin # "" THEN
		W_Temp = W_Temp:' AND AVEC DebAbsAidant <= "':DateFin:'"'
	END 
	
	W_NomReq = "REMPLRECURSIF":User:TIME()
	EXECUTE W_Temp
*	PRINT W_Temp
	EXECUTE 'SAUVE-LISTE ':W_NomReq
	W_Entree<6> = W_NomReq
	W_Sortie<1> = W_NomReq
   END
   *W_Entree<4> = ""
END ELSE
	W_Temp = 'SELECT ABSENCESAIDANT AVEC @ID = "':CodeInterv[1,5]:']" AND AVEC 2 >= "':DateDeb:'"'
	IF DateFin # "" THEN
		W_Temp = W_Temp:' AND AVEC DebAbsAidant <= "':DateFin:'"'
	END 
	IF W_Entree<6> # "" THEN
		W_NomReq = W_Entree<6>+1
	END ELSE
		W_NomReq = "REMPLRECURSIF":User:TIME()
	END
	EXECUTE W_Temp
*	PRINT W_Temp
	EXECUTE 'SAUVE-LISTE ':W_NomReq
END
EXECUTE 'LISTE ':W_NomReq  RETURNING MSGCODE
IF MSGCODE<1> # "209" THEN
* PRINT "Ok."
 SELECT F.ABSENCESAIDANT TO W_Requete
 W_Fin = "F"
 LOOP
 	READNEXT W_Cle FROM W_Requete ELSE W_Fin = "V"
 WHILE W_Fin = "F"
   IF W_Cle[1,5] = CodeInterv[1,5] THEN
*	PRINT "Egal"
   * test ncssaire car si modif activits aid, On a dans la slection tous les TPSREMPLACEAIDANT qui concernent l'aid, et non pas uniquement ceux de l'aidant en cours.
	READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT, W_Cle THEN
	READ ENR_TPSREMPLACEAIDANT FROM F.TPSREMPLACEAIDANT, W_Cle THEN
*		PRINT "trouve"
		i = 0
		iBis = 0
		ENRTEMP = ""
		W_Trouve = "F"
		LOOP
		i = i + 1
		WHILE ENR_TPSREMPLACEAIDANT<1,i> # "" AND W_Trouve = "F"
		   Cle1 = ENR_TPSREMPLACEAIDANT<1,i>
		   IF Cle1 = CodeInterv THEN
*				PRINT "Mis le doigt dessu"

				W_Suppr = "F"
				IF W_Cle[8,5] >= DateDeb THEN
					* On sait qu'il n'y a plus de remplacement  effectuer....
					W_Suppr = "V"
				END ELSE
					READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, CodeInterv THEN
						W_LundiDeb = CodeInterv[11,5] - MOD(CodeInterv[11,5] - 1,7)
						W_DateRef = W_LundiDeb + CodeInterv[22,1]
						LOOP WHILE W_DateRef < W_Cle[8,5]
							W_DateRef = W_DateRef + ENR_TPSDETAILSINTERV<3> * 7
						REPEAT
						IF W_DateRef < DateDeb THEN
							* L'intervention doit bien aboir lieu pdt la partie toujours valide de l'absence
							W_Suppr = "F"
						END ELSE
							* L'intervention n'aura pas lieu pendant le reste de l'absence, donc il n'y a plus aucun remplacement  faire :
							W_Suppr = "V"
						END
					END ELSE
					END
				END
				
				k = 0
				LOOP
				k = k + 1
				WHILE ENR_TPSREMPLACEAIDANT<5,i,k> # ""
					READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, ENR_TPSREMPLACEAIDANT<5,i,k> THEN
					 IF ENR_TPSDETAILSINTERV<1> >= DateDeb OR W_Suppr = "V" THEN
					   IF ENR_TPSREMPLACEAIDANT<5,i,k>[11,5] >= DateDeb OR W_Suppr = "V" THEN
						* cas facile : on supprime !
						W_Entree<1> = ENR_TPSREMPLACEAIDANT<5,i,k>
						W_Entree<2> = ENR_TPSREMPLACEAIDANT<5,i,k>[11,5]
						W_Entree<3> = ENR_TPSDETAILSINTERV<1>
						W_Entree<6> = W_NomReq
						GOSUB 100
						W_Sortie = W_Sortie : " Remplacement supprim."
						DELETE F.TPSDETAILSINTERV, ENR_TPSREMPLACEAIDANT<5,i,k>
						ENR_TPSREMPLACEAIDANT<6,i,k> = "1"
					   END ELSE
						* Nb : on conserve une partie du remplacement !
						* mais il faut voir si rtrcir le remplacement ne rends pas celui ci caduque !
						* ex : abs du lundi 1 au mercredi 10, remplceacement le jeudi. par dfaut, nous crons les rempl avec les date d'abs :
						* Donc si nouvelle date de fin au 3, l'interv du jeudi deviendra du 1 au 3 : n'aura pas lieu. il ne fait pas considrer le remplacement comme effectu !
						
						W_LundiDeb = ENR_TPSREMPLACEAIDANT<5,i,k>[11,5] - MOD(ENR_TPSREMPLACEAIDANT<5,i,k>[11,5] - 1,7)
						W_DateRef = W_LundiDeb + ENR_TPSREMPLACEAIDANT<5,i,k>[22,1]
						LOOP WHILE W_DateRef < ENR_TPSREMPLACEAIDANT<5,i,k>[11,5]
							W_DateRef = W_DateRef + ENR_TPSDETAILSINTERV<3> * 7
						REPEAT
						IF W_DateRef < DateDeb THEN
							* Le remplacement sera bel et biel effectif dans l'intervalle restant 

							W_Entree<1> = ENR_TPSREMPLACEAIDANT<5,i,k>
							W_Entree<2> = DateDeb
							W_Entree<3> = ENR_TPSDETAILSINTERV<1>
							W_Entree<6> = W_NomReq
							GOSUB 100
							W_Sortie = W_Sortie : " Nouvelle date de fin au ":OCONV(DateDeb-1,"D4/"):"."
							ENR_TPSDETAILSINTERV<1> = DateDeb-1
							WRITE ENR_TPSDETAILSINTERV ON F.TPSDETAILSINTERV, ENR_TPSREMPLACEAIDANT<5,i,k>
							ENR_TPSREMPLACEAIDANT<4,i,k> = DateDeb-1
							ENR_TPSREMPLACEAIDANT<6,i,k> = "0"
						END ELSE
							* On rduit l'intervention de manire a se trouver dans un cas de figure type "Interv le jeudi entre le lundi 1 et le mardi 3
							* Donc le remplacement doit tre supprim :
							* cas facile : on supprime !
							W_Entree<1> = ENR_TPSREMPLACEAIDANT<5,i,k>
							W_Entree<2> = ENR_TPSREMPLACEAIDANT<5,i,k>[11,5]
							W_Entree<3> = ENR_TPSDETAILSINTERV<1>
							W_Entree<6> = W_NomReq
							GOSUB 100
							W_Sortie = W_Sortie : " Remplacement supprim."
							DELETE F.TPSDETAILSINTERV, ENR_TPSREMPLACEAIDANT<5,i,k>
							ENR_TPSREMPLACEAIDANT<6,i,k> = "1"

						END
					   END
						
					   CALL REMPLRECURSIF(RETURNVAL, W_Entree, W_Sortie)
					   
					 END ELSE
						* Le remplacement etait AVANT la mise  jour => on le conserve !
						ENR_TPSREMPLACEAIDANT<6,i,k> = "0"
					 END
					END
				REPEAT
				IF W_Suppr = "F" THEN
					iBis = iBis + 1
					ENRTEMP<1,iBis> = ENR_TPSREMPLACEAIDANT<1,i> 
					ENRTEMP<2,iBis> = ENR_TPSREMPLACEAIDANT<2,i>
					t = 0
					tBis = 0
					LOOP
					t = t + 1
					WHILE ENR_TPSREMPLACEAIDANT<5,i,t> # ""
					  IF ENR_TPSREMPLACEAIDANT<6,i,t> = "0" THEN
						tBis = tBis + 1
						ENRTEMP<3,iBis,tBis> = ENR_TPSREMPLACEAIDANT<3,i,t>
						ENRTEMP<4,iBis,tBis> = ENR_TPSREMPLACEAIDANT<4,i,t>
						ENRTEMP<5,iBis,tBis> = ENR_TPSREMPLACEAIDANT<5,i,t>
					  END
					REPEAT

					* Nb : en procdure 50, on a bien iBis = i
					GOSUB 50
					


				END
				

		   END ELSE
			iBis = iBis + 1
			ENRTEMP<1,iBis> = ENR_TPSREMPLACEAIDANT<1,i> 
			ENRTEMP<2,iBis> = ENR_TPSREMPLACEAIDANT<2,i>
			ENRTEMP<3,iBis> = ENR_TPSREMPLACEAIDANT<3,i>
			ENRTEMP<4,iBis> = ENR_TPSREMPLACEAIDANT<4,i>
			ENRTEMP<5,iBis> = ENR_TPSREMPLACEAIDANT<5,i>
		   END
		REPEAT
	
    ********************************
    * test erreur
        W_Heure = TIMEDATE()[1,8]
		EXECUTE 'GETUSER' RETURNING MSGCODE
		W_User=MSGCODE<2,2>
        W_Entree2 = W_User:"|":W_Heure:"|REMPLRECURSIF|":W_Cle:"|":ENRTEMP
		CALL VERIFREMPL(W_RETURNVAL,W_Entree2,SORTIE)
    ******************************** 	
	
		WRITE ENRTEMP ON F.TPSREMPLACEAIDANT, W_Cle

	END
	END	
   END
 REPEAT
*PRINT W_Sortie
 IF W_NomReq # NomRequeteOrigine THEN
	EXECUTE 'EFFACER-LISTE ':W_NomReq
 END
END

RETURN

50 **********************************************************************
* Maj de l'tat du remplacement :

W_Etat = "total" 
IF ENRTEMP<3,i,1> - W_Cle[8,5] >= 7 THEN
	W_Etat = "partiel" 
END ELSE
  W_Max = ENRTEMP<4,i,1>
  m = 1
  LOOP
  m = m + 1
  WHILE ENRTEMP<5,i,m>  # "" AND W_Etat = "total"
	IF ENRTEMP<3,i,m> - W_Max >= 7 THEN
		W_Etat = "partiel"
	END
	IF W_Max < ENRTEMP<4,i,m> THEN
		W_Max = ENRTEMP<4,i,m>
	END
  REPEAT
END
IF W_Etat = "total" THEN
	IF DateDeb-1 - W_Max >= 7 THEN
		W_Etat = "partiel"
	END
END
IF W_Etat = "total" THEN
	ENRTEMP<2,i> = "2"
END ELSE
	ENRTEMP<2,i> = ""					
END

RETURN



100 *********************************************************************
* Ecriture anomalies
*************************************************************************
W_Sortie = W_Sortie:CHAR(13):CHAR(10)
READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, ENR_TPSREMPLACEAIDANT<5,i,k>[1,5] THEN
W_Sortie = W_Sortie:ENR_TPSREMPLACEAIDANT<5,i,k>[1,5]:" ":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>:" chez "
READ ENR_TPSPARAM FROM F.TPSPARAM, "1" ELSE
 ENR_TPSPARAM = ""
 ENR_TPSPARAM<20> = "2"
END
W_Sortie = W_Sortie :ENR_TPSREMPLACEAIDANT<5,i,k>[6,5]
READ ENR_CIVILAIDE FROM F.CIVILAIDE, ENR_TPSREMPLACEAIDANT<5,i,k>[6,5] THEN
	W_Sortie = W_Sortie :" ":ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>:" "
END
BEGIN CASE
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "0"
		W_Sortie = W_Sortie :"le lundi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "1"
		W_Sortie = W_Sortie :"le mardi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "2"
		W_Sortie = W_Sortie :"le mercredi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "3"
		W_Sortie = W_Sortie :"le jeudi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "4"
		W_Sortie = W_Sortie :"le vendredi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "5"
		W_Sortie = W_Sortie :"le samedi "
	CASE ENR_TPSREMPLACEAIDANT<5,i,k>[22,1] = "6"
		W_Sortie = W_Sortie :"le dimanche "
END CASE
	W_HreDebARenvoyer = ENR_TPSREMPLACEAIDANT<5,i,k>[23,4]
	W_Decimales = W_HreDebARenvoyer[3,2]
	IF ENR_TPSPARAM<20> = "2" THEN
		W_Decimales = INT(W_Decimales * 0.6 + 1/2)"R%2"
	END
	W_Sortie = W_Sortie :"de ":W_HreDebARenvoyer[1,2]:"h":W_Decimales:" "
	W_HreFinARenvoyer = ENR_TPSDETAILSINTERV<2>
	IF LEN(W_HreFinARenvoyer) = 4 THEN
		
	END ELSE
		W_HreFinARenvoyer = "0":W_HreFinARenvoyer
	END
	W_Decimales = W_HreFinARenvoyer[3,2]
	IF ENR_TPSPARAM<20> = "2" THEN
		W_Decimales = INT(W_Decimales * 0.6 + 1/2)"R%2"
	END
	W_Sortie = W_Sortie :" ":W_HreFinARenvoyer[1,2]*1:"h":W_Decimales:" "
	IF ENR_TPSDETAILSINTERV<1> = "" THEN
		W_Sortie = W_Sortie :"depuis le ":OCONV(ENR_TPSREMPLACEAIDANT<5,i,k>[11,5],"D4/")
	END ELSE
		IF ENR_TPSDETAILSINTERV<1> = ENR_TPSREMPLACEAIDANT<5,i,k>[11,5] THEN
			W_Sortie = W_Sortie :"le ":OCONV(ENR_TPSREMPLACEAIDANT<5,i,k>[11,5],"D4/")
		END ELSE
			W_Sortie = W_Sortie :"du ":OCONV(ENR_TPSREMPLACEAIDANT<5,i,k>[11,5],"D4/"):" au ":OCONV(ENR_TPSDETAILSINTERV<1>,"D4/")
		END
	END


* Ci dessou : END du READ ENR_CIVILAIDANT
END
RETURN
