*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 "","SSIADEXCEPTPROTOC" TO F.SSIADEXCEPTPROTOC ELSE STOP
OPEN "","SSIADPROTOCOLE" TO F.SSIADPROTOCOLE 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 "","SSIADABSENCESAIDE" 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 "", "PAQUES" TO F.PAQUES ELSE STOP
OPEN "", "TPSTEMPO" TO F.TPSTEMPO ELSE STOP
*********************************************************
* Recuperation des arguments					  *
*********************************************************

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

PROCREAD PARAMETRESTEMP ELSE STOP

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

READ PARAMETRES FROM F.TPSTEMPO, "PARAMVERIFPROTOCSSIAD":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
CodeAide = 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)
Frequence = 1

* 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
CodeAidant = 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


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
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 = ""

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 SSIADPROTOCOLE
*		* 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
		PRINT "Va 4000"
		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
		PRINT "Va 5000"
		GOSUB 5000
	END

	IF ((Etape=6) OR (Etape < 6 AND EtapesSuivantes = "S")) AND W_Erreur = "OK" THEN
		PRINT "Va 6000"
		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
*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, "VERIFPROTOCSSIAD":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_ACTIVITES<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
RETURN

2000 ********************************************************************************
*				Etape 2 : Absences de l'aid						*
*************************************************************************************
READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, CodeAide THEN
   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_BoutonsSortie<1,1> = "OK"
	   W_BoutonsSortie<1,2> = "Annuler"
	   W_EtapeSortie = "2"
	END
   REPEAT
END
RETURN 

3000 ********************************************************************************
*			Etape 3 : Accords et demandes d'accords					*
*************************************************************************************
W_FinInterv = DateFinParam
IF W_FinInterv = "" THEN
	W_FinInterv = 999999
END
EXECUTE 'SELECT SSIADACCORD = "':CodeAide:']" AVEC 2 >= "':DateDebParam:'" AND AVEC 1 <= "':DateDebParam:'" AND AVEC 3 = "':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
	
	W_Erreur = "Aid sans accord ni demande d'accord en cours pour cette activit  la date de dbut d'intervention."
	W_BoutonsSortie<1,1> = "OK"
	W_BoutonsSortie<1,2> = "Annuler"
	W_EtapeSortie = "3"
	
END
RETURN

4000 ********************************************************************************
*			Etape 4 : Absences de l'aidant						*
* Si besoin un jour, cf PR VERIFTPS									*
*************************************************************************************
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"
*		END
*	END
*   END
*REPEAT
RETURN

5000 ********************************************************************************
*			Etape 5 : Indisponibilits de l'aidant					*
* Si besoin un jour, cf PR VERIFTPS									*
*************************************************************************************

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."
*						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."
				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
* 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 saisie"
		END ELSE
			W_Erreur = W_Erreur:", et est indisponible sur la plage horaire saisie"
		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 saisie."
		END ELSE
			W_Erreur = "L'aid est indisponible sur la plage horaire saisie."
		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 + 7
END
PRINT OCONV(W_DateRefA,"D4/")
FOR i = 1 TO W_NbPlagesDispo
	HreDebut = W_ListePlagesDispo<1,i>
	HreFin = W_ListePlagesDispo<2,i>
	
	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 = ""
		i = W_NbPlagesDispo + 1
	END
NEXT i
RETURN


6100 ********************************************************************************
*					Traitement								*
*************************************************************************************
W_Temp = ' AVEC JourInterv = "':Jour:'" AND AVEC 2 > "':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 SSIADPROTOCOLE AVEC CodeAide = "':CodeAide:'" AND ':W_Temp
END ELSE
	W_Temp = 'SELECT SSIADPROTOCOLE = "':CodeAide:']"':W_Temp
END
W_Temp=W_Temp:'PAR HeureInterv'
PRINT W_Temp
EXECUTE 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.SSIADPROTOCOLE 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_SSIADPROTOCOLE FROM F.SSIADPROTOCOLE, W_Cle THEN
			PRINT "Lu ! "
			W_FreqB = 1
			W_LundiDebB = W_Cle[11,5] - MOD(W_Cle[11,5] - 1,7)
			W_DateRefB = W_LundiDebB + W_Cle[17,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_SSIADPROTOCOLE<1> = "" THEN
				W_DateFin = W_DateDeb + (Frequence * W_FreqB * 7) + 1
				W_GereExcept = "F"
			END ELSE
			      IF DateFinParam = "" THEN
					W_DateFin = ENR_SSIADPROTOCOLE<1>
				END ELSE
					W_DateFin = DateFinParam
					IF W_DateFin > ENR_SSIADPROTOCOLE<1> AND ENR_SSIADPROTOCOLE<1> # "" THEN
						W_DateFin = ENR_SSIADPROTOCOLE<1>
					END
				END
				
				
			END			
			PRINT OCONV(W_DateFin,"D4/")
			IF Traitement = "RA" THEN
				W_HreDebB = W_Cle[23,4]
				W_HreFinB = ENR_SSIADPROTOCOLE<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 SSIADEXCEPTPROTOC 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.SSIADEXCEPTPROTOC TO VerifIntExceptionsB
		READNEXT W_CleExceptB FROM VerifIntExceptionsB THEN
			W_DateDerniereExceptB = W_CleExceptB[6,5]
		END ELSE 
			W_DateDerniereExceptB = 999999
		END
	END
	IF AncienCode # "" THEN
	  IF Traitement # "CP" THEN
		EXECUTE 'SELECT SSIADEXCEPTPROTOC 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.SSIADEXCEPTPROTOC TO VerifIntExceptionsA
			READNEXT W_CleExceptA FROM VerifIntExceptionsA THEN
				W_DateDerniereExceptA = W_CleExceptA[6,5]

			END ELSE 
				W_DateDerniereExceptA = 999999
			END
		END
	  END
	END
END
FOR W_DateTest = W_DateRefA TO W_DateFin STEP Frequence*7
PRINT "Test : ":W_DateTest
   IF W_DateTest >= W_DateDeb THEN
	IF MOD(W_DateTest - W_DateRefB, W_FreqB *7 ) = 0 THEN
	PRINT "Risque : "
	   W_AuMoinsUnAideAbsent = "F"
	   W_DateFinAbsAide = ""
	   READ ENR_ABSENCESAIDE FROM F.ABSENCESAIDE, W_Cle[1,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_SSIADPROTOCOLE<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_SSIADPROTOCOLE<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_SSIADPROTOCOLE<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_SSIADPROTOCOLE<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_SSIADPROTOCOLE<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_SSIADPROTOCOLE<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[6,5]
					
				END ELSE 
					W_DateDerniereExceptB = 999999
				END
			REPEAT
			LOOP WHILE W_DateDerniereExceptA < W_DateTest
				READNEXT W_CleExceptA FROM VerifIntExceptionsA THEN
					W_DateDerniereExceptA = W_CleExceptA[6,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] # CodeAide 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] # CodeAide 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 SSIADPROTOCOLE AVEC 6 = "':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.SSIADPROTOCOLE 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.SSIADPROTOCOLE, 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 9000
	IF W_MessageSortie # "" THEN
		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 SSIADPROTOCOLE 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.SSIADPROTOCOLE TO IntervAbs
	W_MessageSortie = ""
	W_FinAbs = "F"
	W_HreDebRetenue = ""
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
		ENR_RAPPORT<-1> = "Cle A : ":W_CleAbs
	WHILE W_FinAbs = "F" 
		READ ENR_INTERVABS FROM F.SSIADPROTOCOLE, 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

9000 **********************************************************
*       Absenteisme : vrification des contrats de travail... *
***************************************************************
IntervAbs=""
W_DejaUneAnomalie = "F"
EXECUTE 'LISTE ':W_NomIntervAbs RETURNING MSGCODE
IF MSGCODE<1> # 209 THEN
	
	SELECT F.SSIADPROTOCOLE TO IntervAbs
	
	W_FinAbs = "F"
	LOOP
		READNEXT W_CleAbs FROM IntervAbs ELSE W_FinAbs = "V"
	WHILE W_FinAbs = "F" 
		READ ENR_INTERVABS FROM F.SSIADPROTOCOLE, 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
				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
				W_Erreur="OK"
				W_BoutonsSortie=""
			END
		END
	REPEAT
	*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		*
*******************************************************************************************
W_MessageSortie = W_MessageSortie:W_CleChevauchARenvoyer[1,5]
READ ENR_CIVILAIDE FROM F.CIVILAIDE, W_CleChevauchARenvoyer[1,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_SSIADPROTOCOLE FROM F.SSIADPROTOCOLE, W_CleChevauchARenvoyer THEN
	W_HreDebARenvoyer = W_CleChevauchARenvoyer[18,4]
	W_Decimales = W_HreDebARenvoyer[3,2]
	W_Decimales = INT(W_Decimales * 0.6 + 1/2)"R%2"

	W_MessageSortie = W_MessageSortie:"de ":W_HreDebARenvoyer[1,2]:"h":W_Decimales:" "
	W_HreFinARenvoyer = ENR_SSIADPROTOCOLE<2>
	IF LEN(W_HreFinARenvoyer) = 4 THEN
		
	END ELSE
		W_HreFinARenvoyer = "0":W_HreFinARenvoyer
	END
	W_Decimales = W_HreFinARenvoyer[3,2]
	W_Decimales = INT(W_Decimales * 0.6 + 1/2)"R%2"

	W_MessageSortie = W_MessageSortie:" ":W_HreFinARenvoyer[1,2]*1:"h":W_Decimales:" "
	IF ENR_SSIADPROTOCOLE<1> = "" THEN
		W_MessageSortie = W_MessageSortie:"depuis le ":OCONV(W_CleChevauchARenvoyer[6,5],"D4/")
	END ELSE
		IF ENR_SSIADPROTOCOLE<1> = W_CleChevauchARenvoyer[11,5] THEN
			W_MessageSortie = W_MessageSortie:"le ":OCONV(W_CleChevauchARenvoyer[6,5],"D4/")
		END ELSE
			W_MessageSortie = W_MessageSortie:"du ":OCONV(W_CleChevauchARenvoyer[6,5],"D4/"):" au ":OCONV(ENR_SSIADPROTOCOLE<1>,"D4/")
		END
	END
END
W_Sortie<1> = W_MessageSortie 

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:"|":CodeActivite[1,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


