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

OPEN "", "TPSSANSCONTRAT" TO F.TPSSANSCONTRAT ELSE STOP
OPEN "", "CONTRAT" TO F.CONTRAT ELSE STOP
OPEN "", "CIVILAIDANT" TO F.CIVILAIDANT ELSE STOP
OPEN "", "CIVILAIDE" TO F.CIVILAIDE ELSE STOP
OPEN "", "TPSDETAILSINTERV" TO F.TPSDETAILSINTERV ELSE STOP
OPEN "", "TPSEXCEPTIONS" TO F.TPSEXCEPTIONS ELSE STOP
OPEN "", "PERIODESPAIE" TO F.PERIODESPAIE ELSE STOP
OPEN "", "ASSOCIATION" TO F.ASSOCIATION ELSE STOP
OPEN "", "ACTIVITES" TO F.ACTIVITES ELSE STOP
OPEN "", "SECTEUR" TO F.SECTEUR ELSE STOP
OPEN "", "TPSTEMPO" TO F.TPSTEMPO ELSE STOP

PROCREAD PARAMETRES ELSE STOP
User = FIELD(PARAMETRES,"|",2)
Tri = FIELD(PARAMETRES,"|",3)
Selection = FIELD(PARAMETRES,"|",4)

READ ENR_PERIODESPAIE FROM F.PERIODESPAIE, "1" THEN
	DateDeb = ICONV("01/":ENR_PERIODESPAIE<1>[5,2]:"/":ENR_PERIODESPAIE<1>[1,4],"D4/")
END

* Initialisation Tableau TypeAct
TypeAct = ""
GOSUB 1000

W_Temp = 'SELECT TPSSANSCONTRAT'
BEGIN CASE
	CASE Tri = "S"
		IF Selection # "" THEN
			W_Temp = W_Temp:' AVEC SecteurAidant = "':Selection:'"'
		END ELSE
			W_Temp = W_Temp:' PAR LibSecteurAidant'
		END	

	CASE Tri = "C"
		IF Selection # "" THEN
			W_Temp = W_Temp:' AVEC CommuneAidant = "':Selection:'"'
		END ELSE
			W_Temp = W_Temp:' PAR CommuneAidant'
		END	

	CASE 1
		
END CASE
W_Temp = W_Temp:" PAR NomPrenomAidant PAR @ID"

W_Resultat = ""
W_IndResultat = 1

W_DerniereAsso = ""

EXECUTE W_Temp
W_NomListe1 = "ListeCoupleIntervSsContrat":User
W_NomListe2 = "ListeInterventionsIntervSsContrat":User
W_NomListe3 = "ListeContratIntervSsContrat":User

W_ReqContrat = ""
W_ReqInterventions = ""
W_ReqTpsSansContrat = ""

EXECUTE 'SAUVE-LISTE ':W_NomListe1
EXECUTE 'LISTE ':W_NomListe1 RETURNING MSGCODE
IF MSGCODE<1> # "209" THEN
	SELECT F.TPSSANSCONTRAT TO W_ReqTpsSansContrat
	GOSUB 10
	GOSUB 800
END ELSE
	* Rien (W_Resultat = "")
END

EXECUTE 'EFFACER-LISTE ':W_NomListe1
EXECUTE 'EFFACER-LISTE ':W_NomListe2
EXECUTE 'EFFACER-LISTE ':W_NomListe3

WRITE W_Resultat ON F.TPSTEMPO, "INTERVSANSCONTRAT":User

STOP

10 **********************************************************************************
*				Parcours requte sur TPSSANSCONTRAT					*
*************************************************************************************
W_FinTpsSansContrat = "F"
DernCodeAidant = ""
DernCodeAidantContrat = ""
LOOP
	READNEXT W_CleTpsSansContrat FROM W_ReqTpsSansContrat ELSE W_FinTpsSansContrat = "V"
WHILE W_FinTpsSansContrat = "F"
	W_TrouveUneIntervSansContrat = "F"
	CodeAidant = W_CleTpsSansContrat[1,5]
	IF LEN(W_CleTpsSansContrat) = 9 THEN
		CodeEmpl = W_CleTpsSansContrat[6,3]
		Activite = W_CleTpsSansContrat[9,1]
	END ELSE
		CodeEmpl = W_CleTpsSansContrat[6,5]
		Activite = "M"
	END
	GOSUB 100
	IF W_TrouveUneIntervSansContrat = "F" THEN
		DELETE F.TPSSANSCONTRAT, W_CleTpsSansContrat
	END
	DernCodeAidant = CodeAidant
REPEAT
RETURN

100 *********************************************************************************
*		Traitement d'un couple	: Selection TPSDETAILSINTERV				*
*************************************************************************************
IF CodeAidant # DernCodeAidant THEN
	EXECUTE 'SELECT TPSDETAILSINTERV AVEC CodeAidant = "':CodeAidant:'" AND AVEC 1 >= "':DateDeb:'" OR = ""'
	EXECUTE 'SAUVE-LISTE ':W_NomListe2
END
EXECUTE 'LISTE ':W_NomListe2 RETURNING MSGCODE
IF MSGCODE<1> # "209" THEN
	SELECT F.TPSDETAILSINTERV TO W_ReqInterventions
	GOSUB 200
END
RETURN

200 *********************************************************************************
*				Parcours des TPSDETAILSINTERV						*
*************************************************************************************
W_FinInterv = "F"
LOOP
READNEXT W_CleInterv FROM W_ReqInterventions ELSE W_FinInterv = "V"
WHILE W_FinInterv = "F"
  READ ENR_TPSDETAILSINTERV FROM F.TPSDETAILSINTERV, W_CleInterv THEN
	IF (CodeEmpl = W_CleInterv[16,3] AND TypeAct<W_CleInterv[16,3],W_CleInterv[19,3]> = Activite) OR (CodeEmpl = W_CleInterv[6,5] AND TypeAct<W_CleInterv[16,3],W_CleInterv[19,3]> = "M") THEN
		* On est bien sur une des interventions qui peuvent avoir donn lieu  l'criture dans le fichier TPSSANSCONTRAT
		GOSUB 300
	END
  END  
REPEAT
RETURN

300 *********************************************************************************
*		Traitement d'un couple	: Selection CONTRAT					*
*************************************************************************************
IF CodeAidant # DernCodeAidantContrat THEN
	EXECUTE 'SELECT CONTRAT AVEC @ID = "':CodeAidant:']" AND AVEC 65 # "O" AND AVEC 8 >= "':DateDeb:'" OR = "" PAR 7'
	EXECUTE 'SAUVE-LISTE ':W_NomListe3
	DernCodeAidantContrat = CodeAidant
END

******** IMPORTANT : Initialiser ici les priodes e validits du contrat ****************
* car si aucun contrat ne rponds aux critres, pas de comparaison possible...
* nb : on pourrait optimiser ici le traitement des interventions : inutile de relire les contrats prestataires au cas o plusieurs interventions prest...
W_PeriodesValides = ""

EXECUTE 'LISTE ':W_NomListe3 RETURNING MSGCODE

IF MSGCODE<1> # "209" THEN
	SELECT F.CONTRAT TO W_ReqContrat
	GOSUB 500
END


W_DatePremiereIntervSsCont = "Aucune"
W_DateDerniereIntervSsCont = "Aucune"

* Puis vrification de l'adquation de l'intervention par rapport aux priodes de validits des contrats :
GOSUB 600

IF W_DatePremiereIntervSsCont = "Aucune" THEN
	* Rien. nb : Il est possible qu'une autre intervention du mme employeur, mme activit soit sans contrat...
END ELSE
	W_TrouveUneIntervSansContrat = "V"
	GOSUB 700
END


RETURN

500 *********************************************************************************
*			Comparaison d'un TPSDETAILSINTERV aux contrats				*
* 1ere tape : dtermination de priodes de validit du contrat
*************************************************************************************
W_FinContrat = "F"
W_IndPeriodes = 0
LOOP
READNEXT W_CleContrat FROM W_ReqContrat ELSE W_FinContrat = "V"
WHILE W_FinContrat = "F"
   READ ENR_CONTRAT FROM F.CONTRAT, W_CleContrat THEN
    IF INDEX(ENR_CONTRAT<36>,W_CleInterv[16,6],1) # 0 THEN
	* Activit prsente dans le contrat de travail !
	IF (ENR_CONTRAT<2> = CodeEmpl AND TypeAct<ENR_CONTRAT<36,1>[1,3],ENR_CONTRAT<36,1>[4,3]> = Activite) OR (ENR_CONTRAT<3> = CodeEmpl AND Activite = "M") THEN
		* Contrat  prendre en compte
		W_IndPeriodes = W_IndPeriodes + 1
		W_PeriodesValides<W_IndPeriodes,1> = ENR_CONTRAT<7>
		W_PeriodesValides<W_IndPeriodes,2> = ENR_CONTRAT<8>
	END
    END
   END
REPEAT

RETURN

600 *********************************************************************************
*	Comparaison de l'intervention avec les dates du contrat				*
*************************************************************************************
W_Freq = ENR_TPSDETAILSINTERV<3>
W_DateDebInterv = W_CleInterv[11,5]
W_DateFinInterv = INT(ENR_TPSDETAILSINTERV<1>)
IF W_DateFinInterv = 0 THEN
	W_DateFinInterv = 99999
END
IF MOD(W_DateDebInterv,7)=0 THEN
	* Date de dbut = dimanche 
	W_LundiDeb = W_DateDebInterv - 6
END ELSE
	W_LundiDeb = W_DateDebInterv - MOD(W_DateDebInterv,7) + 1
END

W_JourInterv = W_CleInterv[22,1]
W_DateIntervRef = W_LundiDeb + W_JourInterv
IF INT(W_DateIntervRef) < INT(W_DateDebInterv) THEN
	W_DateIntervRef = W_DateIntervRef + W_Freq*7
END

W_IndPeriodes = 0
LOOP
W_IndPeriodes = W_IndPeriodes + 1
WHILE W_PeriodesValides<W_IndPeriodes,1> # "" AND (W_PeriodesValides<W_IndPeriodes,2> < W_DateIntervRef AND W_PeriodesValides<W_IndPeriodes,2> # "")
REPEAT
IF DateDeb > W_DateIntervRef THEN
	W_Date = DateDeb - 1	
END ELSE
	W_Date = W_DateIntervRef - 1
END

W_FinParcours = "F"
W_Step = 1
LOOP
W_Date = W_Date + W_Step
WHILE W_FinParcours = "F"
	
	IF W_Date >= W_DateIntervRef THEN
	
	   IF MOD(W_Date-W_DateIntervRef, W_Freq*7) = 0 THEN
		W_Step = W_Freq*7
		* Tester ici que W_Date est dans le contrat ....
		IF W_PeriodesValides<W_IndPeriodes,1> = "" THEN
			* On est arriv au bout des priodes valides, c'est a dire que toutes les prochaines interventions seront sans contrat...
			IF W_DatePremiereIntervSsCont = "Aucune" THEN
				W_DatePremiereIntervSsCont = W_Date

			END
			IF W_DateFinInterv = 99999 THEN
				W_DateDerniereIntervSsCont = ""
				W_FinParcours = "V"
			END ELSE
				* Nb : on va continuer de parcourir les interventions (effectives !) jusqu' la dernire...
				W_DateDerniereIntervSsCont = W_Date
			END
		END ELSE
			IF W_PeriodesValides<W_IndPeriodes,1> > W_Date THEN
				IF W_DatePremiereIntervSsCont = "Aucune" THEN
					W_DatePremiereIntervSsCont = W_Date
				END
				W_DateDerniereIntervSsCont = W_Date
			END ELSE
				IF W_PeriodesValides<W_IndPeriodes,2> = "" THEN
					* = CDI (pas de date de fin...)
					W_FinParcours = "V"
				END ELSE
					IF W_PeriodesValides<W_IndPeriodes,2> < W_Date THEN
						W_FinRecherchePeriode = "F"
						LOOP
							W_IndPeriodes = W_IndPeriodes + 1
						WHILE W_FinRecherchePeriode = "F"
						  IF W_PeriodesValides<W_IndPeriodes,1> = "" THEN
							* On est arriv au bout des priodes valides, c'est a dire que toutes les prochaines interventions seront sans contrat...
							IF W_DatePremiereIntervSsCont = "Aucune" THEN
								W_DatePremiereIntervSsCont = W_Date
							END
							IF W_DateFinInterv = 99999 THEN
								W_DateDerniereIntervSsCont = ""
								W_FinParcours = "V"
							END ELSE
								* Nb : on va continuer de parcourir les interventions (effectives !) jusqu' la dernire...
								W_DateDerniereIntervSsCont = W_Date
							END
							W_FinRecherchePeriode = "V"
						  END ELSE
							IF W_PeriodesValides<W_IndPeriodes,1> > W_Date THEN
								W_FinRecherchePeriode = "V"
								IF W_DatePremiereIntervSsCont = "Aucune" THEN
									W_DatePremiereIntervSsCont = W_Date
								END
								W_DateDerniereIntervSsCont = W_Date
							END ELSE
								IF W_PeriodesValides<W_IndPeriodes,2> >= W_Date OR W_PeriodesValides<W_IndPeriodes,2> = "" THEN
									W_FinRecherchePeriode = "V"
									IF W_PeriodesValides<W_IndPeriodes,2> = "" THEN
										* = CDI (pas de date de fin...)
										W_FinParcours = "V"
									END
								END ELSE
									* On continue de parcourir
								END
							END
						  END
						REPEAT
					END ELSE
						* W_Date est dans le contrat en cours => on continue de parcourir
					END
				END
			END
		END

	   END
	END

	IF W_DateFinInterv # 99999 THEN
		IF W_Date + W_Step > W_DateFinInterv THEN
			* Inutile de continuer  parcourir
			W_FinParcours = "V"
		END

	END ELSE
		* On ne fait rien : on va boucler jusqu' ce qu'on trouve W_PeriodesValides<W_IndPeriodes,2> = "" (= CDI) ou 
		* ou W_PeriodesValides<W_IndPeriodes,1> = "" (Plus de contrats)
	END
REPEAT

RETURN

700 *********************************************************************
*				Enregistrement du rsultat				*
*************************************************************************
W_Trouve700 = "F"
W_IndResultat = DCOUNT(W_Resultat,CHAR(254)) + 1
LOOP
W_IndResultat = W_IndResultat - 1
WHILE W_IndResultat > 0 AND W_Trouve700 = "F"
	IF W_Resultat<W_IndResultat,1> = CodeAidant THEN
	   IF W_Resultat<W_IndResultat,2> = CodeEmpl AND W_Resultat<W_IndResultat,3> = Activite THEN
		W_Trouve700 = "V"
	   END
	END ELSE
	   * Nb : on est tri par aidant => Si on arrive  un autre aidant, c'est qu'on a t trop loin !
		W_IndResultat = 0
	END
REPEAT
IF W_Trouve700 = "F" THEN
	W_IndResultat = DCOUNT(W_Resultat,CHAR(254)) + 1
	W_Resultat<W_IndResultat,1> = CodeAidant
	W_Resultat<W_IndResultat,2> = CodeEmpl
	W_Resultat<W_IndResultat,3> = Activite
	W_Resultat<W_IndResultat,4> = W_DatePremiereIntervSsCont 
	W_Resultat<W_IndResultat,5> = W_DateDerniereIntervSsCont 
END ELSE
	W_IndResultat = W_IndResultat + 1
	IF W_Resultat<W_IndResultat,4> > W_DatePremiereIntervSsCont THEN
		W_Resultat<W_IndResultat,4> = W_DatePremiereIntervSsCont
	END
	IF (W_Resultat<W_IndResultat,5> < W_DateDerniereIntervSsCont AND W_Resultat<W_IndResultat,5> # "") OR W_DateDerniereIntervSsCont = "" THEN
		W_Resultat<W_IndResultat,5> = W_DateDerniereIntervSsCont
	END
END
RETURN

800 **************************************************************************
*			Tri final du rapport							*
*******************************************************************************
W_Sortie = ""
W_IndResultat =DCOUNT(W_Resultat,CHAR(254))
W_IndSortie = 0
W_DernTri = "X"
i = 0
LOOP
	i = i + 1
WHILE i <= W_IndResultat 
	READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, W_Resultat<i,1> THEN
		BEGIN CASE 
			CASE Tri = "S" AND Selection = ""
				IF ENR_CIVILAIDANT<31> # W_DernTri THEN
					READ ENR_SECTEUR FROM F.SECTEUR, ENR_CIVILAIDANT<31> ELSE ENR_SECTEUR<1> = "Inconnu"
					W_IndSortie = W_IndSortie + 1
					W_Sortie<W_IndSortie> = "#" : ENR_SECTEUR<1>
				END
				W_DernTri = ENR_CIVILAIDANT<31>
			CASE Tri = "C" AND Selection = ""
				IF TRIM(ENR_CIVILAIDANT<11>) # W_DernTri THEN
					W_IndSortie = W_IndSortie + 1
					W_Sortie<W_IndSortie> = "#" : TRIM(ENR_CIVILAIDANT<11>)
				END
				W_DernTri = TRIM(ENR_CIVILAIDANT<11>)
			CASE 1
				READ ENR_SECTEUR FROM F.SECTEUR, ENR_CIVILAIDANT<31> ELSE ENR_SECTEUR<1> = "Inconnu"
		END CASE
		W_IndSortie = W_IndSortie + 1
		k = W_IndSortie
		LOOP
		k = k - 1
		WHILE k > 0 AND W_Sortie<k>[1,1] # "#" AND W_Sortie<k,3> > W_Resultat<i,4>
		REPEAT
		GOSUB 801
		IF k = W_IndSortie - 1 THEN
			* Ajout en dernire position
			W_Sortie<W_IndSortie> = W_Temp
		END ELSE
			* Insertion
			k = k + 1
			W_Sortie = INSERT(W_Sortie,k;W_Temp)
		END
	END
REPEAT
W_Resultat = W_Sortie
RETURN

801 ***************************************************************
*											*
*******************************************************************
W_Temp = W_Resultat<i,1>:W_Resultat<i,2>:CHAR(253)
W_Temp = W_Temp:W_Resultat<i,1>:" "
W_Temp801 = TRIM(ENR_CIVILAIDANT<2>:" ":ENR_CIVILAIDANT<3>)[1,25]
W_Temp801 = W_Temp801"L 26"
W_Temp = W_Temp:W_Temp801
IF Tri = "C" THEN
	ENR_CIVILAIDANT<11> = ENR_CIVILAIDANT<11>[1,18]
	ENR_CIVILAIDANT<11> = ENR_CIVILAIDANT<11>"L 19"
	W_Temp = W_Temp:ENR_CIVILAIDANT<11>
END ELSE
	ENR_SECTEUR<1> = ENR_SECTEUR<1>[1,18]
	ENR_SECTEUR<1> = ENR_SECTEUR<1>"L 19"
	W_Temp = W_Temp:ENR_SECTEUR<1>
END

W_Temp = W_Temp:" ":W_Resultat<i,2>
IF LEN(W_Resultat<i,2>) = 5 THEN
	READ ENR_CIVILAIDE FROM F.CIVILAIDE, W_Resultat<i,2> ELSE ENR_CIVILAIDE = ""
	W_Temp801 = TRIM(ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>)[1,25]
	W_Temp801 = W_Temp801"L 26"
	W_Temp = W_Temp:" ":W_Temp801
END ELSE
	IF W_Resultat<i,2> # W_DerniereAsso THEN
		READ ENR_ASSOCIATION FROM F.ASSOCIATION, W_Resultat<i,2> ELSE ENR_ASSOCIATION = ""
		W_DerniereAsso = W_Resultat<i,2>
	END
	W_Temp801 = ENR_ASSOCIATION<1>[1,25]
	W_Temp801 = W_Temp801"L 26"
	W_Temp = W_Temp:"   ":W_Temp801
END
W_Temp = W_Temp:W_Resultat<i,3>:" "
W_Temp = W_Temp:OCONV(W_Resultat<i,4>,"D4/"):" "
IF W_Resultat<i,5> # "" THEN
	W_Temp = W_Temp:OCONV(W_Resultat<i,5>,"D4/"):" "
END
W_Temp = W_Temp:CHAR(253):W_Resultat<i,4>

RETURN


1000
TypeAct = ""
EXECUTE 'SELECT ACTIVITES'
W_fin = "F"
LOOP
READNEXT W_Cle ELSE W_fin = "V"
WHILE W_fin = "F"
	READ ENR_ACTIVITES FROM F.ACTIVITES, W_Cle THEN
		TypeAct<W_Cle[1,3],W_Cle[4,3]> = ENR_ACTIVITES<12>
	END
REPEAT
RETURN