*SUBROUTINE VerifTPS (RETURNVAL,PARAMETRES,W_Sortie)
*************************************************************************************************************
*					PR de tests de cohrence des plannings							*
*																		*
* NB : 1 Cas des congs dbutant l'a.-m. ou finissant le matin :								*
*	    Penser a renseigner le paramtre ci dessous : 									*
MidiConges = "1300"
*      2 Convention utilise : les variables dont la valeur est fixe (qui ne doivent pas changer) 		*
*         sont nommes sans "W_"... (Parametres d'appel du PR, NbJours a afficher...)				*
*	 3 Dlimitation des nuits : paramtres ci dessous  :									*
DebutNuit = "2000"
FinNuit = "700"
*																		*
*************************************************************************************************************

DepartTraitement = TIME()

EXECUTE "SET-THOUS ."
OPEN "","TEMPO" TO F.TEMPO ELSE RETURN
OPEN "","TPSEXCEPTIONS" TO F.TPSEXCEPTIONS ELSE STOP
OPEN "","TPSDETAILSINTERV" TO F.TPSDETAILSINTERV ELSE STOP
OPEN "","TPSAIDANTDISPO" TO F.TPSAIDANTDISPO ELSE STOP
OPEN "","CIVILAIDANT" TO F.CIVILAIDANT ELSE STOP
OPEN "", "CIVILAIDE" TO F.CIVILAIDE ELSE STOP
OPEN "","CONTRAT" TO F.CONTRAT ELSE STOP
OPEN "","ABSENCESAIDANT" TO F.ABSENCESAIDANT ELSE STOP
OPEN "","ABSENCESAIDE" TO F.ABSENCESAIDE ELSE STOP
OPEN "","ACTIVITESAIDE" TO F.ACTIVITESAIDE ELSE STOP
OPEN "","ACTIVITES" TO F.ACTIVITES ELSE STOP
OPEN "","DEMANDACC" TO F.DEMANDACC ELSE STOP
OPEN "","ORGPRISECHARGE" TO F.ORGPRISECHARGE ELSE STOP
OPEN "", "BESOINSAIDE" TO F.BESOINSAIDE ELSE STOP
OPEN "", "TPSPARAM" TO F.TPSPARAM ELSE STOP
OPEN "", "PAQUES" TO F.PAQUES ELSE STOP
OPEN "", "TPSTEMPO" TO F.TPSTEMPO ELSE STOP
OPEN "", "TABLES" TO F.TABLES ELSE STOP
OPEN "", "TPSPARAM" TO F.TPSPARAM ELSE STOP
OPEN "", "ASSOCIATION" TO F.ASSOCIATION ELSE STOP
*********************************************************
* Recuperation des arguments					  *
*********************************************************

EXECUTE 'DATE.FORMAT'
EXECUTE 'SET-DEC ,'

PROCREAD PARAMETRESTEMP ELSE STOP

User = FIELD(PARAMETRESTEMP, "|", 2)

READ PARAMETRES FROM F.TPSTEMPO, "PARAMVERIFTPS":User ELSE
	* Remarque : il est trs maladroit de mettre ici un
	
	STOP

	* mais je ne vois pas quoi faire d'autre en cas d'erreur de lecture des paramtres...
END

Separateur = CHAR(254)

* Code aidant
CodeAidant = FIELD(PARAMETRES,Separateur,1)

* Date de dbut
DateDebParam = FIELD(PARAMETRES,Separateur,7)

* Date de fin
DateFinParam = FIELD(PARAMETRES,Separateur,8)

* Jour : de 0 (lundi)  6 (dimanche)
Jour = FIELD(PARAMETRES,Separateur,2)
IF Jour > 6 THEN
	* Surement MOI, les paramtres sont mal foutus, on auraitpu mettre la date en att. 7 et 8,
	* je n'aurais eu qu'a recalculer la valeur du jour au lieu d'en plus rcrire DateDeb et DateFin
	DateDeb = Jour
	DateFin = Jour
	Jour = MOD(DateDeb-1,7)
END
* Heure dbut de plage
HreDebParam = FIELD(PARAMETRES,Separateur,3)

* Heure fin de plage
HreFinParam = FIELD(PARAMETRES,Separateur,4)

* Frquence
Frequence = FIELD(PARAMETRES,Separateur,5)

* Code activit
CodeActivite = FIELD(PARAMETRES,Separateur,6)
* Numero Etape
Etape = FIELD(PARAMETRES,Separateur,9)

* Traitement plusieurs tapes (a partir de l'tape ci dessus) si = "S", seulement l'tape spcifie sinon  
EtapesSuivantes = FIELD(PARAMETRES,Separateur,10)

* Temps de prsence
TempsPres = FIELD(PARAMETRES,Separateur,11)

* Code aid
CodeAide = FIELD(PARAMETRES,Separateur,12)

* Traitement : "RA" pour recherche aidant, "CP" pour consultation planning, "AE" pour absence aide, "" pour absences aidant, mais sera mis a "ABS"...
Traitement = FIELD(PARAMETRES,Separateur,13)
IF Traitement = "BA" THEN
	GestSemaine = "1"
	Traitement = "CP"
END ELSE
	GestSemaine = ""
END

IF Traitement = "CP" THEN
	W_CleChevauchARenvoyer = ""
END

* Code ancienne intervention si modif d'une intervention en consultation du planning, ou en modif. MOI...
AncienCode = FIELD(PARAMETRES,Separateur,14)

* Liste d'tapes a ne pas relancer
ListeEtapesOK  = FIELD(PARAMETRES,Separateur,15)

* Liste de plages dj affectes
W_DejaAffecteJour = FIELD(PARAMETRES,Separateur,16)
CONVERT CHAR(253) TO CHAR(254) IN W_DejaAffecteJour
W_DejaAffecteHreDeb = FIELD(PARAMETRES,Separateur,17)
CONVERT CHAR(253) TO CHAR(254) IN W_DejaAffecteHreDeb
W_DejaAffecteHreFin = FIELD(PARAMETRES,Separateur,18)
CONVERT CHAR(253) TO CHAR(254) IN W_DejaAffecteHreFin

IF CodeActivite # "" THEN
READ ENR_ACTIVITES FROM F.ACTIVITES, CodeActivite THEN
	TypeActivite = ENR_ACTIVITES<12>
END ELSE
	* peu probable, mais peut engendrer de graves erreur !
	PRINT "Erreur lecture ACTIVITES"
	ENR_RAPPORT = "Erreur lecture ACTIVITES"
	TypeActivite = ""	
END
END

READ ENR_TPSPARAM FROM F.TPSPARAM, "1" ELSE ENR_TPSPARAM = ""

W_ListePlagesDispo=""
W_ListePlagesDispo<1,1> = HreDebParam
W_ListePlagesDispo<2,1> = HreFinParam
W_NbPlagesDispo = 1


******************************************* Traitement principal  *******************************************
*																		*
*						Diriger vers les tapes spcifies							*
*																		*
*************************************************************************************************************
* Nb : la variable W_Erreur indique si une tape a rvl une anomalie
* ou ncessite une dcision de l'utilisateur..

W_Erreur = "OK"
W_BoutonsSortie = ""
W_EtapeSortie = "1"
W_HreDebRetenue = ""
W_HreFinRetenue = ""

W_ListeInterv = ""
W_ListeIntervSsContrat = ""
W_MessageIntervSansContrat = ""
VerifIntExceptionsA=""
VerifIntExceptionsB=""

IntervChevauch = ""

W_Sortie = ""

ENR_RAPPORT = ""

IF LEN(CodeAidant) # 5 THEN
	IF LEN(CodeAidant) > 5 THEN

		* Traitement absentsme : on fait d'abord une requte sur les TPSDETAILSINTERV
		* concernant l'absence, pour voir si l'on peut prolonger chacun d'eux...
		GOSUB 7000

	END ELSE
		* Normalement, traitement = AE : absences de l'aid....
		GOSUB 8000
	END
END ELSE

	IF (Etape=1) OR (Etape < 1 AND EtapesSuivantes = "S") THEN
		GOSUB 1000
	END

	IF ((Etape=2) OR (Etape < 2 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" AND INDEX(ListeEtapesOK,"2",1) = 0 THEN
		GOSUB 2000
	END
	IF TypeActivite = "P" THEN
	   * Cas particulier : l'tape 3 n'est valable que pour le prestataire.
      	IF ((Etape=3) OR (Etape < 3 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" AND INDEX(ListeEtapesOK,"3",1) = 0 THEN
		   GOSUB 3000
      	END
	END
	IF ((Etape=4) OR (Etape < 4 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" AND INDEX(ListeEtapesOK,"4",1) = 0 THEN
		GOSUB 4000
	END

	* Cas particulier : En Recherce Aidant, on peut avoir suite a scan des disponibilits de l'aidant
	* besoin de "dcouper" la plage de prospection (ex. de 8h00  20h00) en plusieurs plages
	* pouvant chacune acceuillir l'intervention (ex 8h00 a 10h00, puis 12h00 a 16h00, etc...).
	* On commence donc a partir de l'tape 5 a travailler a partir d'un tableau W_ListePlagesDispo
	* qui contient en consultation des plannings exactement la plage d'intervention.
	IF ((Etape=5) OR (Etape < 5 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" AND INDEX(ListeEtapesOK,"5",1) = 0 THEN
		GOSUB 5000
	END

	IF ((Etape=6) OR (Etape < 6 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" THEN
		GOSUB 6000
	END

END

EXECUTE 'EFFACER-LISTE ':W_NomIntervAbs

W_Sortie<1> = W_Erreur
W_Sortie<2> = W_BoutonsSortie
W_Sortie<3> = W_EtapeSortie
W_Sortie<4> = W_HreDebRetenue
IF Traitement = "RA" THEN
	IF (W_HreFinRetenue - W_HreDebRetenue) > TempsPres THEN
		W_HreFinRetenue = W_HreDebRetenue + TempsPres
	END
END
W_Sortie<5> = W_HreFinRetenue
IF Traitement = "CP" THEN
	IF TRIM(W_CleChevauchARenvoyer) # "" THEN
		W_MessageSortie = "La plage horaire est dj occupe par l'intervention suivante :":CHAR(13):CHAR(10)
		GOSUB 10000
	END
END
W_Sortie<6> = W_ListeInterv
W_Sortie<7> = W_ListeIntervSsContrat
ENR_RAPPORT<-1> = "*"
ENR_RAPPORT<-1> = W_Sortie
ENR_RAPPORT<-1> = PARAMETRES
*WRITE ENR_RAPPORT ON F.TEMPO, "RapportVerifTPS":Jour:TIME()

WRITE W_Sortie ON F.TPSTEMPO, "VERIFTPS":User

*RETURN
STOP

1000 ********************************************************************************
*			Etape 1 : Activit et contrat de travail					*
*************************************************************************************
READ ENR_ACTIVITESAIDE FROM F.ACTIVITESAIDE, CodeAide THEN
	W_FinInterv = DateFinParam
	IF W_FinInterv = "" THEN
		W_FinInterv = 999999
	END

	i = 0
	W_Trouve = "F"
	LOOP
		i = i + 1
	WHILE ENR_ACTIVITESAIDE<1,i> # "" AND W_Trouve = "F"
		IF ENR_ACTIVITESAIDE<1,i> = CodeActivite THEN

			IF ENR_ACTIVITESAIDE<3,i> = "" THEN ENR_ACTIVITESAIDE<3,i> = 999999
			IF ENR_ACTIVITESAIDE<2,i> <= DateDebParam AND ENR_ACTIVITESAIDE<3,i> >= W_FinInterv THEN
				* Nb : marche mme si date de dbut d'activit (att. 2) = ""
				W_Trouve = "V"
			END ELSE
				IF W_Erreur = "OK" THEN
					* Cas particulier : l'activit est bien commence, mais il y a une date de fin d'act. avant la fin d'intervention saisie.
					IF ENR_ACTIVITESAIDE<3,i> # 999999  AND ENR_ACTIVITESAIDE<3,i> < W_FinInterv THEN
						W_Erreur = "L'activit spcifie sera ferme chez l'aid le ":OCONV(ENR_ACTIVITESAIDE<3,i>,"D4/"):"."
					END ELSE
					   IF ENR_ACTIVITESAIDE<2,i> > DateDebParam THEN
						W_Erreur = "L'activit spcifie ne sera ouverte chez l'aid que le ":OCONV(ENR_ACTIVITESAIDE<2,i>,"D4/"):"."
					   END ELSE
						* Impossible : ENR_ACTVITES<2,i> = "" AND ENR_ACTIVITES<3,i> >= W_FinInterv ! => l'act est bien ouverte sur l'intervention
						
					   END
					END
				END

			END
		END
	REPEAT
	IF W_Trouve = "F" THEN
		IF W_Erreur = "OK" THEN
			W_Erreur = "L'activit spcifie n'est pas ouverte chez l'aid sur la dure d'intervention saisie."
		END
		W_BoutonsSortie = "OK"
	END ELSE
		* Nb : je ne pense pas que l'on puisse avoir 2 fois la mme activit ouverte chez un bnficiaire  la date de dbut d'intervention, mais autant prvenir :
		W_Erreur = "OK"
	END
END ELSE
	W_Erreur = "Aucune activit dfinie pour l'aid."
	W_BoutonsSortie = "OK"
END
IF W_Erreur = "OK" THEN
	* Traitement des contrats de travail
	* Nb : les ventuels contrats successifs doivent se suivre au jour prs, sinon erreur.
	W_Temp = 'SELECT CONTRAT = "':CodeAidant:']" AVEC 65 # "O" '
	IF TypeActivite = "M" THEN
		W_Temp = W_Temp:'AND AVEC 1 = "02" AND AVEC 3 = "':CodeAide:'" ' 
	END ELSE
		W_Temp = W_Temp:'AND AVEC 1 # "02" ' 
	END
	W_Temp = W_Temp:'AND AVEC 8 >= "':DateDebParam:'" OR = "" PAR 7'

	W_DebInterv = DateDebParam
	W_FinInterv = DateFinParam
	IF W_FinInterv = "" THEN W_FinInterv = 999999
	EXECUTE W_Temp
	W_Fin = 0
	LOOP
		READNEXT W_Cle ELSE W_Fin = 1
	WHILE W_Fin = 0 AND W_DebInterv <= W_FinInterv
	  READ ENR_CONTRAT FROM F.CONTRAT, W_Cle THEN
		IF (ENR_CONTRAT<3>=CodeAide OR TypeActivite # "M") AND INDEX(ENR_CONTRAT<36>,CodeActivite,1) # 0 THEN
			IF ENR_CONTRAT<8>	= "" THEN
				ENR_CONTRAT<8> = 999999
			END
			IF ENR_CONTRAT<7> <= W_DebInterv THEN
				* Nb : d'aprs select, plus le fait que les contrats ne peuvent se chevaucher,
				* on a forcment ENR_CONTRAT<8> >= DateDebParam
				* On a un contrat qui couvre le dbut d'intervention, voire toute l'intervention !
				W_DebInterv = ENR_CONTRAT<8> + 1
			END ELSE
				* on ne fait rien !
			END
		END
	  END		
	REPEAT
	LOOP
		READNEXT W_Cle ELSE W_Fin = 1
	WHILE W_Fin = 0 
		* Nb : on "vide" le select en cours, car si le SELECT suivant (ACCORD) ne donne rien, les READNEXT correspondants vont retourner les cls de celui ci... 
	REPEAT
	IF W_DebInterv <= W_FinInterv THEN
		* Nb : W_DebInterv = W_FinInterv signifie pas de contrat sur le dernier jour de la priode !
		IF ENR_TPSPARAM<19> # "1" THEN
			W_Erreur = "Pas de contrats de travail compatibles avec l'intervention saisie."
			W_BoutonsSortie = "OK"
		END ELSE
			* On autorise la cration d'interv ss contrat :
			W_Erreur = "L'intervention n'est pas totalement couverte par le(s) contrat(s) suivant(s) : "
			EXECUTE W_Temp
			W_Fin = 0
			LOOP
				READNEXT W_Cle ELSE W_Fin = 1
			WHILE W_Fin = 0 
			  READ ENR_CONTRAT FROM F.CONTRAT, W_Cle THEN
				IF (ENR_CONTRAT<3>=CodeAide OR TypeActivite # "M") AND INDEX(ENR_CONTRAT<36>,CodeActivite,1) # 0 THEN
					W_Erreur = W_Erreur:CHAR(13):CHAR(10)
					IF ENR_CONTRAT<1> = "02" THEN
						W_Aide1000 = ""
						READ ENR_CIVILAIDE FROM F.CIVILAIDE, ENR_CONTRAT<3> THEN
							W_Aide1000 = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
						END
					END ELSE
						W_Aide1000 = ""
						READ ENR_ASSOCIATION FROM F.ASSOCIATION, ENR_CONTRAT<2> THEN
							W_Aide1000 = ENR_ASSOCIATION<1>
						END
					END
					W_Aide1000 = W_Aide1000[1,40]
					W_Erreur = W_Erreur:W_Aide1000"L 41":OCONV(ENR_CONTRAT<7>,"D4/"):" "
					IF ENR_CONTRAT<8> = "" THEN
						W_Erreur = W_Erreur:SPACE(10):" "
					END ELSE
						W_Erreur = W_Erreur:OCONV(ENR_CONTRAT<8>,"D4/"):" "
					END	
				END
			  END		
			REPEAT
			W_BoutonsSortie<1,1> = "OK"
		   	W_BoutonsSortie<1,2> = "Annuler"
		   	W_EtapeSortie = "1"
			IF W_Erreur = "L'intervention n'est pas totalement couverte par le(s) contrat(s) suivant(s) : " THEN
				* Aucun contrat !
				W_Erreur = "Pas de contrats de travail compatibles avec l'intervention saisie."
			END
			
		END
	END
END
RETURN

2000 ********************************************************************************
*				Etape 2 : Absences de l'aid						*
*************************************************************************************
READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, CodeAide THEN
   W_NotifierAbsence = "F"
   W_FinInterv = DateFinParam
   IF W_FinInterv = "" THEN
	W_FinInterv = 999999
   END
	
   k = 0
   LOOP
	k = k + 1
   WHILE ENR_ABSENCESAIDE<2,k> >= DateDebParam AND ENR_ABSENCESAIDE<2,k> # "" AND W_Erreur = "OK"
	IF ENR_ABSENCESAIDE<1,k> <= W_FinInterv THEN
	   * L'absence est bien situe pendant l'intervention => avertir
	   W_Erreur = "Au moins une absence de l'aid est prvue sur l'intervention."
	   W_NotifierAbsence = "V"
	   W_BoutonsSortie<1,1> = "OK"
	   W_BoutonsSortie<1,2> = "Annuler"
	   W_EtapeSortie = "2"
	END
   REPEAT
   IF W_NotifierAbsence = "V" THEN
*	IF W_FinInterv = 999999 THEN
*	   IF INT(ENR_TPSPARAM(24)) # 0 THEN
*		W_FinInterv = DateDebParam + ENR_TPSPARAM(24) * 30
*	   END ELSE
*		W_FinInterv = DateDebParam + 12 * 30
*	   END
*   	END
	k = 0
      LOOP
	   k = k + 1
      WHILE ENR_ABSENCESAIDE<2,k> >= DateDebParam AND ENR_ABSENCESAIDE<2,k> # ""
	   IF ENR_ABSENCESAIDE<1,k> <= W_FinInterv THEN
		   * L'absence est bien situe pendant l'intervalle => dcrire
		   W_Erreur = W_Erreur:CHAR(13):CHAR(10):"Du ":OCONV(ENR_ABSENCESAIDE<1,k>,"D4/"):" au ":OCONV(ENR_ABSENCESAIDE<2,k>,"D4/"):" : ":ENR_ABSENCESAIDE<3,k>
		 
	   END
      REPEAT
   END
END
RETURN 

3000 ********************************************************************************
*			Etape 3 : Accords et demandes d'accords					*
*************************************************************************************
W_FinInterv = DateFinParam
IF W_FinInterv = "" THEN
	W_FinInterv = 999999
END
EXECUTE 'SELECT ACCORD = "':CodeAide:']" AVEC 18 # "O" AND AVEC 6 >= "':DateDebParam:'" AND AVEC 5 <= "':DateDebParam:'" AND AVEC TypeOrg = "P" AND AVEC ActivitesOrg = "':CodeActivite:'"'
W_Fin1 = "F"
READNEXT W_Cle ELSE W_Fin1 = "V"
W_Fin2 = "F"
LOOP
   READNEXT W_Cle ELSE W_Fin2 = "V"
WHILE W_Fin2 = "F"
	* On vide le SELECT en cours...
REPEAT
IF W_Fin1 = "F" THEN
	* Un accord trouv : on passe  l'tape 4
END ELSE
	READ ENR_DEMANDACC FROM F.DEMANDACC, CodeAide THEN
		k = 0
		W_Trouve = "F"
		LOOP
		k = k + 1
		WHILE ENR_DEMANDACC<1,k> # "" AND W_Trouve = "F"
		   IF ENR_DEMANDACC<3,k> <= DateDebParam AND ENR_DEMANDACC<4,k> >= DateDebParam THEN
			READ ENR_ORGPRISECHARGE FROM F.ORGPRISECHARGE, ENR_DEMANDACC<1,k> THEN
				IF INDEX(ENR_ORGPRISECHARGE<47>,CodeActivite,1) # 0 THEN
					W_Trouve = "V"
				END
			END ELSE
				* Ne peut rien faire, a priori ne devrait pas arriver.
			END
		   END
		REPEAT
		IF W_Trouve = "F" THEN
		   W_Erreur = "Aid sans accord ni demande d'accord en cours  la date de dbut d'intervention."
		   W_BoutonsSortie<1,1> = "OK"
		   W_BoutonsSortie<1,2> = "Annuler"
		   W_EtapeSortie = "3"
		END
	END ELSE
	   W_Erreur = "Aid sans accord ni demande d'accord en cours  la date de dbut d'intervention."
	   W_BoutonsSortie<1,1> = "OK"
	   W_BoutonsSortie<1,2> = "Annuler"
	   W_EtapeSortie = "3"
	END
END
RETURN

4000 ********************************************************************************
*			Etape 4 : Absences de l'aidant						*
*************************************************************************************
W_FinInterv = DateFinParam
IF W_FinInterv = "" THEN
	W_FinInterv = 999999
END
W_NotifierAbsence = "F"
IF Traitement = "CP" THEN
	IF W_FinInterv = 999999 THEN
	   IF INT(ENR_TPSPARAM<24>) # 0 THEN
		W_FinInterv = DateDebParam + ENR_TPSPARAM<24> * 30
	   END ELSE
		W_FinInterv = DateDebParam + 6 * 30
	   END
   	END
	EXECUTE 'SELECT ABSENCESAIDANT = "':CodeAidant:']" AVEC NumMotifAidant # "03" AND AVEC NumMotifAidant < "18" OR > "21" AND AVEC DebAbsAidant <= "':W_FinInterv:'" AND AVEC 2 >= "':DateDebParam:'"'
	W_Fin = "F"
	LOOP
		READNEXT W_Cle ELSE W_Fin = "V"
	WHILE W_Fin = "F" AND W_Erreur = "OK"
		IF W_Cle[6,2] <= "06" THEN
			* Maladie : donc pas d'exception
			W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
			W_NotifierAbsence = "V"
	   		W_BoutonsSortie<1,1> = "OK"
	   		W_BoutonsSortie<1,2> = "Annuler"
	   		W_EtapeSortie = "4"
		END ELSE
			* conges => chercher d'ventuelles exceptions  l'absence, qui ferait que l'aidant peut intervenir sur cette activite 
			READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT, W_Cle THEN
				IF ENR_ABSENCESAIDANT<26> = "" THEN
					* Il n'y a pas d'exception sur l'absence => l'aidant est absent !	
					W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
					W_NotifierAbsence = "V"
		   			W_BoutonsSortie<1,1> = "OK"
		   			W_BoutonsSortie<1,2> = "Annuler"
	   				W_EtapeSortie = "4"
				END ELSE
					GOSUB 4100
					IF W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention." THEN
						W_NotifierAbsence = "V"
		   				W_BoutonsSortie<1,1> = "OK"
		   				W_BoutonsSortie<1,2> = "Annuler"
					END
				END
			END
		END
	REPEAT
	
END ELSE
	* Recherche Aidant
	IF W_FinInterv = 999999 THEN
*		EXECUTE 'SELECT ABSENCESAIDANT = "':CodeAidant:']" AVEC NumMotifAidant < "18" AND AVEC NumMotifAidant # "03" AND # "07" AND # "08" AND # "09" AND # "10" AND # "11" AND AVEC DebAbsAidant <= "':W_FinInterv:'" AND AVEC 2 >= "':DateDebParam:'"'
		EXECUTE 'SELECT ABSENCESAIDANT AVEC 0 = "':CodeAidant:']" AND AVEC NumMotifAidant = "01" OR = "02" OR = "04" OR = "05" OR = "06" OR = "13" AND AVEC DebAbsAidant <= "':W_FinInterv:'" AND AVEC 2 >= "':DateDebParam:'" OR AVEC 0 = "':CodeAidant:']" AND AVEC NumMotifAidant = "12" OR = "14" OR = "15" OR = "16" OR = "17" OR = "22" OR = "23" OR = "24" AND AVEC DebAbsAidant <= "':DateDebParam:'" AND AVEC 2 >= "':DateDebParam:'"'

	END ELSE
		EXECUTE 'SELECT ABSENCESAIDANT = "':CodeAidant:']" AVEC NumMotifAidant # "03" AND AVEC NumMotifAidant < "18" OR > "21" AND AVEC DebAbsAidant <= "':W_FinInterv:'" AND AVEC 2 >= "':DateDebParam:'"'
	END
	W_Fin = "F"
	LOOP
		READNEXT W_Cle ELSE W_Fin = "V"
	WHILE W_Fin = "F" AND W_Erreur = "OK"
		IF W_Cle[6,2] <= "06" THEN
			* Maladie : donc pas d'exception
			W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
	   		W_BoutonsSortie = "OK"
	   		W_EtapeSortie = "4"
		END ELSE
			* conges => chercher d'ventuelles exceptions  l'absence, qui ferait que l'aidant peut intervenir sur cette activite 
			READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT, W_Cle THEN
				IF ENR_ABSENCESAIDANT<26> = "" THEN
					*Il n'y a pas d'exception sur l'absence => l'aidant est absent !	
					W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
		   			W_BoutonsSortie = "OK"
	   				W_EtapeSortie = "4"
				END ELSE
					GOSUB 4100
					IF W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention." THEN
		   				W_BoutonsSortie = "OK"
					END
				END
			END
		END
	REPEAT
END

* Nb: Si erreur dtecte, on n'a pas vid le SELECT en cours
IF W_Erreur # "OK" THEN
	W_Fin = "F"
	LOOP
		READNEXT W_Cle ELSE W_Fin = "V"
	WHILE W_Fin = "F"
	REPEAT
END
IF W_NotifierAbsence = "V" THEN
	READ ENR_TABLESABSENCE FROM F.TABLES, "ABSENCES" ELSE ENR_TABLESABSENCE = ""
	
	EXECUTE 'SELECT ABSENCESAIDANT = "':CodeAidant:']" AVEC NumMotifAidant # "03" AND AVEC NumMotifAidant < "18" OR > "21" AND AVEC DebAbsAidant <= "':W_FinInterv:'" AND AVEC 2 >= "':DateDebParam:'" PAR DebAbsAidant'
	W_Fin = "F"
	LOOP
		READNEXT W_Cle ELSE W_Fin = "V"
	WHILE W_Fin = "F" 
	   i4000 = 0
	   LOOP
	   i4000 = i4000 + 1
	   WHILE ENR_TABLESABSENCE<2,i4000> # W_Cle[6,2]
	   REPEAT

	   READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT, W_Cle THEN
		IF W_Cle[6,2] <= "06" OR ENR_ABSENCESAIDANT<26> = "" THEN
			* Maladie : donc pas d'exception
			W_Erreur = W_Erreur:CHAR(13):CHAR(10):" - "
			
			W_Erreur = W_Erreur:TRIM(ENR_TABLESABSENCE<3,i4000>):" du ":OCONV(W_Cle[8,5],"D4/")

			IF ENR_ABSENCESAIDANT<1> = "2" THEN
				W_Erreur = W_Erreur:" (aprs midi)"
			END

			W_Erreur = W_Erreur:" au ":OCONV(ENR_ABSENCESAIDANT<2>,"D4/")

			IF ENR_ABSENCESAIDANT<3> = "1" THEN
				W_Erreur = W_Erreur:" (midi)"
			END

		END ELSE
			W_Erreur4000 = W_Erreur
			GOSUB 4100
			IF W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention." THEN
			   IF W_TrouveAbs = "F" THEN
				W_Erreur = W_Erreur4000:CHAR(13):CHAR(10):" - "

				W_Erreur = W_Erreur:TRIM(ENR_TABLESABSENCE<3,i4000>):" du ":OCONV(W_Cle[8,5],"D4/")
	
				IF ENR_ABSENCESAIDANT<1> = "2" THEN
					W_Erreur = W_Erreur:" (aprs midi)"
				END

				W_Erreur = W_Erreur:" au ":OCONV(ENR_ABSENCESAIDANT<2>,"D4/")

				IF ENR_ABSENCESAIDANT<3> = "1" THEN
					W_Erreur = W_Erreur:" (midi)"
				END
				
			   END ELSE
				W_Erreur = W_Erreur4000:CHAR(13):CHAR(10):" - "
			
				W_Erreur = W_Erreur:TRIM(ENR_TABLESABSENCE<3,i4000>):" du ":OCONV(ENR_ABSENCESAIDANT<22,iRechAbs>,"D4/")

				IF ENR_ABSENCESAIDANT<23,iRechAbs> = "A" THEN
					W_Erreur = W_Erreur:" (aprs midi)"
				END

				W_Erreur = W_Erreur:" au ":OCONV(ENR_ABSENCESAIDANT<24,iRechAbs>,"D4/")

				IF ENR_ABSENCESAIDANT<25,iRechAbs> # "S" THEN
					W_Erreur = W_Erreur:" (midi)"
				END

			   END
			END

		END
	   END
	REPEAT
	
END

RETURN

4100 ********************************************************************************
*		   Traitement des exceptions sur l'absentsme de l'aidant			*
*************************************************************************************
iRechAbs = 0
W_TrouveAbs = "F"
LOOP
	iRechAbs = iRechAbs + 1
WHILE ENR_ABSENCESAIDANT<26,iRechAbs> # "" AND W_TrouveAbs = "F"
   READ ENR_CONTRAT FROM F.CONTRAT, ENR_ABSENCESAIDANT<26,iRechAbs> THEN
	IF (TypeActivite # "M" AND INDEX(ENR_CONTRAT<36>,CodeActivite,1) # 0 ) OR (TypeActivite="M" AND ENR_CONTRAT<3>=CodeAide) THEN
		* On est sur le contrat concern !
		W_TrouveAbs = "V"
		IF ENR_ABSENCESAIDANT<24,iRechAbs> >= DateDebParam AND ENR_ABSENCESAIDANT<22,iRechAbs> <= W_FinInterv AND ENR_ABSENCESAIDANT<21,iRechAbs> # "N" THEN
			W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
			W_EtapeSortie = "4"
			iRechAbs = iRechAbs - 1
		END
	END
   END
REPEAT
IF W_TrouveAbs = "F" THEN
	W_Erreur = "L'aidant a au moins une absence sur cette priode d'intervention."
	W_EtapeSortie = "4"
END
RETURN

5000 ********************************************************************************
*			Etape 5 : Indisponibilits de l'aidant					*
*************************************************************************************

W_ErreurTemp = ""
*READ ENR_TPSAIDANTDISPO FROM F.TPSAIDANTDISPO, CodeAidant THEN	
READ ENR_TPSAIDANTDISPO FROM F.TPSAIDANTDISPO, CodeAidant ELSE ENR_TPSAIDANTDISPO = ""
	BEGIN CASE
		CASE Jour = "5"

			* Saisie sur un samedi : vrifier que l'aidant a accept de travailler le samedi.
			IF ENR_TPSAIDANTDISPO<7> # "O" THEN

				W_ErreurTemp<1> = "L'aidant ne veut pas travailler le samedi."
				IF Traitement = "CP" THEN

					W_BoutonsSortie<1,1> = "OK"
					W_BoutonsSortie<1,2> = "Annuler"
				END ELSE
					W_BoutonsSortie = "OK"
				END
				W_EtapeSortie = "5"
			END
		CASE Jour = "6"
			* Saisie sur un dimanche : vrifier que l'aidant a accept de travailler le dimanche.
			IF ENR_TPSAIDANTDISPO<8> # "O" THEN
				W_ErreurTemp<2> = "L'aidant ne veut pas travailler le dimanche."
				IF Traitement = "CP" THEN
			
					W_BoutonsSortie<1,1> = "OK"
					W_BoutonsSortie<1,2> = "Annuler"
				END ELSE
					W_BoutonsSortie = "OK"
				END
				W_EtapeSortie = "5"
			END
		CASE 1
	END CASE
	
	IF W_Erreur = "OK" THEN
	   IF ENR_TPSAIDANTDISPO<6> # "O" THEN
		* L'aidant ne veut pas travaillerla nuit !
		* Nb : nuit de 20h00 a 7h00
		IF HreFinParam > DebutNuit THEN
			IF Traitement = "CP" THEN
				* erreur
				W_ErreurTemp<3> = "L'aidant ne veut pas travailler la nuit."
				W_BoutonsSortie<1,1> = "OK"
				W_BoutonsSortie<1,2>= "Annuler"
				W_EtapeSortie = "5"
			END ELSE
				IF DebutNuit - W_ListePlagesDispo<1,W_NbPlagesDispo> < TempsPres THEN
					* Il n'y a pas assez de marge sur la plage saisie pour que l'aidant puisse effectuer 
					* la totalit du temps de prsence requis avant 20h00...
					W_ErreurTemp<3> = "L'aidant ne veut pas travailler la nuit."
					W_BoutonsSortie = "OK"
					W_EtapeSortie = "5"

				END ELSE
					* Cas particulier : on commence a dfinir l'heure d'intervention retenue, et on l'crit dans 
					* le tableau W_ListePlagesDispo...
					W_ListePlagesDispo<2,W_NbPlagesDispo> = DebutNuit
				END
			END
		END ELSE
		   IF HreDebParam < FinNuit THEN
			IF Traitement = "CP" THEN
				* erreur
				W_ErreurTemp<3> = "L'aidant ne veut pas travailler la nuit."
				
				W_BoutonsSortie<1,1> = "OK"
				W_BoutonsSortie<1,2>= "Annuler"
				W_EtapeSortie = "5"
			END ELSE
				IF W_ListePlagesDispo<2,W_NbPlagesDispo> - FinNuit < TempsPres THEN
					* Il n'y a pas assez de marge sur la plage saisie pour que l'aidant puisse effectuer 
					* la totalit du temps de prsence requis avant 20h00...
					W_ErreurTemp<3> = "L'aidant ne veut pas travailler la nuit."
					W_BoutonsSortie = "OK"
					W_EtapeSortie = "5"

				END ELSE
					* Cas particulier : on commence a dfinir l'heure d'intervention retenue, et on l'crit dans 
					* le tableau W_ListePlagesDispo...
					W_ListePlagesDispo<1,W_NbPlagesDispo> = FinNuit
				END
			END
		   END	
		END

	   * ci dessous : fin du "Si L'aidant neveut pas travailler la nuit..."
	   END
	   IF W_Erreur = "OK" THEN
		   i = 0
		   LOOP
			i = i + 1
		   WHILE ENR_TPSAIDANTDISPO<11,i> # "" AND ENR_TPSAIDANTDISPO<11,i> <= Jour
			IF ENR_TPSAIDANTDISPO<11,i> = Jour THEN
		* Nb : on part du principe que les indisponibilits de l'aidant sont tries en ordre croissant...

				IF ENR_TPSAIDANTDISPO<12,i> < W_ListePlagesDispo<2,W_NbPlagesDispo> AND ENR_TPSAIDANTDISPO<13,i> > W_ListePlagesDispo<1,W_NbPlagesDispo> THEN
					IF Traitement = "CP" THEN
					* Erreur
*						W_ErreurTemp<4> = "L'aidant est indisponible sur la plage horaire suivante :":CHAR(13):CHAR(10)
						W_ErreurTemp<4> = CHAR(13):CHAR(10)
						BEGIN CASE
							CASE Jour = "0"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Lundi    "
							CASE Jour = "1"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Mardi    "
							CASE Jour = "2"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Mercredi "
							CASE Jour = "3"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Jeudi    "
							CASE Jour = "4"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Vendredi "
							CASE Jour = "5"
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Samedi   "
							CASE 1
								W_ErreurTemp<4> = W_ErreurTemp<4>:"Dimanche "
						END CASE
						W_Hre20000 = ENR_TPSAIDANTDISPO<12,i>
						GOSUB 20000
						W_ErreurTemp<4> = W_ErreurTemp<4>:" de ":W_Texte20000
						W_Hre20000 = ENR_TPSAIDANTDISPO<13,i>
						GOSUB 20000
						W_ErreurTemp<4> = W_ErreurTemp<4>:"  ":W_Texte20000:" - ":ENR_TPSAIDANTDISPO<14,i>
						IF ENR_TPSAIDANTDISPO<15,i> = "O" THEN
							W_ErreurTemp<4> = W_ErreurTemp<4>:" - Autre employeur"
						END
						W_BoutonsSortie<1,1> = "OK"
						W_BoutonsSortie<1,2>= "Annuler"
						W_EtapeSortie = "5"
					END ELSE
						IF ENR_TPSAIDANTDISPO<12,i> > W_ListePlagesDispo<1,W_NbPlagesDispo> AND ENR_TPSAIDANTDISPO<13,i> < W_ListePlagesDispo<2,W_NbPlagesDispo> THEN

							* Problme : la plage de prospection est "coupe en deux" par l'indisponibilit. Il faudrait faire 2 tests !
							IF ENR_TPSAIDANTDISPO<12,i> - W_ListePlagesDispo<1,W_NbPlagesDispo> < TempsPres THEN
								* La premire plage rsultant est trop courte !		
								* => la plage de prospective devient la deuxime plage rsultante!
								W_ListePlagesDispo<1,W_NbPlagesDispo>= ENR_TPSAIDANTDISPO<13,i>
								IF W_ListePlagesDispo<2,W_NbPlagesDispo> - W_ListePlagesDispo<1,W_NbPlagesDispo> < TempsPres THEN
									* La deuxime plage rsultante est aussi trop courte = erreur !
									IF W_NbPlagesDispo = 1 THEN
										W_ErreurTemp<4> = "L'aidant est indisponible sur la plage horaire."
										W_BoutonsSortie = "OK"
										W_EtapeSortie = "5"
									END ELSE
										* On doit d'annuler la plage en cours !
										W_NbPlagesDispo = W_NbPlagesDispo - 1
										* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
										* prcdente ne sera pas annule par les indispo suivantes.
									END
								END ELSE
									* On continue de parcourir les indisponibilits !
								END
							END ELSE
								IF W_ListePlagesDispo<2,W_NbPlagesDispo> - ENR_TPSAIDANTDISPO<13,i> < TempsPres THEN
								* La deuxime plage rsultante est trop courte 
								* => on diminue simplement la premire.
									W_ListePlagesDispo<2,W_NbPlagesDispo> = ENR_TPSAIDANTDISPO<12,i>
								END ELSE
								* On a bien deux plages valides
									W_ListePlagesDispo<2,W_NbPlagesDispo+1> = W_ListePlagesDispo<2,W_NbPlagesDispo>
									W_ListePlagesDispo<1,W_NbPlagesDispo+1> = ENR_TPSAIDANTDISPO<13,i>
									W_ListePlagesDispo<2,W_NbPlagesDispo> = ENR_TPSAIDANTDISPO<12,i>
									W_NbPlagesDispo = W_NbPlagesDispo + 1
								END
							END
						END ELSE
					* L'indisponibilit est soit sur le dbut, soit sur la fin de la plage de prospection.
						   IF W_ListePlagesDispo<1,W_NbPlagesDispo> < ENR_TPSAIDANTDISPO<13,i> AND ENR_TPSAIDANTDISPO<12,i> <= W_ListePlagesDispo<1,W_NbPlagesDispo> THEN
							* L'indispo est sur le dbut de la plage :
							W_ListePlagesDispo<1,W_NbPlagesDispo> = ENR_TPSAIDANTDISPO<13,i>
						   END
						   IF W_ListePlagesDispo<2,W_NbPlagesDispo> > ENR_TPSAIDANTDISPO<12,i> AND ENR_TPSAIDANTDISPO<13,i> >= W_ListePlagesDispo<2,W_NbPlagesDispo> THEN
							* L'indispo est sur la fin de la plage :
							W_ListePlagesDispo<2,W_NbPlagesDispo> = ENR_TPSAIDANTDISPO<12,i>
						   END
						   IF W_ListePlagesDispo<2,W_NbPlagesDispo> - W_ListePlagesDispo<1,W_NbPlagesDispo> < TempsPres THEN
							IF W_NbPlagesDispo = 1 THEN
								W_ErreurTemp<4> = "L'aidant est indisponible sur la plage."
								W_BoutonsSortie = "OK"
								W_EtapeSortie = "5"
							END ELSE
								* On doit annuler la plage en cours !
								W_NbPlagesDispo = W_NbPlagesDispo - 1
								* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
								* prcdente ne sera pas annule par les indispo suivantes.
							END
						   END
						END
						
					END
		
				END
			END

		  REPEAT
	   END
	END		

*END
*IF Traitement # "RA" THEN
  READ ENR_BESOINSAIDE FROM F.BESOINSAIDE, CodeAide THEN

   i = 0
   LOOP
	i = i + 1
   WHILE ENR_BESOINSAIDE<9,i> # "" AND ENR_BESOINSAIDE<9,i> <= Jour
	IF ENR_BESOINSAIDE<9,i> = Jour THEN
	* Nb : on part du principe que les indisponibilits de l'aide sont tries en ordre croissant...
		IF ENR_BESOINSAIDE<10,i> < W_ListePlagesDispo<2,1> AND ENR_BESOINSAIDE<11,i> > W_ListePlagesDispo<1,1> THEN
			IF Traitement = "CP" THEN
			* Erreur
*				W_ErreurTemp<5> = "L'aid est indisponible sur la plage horaire suivante : ":CHAR(13):CHAR(10)
				W_ErreurTemp<5> = CHAR(13):CHAR(10)

						BEGIN CASE
							CASE Jour = "0"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Lundi    "
							CASE Jour = "1"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Mardi    "
							CASE Jour = "2"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Mercredi "
							CASE Jour = "3"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Jeudi    "
							CASE Jour = "4"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Vendredi "
							CASE Jour = "5"
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Samedi   "
							CASE 1
								W_ErreurTemp<5> = W_ErreurTemp<5>:"Dimanche "
						END CASE
						W_Hre20000 = ENR_BESOINSAIDE<10,i>
						GOSUB 20000
						W_ErreurTemp<5> = W_ErreurTemp<5>:" de ":W_Texte20000
						W_Hre20000 = ENR_BESOINSAIDE<11,i>
						GOSUB 20000
						W_ErreurTemp<5> = W_ErreurTemp<5>:"  ":W_Texte20000:" - ":ENR_BESOINSAIDE<12,i>

				W_BoutonsSortie<1,1> = "OK"
				W_BoutonsSortie<1,2>= "Annuler"
				W_EtapeSortie = "5"
			END ELSE

			   k = 0
			   LOOP
			  	k = k + 1
			   WHILE k <= W_NbPlagesDispo
			   
			   IF W_ListePlagesDispo<2,k> # "" THEN
				IF ENR_BESOINSAIDE<10,i> > W_ListePlagesDispo<1,k> AND ENR_BESOINSAIDE<11,i> < W_ListePlagesDispo<2,k> THEN
				* Problme : la plage de prospection est "coupe en deux" par l'indisponibilit. Il faudrait faire 2 tests !
					IF ENR_BESOINSAIDE<10,i> - W_ListePlagesDispo<1,k> < TempsPres THEN
						* La premire plage rsultant est trop courte !		
						* => la plage de prospective devient la deuxime plage rsultante!
						W_ListePlagesDispo<1,k>= ENR_BESOINSAIDE<11,i>
						IF W_ListePlagesDispo<2,k> - W_ListePlagesDispo<1,k> < TempsPres THEN
							* La deuxime plage rsultante est aussi trop courte = erreur !
							IF W_NbPlagesDispo = 1 THEN
								W_ErreurTemp<5> = "L'aid est indisponible sur la plage horaire."
								W_BoutonsSortie = "OK"
								W_EtapeSortie = "5"
							END ELSE
								* On doit d'annuler la plage en cours !
								DEL W_ListePlagesDispo<1,k>
								DEL W_ListePlagesDispo<2,k>
								W_NbPlagesDispo = W_NbPlagesDispo - 1
								k = k - 1
								* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
								* prcdente ne sera pas annule par les indispo suivantes.
							END
						END ELSE
							* On continue de parcourir les indisponibilits !
						END
					END ELSE
						IF W_ListePlagesDispo<2,k> - ENR_BESOINSAIDE<11,i> < TempsPres THEN
						* La deuxime plage rsultante est trop courte 
						* => on diminue simplement la premire.
							W_ListePlagesDispo<2,k> = ENR_BESOINSAIDE<10,i>
						END ELSE
						* On a bien deux plages valides
						   IF k = W_NbPlagesDispo THEN
							W_ListePlagesDispo<2,W_NbPlagesDispo+1> = W_ListePlagesDispo<2,W_NbPlagesDispo>
							W_ListePlagesDispo<1,W_NbPlagesDispo+1> = ENR_BESOINSAIDE<11,i>
							W_ListePlagesDispo<2,W_NbPlagesDispo> = ENR_BESOINSAIDE<10,i>
							W_NbPlagesDispo = W_NbPlagesDispo + 1
						   END ELSE
							W_ListePlagesDispo = INSERT(W_ListePlagesDispo,2,k+1;W_ListePlagesDispo<2,k>)
							W_ListePlagesDispo = INSERT(W_ListePlagesDispo,1,k+1;ENR_BESOINSAIDE<11,i>)
							W_ListePlagesDispo<2,k> = ENR_BESOINSAIDE<10,i>
							W_NbPlagesDispo = W_NbPlagesDispo + 1
						   END
						   k = k + 1
						END
					END
				END ELSE
			* L'indisponibilit est soit sur le dbut, soit sur la fin de la plage de prospection.
				   IF W_ListePlagesDispo<1,k> < ENR_BESOINSAIDE<11,i> AND ENR_BESOINSAIDE<10,i> <= W_ListePlagesDispo<1,k> THEN
					* L'indispo est sur le dbut de la plage :
					W_ListePlagesDispo<1,k> = ENR_BESOINSAIDE<11,i>
				   END
				   IF W_ListePlagesDispo<2,k> > ENR_BESOINSAIDE<10,i> AND ENR_BESOINSAIDE<11,i> >= W_ListePlagesDispo<2,k> THEN
					* L'indispo est sur la fin de la plage :
					W_ListePlagesDispo<2,k> = ENR_BESOINSAIDE<10,i>
				   END
				   IF W_ListePlagesDispo<2,k> - W_ListePlagesDispo<1,k> < TempsPres THEN
					IF W_NbPlagesDispo = 1 THEN
						W_ErreurTemp<5> = "L'aid est indisponible sur la plage."
						W_BoutonsSortie = "OK"
						W_EtapeSortie = "5"
					END ELSE
						* On doit annuler la plage en cours !
						W_NbPlagesDispo = W_NbPlagesDispo - 1
						* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
						* prcdente ne sera pas annule par les indispo suivantes.
						DEL W_ListePlagesDispo<1,k>
						DEL W_ListePlagesDispo<2,k>
						k = k - 1
					END
				   END
				END
			   * Fin du 'Si W_ListePlagesDIspo<1,k> # ""'
			   END	
			   REPEAT
			END

		END
	END
   REPEAT
  END
*END

IF Traitement = "RA" THEN
ENR_RAPPORT<-1> = "RA"
* On a peut tre dj affect certaines plages horaires...
* => vont se traiter comme des indisponibilits aidant / aid...
   i = 0
   LOOP
	i = i + 1
   WHILE W_DejaAffecteJour<i> # "" AND W_DejaAffecteJour<i> <= Jour
	
	IF W_DejaAffecteJour<i> = Jour THEN
		

	* Nb : on part du principe que les indisponibilits de l'aide sont tries en ordre croissant...
		IF W_DejaAffecteHreDeb<i> < W_ListePlagesDispo<2,1> AND W_DejaAffecteHreFin<i> > W_ListePlagesDispo<1,1> THEN
			IF Traitement = "CP" THEN
			* Erreur
				W_ErreurTemp<5> = "L'aid est indisponible sur la plage horaire."
				W_BoutonsSortie<1,1> = "OK"
				W_BoutonsSortie<1,2>= "Annuler"
				W_EtapeSortie = "5"
			END ELSE
	
			   k = 0
			   LOOP
			  	k = k + 1
			   WHILE k <= W_NbPlagesDispo

			   IF W_ListePlagesDispo<2,k> # "" THEN
				IF W_DejaAffecteHreDeb<i> > W_ListePlagesDispo<1,k> AND W_DejaAffecteHreFin<i> < W_ListePlagesDispo<2,k> THEN
				* Problme : la plage de prospection est "coupe en deux" par l'indisponibilit. Il faudrait faire 2 tests !
					IF W_DejaAffecteHreDeb<i> - W_ListePlagesDispo<1,k> < TempsPres THEN
						* La premire plage rsultant est trop courte !		
						* => la plage de prospective devient la deuxime plage rsultante!
						W_ListePlagesDispo<1,k>= W_DejaAffecteHreFin<i>
						IF W_ListePlagesDispo<2,k> - W_ListePlagesDispo<1,k> < TempsPres THEN
							* La deuxime plage rsultante est aussi trop courte = erreur !
							IF W_NbPlagesDispo = 1 THEN
								W_ErreurTemp<4> = "L'aid est indisponible sur la plage horaire."
								W_BoutonsSortie = "OK"
								W_EtapeSortie = "5"
							END ELSE
								* On doit d'annuler la plage en cours !
								DEL W_ListePlagesDispo<1,k>
								DEL W_ListePlagesDispo<2,k>
								W_NbPlagesDispo = W_NbPlagesDispo - 1
								k = k - 1
								* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
								* prcdente ne sera pas annule par les indispo suivantes.
							END
						END ELSE
							* On continue de parcourir les indisponibilits !
						END
					END ELSE
						IF W_ListePlagesDispo<2,k> - W_DejaAffecteHreFin<i> < TempsPres THEN
						* La deuxime plage rsultante est trop courte 
						* => on diminue simplement la premire.
							W_ListePlagesDispo<2,k> = W_DejaAffecteHreDeb<i>
						END ELSE
						* On a bien deux plages valides
						   IF k = W_NbPlagesDispo THEN
							W_ListePlagesDispo<2,W_NbPlagesDispo+1> = W_ListePlagesDispo<2,W_NbPlagesDispo>
							W_ListePlagesDispo<1,W_NbPlagesDispo+1> = W_DejaAffecteHreFin<i>
							W_ListePlagesDispo<2,W_NbPlagesDispo> = W_DejaAffecteHreDeb<i>
							W_NbPlagesDispo = W_NbPlagesDispo + 1
						   END ELSE
							W_ListePlagesDispo = INSERT(W_ListePlagesDispo,2,k+1;W_ListePlagesDispo<2,k>)
							W_ListePlagesDispo = INSERT(W_ListePlagesDispo,1,k+1;W_DejaAffecteHreFin<i>)
							W_ListePlagesDispo<2,k> = W_DejaAffecteHreDeb<i>
							W_NbPlagesDispo = W_NbPlagesDispo + 1
						   END
						   k = k + 1
						END
					END
				END ELSE
			* L'indisponibilit est soit sur le dbut, soit sur la fin de la plage de prospection.
				   IF W_ListePlagesDispo<1,k> < W_DejaAffecteHreFin<i> AND W_DejaAffecteHreDeb<i> <= W_ListePlagesDispo<1,k> THEN
					* L'indispo est sur le dbut de la plage :
					W_ListePlagesDispo<1,k> = W_DejaAffecteHreFin<i>
				   END
				   IF W_ListePlagesDispo<2,k> > W_DejaAffecteHreDeb<i> AND W_DejaAffecteHreFin<i> >= W_ListePlagesDispo<2,k> THEN
					* L'indispo est sur la fin de la plage :
					W_ListePlagesDispo<2,k> = W_DejaAffecteHreDeb<i>
				   END
				   IF W_ListePlagesDispo<2,k> - W_ListePlagesDispo<1,k> < TempsPres THEN
					IF W_NbPlagesDispo = 1 THEN
						W_ErreurTemp<5> = "L'aid est indisponible sur la plage."
						W_BoutonsSortie = "OK"
						W_EtapeSortie = "5"
					END ELSE
						* On doit annuler la plage en cours !
						W_NbPlagesDispo = W_NbPlagesDispo - 1
						* Remarque : les indispositions tant tries dans l'ordre chronologique, on sait que la plage 
						* prcdente ne sera pas annule par les indispo suivantes.
						DEL W_ListePlagesDispo<1,k>
						DEL W_ListePlagesDispo<2,k>
						k = k - 1
					END
				   END
				END
			   * Fin du 'Si W_ListePlagesDIspo<1,k> # ""'
			   END	
			   REPEAT
			END

		END
	END
   REPEAT

END

IF W_ErreurTemp # "" THEN
	W_Erreur = ""
	IF W_ErreurTemp<1> # "" OR W_ErreurTemp<2> # "" OR W_ErreurTemp<3> # "" THEN
		W_Erreur = "L'aidant ne veut pas travailler"
		IF W_ErreurTemp<3> # "" THEN
			W_Erreur = W_Erreur:" la nuit"
		END
		IF W_ErreurTemp<1> # "" THEN
			IF W_ErreurTemp<3> # "" THEN
				W_Erreur = W_Erreur:", ni le samedi"
			END ELSE
				W_Erreur = W_Erreur:" le samedi"
			END
		END
		IF W_ErreurTemp<2> # "" THEN
			IF W_ErreurTemp<3> # "" OR W_ErreurTemp<1> # "" THEN
				W_Erreur = W_Erreur:", ni le dimanche"
			END ELSE
				W_Erreur = W_Erreur:" le dimanche"
			END
		END
		
	END
	IF W_ErreurTemp<4> # "" THEN
		IF W_Erreur = "" THEN
			W_Erreur = "L'aidant est indisponible sur la plage horaire suivante : ":W_ErreurTemp<4>
		END ELSE
			W_Erreur = W_Erreur:", et est indisponible sur la plage horaire suivante : ":W_ErreurTemp<4>
		END
	END
	IF W_Erreur # "" THEN
		W_Erreur = W_Erreur:"."
	END
	IF W_ErreurTemp<5> # "" THEN
		IF W_Erreur # "" THEN
			W_Erreur = W_Erreur:CHAR(13):CHAR(10):"L'aid est indisponible sur la plage horaire suivante : ":W_ErreurTemp<5>
		END ELSE
			W_Erreur = "L'aid est indisponible sur la plage horaire suivante : ":W_ErreurTemp<5>
		END
	END

END

RETURN

6000 ********************************************************************************
*			Etape 6 : Parcours des interventions					*
*************************************************************************************
* on dtermine la date de rfrence, ie date  laquelle on est certain qu'il y a intervention physique.
W_LundiDebA = DateDebParam - MOD(DateDebParam - 1,7)
W_DateRefA = W_LundiDebA + Jour
IF W_DateRefA < DateDebParam THEN
	W_DateRefA = W_DateRefA + Frequence * 7
END

FOR i6000 = 1 TO W_NbPlagesDispo
	HreDebut = W_ListePlagesDispo<1,i6000>
	HreFin = W_ListePlagesDispo<2,i6000>
	
	W_Erreur = "OK"
	W_BoutonsSortie = ""
	W_EtapeSortie = "6"
	W_HreDebRetenue = HreDebut
	W_HreFinRetenue = HreFin

	GOSUB 6100
	IF W_Erreur = "OK" THEN
		* Nb : cas o il y a plusieurs plages : il suffit que la premire soit valide !
		W_EtapeSortie = ""
		i6000 = W_NbPlagesDispo + 1
	END
NEXT i6000
RETURN


6100 ********************************************************************************
*					Traitement								*
*************************************************************************************
W_Temp = ' AVEC JourInterv = "':Jour:'" AND AVEC HeureFinDetailsInterv > "':HreDebut:'" AND AVEC HeureInterv < "':HreFin:'" '
IF DateFinParam # "" THEN
	W_Temp = W_Temp:'AND AVEC DateDebInterv <= "':DateFinParam:'" '
END
W_Temp = W_Temp:'AND AVEC 1 >= "':DateDebParam:'" OR = "" '

IF AncienCode # "" THEN
	W_Temp = W_Temp:'AND AVEC @ID # "':AncienCode:']" '
END
IF CodeAide # "" AND GestSemaine = "1" THEN
	W_Temp = 'SELECT TPSDETAILSINTERV AVEC CodeAidant = "':CodeAidant:'" AND ':W_Temp:' OR AVEC CodeAide = "':CodeAide:'" AND ':W_Temp
END ELSE
	W_Temp = 'SELECT TPSDETAILSINTERV = "':CodeAidant:']"':W_Temp
END
W_Temp=W_Temp:'PAR HeureInterv'

EXECUTE W_Temp
ENR_RAPPORT<-1> = "Requete : "
ENR_RAPPORT<-1> = W_Temp
W_NomIntervChevauch = "IntervChevauch":Traitement:CodeAide:TIME()
EXECUTE 'SAUVE-LISTE ':W_NomIntervChevauch
EXECUTE 'LISTE ':W_NomIntervChevauch RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	SELECT F.TPSDETAILSINTERV TO IntervChevauch

	* Nb : rgle adopte : Variables [NomVariable]+A = concerne intervention que l'on a saisi (en CP ou plage Recherche Aidant),
	* et [NomVariable]+B concerne l'intervention rsultant dela requte ci dessus, avec laquelle on cherche un chevauchement

	W_FinChevauch = "F"
	LOOP
		READNEXT W_Cle FROM IntervChevauch ELSE W_FinChevauch = "V"

	WHILE W_FinChevauch = "F" AND (W_Erreur = "OK" OR Traitement = "AE")
		READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, W_Cle THEN

			W_FreqB = ENR_TPSDETAILSINTERV<3>
			W_LundiDebB = W_Cle[11,5] - MOD(W_Cle[11,5] - 1,7)
			W_DateRefB = W_LundiDebB + W_Cle[22,1]
			IF W_DateRefB < W_Cle[11,5] THEN
				W_DateRefB = W_DateRefB + W_FreqB * 7
			END

			IF W_DateRefA < W_DateRefB THEN
				W_DateDeb = W_DateRefB
			END ELSE
				W_DateDeb = W_DateRefA
			END

			W_Passe = "F"
			IF Traitement # "RA" THEN
				W_GereExcept = "V"
			END ELSE
				W_GereExcept = "F"
			END
			IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
				W_DateFin = W_DateDeb + (Frequence * W_FreqB * 7) + 1
				W_GereExcept = "F"
			END ELSE
			      IF DateFinParam = "" THEN
					W_DateFin = ENR_TPSDETAILSINTERV<1>
				END ELSE
					W_DateFin = DateFinParam
					IF W_DateFin > ENR_TPSDETAILSINTERV<1> AND ENR_TPSDETAILSINTERV<1> # "" THEN
						W_DateFin = ENR_TPSDETAILSINTERV<1>
					END
				END
				* On vrifie abs aid.
				*READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, W_Cle[6,5] THEN
				*	i = 0
				*	LOOP
				*	i = i + 1
				*	WHILE ENR_ABSENCESAIDE<1,i> # "" AND ENR_ABSENCESAIDE<2,i> >= W_DateDeb
				*		IF ENR_ABSENCESAIDE<1,i> <= W_DateDeb AND ENR_ABSENCESAIDE<2,i> >= W_DateFin THEN
				*			* L'aid est absent sur toute la priode o il risque d'y avoir chevauchement !
				*			W_Passe = "V"
				*		END  
				*	REPEAT 
				*END
				
			END			
			IF Traitement = "RA" THEN
				W_HreDebB = W_Cle[23,4]
				W_HreFinB = ENR_TPSDETAILSINTERV<2>
				IF (W_HreDebB - W_HreDebRetenue) > TempsPres THEN
					* Les interventions sont tries par heure de dbut, donc on doit tre OK.
					W_Passe = "V"
				END ELSE
					* on ne peut pas savoir !
				END
				
			END
			IF W_Passe = "F" THEN
				* On a fix les bornes des dates a scanner.

				GOSUB 6200
				
			END
			IF Traitement = "RA" THEN
				IF W_HreDebB <= W_HreDebRetenue THEN
					* On a fin interventionB >= Dbut hre retenue !
					IF W_Erreur = "OK" THEN
						* Ne fait rien car pas d'incidence, mais il faut parcourir les interventions suivantes.
					END ELSE
						W_HreDebRetenue = W_HreFinB
						IF W_HreFinRetenue > (W_HreFinB + TempsPres) THEN
							W_Erreur = "OK"
							W_BoutonsSortie = ""
						END ELSE
							* On a trop consomm sur la plage disponible !
							* => laisser l'erreur dtecte en 6200 remonter.
						END
					END
				END ELSE
					IF (W_HreDebB - W_HreDebRetenue) > TempsPres THEN
						* Cas vu ci dessus, on propose cette premire plage.
						* Nb : doit tre signal en formation que systmatiquement, 
						* l'horaire retenu sera la premire plage disponible...
						W_HreFinRetenue = W_HreDebB
						W_FinChevauch = "V"
						W_Erreur = "OK"
						W_BoutonsSortie = ""
					END ELSE
						IF W_Erreur = "OK" THEN
							* on ne peut pas savoir !
						END ELSE
							W_HreDebRetenue = W_HreFinB
							IF W_HreFinRetenue > (W_HreFinB + TempsPres) THEN
								W_Erreur = "OK"
								W_BoutonsSortie = ""
							END ELSE
								* On a trop t de la plage disponible !
								* => laisser l'erreur dtecte en 6200 remonter.
							END
						END
					END
				END
			END


		END
	REPEAT
	
END
EXECUTE 'EFFACER-LISTE ':W_NomIntervChevauch
RETURN

6200 ********************************************************************************
*       Recherche des chevauchements effectifs dans la priode dtermine		*
*************************************************************************************
IF W_GereExcept = "V" THEN
	* nb : spcificit Unidata: il faut mettre descrochets pour des critresde slection de longueur > 17 = cle intev !
	EXECUTE 'SELECT TPSEXCEPTIONS AVEC 1 = "':W_Cle:']" AND AVEC DateDebExcep >= "':W_DateDeb:'" AND AVEC DateDebExcep <= "':W_DateFin:'" PAR DateDebExcep'
	
	W_NomVerifIntExceptionsB = "VerifIntExceptionsB":Traitement:CodeAide:TIME()
	EXECUTE 'SAUVE-LISTE ':W_NomVerifIntExceptionsB
	EXECUTE 'LISTE ':W_NomVerifIntExceptionsB RETURNING MSGCODE
	IF MSGCODE<1> = 209 THEN
		W_DateDerniereExceptB = 999999
	END ELSE
		SELECT F.TPSEXCEPTIONS TO VerifIntExceptionsB
		READNEXT W_CleExceptB FROM VerifIntExceptionsB THEN
			W_DateDerniereExceptB = W_CleExceptB[11,5]
		END ELSE 
			W_DateDerniereExceptB = 999999
		END
	END
	IF AncienCode # "" THEN
	  IF Traitement # "CP" THEN
		EXECUTE 'SELECT TPSEXCEPTIONS AVEC 1 = "':AncienCode:']" AND AVEC DateDebExcep >= "':W_DateDeb:'" AND AVEC DateDebExcep <= "':W_DateFin:'" PAR DateDebExcep'
		W_NomVerifIntExceptionsA = "VerifIntExceptionsA":Traitement:CodeAide:TIME()
		EXECUTE 'SAUVE-LISTE ':W_NomVerifIntExceptionsA
		EXECUTE 'LISTE ':W_NomVerifIntExceptionsA RETURNING MSGCODE
		IF MSGCODE<1> = 209 THEN
			W_DateDerniereExceptA = 999999
		END ELSE
			SELECT F.TPSEXCEPTIONS TO VerifIntExceptionsA
			READNEXT W_CleExceptA FROM VerifIntExceptionsA THEN
				W_DateDerniereExceptA = W_CleExceptA[11,5]

			END ELSE 
				W_DateDerniereExceptA = 999999
			END
		END
	  END
	END
END
FOR W_DateTest = W_DateRefA TO W_DateFin STEP Frequence*7
   IF W_DateTest >= W_DateDeb THEN
	IF MOD(W_DateTest - W_DateRefB, W_FreqB *7 ) = 0 THEN
	   W_AuMoinsUnAideAbsent = "F"
	   W_DateFinAbsAide = ""
	   READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, W_Cle[6,5] THEN
	   	i = 0
		LOOP
		i = i + 1
		WHILE ENR_ABSENCESAIDE<1,i> # "" AND ENR_ABSENCESAIDE<2,i> >= W_DateTest AND W_AuMoinsUnAideAbsent = "F"
			IF ENR_ABSENCESAIDE<1,i> <= W_DateTest AND ENR_ABSENCESAIDE<2,i> >= W_DateTest THEN
			  
				* L'aid est absent sur toute la priode o il risque d'y avoir chevauchement !
				W_AuMoinsUnAideAbsent = "V"
				W_DateDeb = W_DateTest 
				IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
					W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
				END
			END  
		REPEAT 
	   END	
	   READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, CodeAide THEN
	   	i = 0
		LOOP
		i = i + 1
		WHILE ENR_ABSENCESAIDE<1,i> # "" AND ENR_ABSENCESAIDE<2,i> >= W_DateTest AND W_AuMoinsUnAideAbsent = "F"
			IF ENR_ABSENCESAIDE<1,i> <= W_DateTest AND ENR_ABSENCESAIDE<2,i> >= W_DateTest THEN
			   IF Traitement # "AE" THEN
				* L'aid est absent sur toute la priode o il risque d'y avoir chevauchement !
				W_AuMoinsUnAideAbsent = "V"
				W_DateDeb = W_DateTest 
				IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
					W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
				END
			   END ELSE
				* Justement, on appelle le programme parce que l'on veut supprimer cette absence ! 
				* => faire en sorte qu'une ventuelle erreur remonte...
			   END
			END  
		REPEAT 
	   END	

	   IF W_AuMoinsUnAideAbsent = "F" THEN
		* Test jours fris
		W_JourFerieProsp = W_DateTest
		GOSUB 11000
		IF W_JourFerieProsp = "F" THEN
			* On n'est pas un jour fri
		END ELSE
			* Il faut aller voir si au moins un des deux aids refuse le travail les jours fris...
			READ ENR_BESOINSAIDE FROM F.BESOINSAIDE, W_Cle[6,5] THEN
				IF ENR_BESOINSAIDE<7> # "O" THEN
					* Pas de travail les jours fris
					W_AuMoinsUnAideAbsent = "V"
					W_DateDeb = W_DateTest 
					IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
						W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
					END
				END ELSE
					READ ENR_BESOINSAIDE FROM F.BESOINSAIDE, CodeAide THEN
						IF ENR_BESOINSAIDE<7> # "O" THEN
							* Pas de travail les jours fris
							W_AuMoinsUnAideAbsent = "V"
							W_DateDeb = W_DateTest 
							IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
								W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
							END
						END ELSE
				
						END
					END ELSE
						* Pas de travail les jours fris
						W_AuMoinsUnAideAbsent = "V"
						W_DateDeb = W_DateTest 
						IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
							W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
						END
					END
				END
			END ELSE
				* Pas de travail les jours fris
				W_AuMoinsUnAideAbsent = "V"
				W_DateDeb = W_DateTest 
				IF DateFinParam = "" AND ENR_TPSDETAILSINTERV<1> = "" THEN
					W_DateFin = W_DateDeb + Frequence*W_FreqB*7 + 1
				END
			END
		END
		IF W_AuMoinsUnAideAbsent = "F" THEN
		   * Chevauchement
		   IF W_GereExcept = "V" THEN
			LOOP WHILE W_DateDerniereExceptB < W_DateTest
				READNEXT W_CleExceptB FROM VerifIntExceptionsB THEN
					W_DateDerniereExceptB = W_CleExceptB[11,5]
					
				END ELSE 
					W_DateDerniereExceptB = 999999
				END
			REPEAT
			LOOP WHILE W_DateDerniereExceptA < W_DateTest
				READNEXT W_CleExceptA FROM VerifIntExceptionsA THEN
					W_DateDerniereExceptA = W_CleExceptA[11,5]

				END ELSE 
					W_DateDerniereExceptA = 999999
				END
			REPEAT

			IF W_DateDerniereExceptB = W_DateTest OR W_DateDerniereExceptA = W_DateTest THEN
				* Pas d'erreur, mais on repouuse la limite des tests...
				W_DateDeb = W_DateTest 
			END ELSE
				* Erreur
				IF Traitement = "AE" THEN
					IF W_Erreur = "OK" THEN W_Erreur = ""
					W_Erreur<1,-1> = W_Cle
				END ELSE
				   IF W_Cle[1,5] # CodeAidant THEN
					W_Sortie<6,-1> = W_Cle
				   END ELSE
					W_Erreur = "La plage horaire est dj occupe par une autre intervention."
					W_BoutonsSortie = "OK"
					IF Traitement = "CP" THEN
						W_CleChevauchARenvoyer = W_Cle
					END
				   END
				END
				W_DateTest = W_DateFin + 1
			END
		   END ELSE
		   
			* Erreur
			IF Traitement = "AE" THEN
				IF W_Erreur = "OK" THEN
					W_Erreur = ""
				END
				W_Erreur<1,-1> = W_Cle
			END ELSE
				IF W_Cle[1,5] # CodeAidant THEN
					W_Sortie<6,-1> = W_Cle
				END ELSE
					W_Erreur = "La plage horaire est dj occupe par une autre intervention."
					W_BoutonsSortie = "OK"
					IF Traitement = "CP" THEN
						W_CleChevauchARenvoyer = W_Cle
					END
				END
			END
			W_DateTest = W_DateFin + 1
		   END
		END
	   END
	END
	IF W_DateTest > W_DateDeb + Frequence*W_FreqB*7 + 1 THEN
	* inutile d'aller plus loin : on aurait dj eu chevauchement s'il y avait lieu...
		W_DateTest = W_DateFin + 1
	END
   END
NEXT W_DateTest
IF W_GereExcept = "V" THEN
	EXECUTE 'EFFACER-LISTE ':W_NomVerifIntExceptionsB
	EXECUTE 'EFFACER-LISTE ':W_NomVerifIntExceptionsA
END
RETURN


7000 ********************************************************************************
*	Traitement absentisme : lancer l'tape 6 pour chaque remplaant.			*
*************************************************************************************
*EXECUTE 'SELECT TPSDETAILSINTERV AVEC 6 = "':CodeAidant:'"'
EXECUTE 'SELECT TPSDETAILSINTERV AVEC 6 = "':CodeAidant:'" AND AVEC 1="':DateDebParam:'" PAR CodeAidant'

IntervAbs=""
Traitement = "ABS"
AidantAbsent = CodeAidant[1,5]
W_NomIntervAbs = "IntervAbs":Traitement:AidantAbsent:TIME()
EXECUTE 'SAUVE-LISTE ':W_NomIntervAbs
EXECUTE 'LISTE ':W_NomIntervAbs RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	
	SELECT F.TPSDETAILSINTERV TO IntervAbs
	W_MessageSortie = ""
	W_ListeInterv = ""
	W_FinAbs = "F"
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
	WHILE W_FinAbs = "F" 
		READ ENR_INTERVABS FROM F.TPSDETAILSINTERV, W_CleAbs THEN

			CodeAidant = W_CleAbs[1,5]
			Jour = W_CleAbs[22,1]
			HreDebut = W_CleAbs[23,4]
			HreFin = ENR_INTERVABS<2>
			Frequence = ENR_INTERVABS<3>
			AncienCode = W_CleAbs
			W_LundiDebA = W_CleAbs[11,5] - MOD(W_CleAbs[11,5] - 1,7)
			W_DateRefA = W_LundiDebA + Jour
			LOOP WHILE W_DateRefA < DateDebParam 
				W_DateRefA = W_DateRefA + Frequence * 7
			REPEAT
			GOSUB 6100

			IF W_Erreur # "OK" THEN
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, CodeAidant THEN
					IF W_MessageSortie = "" THEN
						W_MessageSortie = "La prolongation de l'absence entrane une redondance de plages sur les couples (aidant - aid) suivants :":CHAR(13):CHAR(10):CHAR(13):CHAR(10)
					END
					IF INDEX(W_ListeInterv,W_CleAbs:";",1) = 0 THEN
						W_MessageSortie = W_MessageSortie:CodeAidant:" ":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>:" - "
						W_CleChevauchARenvoyer = W_CleAbs
						GOSUB 10000
						W_MessageSortie = W_MessageSortie:CHAR(13):CHAR(10)
						W_ListeInterv = W_ListeInterv:W_CleAbs:";"
					END
				END
				W_Erreur="OK"
				W_BoutonsSortie=""
			END
		END
	REPEAT
	GOSUB 8500
	GOSUB 9000
	IF W_MessageSortie # "" OR W_MessageIntervSansContrat # "" THEN
		IF W_MessageSortie # "" THEN
			W_MessageSortie = W_MessageSortie:CHAR(13):CHAR(10):W_MessageIntervSansContrat
		END ELSE
			W_MessageSortie = W_MessageIntervSansContrat
		END
		W_Erreur = W_MessageSortie
		W_BoutonsSortie<1,1> = "OK"
		W_BoutonsSortie<1,2> = "Annuler"
	END	

END
RETURN


8000 ********************************************************************************
*	Traitement absentisme : lancer l'tape 6 pour chaque remplaant.			*
*************************************************************************************
EXECUTE 'SELECT TPSDETAILSINTERV AVEC CodeAide = "':CodeAide:'" AND AVEC DateDebInterv <= "':DateFinParam:'" AND AVEC 1 >= "':DateDebParam:'" OR = "" '
IntervAbs=""
W_NomIntervAbs = "IntervAbs":Traitement:CodeAide:TIME()
EXECUTE 'SAUVE-LISTE ':W_NomIntervAbs
EXECUTE 'LISTE ':W_NomIntervAbs RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	W_SauveDateFinParam = DateFinParam
	
	SELECT F.TPSDETAILSINTERV TO IntervAbs
	W_MessageSortie = ""
	W_FinAbs = "F"
	W_HreDebRetenue = ""
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
		
	WHILE W_FinAbs = "F" 
		READ ENR_INTERVABS FROM F.TPSDETAILSINTERV, W_CleAbs THEN
  		  
			CodeAidant = W_CleAbs[1,5]
			Jour = W_CleAbs[22,1]
			HreDebut = W_CleAbs[23,4]
			HreFin = ENR_INTERVABS<2>
			Frequence = ENR_INTERVABS<3>
			AncienCode = W_CleAbs
			W_LundiDebA = W_CleAbs[11,5] - MOD(W_CleAbs[11,5] - 1,7)
			W_DateRefA = W_LundiDebA + Jour
			LOOP WHILE W_DateRefA < DateDebParam 
				W_DateRefA = W_DateRefA + Frequence * 7
			REPEAT
			IF DateFinParam > ENR_INTERVABS<1> THEN
				DateFinParam = ENR_INTERVABS<1>
			END
			GOSUB 6100
			
			IF W_Erreur # "OK" THEN
				
				
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, CodeAidant THEN
				   i = 0
				   LOOP
				   i = i + 1
				   WHILE W_Erreur<1,i> # ""
					
					IF INDEX(W_HreDebRetenue,W_Erreur<1,i>,1) = 0 THEN
						W_HreDebRetenue<1,-1> = W_Erreur<1,i>
					END
					k = 0
					W_Trouve = "F"
					LOOP
						k = k + 1
					WHILE W_Trouve = "F" AND INDEX(W_MessageSortie,CodeAidant,k) # 0
						
						IF W_MessageSortie[INDEX(W_MessageSortie,CodeAidant,k) + 30,5] = W_Erreur<1,i>[6,5] THEN
							W_Trouve = "V"
						END
					REPEAT
					IF W_Trouve = "F" THEN
						IF W_MessageSortie = "" THEN
							W_MessageSortie = "La modification de l'absence entrane une redondance de plages sur les couples suivants :":CHAR(13):CHAR(10)
						END
						W_MessageSortie = W_MessageSortie:CodeAidant:" ":TRIM(ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>)[1,24]"L 24"
						READ ENR_CIVILAIDE FROM F.CIVILAIDE, W_Erreur<1,i>[6,5] THEN
							W_MessageSortie = W_MessageSortie:W_Erreur<1,i>[6,5]:" ":ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>:CHAR(13):CHAR(10)
						END ELSE	
							W_MessageSortie = W_MessageSortie:CHAR(13):CHAR(10)
						END
						
					END
					IF INDEX(W_ListeInterv,W_CleAbs:";",1) = 0 THEN
						W_ListeInterv = W_ListeInterv:W_CleAbs:";"
					END
				   REPEAT	
				END
				W_Erreur="OK"
				W_BoutonsSortie=""
			END
			DateFinParam = W_SauveDateFinParam	
		  
		END
	REPEAT
	IF W_MessageSortie # "" THEN
		W_Erreur = W_MessageSortie
		W_BoutonsSortie<1,1> = "OK"
		W_BoutonsSortie<1,2> = "Annuler"
	END
END
RETURN

8500 **********************************************************
*       Absenteisme : vrification des absences aidant	  *
***************************************************************
IntervAbs=""
READ ENR_TABLESABSENCE FROM F.TABLES, "ABSENCES" ELSE ENR_TABLESABSENCE = ""
W_SauveSortie = W_MessageSortie
W_MessageSortie = ""
W_ReqAbsAidant = ""
W_NomReqAbs = "ReqAbs":Traitement:AidantAbsent:TIME()
EXECUTE 'LISTE ':W_NomIntervAbs RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	
	SELECT F.TPSDETAILSINTERV TO IntervAbs
	W_DernAidant = ""
	W_FinAbs = "F"
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
	WHILE W_FinAbs = "F" 
		
		IF INDEX(W_ListeInterv,W_CleAbs:";",1) = 0 THEN
		* Nb : si l'on sait dj qu'il y a chevauchement, inutile de rechercher les absences ...			
		  READ ENR_INTERVABS FROM F.TPSDETAILSINTERV, W_CleAbs THEN
			CodeAidant = W_CleAbs[1,5]
			Jour = W_CleAbs[22,1]
			HreDebut = W_CleAbs[23,4]
			HreFin = ENR_INTERVABS<2>
			Frequence = ENR_INTERVABS<3>
			AncienCode = W_CleAbs
			W_LundiDebA = W_CleAbs[11,5] - MOD(W_CleAbs[11,5] - 1,7)
			W_DateRefA = W_LundiDebA + Jour
			LOOP WHILE W_DateRefA < DateDebParam 
				W_DateRefA = W_DateRefA + Frequence * 7
			REPEAT
			
			IF CodeAidant # W_DernAidant THEN
				EXECUTE 'EFFACER-LISTE ':W_NomReqAbs
				EXECUTE 'SELECT ABSENCESAIDANT = "':CodeAidant:']" AVEC NumMotifAidant # "03" AND # "18" AND #"19" AND # "20" AND # "21" AND AVEC DebAbsAidant <= "':DateFinParam:'" AND AVEC 2 >= "':DateDebParam:'" PAR DebAbsAidant'
				EXECUTE 'SAUVE-LISTE ':W_NomReqAbs
			END
			W_DernAidant = CodeAidant
			EXECUTE 'LISTE ':W_NomReqAbs RETURNING MSGCODE
			W_LibAbsence = ""
			IF MSGCODE<1> # '209' THEN
				SELECT F.ABSENCESAIDANT TO W_ReqAbsAidant
				W_FinAbsence = "F"
				LOOP
					READNEXT W_CleAbsence FROM W_ReqAbsAidant ELSE W_FinAbsence = "V"
				WHILE W_FinAbsence = "F" 
				 IF W_LibAbsence = "" THEN
				 * Si dj une absence, on vide la slection mais inutile de tester les autres absences ...
				   READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT, W_CleAbsence THEN
					LOOP
					WHILE W_DateRefA < W_CleAbsence[8,5]
						W_DateRefA = W_DateRefA + Frequence * 7
					REPEAT
					LOOP
					WHILE W_DateRefA <= ENR_ABSENCESAIDANT<2> AND W_DateRefA <= DateFinParam AND W_DateRefA <= ENR_INTERVABS<1> AND W_LibAbsence = "" 
					  IF W_CleAbsence[6,2] <= "06" THEN
						* Maladie : pas d'exceptions :
						IF W_DateRefA <= ENR_ABSENCESAIDANT<2> AND W_DateRefA >= W_CleAbsence[8,5] THEN
							
							W_LibAbsence = "V"
						END
					  END ELSE
						READ ENR_ACTIVITES FROM F.ACTIVITES, W_CleAbs[16,6] ELSE ENR_ACTIVITES<12> = "P"
						W_Trouve8500 = "F"
						i8500 = 0
						LOOP
						i8500 = i8500 + 1
						WHILE ENR_ABSENCESAIDANT<26,i8500> # "" AND W_Trouve8500 = "F"
							READ ENR_CONTRAT FROM F.CONTRAT, ENR_ABSENCESAIDANT<26,i8500> THEN
							  IF INDEX(ENR_CONTRAT<36>,W_CleAbs[16,6],1) # 0 THEN
								IF ENR_ACTIVITES<12> = "M" THEN
									IF ENR_CONTRAT<3> = W_CleAbs[6,5] THEN
										i8500 = i8500 - 1
										W_Trouve8500 = "V"
									END
								END ELSE
									i8500 = i8500 - 1
									W_Trouve8500 = "V"
								END
							  END
							END
						REPEAT
						IF W_Trouve8500 = "V" THEN
							
							IF ENR_ABSENCESAIDANT<21> = "N" THEN
								* Rien : l'absence ne concerne pas ce contrat, donc cette intervention a lieu ...
							END ELSE
								IF W_DateRefA < ENR_ABSENCESAIDANT<24,i8500> AND W_DateRefA > ENR_ABSENCESAIDANT<22,i8500> THEN
									W_LibAbsence = "V"  
								END ELSE
								  IF W_DateRefA = ENR_ABSENCESAIDANT<24,i8500> AND ((ENR_ABSENCESAIDANT<25,i8500> = "M" AND HreDebut < MidiConges) OR ENR_ABSENCESAIDANT<25,i8500> # "M") THEN
									W_LibAbsence = "V"
								  END ELSE
									IF W_DateRefA = W_CleAbsence[8,5] AND ((ENR_ABSENCESAIDANT<22,i8500> = "A" AND HreFin > MidiConges) OR ENR_ABSENCESAIDANT<22,i8500> # "A") THEN
										W_LibAbsence = "V"
							  		END
								  END
								END
							END
						END ELSE
							IF W_DateRefA < ENR_ABSENCESAIDANT<2> AND W_DateRefA > W_CleAbsence[8,5] THEN
								W_LibAbsence = "V"  
							END ELSE
							  IF W_DateRefA = ENR_ABSENCESAIDANT<2> AND ((ENR_ABSENCESAIDANT<3> = "1" AND HreDebut < MidiConges) OR ENR_ABSENCESAIDANT<3> # "1") THEN
								W_LibAbsence = "V"
							  END ELSE
								IF W_DateRefA = W_CleAbsence[8,5] AND ((ENR_ABSENCESAIDANT<1> = "2" AND HreFin > MidiConges) OR ENR_ABSENCESAIDANT<1> # "2") THEN
									W_LibAbsence = "V"
							  	END
							  END
							END
						END
					  END 
					  IF W_LibAbsence # "" THEN
					    i8500 = 0
					    LOOP
					    i8500 = i8500 + 1 
					    WHILE ENR_TABLESABSENCE<2,i8500> # "" AND ENR_TABLESABSENCE<2,i8500> # W_CleAbsence[6,2]	
						
					    REPEAT
					    IF ENR_TABLESABSENCE<3,i8500> = "" THEN ENR_TABLESABSENCE<3,i8500> = "Absent"
					    W_LibAbsence = ENR_TABLESABSENCE<3,i8500>:" le " & OCONV(W_DateRefA,"D4/")	
					  END
					  W_DateRefA = W_DateRefA + Frequence * 7
					REPEAT
				   END
				 END
				REPEAT
			END
			* ici : on sait si absent ou pas :
			IF W_LibAbsence # "" THEN
				IF W_MessageSortie = "" THEN
					
				END
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, CodeAidant THEN
					IF W_MessageSortie = "" THEN
						W_MessageSortie = "Les remplacements suivants n'ont pas pu tre prolongS car les remplacants sont absents :":CHAR(13):CHAR(10):CHAR(13):CHAR(10)
					END
					IF INDEX(W_ListeInterv,W_CleAbs:";",1) = 0 THEN
						W_MessageSortie = W_MessageSortie:CodeAidant:" ":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>:" - "
						W_CleChevauchARenvoyer = W_CleAbs
						GOSUB 10000
						W_MessageSortie = W_MessageSortie:CHAR(13):CHAR(10)
						W_ListeInterv = W_ListeInterv:W_CleAbs:";"
					END
				END

			END
		  END
		END
	REPEAT
	EXECUTE 'EFFACER-LISTE ':W_NomReqAbs

END
IF W_MessageSortie # "" THEN
	IF W_SauveSortie = "" THEN
	END ELSE
		W_MessageSortie = W_SauveSortie:CHAR(13):CHAR(10):W_MessageSortie
	END
END ELSE
	W_MessageSortie = W_SauveSortie
END
RETURN

RETURN
9000 **********************************************************
*       Absenteisme : vrification des contrats de travail... *
***************************************************************
IntervAbs=""
W_DejaUneAnomalie = "F"
EXECUTE 'LISTE ':W_NomIntervAbs RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	
	SELECT F.TPSDETAILSINTERV TO IntervAbs
	
	W_FinAbs = "F"
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
	WHILE W_FinAbs = "F" 
		READ ENR_INTERVABS FROM F.TPSDETAILSINTERV, W_CleAbs THEN
			CodeAidant = W_CleAbs[1,5]
			CodeAide = W_CleAbs[6,5]
			CodeActivite = W_CleAbs[16,6]
			READ ENR_ACTIVITES FROM F.ACTIVITES, CodeActivite THEN
				TypeActivite = ENR_ACTIVITES<12>
			END
			
			GOSUB 1000
			 
			IF W_Erreur # "OK" THEN
			   IF ENR_TPSPARAM<19> # "1" THEN
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, CodeAidant THEN
					IF W_DejaUneAnomalie = "F" THEN
						W_MessageSortie = W_MessageSortie:"Impossible de prolonger les interventions des remplacants suivants :":CHAR(13):CHAR(10)
					END
					IF INDEX(W_MessageSortie,CodeAidant,1) = 0 THEN
						W_MessageSortie = W_MessageSortie:CodeAidant:" ":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>:" "
						W_CleChevauchARenvoyer = W_CleAbs
						GOSUB 10000
						W_MessageSortie = W_MessageSortie:" : ":CHAR(13):CHAR(10):" - ":W_Erreur:CHAR(13):CHAR(10)
					END
					W_DejaUneAnomalie = "V"
					IF INDEX(W_ListeInterv,W_CleAbs:";",1) = 0 THEN
						W_ListeInterv = W_ListeInterv:W_CleAbs:";"
					END
				END

			   END ELSE
			    READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, CodeAidant THEN
				IF W_MessageIntervSansContrat = "" THEN
					W_MessageIntervSansContrat = "Les interventions suivantes vont tre prolonges sans contrat : ":CHAR(13):CHAR(10)
				END
				
				W_MessageIntervSansContrat = W_MessageIntervSansContrat:CodeAidant:" ":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>:" "
				W_CleChevauchARenvoyer = W_CleAbs
				GOSUB 10001
				W_MessageIntervSansContrat = W_MessageIntervSansContrat:" : ":CHAR(13):CHAR(10):" - ":W_Erreur:CHAR(13):CHAR(10)
				IF INDEX(W_ListeIntervSsContrat,W_CleAbs:";",1) = 0 THEN
				    W_ListeIntervSsContrat = W_ListeIntervSsContrat:W_CleAbs:";"
				END
			    END
			   END
			   W_Erreur="OK"
			   W_BoutonsSortie=""
			END
		END
	REPEAT
	IF W_ListeIntervSsContrat # "" THEN
		W_ListeTemp = ""
		i = 1
		LOOP
		i = i + 1
		WHILE FIELD(W_ListeIntervSsContrat,";",i) # ""
			READ ENR_ACTIVITES FROM F.ACTIVITES, FIELD(W_ListeIntervSsContrat,";",i)[16,6] THEN
				IF ENR_ACTIVITES<12> = "M" THEN
					W_ListeTemp = W_ListeTemp:FIELD(W_ListeIntervSsContrat,";",i)[1,10]:";"
				END ELSE
					W_ListeTemp = W_ListeTemp:FIELD(W_ListeIntervSsContrat,";",i)[1,5]:FIELD(W_ListeIntervSsContrat,";",i)[16,3]:ENR_ACTIVITES<12>";"
				END
			END
		REPEAT
		W_ListeIntervSsContrat = W_ListeTemp
	END
	*IF W_MessageSortie # "" THEN
	*	W_Erreur = W_MessageSortie
	*	W_BoutonsSortie<1,1> = "OK"
	*	W_BoutonsSortie<1,2> = "Annuler"
	*END
END
RETURN

10000 *************************************************************************************
*		Message indiquant l'intervention avec laquelle il y a chevauchement		*
*******************************************************************************************
READ ENR_TPSPARAM FROM F.TPSPARAM, "1" ELSE
 ENR_TPSPARAM = ""
 ENR_TPSPARAM<20> = "2"
END
W_MessageSortie = W_MessageSortie:W_CleChevauchARenvoyer[6,5]
READ ENR_CIVILAIDE FROM F.CIVILAIDE, W_CleChevauchARenvoyer[6,5] THEN
	W_MessageSortie = W_MessageSortie:" ":ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>:" "
END
BEGIN CASE
	CASE W_CleChevauchARenvoyer[22,1] = "0"
		W_MessageSortie = W_MessageSortie:"le lundi "
	CASE W_CleChevauchARenvoyer[22,1] = "1"
		W_MessageSortie = W_MessageSortie:"le mardi "
	CASE W_CleChevauchARenvoyer[22,1] = "2"
		W_MessageSortie = W_MessageSortie:"le mercredi "
	CASE W_CleChevauchARenvoyer[22,1] = "3"
		W_MessageSortie = W_MessageSortie:"le jeudi "
	CASE W_CleChevauchARenvoyer[22,1] = "4"
		W_MessageSortie = W_MessageSortie:"le vendredi "
	CASE W_CleChevauchARenvoyer[22,1] = "5"
		W_MessageSortie = W_MessageSortie:"le samedi "
	CASE W_CleChevauchARenvoyer[22,1] = "6"
		W_MessageSortie = W_MessageSortie:"le dimanche "
END CASE
READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, W_CleChevauchARenvoyer THEN
	W_HreDebARenvoyer = W_CleChevauchARenvoyer[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_MessageSortie = W_MessageSortie:"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_MessageSortie = W_MessageSortie:" ":W_HreFinARenvoyer[1,2]*1:"h":W_Decimales:" "
	IF ENR_TPSDETAILSINTERV<1> = "" THEN
		W_MessageSortie = W_MessageSortie:"depuis le ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/")
	END ELSE
		IF ENR_TPSDETAILSINTERV<1> = W_CleChevauchARenvoyer[11,5] THEN
			W_MessageSortie = W_MessageSortie:"le ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/")
		END ELSE
			W_MessageSortie = W_MessageSortie:"du ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/"):" au ":OCONV(ENR_TPSDETAILSINTERV<1>,"D4/")
		END
	END
END
W_Sortie<1> = W_MessageSortie 

RETURN

10001 *************************************************************************************
*		Message indiquant l'intervention avec laquelle il y a chevauchement		*
*******************************************************************************************
READ ENR_TPSPARAM FROM F.TPSPARAM, "1" ELSE
 ENR_TPSPARAM = ""
 ENR_TPSPARAM<20> = "2"
END
W_MessageIntervSansContrat = W_MessageIntervSansContrat:W_CleChevauchARenvoyer[6,5]
READ ENR_CIVILAIDE FROM F.CIVILAIDE, W_CleChevauchARenvoyer[6,5] THEN
	W_MessageIntervSansContrat = W_MessageIntervSansContrat :" ":ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>:" "
END
BEGIN CASE
	CASE W_CleChevauchARenvoyer[22,1] = "0"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le lundi "
	CASE W_CleChevauchARenvoyer[22,1] = "1"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le mardi "
	CASE W_CleChevauchARenvoyer[22,1] = "2"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le mercredi "
	CASE W_CleChevauchARenvoyer[22,1] = "3"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le jeudi "
	CASE W_CleChevauchARenvoyer[22,1] = "4"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le vendredi "
	CASE W_CleChevauchARenvoyer[22,1] = "5"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le samedi "
	CASE W_CleChevauchARenvoyer[22,1] = "6"
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le dimanche "
END CASE
READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, W_CleChevauchARenvoyer THEN
	W_HreDebARenvoyer = W_CleChevauchARenvoyer[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_MessageIntervSansContrat = W_MessageIntervSansContrat:"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_MessageIntervSansContrat = W_MessageIntervSansContrat:" ":W_HreFinARenvoyer[1,2]*1:"h":W_Decimales:" "
	IF ENR_TPSDETAILSINTERV<1> = "" THEN
		W_MessageIntervSansContrat = W_MessageIntervSansContrat:"depuis le ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/")
	END ELSE
		IF ENR_TPSDETAILSINTERV<1> = W_CleChevauchARenvoyer[11,5] THEN
			W_MessageIntervSansContrat = W_MessageIntervSansContrat:"le ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/")
		END ELSE
			W_MessageIntervSansContrat = W_MessageIntervSansContrat:"du ":OCONV(W_CleChevauchARenvoyer[11,5],"D4/"):" au ":OCONV(ENR_TPSDETAILSINTERV<1>,"D4/")
		END
	END
END
W_Sortie<1> = W_MessageIntervSansContrat 

RETURN

11000 ********************************************************
*  On dtermine si W_JourFerieProsp (date interne) est un	*
* jour fri, si non on a en sortie W_JourFerieProsp = "F"	*
*************************************************************

* ATTENTION : ne pas utiliser variables i, k, W_NbMv,...
* pour viter tous risques, les variables utilises par cette procdure se nomment toutes [XX]FerieProsp
* + penser en dbut de programme a initialiser W_DerniereAnneeFerieProsp afin d'viter les avertissements d'unidata.

W_AnneeFerieProsp = OCONV(W_JourFerieProsp,"D4/")[7,4]
IF W_AnneeFerieProsp # W_DerniereAnneeFerieProsp THEN
*	READ ENR_PAQUES FROM F.PAQUES, W_AnneeFerieProsp THEN
*		ENR_PAQUES<2> = ICONV(ENR_PAQUES<1>[1,2]:"/":ENR_PAQUES<1>[3,2]:"/":W_AnneeFerieProsp,"D4/")
*	END ELSE
*		ENR_PAQUES = ""
*		ENR_PAQUES<2> = 0
*	END
	W_DerniereAnneeFerieProsp = W_AnneeFerieProsp
END

W_JourClairFerieProsp = OCONV(W_JourFerieProsp,"D4/")

IF OCONV(W_JourFerieProsp,"DWA") = "Sunday" OR OCONV(W_JourFerieProsp,"DWA") = "Dimanche" THEN
   W_JourFerieProsp = "F"
END ELSE
	W_Param=W_JourClairFerieProsp:"|":W_Cle[16,3]
  	CALL DIMJF(RETURNVAL,W_Param,Ferie)

  	IF Ferie[1,5] # "FERIE" THEN
		W_JourFerieProsp = "F"
  	END

*   W_JourClairFerieProsp = OCONV(W_JourFerieProsp,"D4/")
*   BEGIN CASE
*	CASE W_JourClairFerieProsp[1,5] = "01/01"
*	CASE W_JourClairFerieProsp[1,5] = "01/05"
*	CASE W_JourClairFerieProsp[1,5] = "08/05"
*	CASE W_JourClairFerieProsp[1,5] = "14/07"
*	CASE W_JourClairFerieProsp[1,5] = "15/08"
*	CASE W_JourClairFerieProsp[1,5] = "01/11"
*	CASE W_JourClairFerieProsp[1,5] = "11/11"
*	CASE W_JourClairFerieProsp[1,5] = "25/12"
*	CASE W_JourFerieProsp = ENR_PAQUES<2> + 1
*	CASE W_JourFerieProsp = ENR_PAQUES<2> + 39
*	CASE W_JourFerieProsp = ENR_PAQUES<2> + 39 + 11
*		* On ne considere plus le lundi de pentecote comme un jour fri ... * REVOIR si besoin est !!!
*		W_JourFerieProsp = "F"
*	CASE 1
*		W_JourFerieProsp = "F"
*   END CASE
END
RETURN

*************************************************************************
*		Convertit W_Hre20000 qui est en centiemmes 			*
* vers l'heure en minutes et en texte						*
*************************************************************************
20000
IF LEN(W_Hre20000) = 3 THEN
	W_Texte20000 = W_Hre20000[1,1]:"h"
	W_Cent20000 = W_Hre20000[2,2]
END ELSE
	W_Texte20000 = INT(W_Hre20000[1,2]):"h"
	W_Cent20000 = W_Hre20000[3,2]
END
W_Cent20000 = INT(W_Cent20000 /100 * 60 + 1/2)
W_Texte20000 = W_Texte20000:W_Cent20000"R%2"
W_Texte20000 = W_Texte20000
RETURN


