SUBROUTINE CHEVAUCHEMENTSDOMITIME(RETURNVAL,PARAMETRES,W_Sortie)
******************************************************
* Cette subroutine cherche les doublons dans les pointages
* valids de la gestion DOMITIME.
* Elle peut tre appele via PICK ou VB.
* Si c'est  partir de PICK, on gnre un fichier *.txt
* dans FUSION.
* Si c'est  partir de VB, on renvoie le tableau W_Sortie.
*
* Grgory - 26/11/07
******************************************************
EXECUTE "SET-THOUS ."
EXECUTE "SET-DEC ,"
EXECUTE "DATE.FORMAT"
OPEN "", "FUSION" TO F.FUSION ELSE RETURN
OPEN "", "TLGPOINTAGE" TO F.TLGPOINTAGE ELSE RETURN
OPEN "", "CIVILAIDANT" TO F.CIVILAIDANT ELSE RETURN
OPEN "", "CIVILAIDE" TO F.CIVILAIDE ELSE RETURN
OPEN "", "SECTEUR" TO F.SECTEUR ELSE RETURN
OPEN "", "DOMITIME" TO F.DOMITIME ELSE RETURN
OPEN "", "TEMPO" TO F.TEMPO ELSE RETURN
OPEN "", "TLGMOI" TO F.TLGMOI ELSE RETURN
OPEN "", "TLGHISTORPOINTAGE" TO F.TLGHISTORPOINTAGE ELSE RETURN
* Modif Greg - 15/12/15
OPEN "", "TLGPOINTAGESUPPR" TO F.TLGPOINTAGESUPPR ELSE RETURN
******************************************************

ENR_FUSION=""
ENR_TLGPOINTAGE=""
ENR_TEMP=""
ENR_CIVILAIDANT=""
ENR_CIVILAIDE1=""
ENR_CIVILAIDE2=""
ENR_SECTEUR=""
ENR_DOMITIME=""
ENR_TEMPO=""
ENR_TLGHISTORPOINTAGE=""

W_DateTransDeb=""
W_DateTransFin=""

W_Sortie=""

W_ReqTlg=""

W_Ind=0

* Rcupration des paramtres
W_DateDeb=PARAMETRES<1>
W_DateFin=PARAMETRES<2>
W_Appel=PARAMETRES<3>
W_CleTempo=PARAMETRES<4>

* Modif Greg - 05/07/11 - DA11061 - L'intgration en tlgestion peut dorvant
* se faire en individuel. Ce prsent PR tant appel, il faut qu'il puisse
* grer le traitement individuel.
IF W_CleTempo<>"" THEN
	READ ENR_TEMPOINDIV FROM F.TEMPO, W_CleTempo ELSE ENR_TEMPOINDIV=""
END

W_HeureTrt=TIMEDATE()
W_HeureTrt=W_HeureTrt[1,2]:'H':W_HeureTrt[4,2]

******************************************************
	
	* Modif Greg - 05/07/11 - DA11061 - Gestion "individuel".
	IF W_CleTempo="" THEN
		W_Requete='SSELECT TLGPOINTAGE AVEC DateDebInterv >= "':W_DateDeb:'" AND <= "':W_DateFin:'" PAR CodeAidant PAR DateDebInterv PAR HeureDebInterv'
	END ELSE
		W_Requete='SSELECT TLGPOINTAGE'
		FOR I = 1 TO DCOUNT(ENR_TEMPOINDIV,CHAR(254))
			IF I>1 THEN W_Requete=W_Requete:' OR'
			
			W_Requete=W_Requete:' AVEC CodeAidant = "':ENR_TEMPOINDIV<I,1>[1,5]:'"'
						
			IF ICONV(ENR_TEMPOINDIV<I,3>,"D4/") > W_DateDeb THEN
				W_Requete=W_Requete:' AND AVEC 3 >= "':ICONV(ENR_TEMPOINDIV<I,3>,"D4/"):'"'
			END ELSE
				W_Requete=W_Requete:' AND AVEC 3 >= "':W_DateDeb:'"'
			END
			
			IF TRIM(ENR_TEMPOINDIV<I,4>)="" THEN
				W_Requete=W_Requete:' AND <= "':W_DateFin:'"'
			END ELSE
				IF ICONV(ENR_TEMPOINDIV<I,4>,"D4/") < W_DateFin THEN
					W_Requete=W_Requete:' AND <= "':ICONV(ENR_TEMPOINDIV<I,4>,"D4/"):'"'
				END ELSE
					W_Requete=W_Requete:' AND <= "':W_DateFin:'"'
				END
			END
		NEXT I
		
		W_Requete=W_Requete:' PAR CodeAidant PAR DateDebInterv PAR HeureDebInterv'

		EXECUTE 'DELETE TEMPO ':W_CleTempo
	END
	* Fin modif Greg - 05/07/11

	EXECUTE W_Requete
	EXECUTE 'SAUVE-LISTE W_ReqTlg'
	EXECUTE "LISTE W_ReqTlg" RETURNING MSGCODE
	
	IF MSGCODE<1> # 209 THEN
		W_Ind=W_Ind+1
		W_Sortie<W_Ind>="Cle 1;Cle 2;Secteur;Code aidant;Nom et prenom aidant;Date de dbut 1;Date de fin 1;Code aide 1;Nom et prenom aide 1;Heure de debut 1;Heure de fin 1;Heure de debut validee 1;Heure de fin validee 1;Date de debut 2;Date de fin 2;Code aide 2;Nom et prenom aide 2;Heure de debut 2;Heure de fin 2;Heure de debut validee 2;Heure de fin validee 2"
		*W_Sortie<W_Ind>="Cle;Code;Aidant;J;Code;Aide;Debut;Fin"
	
		SELECT F.TLGPOINTAGE TO W_ReqTlg

		W_Fini="FAUX"
		LOOP
			READNEXT W_CleTlg FROM W_ReqTlg ELSE W_Fini="VRAI"
		WHILE W_Fini="FAUX" DO
			READ ENR_TLGPOINTAGE FROM F.TLGPOINTAGE, W_CleTlg THEN
				IF ENR_TEMP = "" THEN
					ENR_TEMP=ENR_TLGPOINTAGE
					ENR_TEMP<20>=W_CleTlg
				END ELSE
					GOSUB 10
				END
			END
		REPEAT
		GOSUB 10
		
	END

	ENR_TEMPO<1>=W_Ind-1
	ENR_TEMPO<2>=W_DateDeb
	ENR_TEMPO<3>=W_DateFin
	IF W_Appel<>"INTEGRE" THEN WRITE ENR_TEMPO ON F.TEMPO, "CHEVAUCHEMENTSDOMITIME"
	
	IF (W_Appel="INTEGRE" OR W_Appel="PRX") AND W_Sortie<2><>"" THEN
		IF W_Appel="PRX" THEN
			IF TRIM(W_Sortie<2>)="" THEN W_Sortie<2>="Aucun chevauchements"
			WRITE W_Sortie ON F.DOMITIME, 'Liste des chevauchements du ':OCONV(W_DateDeb,"D4-"):' au ':OCONV(W_DateFin,"D4-"):' ':W_HeureTrt:'.txt'
		END ELSE
			IF TRIM(W_Sortie<2>)="" THEN
				W_Sortie=""
			END ELSE
				W_Sortie=CONVERT(";",CHAR(253),W_Sortie)
			END
		END
	END
	
RETURN
******************************************************
10
	
	IF ENR_TEMP<20>[3,5]=W_CleTlg[3,5] AND (ENR_TEMP<20>[14,5]=W_CleTlg[14,5] OR ENR_TEMP<3>=W_CleTlg[14,5]) THEN
		* Modif Greg - 07/01/14 - Refonte de l'algo afin de grer correctement les nuits (ce qui n'tait pas le cas).
		* Je me base sur l'algo prsent dans l'historique des pointages, procdure VerifChevauchement. Les modifs incluent
		* le traitement des heures (pour grer les nuits) et le IF qui permet de tester si il y a chevauchement ou pas.
		
		* Je rcupre les horaires de l'intervention 1
		W_DateDeb1=ENR_TEMP<20>[14,5]
		W_DateFin1=ENR_TEMP<3>
		IF ENR_TEMP<7><>"" THEN
			W_HeureDeb1=ENR_TEMP<7>[1,2]:ENR_TEMP<7>[4,2]
			W_HeureFin1=ENR_TEMP<8>[1,2]:ENR_TEMP<8>[4,2]
		END ELSE
			W_HeureDeb1=ENR_TEMP<20>[19,2]:ENR_TEMP<20>[22,2]
			W_HeureFin1=ENR_TEMP<4>[1,2]:ENR_TEMP<4>[4,2]
		END
		
		* Je rcupre les horaires de l'intervention 2
		W_DateDeb2=W_CleTlg[14,5]
		W_DateFin2=ENR_TLGPOINTAGE<3>
		
		IF ENR_TLGPOINTAGE<7><>"" THEN
			W_HeureDeb2=ENR_TLGPOINTAGE<7>[1,2]:ENR_TLGPOINTAGE<7>[4,2]
			W_HeureFin2=ENR_TLGPOINTAGE<8>[1,2]:ENR_TLGPOINTAGE<8>[4,2]
		END ELSE
			W_HeureDeb2=W_CleTlg[19,2]:W_CleTlg[22,2]
			W_HeureFin2=ENR_TLGPOINTAGE<4>[1,2]:ENR_TLGPOINTAGE<4>[4,2]
		END
		
		* Test pour l'intervention 1 : si la date de fin est suprieure  la date de dbut, alors c'est une nuit.
		* Donc pour facilier les tests, on ajoute 24h  l'heure de fin. Sinon on ne fait rien.
		IF W_DateFin1>W_DateDeb1 THEN W_HeureFin1=W_HeureFin1+2400
		
		* Tests pour l'intervention 2
		* Si elle est sur une journe, on ne touche  rien.
        IF W_DateFin2 <> W_DateDeb2 THEN
            * La date de dbut de l'intervention 2 est infrieure  celle de l'intervention 2,
			* donc on retire 24h sur l'heure de dbut de l'intervention 2, car elle a dbut la veille.
			* On ne touche pas  l'heure de fin car elle est sur la mme date que l'intervention 1
			* (qui est le "repre").
            IF W_DateDeb2 < W_DateDeb1 THEN
                W_HeureDeb2 = W_HeureDeb2 - 2400
            END ELSE
                * Si la date de dbut de l'intervention 2 est sur la mme date de dbut que l'intervention 1, alors
                * c'est l'heure de fin de l'intervention 2 qui est sur une journe diffrente (celle d'aprs) donc on rajoute 24h.
                IF W_DateDeb2 = W_DateDeb1 THEN
                    W_HeureFin2 = W_HeureFin2 + 2400
                END ELSE
                    * La date de dbut de l'intervention 2 est suprieure  celle de l'intervention 1,
					* donc il s'agit d'une intervention qui a dbut le lendemain et qui se termine le
					* surlendemain (par rapport  l'intervention 1 qui est la rfrence). Donc on ajoute
					* 24h  l'heure de dbut de l'intervention 2 et 48h  l'heure de fin.
                    W_HeureDeb2 = W_HeureDeb2 + 2400
                    W_HeureFin2 = W_HeureFin2 + 4800
                END
            END
		END ELSE
			* Modif Greg - 07/05/15 - Ticket 9341 : un problme a t constat dans l'algo de la recherche des chevauchements
			* de l'historique des pointages. Comme l'algo est le mme ici, le mme problme est prsent et doit donc tre corrig.
			* En gros, l'algo existant gre correctement les interventions
			* - de jour compares  des interventions de jour
			* - de jour compares  des interventions de nuit
			* - de nuit compares  des interventions de nuit
			* Mais il ne permet pas de grer les interventions de nuit compares  des interventions de jour.
			* L'ajout du END ELSE est l pour rmdier  .
			IF W_DateDeb2>W_DateDeb1 THEN
                W_HeureDeb2 = W_HeureDeb2 + 2400
                W_HeureFin2 = W_HeureFin2 + 2400
			END
			* Fin modif Greg - 07/05/15
        END
				
		* IF pour tester si il y a chevauchement ou pas en fonction des horaires, modifis en fonction des dates.
		IF W_HeureDeb2 < W_HeureFin1 AND W_HeureFin2 > W_HeureDeb1 THEN
			* Modif Greg - 21/03/11 - DA11033 - On rsoud automatiquement les chevauchements si on le peut.
			W_ChevauchementResolu="NON"
			IF ENR_TEMP<20>[9,5]=W_CleTlg[9,5] AND W_Appel <> "INTEGRE" THEN
				IF (ENR_TEMP<1><>"" AND ENR_TEMP<2>="" AND ENR_TLGPOINTAGE<1>="" AND ENR_TLGPOINTAGE<2><>"") OR (ENR_TEMP<1>="" AND ENR_TEMP<2><>"" AND ENR_TLGPOINTAGE<1><>"" AND ENR_TLGPOINTAGE<2>="") THEN
					* Modif Greg - 15/12/15 - Dans la v580, on a mis en place la gestion de TLGPOINTAGESUPPR.
					* Quand un TLGPOINTAGE est supprim dfinitivement, on renseigne le nouveau fichier.
					* Ca n'a pas t fait dans les cas o la suppression est suivie d'une cration ou compltion d'une autre intervention.
					* Par exemple si la suppression est de au fait que la cl change, alors on part du principe qu'il ne s'agit pas d'une
					* vraie suppression, car on garde tout de mme une intervention.
					* Mais il s'avre qu'on a un souci quelque part : TLGPOINTAGESQL a des suppressions "dfinitives" qu'on ne retrouve pas
					* dans TLGPOINTAGESUPPR.
					* Comme on ne sait pas d'o vient le problme, il a t dcid de renseigner TLGPOINTAGESUPPR  chaque suppression, qu'elle
					* soit dfinitive ou dans le cadre d'une gestion plus globale, comme ici : on a 2 interventions qui se compltent, on les
					* supprime et  partir des donnes des 2 interventions, on en fait une seule.
					W_DateSuppr=OCONV(DATE(),"D4/")
					W_TimeSuppr=TIMEDATE()
					W_TimeSuppr=W_TimeSuppr[1,2]:W_TimeSuppr[4,2]
					ENR_TLGPOINTAGESUPPR=""
					ENR_TLGPOINTAGESUPPR=ENR_TEMP
					ENR_TLGPOINTAGESUPPR<10>=ENR_TLGPOINTAGESUPPR<10>:" SUPPRESSION VIA CHEVAUCHEMENTSDOMITIME - Le ":W_DateSuppr:"  ":W_TimeSuppr:"."
					ENR_TLGPOINTAGESUPPR<10>=ENR_TLGPOINTAGESUPPR<10>:" Interv. 1 : ":ENR_TEMP<20>:" - Interv. 2 : ":W_CleTlg
					WRITE ENR_TLGPOINTAGESUPPR ON F.TLGPOINTAGESUPPR, ENR_TEMP<20>
					
					ENR_TLGPOINTAGESUPPR=""
					ENR_TLGPOINTAGESUPPR=ENR_TLGPOINTAGE
					ENR_TLGPOINTAGESUPPR<10>=ENR_TLGPOINTAGESUPPR<10>:" SUPPRESSION VIA CHEVAUCHEMENTSDOMITIME - Le ":W_DateSuppr:"  ":W_TimeSuppr:"."
					ENR_TLGPOINTAGESUPPR<10>=ENR_TLGPOINTAGESUPPR<10>:" Interv. 1 : ":ENR_TEMP<20>:" - Interv. 2 : ":W_CleTlg
					WRITE ENR_TLGPOINTAGESUPPR ON F.TLGPOINTAGESUPPR, W_CleTlg					
				
					EXECUTE "DELETE TLGPOINTAGE ":ENR_TEMP<20>
					EXECUTE "DELETE TLGPOINTAGE ":W_CleTlg
					
					* On rcupre les donnes MOI, qui sont lies au pointage de fin.
					* Donc les donnes sont enregistres dans TLGMOI avec la cl de
					* TLGPOINTAGE qui contient le rel pointage de fin.
					IF ENR_TEMP<1><>"" THEN
						READ ENR_TLGMOI FROM F.TLGMOI, W_CleTlg THEN
							EXECUTE "DELETE TLGMOI ":W_CleTlg
						END ELSE
							ENR_TLGMOI="RIEN"
						END
						ENR_TLGPOINTAGE<1>=ENR_TEMP<1>
						W_CleTlg=ENR_TEMP<20>						
					END ELSE
						READ ENR_TLGMOI FROM F.TLGMOI, ENR_TEMPO<20> THEN
							EXECUTE "DELETE TLGMOI ":ENR_TEMPO<20>
						END ELSE
							ENR_TLGMOI="RIEN"
						END
						ENR_TLGPOINTAGE<2>=ENR_TEMP<2>
						ENR_TLGPOINTAGE<3>=ENR_TEMP<3>
						ENR_TLGPOINTAGE<4>=ENR_TEMP<4>
					END
					
					READ ENR_TLGHISTORPOINTAGE FROM F.TLGHISTORPOINTAGE, ENR_TLGPOINTAGE<1> ELSE ENR_TLGHISTORPOINTAGE=""
					W_DateTransDeb=OCONV(ENR_TLGHISTORPOINTAGE<7>,"D4/")
					READ ENR_TLGHISTORPOINTAGE FROM F.TLGHISTORPOINTAGE, ENR_TLGPOINTAGE<2> ELSE ENR_TLGHISTORPOINTAGE=""
					W_DateTransFin=OCONV(ENR_TLGHISTORPOINTAGE<7>,"D4/")
					
					ENR_TLGPOINTAGE<7>=""
					ENR_TLGPOINTAGE<8>=""
					ENR_TLGPOINTAGE<9>=""
					ENR_TLGPOINTAGE<10>="Correction de chevauchement le ":OCONV(DATE(),"D4/"):"  ":OCONV(TIME(),"MT"):" : pointage de dbut intgr le ":W_DateTransDeb:" et pointage de fin intgr le ":W_DateTransFin:"."
				
					* Si des MOI ont t trouves, on les enregistre avec la cl "dfinitive".
					IF ENR_TLGMOI<>"RIEN" THEN
						WRITE ENR_TLGMOI ON F.TLGMOI, W_CleTlg
					END
					WRITE ENR_TLGPOINTAGE ON F.TLGPOINTAGE, W_CleTlg
		
					W_ChevauchementResolu="OUI"
				END
			END
				
			IF W_ChevauchementResolu="NON" THEN
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, ENR_TEMP<20>[3,5] ELSE ENR_CIVILAIDANT=""
				READ ENR_CIVILAIDE1 FROM F.CIVILAIDE, ENR_TEMP<20>[9,5] ELSE ENR_CIVILAIDE1=""
				READ ENR_CIVILAIDE2 FROM F.CIVILAIDE, W_CleTlg[9,5] ELSE ENR_CIVILAIDE2=""
				READ ENR_SECTEUR FROM F.SECTEUR, ENR_CIVILAIDANT<31> ELSE ENR_SECTEUR=""

				* Modif Greg - 22/03/11 - Ajout des heures valides (car le chevauchement peut tre sur les heures valides mais pas sur les heures pointes).
				W_Ind=W_Ind+1
				W_Sortie<W_Ind>=ENR_TEMP<20>:";":W_CleTlg
				W_Sortie<W_Ind>=W_Sortie<W_Ind>:";":ENR_SECTEUR<1>:";":ENR_TEMP<20>[3,5]:";":ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>
				W_Sortie<W_Ind>=W_Sortie<W_Ind>:";":OCONV(ENR_TEMP<20>[14,5],"D4/"):";":OCONV(ENR_TEMP<3>,"D4/"):";":ENR_TEMP<20>[9,5]:";":ENR_CIVILAIDE1<2>:" ":ENR_CIVILAIDE1<3>:";":ENR_TEMP<20>[19,8]:";":ENR_TEMP<4>:';':ENR_TEMP<7>:';':ENR_TEMP<8>
				W_Sortie<W_Ind>=W_Sortie<W_Ind>:";":OCONV(W_CleTlg[14,5],"D4/"):";":OCONV(ENR_TLGPOINTAGE<3>,"D4/"):";":W_CleTlg[9,5]:";":ENR_CIVILAIDE2<2>:" ":ENR_CIVILAIDE2<3>:";":W_CleTlg[19,8]:";":ENR_TLGPOINTAGE<4>:";":ENR_TLGPOINTAGE<7>:";":ENR_TLGPOINTAGE<8>
			END
		END
	END

	ENR_TEMP=ENR_TLGPOINTAGE
	ENR_TEMP<20>=W_CleTlg
RETURN