**********************************************************
* RATTRAPPAGE DES CONGES EN COURS SUITE A NON PRISE EN COMPTE 
* DU NOMBRE DE JOURS D'ARRET ASSIIMILE A DU TRAVAIL EFFECTIF
*Programme chaine  partir d'un projet VB
**********************************************************

* Ouvertures des fichiers
EXECUTE "SET-THOUS ."
EXECUTE "SET-DEC ,"
EXECUTE "DATE.FORMAT"
EXECUTE 'COMO ON RATCONGESCOURS'
OPEN "","CONSTANTESPAIE" TO F.CONSTANTESPAIE ELSE STOP
OPEN "","ABSENCESAIDANT" TO F.ABSENCESAIDANT ELSE STOP 
OPEN "","CONTRAT" TO F.CONTRAT ELSE STOP
OPEN "","CONVENTIONCOL" TO F.CONVENTIONCOL ELSE STOP
OPEN "","DETAILCALCUL" TO F.DETAILCALCUL ELSE STOP
OPEN "","PERIODESPAIE" TO F.PERIODESPAIE ELSE STOP
READ ENR_CONSTANTESPAIE FROM F.CONSTANTESPAIE,"1" ELSE STOP
READ ENR_PERIODESPAIE FROM F.PERIODESPAIE,"1" ELSE STOP
IF INT(ICONV("01/":ENR_PERIODESPAIE<1>[5,2]:"/":ENR_PERIODESPAIE<1>[1,4],"D4/"))>=INT(ENR_CONSTANTESPAIE<9>) THEN
   W_PASSAGEEURO=1
   W_EURO="6,55957"
END ELSE
   W_PASSAGEEURO=0
END
PERPAIECOURS=ENR_PERIODESPAIE<1>
PERPAIEPREC=PERPAIECOURS-1
IF PERPAIEPREC[5,2]="00" THEN
 PERPAIEPREC=PERPAIECOURS[1,4]-1
 PERPAIEPREC=PERPAIEPREC:"12"
END
REQUETERATCONG=""
EXECUTE 'SELECT CONTRAT AVEC 1 # "02" AND AVEC 63 >= "':PERPAIEPREC:'" AND AVEC 65 = "" AND AVEC 58 >= "':PERPAIECOURS:'" OR = "" PAR 1 PAR 0'
EXECUTE 'SAUVE-LISTE REQUETERATCONG'
EXECUTE 'LISTE REQUETERATCONG' CAPTURING MSG RETURNING MSGCODE
IF MSGCODE<1>=209 THEN STOP
SELECT F.CONTRAT TO REQUETERATCONG
LISTEABSENCESAIDANT=""
LISTEMALADIEAIDANT=""
W_Fini="FAUX"
W_SAUVCODECONVENTION=""
LOOP
 READNEXT W_CleContrat FROM REQUETERATCONG ELSE W_Fini="VRAI"
 UNTIL W_Fini="VRAI" DO
  READ ENR_CONTRAT FROM F.CONTRAT,W_CleContrat THEN
   W_CODECONVENTION=ENR_CONTRAT<1> 
   IF W_CODECONVENTION#W_SAUVCODECONVENTION THEN
    W_SAUVCODECONVENTION=W_CODECONVENTION
    READ ENR_CONVENTIONCOL FROM F.CONVENTIONCOL,W_CODECONVENTION ELSE ENR_CONVENTIONCOL=""
    PERIODEREFCONGES=ENR_CONVENTIONCOL<28>
    IF PERIODEREFCONGES=0 THEN PERREFCONGDEPART="200606" ELSE PERREFCONGDEPART="200601"
   END
   PERDERNCLOT=ENR_CONTRAT<63>
   W_CODEAIDANT=W_CleContrat[1,5]
   W_CODECONTRAT=W_CleContrat 
   W_DEBUTCONTRAT=ENR_CONTRAT<7>
   W_DEBUTCONTRATANC=ENR_CONTRAT<97>
   W_ASSOCIATION=ENR_CONTRAT<2>
   IF PERDERNCLOT#"" AND ENR_CONTRAT<31> <> "1" THEN
    FOR G=PERREFCONGDEPART TO PERDERNCLOT
     W_PERIODE=G
     W_DebMois=ICONV("01/":W_PERIODE[5,2]:"/":W_PERIODE[1,4],"D4/")
     W_FinMois=W_DebMois+32
     W_FinMois=OCONV(W_FinMois,"D4/")
     W_FinMois="01/":W_FinMois[4,7]
     W_FinMois=ICONV(W_FinMois,"D4/")-1
     W_NbJourMois=W_FinMois-W_DebMois+1
     W_NbJourMois=W_NbJourMois * 100
     W_JOURCONGESCPS=0
     READ ENR_DETAILCALCUL FROM F.DETAILCALCUL,W_CleContrat:G ELSE ENR_DETAILCALCUL=""
     I=1
     LOOP
      UNTIL ENR_DETAILCALCUL<2,I>="" DO
       IF ENR_DETAILCALCUL<2,I>="804" THEN W_JOURCONGESCPS=1
       I=I+1
     REPEAT
     GOSUB 100
    NEXT G
    WRITE ENR_CONTRAT ON F.CONTRAT,W_CleContrat
   END
  END
REPEAT
EXECUTE 'COMO OFF'
STOP
*********************************************************
* GESTION DES CONGES
* MAJ DES CONGES EN-COURS D'ACQUISITION

100 *
    W_TOTNBJOURCONGES=0
    W_CODEABSENCE=""
    W_REQABSENCESVIDE="FAUX"
    W_TOTALJRSABSMALADIE=0
    W_NBJOURNONINDEM=0
    W_PASABS="VRAI"
    W_MOIS=W_PERIODE[5,2]
    W_ANNEE=W_PERIODE[1,4]
    W_DEBUTPERIODE=ICONV("01/":W_MOIS:"/":W_ANNEE,"D")
    W_MOISFIN=W_PERIODE[5,2]+1
    IF W_MOISFIN>12 THEN
	 W_ANNEEFIN=W_PERIODE[1,4]+1
	 W_MOISFIN="01"
    END ELSE
	 W_ANNEEFIN=W_PERIODE[1,4]
    END
    W_FINPERIODE=ICONV("01/":W_MOISFIN:"/":W_ANNEEFIN,"D4/")
    W_FINPERIODE=W_FINPERIODE-1
    W_FINPERIODE2=OCONV(W_FINPERIODE,"D4/")
    W_FINPERIODE2=W_FINPERIODE2[7,4]:W_FINPERIODE2[4,2]

    EXECUTE 'TSELECT ABSENCESAIDANT AVEC CodAbsAidant = "':W_CODEAIDANT:']" AND AVEC 2 >= "':W_DEBUTPERIODE:'" AND AVEC DebAbsAidant <= "':W_FINPERIODE:'" AND AVEC NumMotifAidant = "01"'
    EXECUTE "SAUVE-LISTE LISTEABSENCESAIDANT"
    EXECUTE "LISTE LISTEABSENCESAIDANT" CAPTURING MSG RETURNING MSGCODE

    IF MSGCODE<1><>209 THEN 
         SELECT F.ABSENCESAIDANT TO LISTEABSENCESAIDANT
         LOOP 
 	     READNEXT CLE FROM LISTEABSENCESAIDANT ELSE
	         W_REQABSENCESVIDE="VRAI"
  	     END
	   UNTIL W_REQABSENCESVIDE="VRAI" DO
	     W_CODEABSENCE=CLE[6,2]
	     W_CLEABSENCE=CLE
	     * LECTURE ABSENCESAIDANT
	     READ ENR_ABSENCESAIDANT FROM F.ABSENCESAIDANT,W_CLEABSENCE ELSE
               PRINT "PAS D'ABS"
	       STOP
	     END
	     * VERIFIE SI ABS A PRENDRE (EXCLUSION)
	     W_ABSOK=0
	     * recherche code contrat sur att 26
	     IF ENR_ABSENCESAIDANT<26,1>="" THEN 
		  W_ABSOK=1
	     END ELSE
	          Z=1
                  LOOP
		       UNTIL ENR_ABSENCESAIDANT<26,Z>=W_CleContrat OR ENR_ABSENCESAIDANT<26,Z>="" DO
 		       Z=Z+1
    	          REPEAT
		  * si code contrat trouv
		  IF ENR_ABSENCESAIDANT<26,Z>=W_CleContrat THEN 
			* si absence a prendre en compte 
			IF ENR_ABSENCESAIDANT<21,Z>="O" THEN 
				W_ABSOK=1
				* modifie virtuellement les infos de l'absence
				W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7]=ENR_ABSENCESAIDANT<22,Z>
				CLE[8,LEN(CLE)-7]=ENR_ABSENCESAIDANT<22,Z>
				IF ENR_ABSENCESAIDANT<23,Z>="M" THEN 
					ENR_ABSENCESAIDANT<1>="1"
				END ELSE
					ENR_ABSENCESAIDANT<1>="2"
				END
				ENR_ABSENCESAIDANT<2>=ENR_ABSENCESAIDANT<24,Z>
				IF ENR_ABSENCESAIDANT<25,Z>="M" THEN 
					ENR_ABSENCESAIDANT<3>="1"
				END ELSE
					ENR_ABSENCESAIDANT<3>="2"
				END
			END
		  END ELSE 
			W_ABSOK=0
	          END
	      END

	     IF W_ABSOK=1 THEN
  	       IF ENR_CONTRAT<31> <> 1 OR ENR_CONTRAT<1>="02" THEN
                 W_PASABS="FAUX"
                 IF W_JOURCONGESCPS=0 THEN
                    * Pas conges payes pour soldes 
                    GOSUB 200
                 END
               END
	     END

         REPEAT

         * a voir
	   IF W_PASABS="VRAI" AND W_JOURCONGESCPS=0 THEN GOSUB 200
    END

RETURN     

*********************************************************
* GESTION DES ABSENCES

200 *
    W_MONTANTARRET=0
    W_ABSENCEMOIS="FAUX"
    IF W_PASABS="FAUX" THEN
       * RECHERCHE SI ABSENCES SUR LE MOIS
       IF W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7]>=W_DEBUTPERIODE AND W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7]<=W_FINPERIODE THEN 
          W_ABSENCEMOIS="VRAI"
       END
       IF W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7]<=W_DEBUTPERIODE THEN 
	   IF ENR_ABSENCESAIDANT<2>>=W_DEBUTPERIODE THEN 
	      W_ABSENCEMOIS="VRAI"
           END    
       END
    END ELSE
       W_ABSENCEMOIS="FAUX"
       W_CODEABSENCE=""
    END

    IF W_ABSENCEMOIS="VRAI" THEN

      BEGIN CASE
	* MALADIE
       CASE W_CODEABSENCE="01"     
	
	  * Determine le nb jour d'abs.
        GOSUB 300
        W_NBJOURABSMALADIE=W_NBJOURABS
        IF ENR_CONVENTIONCOL<17><>"" THEN
            W_NBSUSPENSION=ENR_CONVENTIONCOL<17>*100
        END ELSE
            W_NBSUSPENSION=""
        END
        IF W_TOTALJRSABSMALADIE=0 THEN
           GOSUB 302
           W_CUMULJOURMALADIE=W_CUMULMALADIE
        END
        W_TOTALJRSABSMALADIE=W_TOTALJRSABSMALADIE+W_NBJOURABSMALADIE
        W_CUMULJOURMALADIE=W_CUMULJOURMALADIE+W_NBJOURABSMALADIE

        IF W_CUMULJOURMALADIE <= W_NBSUSPENSION THEN
           * On maintient les droits de la personne
           GOSUB 301	
           * CALCUL SALAIRE DE REFERENCE
           K=1
           LOOP
           UNTIL ENR_ABSENCESAIDANT<17,K>=W_CODECONTRAT OR ENR_ABSENCESAIDANT<17,K>="" DO
              K=K+1
           REPEAT
           IF W_PASSAGEEURO=1 AND (INT(W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7])<INT(ENR_CONSTANTESPAIE<9>)) THEN
              ENR_ABSENCESAIDANT<14,K>=INT((ENR_ABSENCESAIDANT<14,K>/W_EURO)+1/2)
           END
           W_SALREFHRES=(ENR_ABSENCESAIDANT<15,K>/W_NbJourMois)*(W_NBJOURABSMALADIE)
           W_SALREFMONT=(ENR_ABSENCESAIDANT<14,K>/W_NbJourMois)*(W_NBJOURABSMALADIE)
           * PRISE DES 10 %
           W_SALREFHRES=INT(W_SALREFHRES*10/100 + 1/2)
           W_SALREFMONT=INT(W_SALREFMONT*10/100 + 1/2)
PRINT W_CODEAIDANT:"   ":OCONV(W_DEBUTPERIODE,"D4/"):" ":OCONV(W_FINPERIODE,"D4/"):" ":ENR_CONTRAT<44>:" ":ENR_CONTRAT<45>:" ":ENR_CONTRAT<46>:" ":ENR_CONTRAT<70>
PRINT W_CODEAIDANT:"   ":W_NBJOURCONGES:" ":W_SALREFHRES:" ":W_SALREFMONT:" ":W_NBJOURABSMALADIE
PRINT
           ENR_CONTRAT<44>=ENR_CONTRAT<44>+W_NBJOURCONGES
           ENR_CONTRAT<45>=ENR_CONTRAT<45>+W_SALREFHRES
           ENR_CONTRAT<46>=ENR_CONTRAT<46>+W_SALREFMONT
           ENR_CONTRAT<70>=ENR_CONTRAT<70>-W_NBJOURABSMALADIE
           IF ENR_CONTRAT<70><0 THEN ENR_CONTRAT<70>=0
        END ELSE
           W_NBJOURINDEM=W_NBSUSPENSION - (W_CUMULJOURMALADIE - W_NBJOURABSMALADIE)
           IF W_NBJOURINDEM > 0 THEN
              * A Indemnise
              W_NBJOURABS=W_NBJOURINDEM
              GOSUB 301
              * CALCUL SALAIRE DE REFERENCE
              K=1
              LOOP
              UNTIL ENR_ABSENCESAIDANT<17,K>=W_CODECONTRAT OR ENR_ABSENCESAIDANT<17,K>="" DO
                 K=K+1
              REPEAT
              IF W_PASSAGEEURO=1 AND (INT(W_CLEABSENCE[8,LEN(W_CLEABSENCE)-7])<INT(ENR_CONSTANTESPAIE<9>)) THEN
                 ENR_ABSENCESAIDANT<14,K>=INT((ENR_ABSENCESAIDANT<14,K>/W_EURO)+1/2)
              END
              W_SALREFHRES=(ENR_ABSENCESAIDANT<15,K>/W_NbJourMois)*(W_NBJOURABS)
              W_SALREFMONT=(ENR_ABSENCESAIDANT<14,K>/W_NbJourMois)*(W_NBJOURABS)
              * PRISE DES 10 %
              W_SALREFHRES=INT(W_SALREFHRES*10/100 + 1/2)
              W_SALREFMONT=INT(W_SALREFMONT*10/100 + 1/2)
PRINT W_CODEAIDANT:"   ":OCONV(W_DEBUTPERIODE,"D4/"):" ":OCONV(W_FINPERIODE,"D4/"):" ":ENR_CONTRAT<44>:" ":ENR_CONTRAT<45>:" ":ENR_CONTRAT<46>:" ":ENR_CONTRAT<70>
PRINT W_CODEAIDANT:"   ":W_NBJOURCONGES:" ":W_SALREFHRES:" ":W_SALREFMONT:" ":W_NBJOURABSMALADIE
PRINT
              ENR_CONTRAT<44>=ENR_CONTRAT<44>+W_NBJOURCONGES
              ENR_CONTRAT<45>=ENR_CONTRAT<45>+W_SALREFHRES
              ENR_CONTRAT<46>=ENR_CONTRAT<46>+W_SALREFMONT
              ENR_CONTRAT<70>=ENR_CONTRAT<70>-W_NBJOURINDEM
              IF ENR_CONTRAT<70><0 THEN ENR_CONTRAT<70>=0
           END
        END
			
      CASE 1   
		
         NULL
          
      END CASE       
   END
RETURN	 

*********************************************************
* CALCUL DU NOMBRE DE JOURS D'ABSENCES (HORS MALADIE)

300 * 

    * DEBUT ABS >= DEBUT MOIS
    IF CLE[8,LEN(CLE)-7]>=W_DEBUTPERIODE THEN
    * FIN ABSENCES <= FIN MOIS
	IF ENR_ABSENCESAIDANT<2><=W_FINPERIODE THEN
  	    W_NBJOURABS=ENR_ABSENCESAIDANT<2>-CLE[8,LEN(CLE)-7]+1
	END ELSE
  	    W_NBJOURABS=W_FINPERIODE-CLE[8,LEN(CLE)-7]+1
	END
    END ELSE
	* FIN ABSENCES <= FIN MOIS
	IF ENR_ABSENCESAIDANT<2><=W_FINPERIODE THEN
  	    W_NBJOURABS=ENR_ABSENCESAIDANT<2>-W_DEBUTPERIODE+1
	END ELSE
  	    W_NBJOURABS=W_FINPERIODE-W_DEBUTPERIODE+1
	END
    END
    W_NBJOURABS=W_NBJOURABS*100

    * DIMINUTION DU NOMBRE DE JOURS SI DEMI-JOURNEE
    IF ENR_ABSENCESAIDANT<1>=2 THEN W_NBJOURABS=W_NBJOURABS-50
    IF ENR_ABSENCESAIDANT<3>=1 THEN W_NBJOURABS=W_NBJOURABS-50

RETURN

*********************************************************
* CALCUL DES DROITS AUX CONGES (TYPE 12 OU 13)

301 *

    * CALCUL AU PRORATA DES JOURS DE CONGES
    W_NBJOURCONGES=250*W_NBJOURABS/W_NbJourMois
    W_NBJOURCONGES=INT(W_NBJOURCONGES+1/2)

RETURN

*********************************************************
* CALCUL DU NOMBRE CUMULE DE JOURS D'ABSENCES (JUIN->MAI)
* OU JANVIER->DECEMBRE SI ATT.28 CONVENTIONCOL = 1

302 *
    W_CUMULMALADIE=0
    W_REQMALADIEVIDE="FAUX"
    IF ENR_CONVENTIONCOL<28>="0" OR ENR_CONVENTIONCOL<28>="" THEN
      IF W_PERIODE[5,2]>="06" THEN
        W_DEBUTANNEE=ICONV("01/06/":W_PERIODE[1,4],"D4/")
      END ELSE
        W_DEBUTANNEE=ICONV("01/06/":W_PERIODE[1,4]-1,"D4/")
      END
    END ELSE
        W_DEBUTANNEE=ICONV("01/01/":W_PERIODE[1,4],"D4/")
    END
    W_PERIODECOURS=W_DEBUTPERIODE-1   

    IF W_DEBUTANNEE#W_DEBUTPERIODE THEN
      EXECUTE 'TSELECT ABSENCESAIDANT AVEC CodAbsAidant = "':W_CODEAIDANT:']" AND AVEC NumMotifAidant = "01" AND AVEC 2 >= "':W_DEBUTANNEE:'" OR = "" AND AVEC DebAbsAidant <= "':W_PERIODECOURS:'" PAR DebAbsAidant'
      EXECUTE "SAUVE-LISTE LISTEMALADIEAIDANT"
      EXECUTE "LISTE LISTEMALADIEAIDANT" CAPTURING MSG RETURNING MSGCODE
      IF MSGCODE<1>=209 THEN W_REQMALADIEVIDE="VRAI"
      IF W_REQMALADIEVIDE="FAUX" THEN
         SELECT F.ABSENCESAIDANT TO LISTEMALADIEAIDANT
         LOOP 
	      READNEXT CLECUM FROM LISTEMALADIEAIDANT ELSE
	          W_REQMALADIEVIDE="VRAI"
     	      END
	      UNTIL W_REQMALADIEVIDE="VRAI" DO
              READ ENR_ABSENCESAIDANTCUM FROM F.ABSENCESAIDANT,CLECUM ELSE ENR_ABSENCESAIDANTCUM=""
	      GOSUB 303
    	      * CUMUL DU NOMBRE DE JOURS DE MALADIE SUR L'ANNEE
	      W_CUMULMALADIE=W_CUMULMALADIE+W_NBJOURABSCUMUL              
	 REPEAT
      END ELSE 
	 W_CUMULMALADIE=0
      END
    END ELSE
      W_CUMULMALADIE=0
    END
 
RETURN

*********************************************************
* CALCUL DU NOMBRE DE JOURS D'ABSENCES MALADIE

303 * 
    * DEBUT ABS <= 01/06 OU <= 01/01
    W_NBJOURABSCUMUL=0
    IF CLECUM[8,LEN(CLECUM)-7]<=W_DEBUTANNEE THEN
        * FIN ABSENCES <= FIN MOIS
      IF ENR_ABSENCESAIDANTCUM<2>>=W_DEBUTANNEE THEN
	IF ENR_ABSENCESAIDANTCUM<2><=W_PERIODECOURS THEN
            W_NBJOURABSCUMUL=ENR_ABSENCESAIDANTCUM<2>-W_DEBUTANNEE+1
	END ELSE
            W_NBJOURABSCUMUL=W_PERIODECOURS-W_DEBUTANNEE+1
	END
      END
    END ELSE
	* FIN ABSENCES <= FIN MOIS
      IF CLECUM[8,LEN(CLECUM)-7]<=W_PERIODECOURS THEN
	IF ENR_ABSENCESAIDANTCUM<2><=W_PERIODECOURS THEN
  	    W_NBJOURABSCUMUL=ENR_ABSENCESAIDANTCUM<2>-CLECUM[8,LEN(CLECUM)-7]+1
	END ELSE
  	    W_NBJOURABSCUMUL=W_PERIODECOURS-CLECUM[8,LEN(CLECUM)-7]+1
	END
      END
    END
    W_NBJOURABSCUMUL=W_NBJOURABSCUMUL*100

    * DIMINUTION DU NOMBRE DE JOURS SI DEMI-JOURNEE
    IF ENR_ABSENCESAIDANTCUM<1>=2 THEN W_NBJOURABSCUMUL=W_NBJOURABSCUMUL-50
    IF ENR_ABSENCESAIDANTCUM<3>=1 THEN W_NBJOURABSCUMUL=W_NBJOURABSCUMUL-50

RETURN