********************************************
* Rapprochement des factures et rglements *
* Cr par guillaume Juillet 2006          *
********************************************
*Modifications :                           *
*										   *
********************************************
********************************************

************
* FICHIERS *
************
EXECUTE 'DATE.FORMAT'
EXECUTE 'SET-DEC ,'
EXECUTE "SET-THOUS ."

OPEN "","REGLTORG" TO F.REGLTORG ELSE STOP
OPEN "","FACTPAIEMENT" TO F.FACTPAIEMENT ELSE STOP
OPEN "","CIVILAIDE" TO F.CIVILAIDE ELSE STOP
OPEN "","TEMPO" TO F.TEMPO ELSE STOP
OPEN "","FUSION" TO F.FUSION ELSE STOP

******************************
* Recuperation des arguments *
******************************
PROCREAD ARGUMENTS ELSE PRINT "PROCREAD"

W_PeriodeTrait=FIELD(ARGUMENTS,"|",2)
W_CodAsso=FIELD(ARGUMENTS,"|",3)
W_Org=FIELD(ARGUMENTS,"|",4)
W_Fichier=FIELD(ARGUMENTS,"|",5)
W_TypeTrait=FIELD(ARGUMENTS,"|",6)

********************************
* Initialisation des variables *
********************************
ENR_REGLTORG=""
ENR_FACTPAIEMENT=""
ENR_CIVILAIDE=""
ENR_TEMPO=""
ENR_REGLTORGValide=""
W_Cle=""
W_PeriodeFact=""
W_NRetraite=""
W_Patronyme=""
W_NBRelgt=0
W_Err=0
W_MontFact=0
W_MontReglt=0
W_MontTotReglt=0
W_MontTotFact=0
W_ListeReq=""
W_CleAide = ""
W_CleValide = ""

W_Anomalies=""
iAnom=1
i=0
iReglt=1

W_Marqueur = DATE():TIME()


*************************
* Droulement programme *
*************************
*100 ===> Lecture du fichier de rglement CRAM et recherche/comparaison des factures correspondantes
*200 ===> Gnration des erreurs
*300 ===> Recherche des facturations non "marques"

**************************************************************
GOSUB 100
GOSUB 300

* Ecriture dans le fichier TEMPO des anomalies dtectes *

* Ecriture dans le fichier TEMPO des montants totaux *
IF W_TypeTrait = 1 THEN
	WRITE W_Anomalies ON F.TEMPO, "ANOMALIESREGLT"
	ENR_TEMPO<1>=W_MontTotFact
	ENR_TEMPO<2>=W_MontTotReglt
	WRITE ENR_TEMPO ON F.TEMPO, "MONTANTS"
END ELSE
	
	i = 0
	LOOP
	i = i + 1
	WHILE W_Anomalies<i> # ""
		FOR t = 5 TO 7
			W_Anomalies<i,t> = W_Anomalies<i,t> / 100
		NEXT t
		W_Anomalies<i,10> = W_Anomalies<i,10> / 100
		W_Anomalies<i,11> = W_Anomalies<i,11> / 100

	REPEAT
	W_Anomalies=INSERT(W_Anomalies,1;"Montant factur;;;;;;;;;;;":W_MontTotFact/100)	
	W_Anomalies=INSERT(W_Anomalies,1;"Anomalie;Code;Nom prnom;Numro retraite;Periode;Hres semaines factures;Hres Dim JF factures;Montant factur;Hres semaines rgles;Hres Dim JF rgles;Montant rgl;Diffrence")

	W_Anomalies=CONVERT(CHAR(253),";",W_Anomalies)
	i=1
	W_Ecrit="FAUX"
	LOOP
		WHILE W_Ecrit="FAUX"
		READ FUSION FROM F.FUSION, "RapprochementFacturation-Rglement_":W_PeriodeTrait:"-":i:".csv" THEN
			i=i+1
		END ELSE
			WRITE W_Anomalies ON F.FUSION, "RapprochementFacturation-Rglement_":W_PeriodeTrait:"-":i:".csv"
			W_Anomalies="RapprochementFacturation-Rglement_":W_PeriodeTrait:"-":i:".csv"
			WRITE W_Anomalies ON F.TEMPO, "ANOMALIESREGLT"
			W_Ecrit="VRAI"
		END
	REPEAT
END
	

	
STOP


*****************************
* Lecture du rglement CRAM *
*****************************

100

READ ENR_FACTPAIEMENT FROM F.FACTPAIEMENT, W_Fichier ELSE ENR_FACTPAIEMENT=""
W_NBReglt=DCOUNT(ENR_FACTPAIEMENT,CHAR(254))

FOR i=1 TO W_NBReglt
	
*	W_PeriodeFact= FIELD(ENR_FACTPAIEMENT<i>,";",12)[1,6]
*	W_NRetraite = FIELD(ENR_FACTPAIEMENT<i>,";",9):FIELD(ENR_FACTPAIEMENT<i>,";",10)[2,8]
*	W_Patronyme = FIELD(ENR_FACTPAIEMENT<i>,";",36)
*	W_MontReglt = (FIELD(ENR_FACTPAIEMENT<i>,";",27)[2,12] + FIELD(ENR_FACTPAIEMENT<i>,";",29)[2,12] + FIELD(ENR_FACTPAIEMENT<i>,";",30)[2,12])
	W_PeriodeFact= ENR_FACTPAIEMENT<i>[211,6]
	W_NRetraite = TRIM((ENR_FACTPAIEMENT<i>[185,2]:ENR_FACTPAIEMENT<i>[188,8]) * 1)
	W_Nir=TRIM(ENR_FACTPAIEMENT<i>[33,13])
	W_NomPrenomAide=TRIM(ENR_FACTPAIEMENT<i>[1,32])
	W_Patronyme = ENR_FACTPAIEMENT<i>[438,26]
	W_MtntTemp1 = ENR_FACTPAIEMENT<i>[328,10]
	W_MtntTemp2 = ENR_FACTPAIEMENT<i>[348,10]
	W_MtntTemp3 = ENR_FACTPAIEMENT<i>[359,10]
	W_MtntTemp = W_MtntTemp1
	GOSUB 400
	W_MtntTemp1 = W_MtntTemp
	W_MtntTemp = W_MtntTemp2
	GOSUB 400
	W_MtntTemp2 = W_MtntTemp
	W_MtntTemp = W_MtntTemp3
	GOSUB 400
	W_MtntTemp3 = W_MtntTemp

	W_MontReglt = W_MtntTemp1 + W_MtntTemp2 + W_MtntTemp3

	W_MontReglt = TRIM(W_MontReglt)
	W_MontTotReglt = W_MontTotReglt + W_MontReglt
	
	W_Err = 1
	iReglt = 1
	ENR_REGLTORG = ""
	
	ENR_CIVILAIDE=""
	ENR_CIVILAIDE<2>=W_NomPrenomAide
	
	LOOP
		W_Cle=W_CodAsso:W_Org:iReglt "R%3":W_PeriodeTrait:W_PeriodeFact:W_NRetraite
		READ ENR_REGLTORG FROM F.REGLTORG, W_Cle THEN
			ENR_REGLTORGValide = ENR_REGLTORG
			W_CleValide = W_Cle
		END ELSE
			W_Cle=W_CodAsso:W_Org:iReglt "R%3":W_PeriodeTrait:W_PeriodeFact:W_Nir
			READ ENR_REGLTORG FROM F.REGLTORG, W_Cle THEN
				ENR_REGLTORGValide = ENR_REGLTORG
				W_CleValide = W_Cle
			END ELSE			
				ENR_REGLTORG=""
			END
		END
		
	UNTIL ENR_REGLTORG="" OR W_Err = 0
			
			
			W_CleAide = ENR_REGLTORG<9>
			READ ENR_CIVILAIDE FROM F.CIVILAIDE, ENR_REGLTORG<9> THEN
				*Test de concordance du numro d'ordre avec l'aid
				IF iReglt <> 1 THEN
					IF TRIM(W_Patronyme) <> TRIM(ENR_CIVILAIDE<4>) THEN
						IF TRIM(W_Patronyme) <> TRIM(ENR_CIVILAIDE<2>) THEN
							W_Err = 1
						END ELSE
							W_Err = 0
						END
					END ELSE
						W_Err = 0
					END
				END ELSE
					W_Err = 0
				END		
			END ELSE
				ENR_CIVILAIDE=""
				ENR_CIVILAIDE<2>=W_NomPrenomAide
			END
			
			IF TRIM(ENR_REGLTORG<4>) = "" THEN ENR_REGLTORG<4> = 0
			IF TRIM(ENR_REGLTORG<8>) = "" THEN ENR_REGLTORG<8> = 0
			W_MontFact = SUM(ENR_REGLTORG<4>) + ENR_REGLTORG<8>
			
			*Si aid bon, test de concordance du montant de rglement
			IF W_Err = 0 THEN

				IF W_MontFact <> W_MontReglt THEN
					W_Err = 2
				END
			END
					
			W_MontTotFact = W_MontTotFact + W_MontFact
			
			iReglt=iReglt+1
	REPEAT

	GOSUB 200
	W_CleAide = ""
	W_CleValide = ""
NEXT i


RETURN

**************************
* Gnration des erreurs *
**************************
*Codes Erreurs :
*1 = Rglement non trouv en facturation
*2 = Rglement diffrent de la facturation
*3 = Facturation non trouve en rglement
*

200

IF W_TypeTrait = 0 THEN
*fichier 
	BEGIN CASE 
		CASE W_Err = 1
			W_Anomalies<iAnom,1> = "Pas de facture"
			W_Anomalies<iAnom,2> = W_CleAide
			W_Anomalies<iAnom,3> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,4> = W_NRetraite
			W_Anomalies<iAnom,5> = W_PeriodeFact
			W_Anomalies<iAnom,6> = "0"
			W_Anomalies<iAnom,7> = "0"
			W_Anomalies<iAnom,8> = "0"
			W_Anomalies<iAnom,9> = ENR_FACTPAIEMENT<i>[228,5]/100 + ENR_FACTPAIEMENT<i>[248,5]/100
			W_Anomalies<iAnom,10> = ENR_FACTPAIEMENT<i>[238,5]/100 + ENR_FACTPAIEMENT<i>[253,5]/100
			W_Anomalies<iAnom,11> = W_MontReglt
			W_Anomalies<iAnom,12> = W_MontReglt/100
			iAnom = iAnom + 1
			
		CASE W_Err = 2
			W_Anomalies<iAnom,1> = "Ecart de facturation"		
			W_Anomalies<iAnom,2> = W_CleAide
			W_Anomalies<iAnom,3> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,4> = W_NRetraite
			W_Anomalies<iAnom,5> = W_PeriodeFact
			FOR j=1 TO DCOUNT(ENR_REGLTORGValide<1>, CHAR(253))
				W_Anomalies<iAnom,6> = W_Anomalies<iAnom,6> + ENR_REGLTORGValide<1,j>
				W_Anomalies<iAnom,7> = W_Anomalies<iAnom,7> + ENR_REGLTORGValide<5,j>
			NEXT j
			W_Anomalies<iAnom,8> = W_MontFact/100
			W_Anomalies<iAnom,9> = ENR_FACTPAIEMENT<i>[228,5]/100 + ENR_FACTPAIEMENT<i>[248,5]/100
			W_Anomalies<iAnom,10> = ENR_FACTPAIEMENT<i>[238,5]/100 + ENR_FACTPAIEMENT<i>[253,5]/100
			W_Anomalies<iAnom,11> = W_MontReglt
			W_Anomalies<iAnom,12> =	(W_MontReglt - W_MontFact)/100
			iAnom = iAnom + 1
		CASE W_Err = 3
			W_Anomalies<iAnom,1> = "Pas de reglement"				
			W_Anomalies<iAnom,2> = W_CleAide
			W_Anomalies<iAnom,3> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,4> = W_NRetraite
			W_Anomalies<iAnom,5> = W_PeriodeFact
			FOR j=1 TO DCOUNT(ENR_REGLTORG<1>, CHAR(253))
				W_Anomalies<iAnom,6> = W_Anomalies<iAnom,6> + ENR_REGLTORG<1,j> 
				W_Anomalies<iAnom,7> = W_Anomalies<iAnom,7> + ENR_REGLTORG<5,j>
			NEXT j
			W_Anomalies<iAnom,8> = W_MontFact/100
			W_Anomalies<iAnom,9> = "0"
			W_Anomalies<iAnom,10> = "0"
			W_Anomalies<iAnom,11> = "0"
			W_Anomalies<iAnom,12> = - W_MontFact/100
			iAnom = iAnom + 1
	END CASE

END ELSE
	BEGIN CASE 
		CASE W_Err = 1
			W_Anomalies<iAnom,1> = W_CleAide
			W_Anomalies<iAnom,2> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,3> = W_NRetraite
			W_Anomalies<iAnom,4> = W_PeriodeFact
			W_Anomalies<iAnom,5> = "0"
			W_Anomalies<iAnom,6> = "0"
			W_Anomalies<iAnom,7> = "0"
	*		W_Anomalies<iAnom,8> = FIELD(ENR_FACTPAIEMENT<i>,";",13)[2,99]
	*		W_Anomalies<iAnom,9> = FIELD(ENR_FACTPAIEMENT<i>,";",16)[2,99]
			W_Anomalies<iAnom,8> = ENR_FACTPAIEMENT<i>[228,5]/100 + ENR_FACTPAIEMENT<i>[248,5]/100
			W_Anomalies<iAnom,9> = ENR_FACTPAIEMENT<i>[238,5]/100 + ENR_FACTPAIEMENT<i>[253,5]/100
			W_Anomalies<iAnom,10> = W_MontReglt
			W_Anomalies<iAnom,11> = W_MontReglt
			iAnom = iAnom + 1
			
		CASE W_Err = 2
			W_Anomalies<iAnom,1> = W_CleAide
			W_Anomalies<iAnom,2> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,3> = W_NRetraite
			W_Anomalies<iAnom,4> = W_PeriodeFact
			FOR j=1 TO DCOUNT(ENR_REGLTORGValide<1>, CHAR(253))
				W_Anomalies<iAnom,5> = W_Anomalies<iAnom,5> + ENR_REGLTORGValide<1,j>
				W_Anomalies<iAnom,6> = W_Anomalies<iAnom,6> + ENR_REGLTORGValide<5,j>
			NEXT j
			W_Anomalies<iAnom,7> = W_MontFact
	*		W_Anomalies<iAnom,8> = FIELD(ENR_FACTPAIEMENT<i>,";",13)[2,99]
	*		W_Anomalies<iAnom,9> = FIELD(ENR_FACTPAIEMENT<i>,";",16)[2,99]
			W_Anomalies<iAnom,8> = ENR_FACTPAIEMENT<i>[228,5]/100 + ENR_FACTPAIEMENT<i>[248,5]/100
			W_Anomalies<iAnom,9> = ENR_FACTPAIEMENT<i>[238,5]/100 + ENR_FACTPAIEMENT<i>[253,5]/100
			W_Anomalies<iAnom,10> = W_MontReglt 
			W_Anomalies<iAnom,11> =	W_MontReglt - W_MontFact
		iAnom = iAnom + 1
		CASE W_Err = 3
			W_Anomalies<iAnom,1> = W_CleAide
			W_Anomalies<iAnom,2> = ENR_CIVILAIDE<2>:" ":ENR_CIVILAIDE<3>
			W_Anomalies<iAnom,3> = W_NRetraite
			W_Anomalies<iAnom,4> = W_PeriodeFact
			FOR j=1 TO DCOUNT(ENR_REGLTORG<1>, CHAR(253))
				W_Anomalies<iAnom,5> = W_Anomalies<iAnom,5> + ENR_REGLTORG<1,j>
				W_Anomalies<iAnom,6> = W_Anomalies<iAnom,6> + ENR_REGLTORG<5,j>
			NEXT j
			W_Anomalies<iAnom,7> = W_MontFact
			W_Anomalies<iAnom,8> = "0"
			W_Anomalies<iAnom,9> = "0"
			W_Anomalies<iAnom,10> = "0"
			W_Anomalies<iAnom,11> = - W_MontFact
			iAnom = iAnom + 1
	END CASE
FOR j=1 TO 11
	IF W_Anomalies<iAnom,j>="" THEN W_Anomalies<iAnom,j>="0"
NEXT j

END
	ENR_REGLTORGValide<10> = W_Marqueur
	WRITE ENR_REGLTORGValide ON F.REGLTORG, W_CleValide
	
W_Err = 0
RETURN

******************************************
* Recherche des facturatoins non rgles *
******************************************

300


W_Requete = 'SSELECT REGLTORG AVEC 10 <> "':W_Marqueur:'" OR = "" AND AVEC PeriodeTrait = "':W_PeriodeTrait:'" AND AVEC CodAssoc = "':W_CodAsso:'" AND AVEC CodeOrg = "':W_Org:'" PAR NomAide'
W_ListeRequete = ""
EXECUTE W_Requete
EXECUTE 'SAUVE-LISTE W_ListeReq'
EXECUTE "LISTE W_ListeReq" RETURNING MSGCODE

IF MSGCODE<1> <> 209 THEN
	SELECT F.REGLTORG TO W_ListeReq
	
	LOOP
		W_Trouve = 1
		READNEXT W_CleReglt FROM W_ListeReq ELSE W_Trouve = 0
		
		IF W_Trouve = 1 THEN
			READ ENR_REGLTORG FROM F.REGLTORG, W_CleReglt ELSE ENR_REGLTORG=""
		END	ELSE
			ENR_REGLTORG = ""
		END
		
		WHILE ENR_REGLTORG # ""
		W_CleAide = ENR_REGLTORG<9>
		W_PeriodeFact = W_CleReglt[16,6]
		W_MontFact = SUM(ENR_REGLTORG<4>) + ENR_REGLTORG<8>
		W_MontTotFact = W_MontTotFact + W_MontFact
		READ ENR_CIVILAIDE FROM F.CIVILAIDE, ENR_REGLTORG<9> THEN
			W_NRetraite = W_CleReglt[22,10]
			W_Err=3
		END ELSE
			ENR_CIVILAIDE=""
			ENR_CIVILAIDE<2>="NON TROUVE"
		END
		GOSUB 200
	REPEAT
END

RETURN

400 *********************************************************************
*  Conversion des sommes negatives							*
*************************************************************************
IF NOT (NUM(W_MtntTemp)) THEN
  BEGIN CASE
	CASE W_MtntTemp[10,1] = "p"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"0"
	CASE W_MtntTemp[10,1] = "q"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"1"
	CASE W_MtntTemp[10,1] = "r"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"2"
	CASE W_MtntTemp[10,1] = "s"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"3"
	CASE W_MtntTemp[10,1] = "t"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"4"
	CASE W_MtntTemp[10,1] = "u"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"5"
	CASE W_MtntTemp[10,1] = "v"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"6"
	CASE W_MtntTemp[10,1] = "w"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"7"
	CASE W_MtntTemp[10,1] = "x"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"8"
	CASE W_MtntTemp[10,1] = "y"
		W_MtntTemp=W_MtntTemp[1,9]*1
		W_MtntTemp = "-":W_MtntTemp:"9"
	CASE 1
  END CASE
END
RETURN