*******************
* ASMAD - DA15023 *
*                 *
* Greg - 24/03/15 *
*******************
SUBROUTINE RECHINTERVACHORSCONVCOL(RETURNVAL,PARAMETRES,W_Sortie)

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

W_Sortie = ""

OPEN "","TAMPONMAPPY" TO F.TAMPONMAPPY ELSE W_Sortie = "TAMPONMAPPY"
OPEN "","TPSTEMPO" TO F.TPSTEMPO ELSE W_Sortie = "TPSTEMPO"
OPEN "","LOGISROUTE" TO F.LOGISROUTE ELSE W_Sortie = "LOGISROUTE"
OPEN "","CIVILAIDANT" TO F.CIVILAIDANT ELSE W_Sortie = "CIVILAIDANT"
OPEN "","CIVILAIDE" TO F.CIVILAIDE ELSE W_Sortie = "CIVILAIDE"
OPEN "","TAMPONMAPPY" TO F.TAMPONMAPPY ELSE W_Sortie = "TAMPONMAPPY"

ENR_TAMPONMAPPY=""
ENR_TPSTEMPO=""
ENR_LOGISROUTE=""
ENR_CIVILAIDANT=""
ENR_CIVILAIDE=""
ENR_TAMPONMAPPY=""

IF W_Sortie # "" THEN
    W_Sortie = "Une erreur est survenue lors de l'ouverture du fichier ":W_Sortie
    RETURN
END

W_DateDeb=PARAMETRES<1>
W_DateFin=PARAMETRES<2>

	EXECUTE "DELETE TPSTEMPO AFFICHEPLANNINGRECHINTERVACHCC"
	EXECUTE 'AFFICHEPLANNING |RECHINTERVACHCC|001|PM|':W_DateDeb:'|':W_DateFin:'||||E'

	READ ENR_TPSTEMPO FROM F.TPSTEMPO, "AFFICHEPLANNINGRECHINTERVACHCC" THEN
		
		W_TabIntervTot=""
		W_TabIntervInd = ""
    
		W_CodeAidant = ""
		W_DureeTot = 0
		W_NbIntervac = 0
		W_Ind=0
		W_Date = W_DateDeb - 1
		W_IndDernP=0
		W_DureeTotTmp=0
		W_NbIntervacTmp=0
		* Si l'aidant a comme moyen de locomotion les transports en commun, on ne le traite pas du tout.
		W_TEC="NON"
    
		FOR I = 1 TO DCOUNT(ENR_TPSTEMPO,CHAR(254))
			IF ENR_TPSTEMPO<I>[1,7] = "#Interv" THEN
				W_TabIntervInd = ""
				
				W_CodeAidant = ENR_TPSTEMPO<I>[8,5]
				W_DureeTot = 0
				W_NbIntervac = 0
				W_Ind=0
				W_Date = W_DateDeb - 1
				* Indice de la dernire intervention prestataire
				W_IndDernP=0
				* Indice de la dernire intervention : si on a l'enchainement P INDISPO M,
				* on doit calculer l'intervacation entre P et M. Il faut donc mmorer l'emplacement de P,
				* qui est la dernire intervention rencontre. Mme principe pour M MOI M par exemple.
				* L'ide est que seule les interventions prestataires et mandataires sont prises en compte
				* pour calculer les intervacations.
				W_IndDernI=0
				W_DureeTotTmp=0
				W_NbIntervacTmp=0
				
				READ ENR_CIVILAIDANT FROM F.CIVILAIDANT, W_CodeAidant ELSE ENR_CIVILAIDANT=""
				
				IF ENR_CIVILAIDANT<34>="5" THEN
					W_TEC="OUI"
				END ELSE
					W_TEC="NON"
				END
			END ELSE
				IF W_Date < W_DateFin AND W_TEC="NON" THEN
					W_TabIntervInd=""
					W_DureeTot = 0
					W_NbIntervac = 0
					W_IndDernP=0
					W_IndDernI=0
					W_Ind=0
					W_DureeTotTmp=0
					W_NbIntervacTmp=0
					W_Date = W_Date + 1
					FOR J = 1 TO DCOUNT(ENR_TPSTEMPO<I,1>,CHAR(252))
						IF ENR_TPSTEMPO<I,1,J>[1,7]="IntervP" THEN
							* On a une intervention prestataire...
							IF W_IndDernP=0 THEN
								* ... considre comme potentiellement le dbut d'une intervacation
								W_IndDernP=J
							END ELSE
								IF J-W_IndDernP=1 THEN
									* ... qui suit une autre intervention prestataire
									* On a donc P1 P2. Une intervacation le plus simple possible,  prendre en compte
									* Si elle fait plus de 30 minutes.
									IF ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,W_IndDernP> > 50 THEN
										W_DureeTot = W_DureeTot + (ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,W_IndDernP>)
										W_NbIntervac = W_NbIntervac + 1
										
										W_Ind = W_Ind + 1
										W_TabIntervInd<W_Ind,1> = W_CodeAidant
										W_TabIntervInd<W_Ind,2> = "B":ENR_TPSTEMPO<I,4,W_IndDernP>[6,5]:"B":ENR_TPSTEMPO<I,4,J>[6,5]
										W_TabIntervInd<W_Ind,3> = OCONV(W_Date,"D4/")
										W_TabIntervInd<W_Ind,4> = ENR_TPSTEMPO<I,1,W_IndDernP>[7,1]
										W_TabIntervInd<W_Ind,5> = ENR_TPSTEMPO<I,1,J>[7,1]
										W_TabIntervInd<W_Ind,6> = ENR_TPSTEMPO<I,3,W_IndDernP> "MR2"
										W_TabIntervInd<W_Ind,7> = ENR_TPSTEMPO<I,2,J> "MR2"
									END
								END ELSE
									* ... qui ne suit pas une intervention prestataire
									
									* Dans un premier temps, il faut tester l'intervacation "en cours"
									IF ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,J-1> > 50 THEN
										W_DureeTotTmp = W_DureeTotTmp + (ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,W_IndDernI>)
										W_NbIntervacTmp = W_NbIntervacTmp + 1
									END
									
									* Dans un deuxime temps, SI ENTRE 2 INTERVENTIONS PRESTATAIRES, ON A AU MOINS UNE
									* INTERVACATION DE PLUS DE 30 MINUTES, alos il faut ajouter les valeurs mmorises aux
									* valeurs globables. Dans les valeurs mmorises on a donc potentiellement l'intervac
									* qu'on vient de traiter, mais aussi, potentiellement, celles d'intervacations prcdentes,
									* traites depuis la prcdente IntervP trouve.
									* Par exemple si on a P1 M1 M2 P2.
									* Ici on vient de traiter M2 P2, mais on a dj trait P1 M1 et M1 M2, ce qui a pu amener
									*  mmoriser des choses.
									IF W_NbIntervacTmp>0 THEN
										W_DureeTot = W_DureeTot + W_DureeTotTmp
										W_NbIntervac = W_NbIntervac + W_NbIntervacTmp
										
										* Dans un troisime temps, mmoriser l'intervacation pour le traitement ViaMichelin.
										* MAIS ATTENTION : l'intervacation est de P  P. C'est  dire que si on a par exemple
										* l'enchainement P M M P, les intervacations qui sont testes pour le nombre et la dure
										* sont celles entre chaque vnements (P M, puis M M et enfin M P), mais celle qui est
										* garde pour le traitement final est celle de P  P, comme le fait LogisRoute lors du
										* traitement rel.
										W_Ind = W_Ind + 1
										W_TabIntervInd<W_Ind,1> = W_CodeAidant
										W_TabIntervInd<W_Ind,2> = "B":ENR_TPSTEMPO<I,4,W_IndDernP>[6,5]:"B":ENR_TPSTEMPO<I,4,J>[6,5]
										W_TabIntervInd<W_Ind,3> = OCONV(W_Date,"D4/")
										W_TabIntervInd<W_Ind,4> = ENR_TPSTEMPO<I,1,W_IndDernP>[7,1]
										W_TabIntervInd<W_Ind,5> = ENR_TPSTEMPO<I,1,J>[7,1]
										W_TabIntervInd<W_Ind,6> = ENR_TPSTEMPO<I,3,W_IndDernP> "MR2"
										W_TabIntervInd<W_Ind,7> = ENR_TPSTEMPO<I,2,J> "MR2"
									END
								END
								
								* Peu importe le cas de figure, l'IntervP en cours de traitement devient l'IntervP  considrer
								* comme le dbut potentiel d'une nouvelle intervacation.
								* Par exemple P1 P2 P3.
								* P1 est mmoris en premier. L on vient de traiter P2. On a donc trait l'intervac P1 P2.
								* P2 evient maintenant le dbut de l'intervacation, ce qui permettra de traiter P2 P3.
								* Si on a P1 P2 M1, P2 sera mmoris tout pareil, mme s'il ne sera au final pas utilis.
								W_IndDernP=J
							END
							W_IndDernI=J
						END ELSE
							IF ENR_TPSTEMPO<I,1,J>[1,7]="IntervM" THEN
								* Si on a une intervention mandataire et qu'on a dj eu une intervention prestataire,
								* il faut mmoriser les dures et le nombre d'intervacations car si on trouve une
								* nouvelle intervention prestataire, il faudra cumuler les donnes.
								* Par exemple on a P1 M1 M2 P2.
								* On a stock l'indice de P1. Quand on est sur M1, il faut mmoriser l'intervac et la dure
								* ( condition de remplir le critre "plus de 30 minutes"). On est ensuite sur M2 : mme principe.
								* On arrive sur P2 : on passe dans une autre partie de l'algo, mais on aura mmoris le fait qu'on a eu 2 intervactions
								* pour une dure de 1h30 par exemple. Ces valeurs seront  cumuler aux valeurs "globales" qui serviront  savoir,
								*  la fin de la journe, si on a eu plus de 3 intervacations ou plus de 5h d'intervacations rpondant aux critres.
								IF W_IndDernP<>0 THEN
									IF ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,J-1> > 50 THEN
										W_DureeTotTmp = W_DureeTotTmp + (ENR_TPSTEMPO<I,2,J> - ENR_TPSTEMPO<I,3,W_IndDernI>)
										W_NbIntervacTmp = W_NbIntervacTmp + 1
									END
								END
								W_IndDernI=J
							END
						END
					NEXT J
					
					* A la fin de la journe, si on a plus de 3 intervacations de plus de 30 minutes, ou si leur dure fait plus de 5h,
					* alors ce sont des intervacations  traiter sur ViaMichelin.
					IF W_DureeTot > 500 OR W_NbIntervac > 3 THEN
						GOSUB 10
					END
				END
			END
		NEXT I
		
		IF W_TabIntervTot <> "" THEN
			WRITE W_TabIntervTot ON F.LOGISROUTE, "TestGreg.txt"
			W_Sortie=W_TabIntervTot
		END ELSE
			W_Sortie="RIEN"
		END
	
	END ELSE
		W_Sortie="ERREUR"
	END

RETURN
**********************************
* Ajout des intervac d'un aidant *
* au tableau global              *
**********************************
10
    W_IndTot = DCOUNT(W_TabIntervTot,CHAR(254))
        
    FOR K = 1 TO DCOUNT(W_TabIntervInd,CHAR(254))
		* Si on est sur un cas o les 2 interventions qui se suivent sont chez le mme aid,
		* on vite de provoquer une requte ViaMichelin ( ne servirait  rien et  consommerait
		* une requte), mais on indique le cas dans le fichier final (qui du coup sortira  0 minute).
		IF W_TabIntervInd<K,2>[1,6]<>W_TabIntervInd<K,2>[7,6] THEN
			READ ENR_TAMPONMAPPY FROM F.TAMPONMAPPY, W_TabIntervInd<K,2> ELSE ENR_TAMPONMAPPY=""
			ENR_TAMPONMAPPY<ENR_CIVILAIDANT<34>>="1"
			WRITE ENR_TAMPONMAPPY ON F.TAMPONMAPPY, W_TabIntervInd<K,2>
		END
		
		W_IndTot = W_IndTot + 1
		FOR L = 1 TO 7
			W_TabIntervTot<W_IndTot,L> = W_TabIntervInd<K,L>
		NEXT L
		
		IF W_DureeTot > 500 AND W_NbIntervac > 3 THEN
			W_TabIntervTot<W_IndTot,8>="Plus de 3 intervacations et plus de 5h d'intervacations"
		END ELSE
			IF W_NbIntervac > 3 THEN
				W_TabIntervTot<W_IndTot,8>="Plus de 3 intervacations"
			END ELSE
				W_TabIntervTot<W_IndTot,8>="Plus de 5h d'intervacations"
			END
		END
    NEXT K

RETURN

