**********************************************************
*  gnration des fichiers ABSENCESAIDANT et HISTORINDEM  partir 
*  du fichier des absences du logiciel PAIE
*  Vanessa
*  Aot 1999
**********************************************************

*    DIFFERENTES PROCEDURES

*   50  -> Charge la table des contrats
*  100  -> Remplit le fichier ABSENCESAIDANT  partir d'ABSENCE
*  150  -> Remplit les att 13 16 17 du fichier ABSENCESAIDANT
*  200  -> Remplit le fichier HISTORINDEM
*  300  -> Remplit les att 14 15 de ABSENCESAIDANT
*  400  -> Recherche la multivaleur pour remplir HISTORINDEM
*  500  -> Correspondance des motifs d'absence
*  600  -> Cration du Voc
*  700  -> Suppression du Voc
*  800  -> Rcupration parametres
**********************************************************

EXECUTE 'DATE.FORMAT'

* Rcupration des paramtres
GOSUB 800

* Cration du voc
GOSUB 600

* Ouvertures des fichiers

OPEN "","ABSENCE" TO F.ABSENCE ELSE STOP ;* en lecture
OPEN "","ABSENCESAIDANT" TO F.ABSENCESAIDANT ELSE STOP ;* en lecture criture
OPEN "","FIPAY" TO F.FIPAY ELSE STOP ;* en lecture
OPEN "","CONTRAT" TO F.CONTRAT ELSE STOP ;* en lecture
OPEN "","HISTORINDEM" TO F.HISTORINDEM ELSE STOP ;* en lecture criture
OPEN "","CUMULS" TO F.CUMULS ELSE STOP ;* en lecture

***********************************************************
* initialisation des variables

ENR_ABSENCESAIDANT = ""
ENR_HISTORINDEM = ""

*********************************************************
* PROGRAMME PRINCIPAL

   EXECUTE 'SSELECT ABSENCE'
   EXECUTE 'SAUVE-LISTE W_RequeteAbsPaie'
   EXECUTE "LISTE W_RequeteAbsPaie" RETURNING MSGCODE

   IF MSGCODE<1> = 209 THEN
      STOP
   END ELSE
      SELECT F.ABSENCE TO W_RequeteAbsPaie
      W_Fini = "FAUX"
      LOOP
         READNEXT W_CleAbs FROM W_RequeteAbsPaie ELSE W_Fini = "VRAI"
      WHILE W_Fini = "FAUX" DO
         READ ENR_ABSENCE FROM F.ABSENCE,W_CleAbs ELSE ENR_ABSENCE=""

         * traite l'historique des arrts de travail (att 4 5 6 d'ABSENCE)
	   W_Trait="H"
         W_AttDebut = ENR_ABSENCE<4>
         W_AttFin = ENR_ABSENCE<5>
         W_AttMotif = ENR_ABSENCE<6>
         GOSUB 100

	   W_Trait="C"
         * traite les arrts de travail en cours (att 1 2 3 d'ABSENCE)
         W_AttDebut = ENR_ABSENCE<1>
         W_AttFin = ENR_ABSENCE<2>
         W_AttMotif = ENR_ABSENCE<3>
         GOSUB 100
      REPEAT
   END

   * Suppression du voc
   GOSUB 700

STOP

*********************************************************
*  Remplit le fichier ABSENCESAIDANT  partir d'ABSENCE

100

   W_Count = DCOUNT(W_AttDebut,CHAR(253))

   READ ENR_FIPAY FROM F.FIPAY,W_CleAbs ELSE ENR_FIPAY=""
   W_CodeCivilAidant = ENR_FIPAY<60>

   FOR i = 1 TO W_Count
      W_AncCodeAbs = W_AttMotif<1,i>

      GOSUB 500
      W_CleAbsencesAidant = W_CodeCivilAidant:W_NouvCodeAbs:W_AttDebut<1,i>

      * charge la table des contrats
      GOSUB 50

      IF W_RequeteContrat # "" THEN
         * lecture de l'article dans ABSENCESAIDANT
         READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT,W_CleAbsencesAidant THEN
            W_Existe = "VRAI"
            GOSUB 150
         END ELSE
            ENR_ABSENCESAIDANT = ""
            IF W_AncCodeAbs = "6" OR W_AncCodeAbs = "7" OR W_AncCodeAbs = "9" OR  W_AncCodeAbs = "10" THEN
               ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,1;"1")
               ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,3;"2")
            END
            ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,2;W_AttFin<1,i>)
            IF W_AncCodeAbs = "1" OR W_AncCodeAbs = "2" OR W_AncCodeAbs = "3" OR W_AncCodeAbs = "4" OR W_AncCodeAbs = "5" OR W_AncCodeAbs = "8" THEN
               ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,9;W_AttDebut<1,i>-1)
               ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,10;W_AttFin<1,i>+1)
            END
            ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,11;"1")
            ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,12;"1")
            W_Existe = "FAUX"
            GOSUB 150
         END
         WRITE ENR_ABSENCESAIDANT ON F.ABSENCESAIDANT,W_CleAbsencesAidant
         IF W_AncCodeAbs = "1" OR W_AncCodeAbs = "2" OR W_AncCodeAbs = "3" OR W_AncCodeAbs = "4" THEN
            GOSUB 200
         END
      END     
   NEXT i

RETURN

*********************************************************
*  Charge la table des contrats

50

   * Lecture des contrats de travail
   W_End = "FAUX"
   j=1
   W_Rang = 1
   W_RequeteContrat = ""

   LOOP 
      j=j "R%3"
      W_CleContrat = W_CodeCivilAidant:j

      READ ENR_CONTRAT FROM F.CONTRAT,W_CleContrat ELSE W_End = "VRAI"
   WHILE W_End = "FAUX" DO
      IF ENR_CONTRAT<1> # "02" AND ENR_CONTRAT<7> <= W_AttDebut<1,i> THEN
       IF ENR_CONTRAT<8>#"" AND ENR_CONTRAT<8> >= W_AttDebut<1,i> THEN
        W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,1;W_CleContrat)
        W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,2;ENR_CONTRAT<7>)
        W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,3;ENR_CONTRAT<8>)
        W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,4;ENR_CONTRAT<2>)
        W_Rang = W_Rang + 1
       END ELSE
        IF ENR_CONTRAT<8> = "" THEN
         W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,1;W_CleContrat)
         W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,2;ENR_CONTRAT<7>)
         W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,3;ENR_CONTRAT<8>)
         W_RequeteContrat = REPLACE(W_RequeteContrat,W_Rang,4;ENR_CONTRAT<2>)
         W_Rang = W_Rang + 1
        END
       END
      END
      j=j+1
   REPEAT

RETURN

*********************************************************
*  Remplit les att 13 16 17 du fichier ABSENCESAIDANT

150

   IF W_Existe = "FAUX" THEN
      W_Indice = 1
   END ELSE
      * cherche le nombre de MV dj existante en att 13
      W_Indice = DCOUNT(ENR_ABSENCESAIDANT<13>,CHAR(253)) + 1
   END

   * Compte le nombre de contrat dans la table
   W_CountContrat = DCOUNT(W_RequeteContrat,CHAR(254))

   * Recherche la priode de debut d'absence
   W_Mois = OCONV(W_AttDebut<1,i>,"D4/")
   W_Mois=W_Mois[4,2]
   W_An = OCONV(W_AttDebut<1,i>,"D4/")
   W_An=W_An[9,2]
   W_PeriodeAbs = W_An:W_Mois

   W_CodeAidant = W_CleAbs

   FOR j = 1 TO W_CountContrat

      ENR_ABSENCESAIDANT =REPLACE(ENR_ABSENCESAIDANT,13,W_Indice;W_RequeteContrat<j,4>)
      ENR_ABSENCESAIDANT =REPLACE(ENR_ABSENCESAIDANT,14,W_Indice;"0")
      ENR_ABSENCESAIDANT =REPLACE(ENR_ABSENCESAIDANT,15,W_Indice;"0")
      ENR_ABSENCESAIDANT =REPLACE(ENR_ABSENCESAIDANT,16,W_Indice;"NON")
      ENR_ABSENCESAIDANT =REPLACE(ENR_ABSENCESAIDANT,17,W_Indice;W_RequeteContrat<j,1>) 
      IF W_AncCodeAbs = "1" OR W_AncCodeAbs = "2" OR W_AncCodeAbs = "3" OR W_AncCodeAbs = "4" OR W_AncCodeAbs = "8" THEN
         GOSUB 300
      END
      W_Indice = W_Indice + 1

   NEXT j

RETURN

*********************************************************
*  Remplit le fichier HISTORINDEM

200
   
   ENR_HISTORINDEM = ""

   FOR j = 1 TO W_CountContrat

      * remplit HISTORINDEM  partir des att 7 8 9 de ABSENCE
      W_CountAtt7 = DCOUNT(ENR_ABSENCE<7>,CHAR(253))
      FOR k = 1 TO W_CountAtt7

         W_Mois = ENR_ABSENCE<7,k>[3,2]
         IF ENR_ABSENCE<7,k>[1,2] > 20 THEN
            W_DatDebAn = "19"
         END ELSE
            W_DatDebAn = "20"
         END
         W_An = W_DatDebAn:ENR_ABSENCE<7,k>[1,2]
         W_DatDebPeriode = ICONV("01/":W_Mois:"/":W_An,"D4/")
         W_Mois = W_Mois + 1
         IF W_Mois = "13" THEN
            W_Mois = "01"
            W_An = W_An + 1
         END
         W_DatFinPeriode = ICONV("01/":W_Mois:"/":W_An,"D4/")-1
         IF (W_RequeteContrat<j,2> <= W_DatFinPeriode AND W_RequeteContrat<j,3> => W_DatDebPeriode) OR (W_RequeteContrat<j,2> <= W_DatFinPeriode AND W_RequeteContrat<j,3> = "") THEN
            W_PeriodeHistorIndem = W_DatDebAn:ENR_ABSENCE<7,k>
            GOSUB 400 
            ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,1,W_Indice;W_PeriodeHistorIndem)
            ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,2,W_Indice;ENR_ABSENCE<8,k>)
            ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,3,W_Indice;"0")
         END
      NEXT k

      * remplit HISTORINDEM  partir des att 15 16 17 de ABSENCE
      W_CountAtt15 = DCOUNT(ENR_ABSENCE<15>,CHAR(253))

      FOR k = 1 TO W_CountAtt15
         W_Trouve = "FAUX"
         W_CountHistor = DCOUNT(ENR_HISTORINDEM<1>,CHAR(253))
         FOR l = 1 TO W_CountHistor
            IF ENR_ABSENCE<15,k> = ENR_HISTORINDEM<1,l>[3,4] THEN
               ENR_HISTORINDEM = REPLACE(ENR_HISTORINDEM,3,l;ENR_ABSENCE<16,k>+ENR_ABSENCE<17,k>)            
               W_Trouve = "VRAI"
            END
         NEXT l 
         IF W_Trouve = "FAUX" THEN
            IF ENR_ABSENCE<15,k>[1,2] > 20 THEN
               W_DatDebAn = "19"
            END ELSE
               W_DatDebAn = "20"
            END
            W_Mois = ENR_ABSENCE<15,k>[3,2]
            W_An = W_DatDebAn:ENR_ABSENCE<15,k>[1,2]
            W_DatDebPeriode = ICONV("01/":W_Mois:"/":W_An,"D4/")
            W_Mois = W_Mois + 1
            IF W_Mois = "13" THEN
               W_Mois = "01"
               W_An = W_An + 1
            END
            W_DatFinPeriode = ICONV("01/":W_Mois:"/":W_An,"D4/")-1
            IF (W_RequeteContrat<j,2> <= W_DatFinPeriode AND W_RequeteContrat<j,3> => W_DatDebPeriode) OR (W_RequeteContrat<j,2> <= W_DatFinPeriode AND W_RequeteContrat<j,3> = "") THEN
               W_PeriodeHistorIndem = W_DatDebAn:ENR_ABSENCE<15,k>
               GOSUB 400
               ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,1,W_Indice;W_PeriodeHistorIndem)
               ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,2,W_Indice;"0")
               ENR_HISTORINDEM = INSERT(ENR_HISTORINDEM,3,W_Indice;ENR_ABSENCE<16,k>+ENR_ABSENCE<17,k>)
            END
         END
      NEXT k
      IF ENR_HISTORINDEM<1> # "" THEN
         WRITE ENR_HISTORINDEM ON F.HISTORINDEM,W_RequeteContrat<j,1>
      END

   NEXT j

RETURN

*********************************************************
*  Recherche la multivaleur pour remplir HISTORINDEM

400

   W_CountHistor = DCOUNT(ENR_HISTORINDEM<1>,CHAR(253))

   IF W_CountHistor = 0 THEN
      W_Indice = 1
   END ELSE
      IF W_CountHistor = 1 THEN
         IF W_PeriodeHistorIndem > ENR_HISTORINDEM<1,1> THEN
            W_Indice = 1
         END ELSE
            W_Indice = 2
         END
      END ELSE
         l=1
         IF ENR_HISTORINDEM<1,l> < W_PeriodeHistorIndem THEN
            W_Indice = 1
         END ELSE
            LOOP 

            UNTIL (ENR_HISTORINDEM<1,l> < W_PeriodeHistorIndem AND ENR_HISTORINDEM<1,l+1> > W_PeriodeHistorIndem) OR ENR_HISTORINDEM<1,l> = "" DO
               l=l+1
            REPEAT 
            W_Indice = l
         END
      END
   END

RETURN

*********************************************************
*  Remplit les att 14 15 du fichier ABSENCESAIDANT

300
IF W_Trait = "H" THEN
   W_MoyMont = 0
   W_HeureBrute = 0
   W_Passe = 0

   * Recherche la priode de debut de contrat
   W_Mois = OCONV(W_RequeteContrat<j,2>,"D4/")
   W_Mois=W_Mois[4,2]
   W_An = OCONV(W_RequeteContrat<j,2>,"D4/")
   W_An=W_An[9,2]
   W_PeriodeCont = W_An:W_Mois
   W_PeriodeCumul = W_PeriodeAbs

   FOR l = 1 TO 3

      W_PeriodeCumul = W_PeriodeCumul - 1
      W_PeriodeCumul = W_PeriodeCumul "R%4"
      IF W_PeriodeCumul[3,2] = "00" THEN
         IF W_PeriodeCumul[1,2] = "00" THEN
            W_PeriodeCumul = "9912"
         END ELSE
            W_PeriodeCumul = W_PeriodeCumul[1,2]-1:"12"
            W_PeriodeCumul = W_PeriodeCumul "R%4"
         END
      END

      IF W_PeriodeCumul<1000 THEN
	 W_PeriodeCumul2="20":W_PeriodeCumul
      END ELSE
	 W_PeriodeCumul2="19":W_PeriodeCumul
      END
      IF W_PeriodeCont<1000 THEN
	 W_PeriodeCont2="20":W_PeriodeCont
      END ELSE
	 W_PeriodeCont2="19":W_PeriodeCont
      END

      IF W_PeriodeCumul2 < W_PeriodeCont2 THEN
         NULL
      END ELSE
         W_CleCumul = W_CodeAidant:W_PeriodeCumul
         READ ENR_CUMULS FROM F.CUMULS,W_CleCumul THEN
            W_MoyMont = W_MoyMont + ENR_CUMULS<71>
            W_HeureBrute = W_HeureBrute + ENR_CUMULS<66>
            W_Passe = W_Passe + 1
         END
      END 

   NEXT l

   IF W_Passe > 0 THEN
      ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,14,W_Indice;INT((W_MoyMont/W_Passe)+(1/2)))
      ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,15,W_Indice;INT((W_HeureBrute/W_Passe)+(1/2)))
   END ELSE
      ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,14,W_Indice;"0")
      ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,15,W_Indice;"0")
   END
END ELSE
    ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,14,W_Indice;ENR_ABSENCE<19,i>)
    ENR_ABSENCESAIDANT = REPLACE(ENR_ABSENCESAIDANT,15,W_Indice;ENR_ABSENCE<14,i>)
END


RETURN

*********************************************************
*  Correspondance des motifs d'absence

500

   BEGIN CASE 
      CASE W_AncCodeAbs = "1"
         W_NouvCodeAbs = "01"
      CASE W_AncCodeAbs = "2"
         W_NouvCodeAbs = "04"
      CASE W_AncCodeAbs = "3"
         W_NouvCodeAbs = "05"
      CASE W_AncCodeAbs = "4"
         W_NouvCodeAbs = "06"
      CASE W_AncCodeAbs = "5"
         W_NouvCodeAbs = "02"
      CASE W_AncCodeAbs = "6"
         W_NouvCodeAbs = "12"
      CASE W_AncCodeAbs = "7"
         W_NouvCodeAbs = "07"
      CASE W_AncCodeAbs = "8"
         W_NouvCodeAbs = "03"
      CASE W_AncCodeAbs = "9"
         W_NouvCodeAbs = "17"
      CASE W_AncCodeAbs = "10"
         W_NouvCodeAbs = "13"
   END CASE

RETURN

*************************************************************
* Cration du voc                                              

600 

	OPEN "","VOC" TO F.VOC ELSE STOP

	ENR_VOC=""
	ENR_VOC=REPLACE(ENR_VOC,1;"F")
	ENR_VOC=REPLACE(ENR_VOC,2;"D:\TRANSFERT\":W_MODULE:"\ABSENCE")
	ENR_VOC=REPLACE(ENR_VOC,3;"D:\TRANSFERT\":W_MODULE:"\D_ABSENCE")
	WRITE ENR_VOC ON F.VOC,"ABSENCE"

	ENR_VOC=""
	ENR_VOC=REPLACE(ENR_VOC,1;"F")
	ENR_VOC=REPLACE(ENR_VOC,2;"D:\TRANSFERT\":W_MODULE:"\FIPAY")
	ENR_VOC=REPLACE(ENR_VOC,3;"D:\TRANSFERT\":W_MODULE:"\D_FIPAY")
	WRITE ENR_VOC ON F.VOC,"FIPAY"

	ENR_VOC=""
	ENR_VOC=REPLACE(ENR_VOC,1;"F")
	ENR_VOC=REPLACE(ENR_VOC,2;"D:\TRANSFERT\":W_MODULE:"\CUMULS")
	ENR_VOC=REPLACE(ENR_VOC,3;"D:\TRANSFERT\":W_MODULE:"\D_CUMULS")
	WRITE ENR_VOC ON F.VOC,"CUMULS"

RETURN

*************************************************************
* Suppression du voc                                           

700 

	DELETE F.VOC,"ABSENCE"
	DELETE F.VOC,"FIPAY"
	DELETE F.VOC,"CUMULS"

RETURN

*********************************************************
* Rcupration des paramtres				

800 

	PROCREAD MODULE ELSE STOP
	W_MODULE=FIELD(MODULE," ",2)

RETURN