#include <stdio.h>

#include <stdlib.h>
#include <string.h>
// IMPORTANT: We changed the initial implementation (we removed <malloc/malloc.h>)
// #include <malloc/malloc.h>

#include "fgmco.h"
#include "../ficum/ctrlgenficum.h"

// Global variable definitions (declared as extern in fgmco.h)
GRP_ENTREE_2024 grp_ent_2024;
GHS_VALORISATION_2024 ghs_val_2024;
RSS_INFO_2024 rss_inf_2024;

GRP_ENTREE_2025 grp_ent_2025;
GHS_VALORISATION_2025 ghs_val_2025;
RSS_INFO_2025 rss_inf_2025;

GRP_RESULTAT_2025 grp_res_2025;

long  nbenr;
enum versionFG
{
	V2024,
	V2025
};

int my_index1(char s1[],char s2[])
{
 int i,j,k;
 for(i=0;s1[i]!='\0';i++)
  {
   for(j=i,k=0;s2[k]!='\0' && s1[j]==s2[k];j++,k++);
   if(s2[k]=='\0')
	   return(i);
  }
  return(-1);
}

void trim(char s[],char s2[])
{
   int i,j;

   j=0;
   for(i=0;(unsigned int)i<strlen(s);i++)
   {
      if(s[i]!=' ')
	  {
		  s2[j]=s[i];
		  j++;
	  }
    }
   s2[j]=0;
}

void decoupe(char s1[],char s2[],char s3[])
{
   int pos;char r[130],l[130];

    pos=my_index1(s1,"=");
    if (pos<0)
	{
		s2=0;
		s3=0;
		return;
	}
    strncpy(l,s1,pos);
	l[pos]=0;
	trim(l,s2);
    strncpy(r,s1+pos+1,strlen(s1)-pos-1);
	r[strlen(s1)-pos-1]=0;
	trim(r,s3);
}

int Test_Ver(char bufin[],char VERS[])
{
/* Permet de tester la version de RUM */
 if (strncmp(bufin+9,VERS,3)==0) return(0);
 else return(1);
 }

int trouveSlash(char *pch)
{
    int i;
    int taillech=strlen(pch);
    for(i=taillech;i>=0;i--)
    {
        if((pch[i]=='/') || (pch[i]=='\\') || (pch[i]==':'))
            break;
    }
    return i;
}

int GenereFichierUM(char *pdirtables,char *lficumin,char *lficumout,FILE *lflog, int bGestionPortee,int bgenerefinessgeo)
{
    char* msgerr_ium;
    int ret;

    if((ret=CtrlFicUM(lficumin,lficumout,pdirtables,1,bGestionPortee,bgenerefinessgeo))!=0)
    {
        switch(ret)
        {
        case 1 : msgerr_ium="impossible d'ouvrir le fichier";break;
        case 2 : msgerr_ium="impossible de créer le fichier de travail";break;
        case 3 : msgerr_ium="impossible de créer le fichier de rapport";break;
        case 4 : msgerr_ium="erreurs de format ou dates incohérentes détectées";break;
        case 5 : msgerr_ium="au moins deux dates de début d'autorisation identiques";break;
        case 6 : msgerr_ium="erreur système";break;
        case 8 : msgerr_ium="type d'autorisation non acceptee avec l'UM reservee $$$$";break;
		case 9: msgerr_ium = "fichier de références des autorisations d'UM corrompu"; break;
		case 10: msgerr_ium = "au moins deux dates de début d'autorisation identiques pour une autorisation globale au finess géographique"; break;
		case 11: msgerr_ium = "Le type d'autorisation 72 IVG n'est plus accepté au 1er mars 2019."; break;
		default: msgerr_ium = "erreur inconnue.";
        }
        fprintf(lflog,"Le fichier ficum.txt n'a pas été généré car :  %s\n",msgerr_ium);
        if(ret!=3)
            fprintf(lflog,"Voir le fichier de log : %s.log\n",lficumin);
        return 1;
    }
    return 0;
}

void genereRDS_V2024(FILE* frds, char* rum[])
{
	int lg;
	char zone[20];
	lg = strlen(rum[0]);
	/* ----------------------- Génération du RDS ----------------------- */
	/* de n°RSS à sexe */

	if (datedernregles_renseignee_2024 < 0)
		strncpy(zone, rum[0] + 108, 8);
	else
		strncpy(zone, rum[datedernregles_renseignee_2024] + 108, 8);
	zone[8] = 0;

	if (agegest_renseigne_2024 < 0)
		fprintf(frds, "%20.20s%9.9s%3.3s%3.3s%2.2s%2.2s%4.4s%3.3s%02d%03d%03d%2.2s%8.8s%c", rum[0] + 12, rum[0], "R09", "122", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, grp_res_2025.cret, grp_ent_2024.ns, rss_inf_2024.agea, rss_inf_2024.agej, rum[0] + 106, zone, *(rum[0] + 70));
	else
		fprintf(frds, "%20.20s%9.9s%3.3s%3.3s%2.2s%2.2s%4.4s%3.3s%02d%03d%03d%2.2s%8.8s%c", rum[0] + 12, rum[0], "R09", "122", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, grp_res_2025.cret, grp_ent_2024.ns, rss_inf_2024.agea, rss_inf_2024.agej, rum[agegest_renseigne_2024] + 106, zone, *(rum[0] + 70));
	/* de mode entrée à destination */
	fprintf(frds, "%c%c%2.2s%4.4s%c%c", *(rum[0] + 85), *(rum[0] + 86), rum[grp_ent_2024.ns - 1] + 87 + 2, rum[grp_ent_2024.ns - 1] + 87 + 4, *(rum[grp_ent_2024.ns - 1] + 95), *(rum[grp_ent_2024.ns - 1] + 96));
	/* durée de séjour totale et code postal */
	if (rss_inf_2024.dstot > 9999)
		fprintf(frds, "9999%5.5s", rum[0] + 97);
	else
		fprintf(frds, "%4.4d%5.5s", rss_inf_2024.dstot, rum[0] + 97);
	/* poids d'entrée */
	if (lg < 106)
		fprintf(frds, "%4.4s", "    ");
	else
		fprintf(frds, "%4.4s", rum[0] + 102);

	/* nbseances et nnbseances avant SROS*/
	fprintf(frds, "%02d", ghs_val_2024.nbseance);

	/* igs */
	/*sprintf(zone,"%03d",_igs_2024);*/
	fprintf(frds, "%03d", _igs_2024);
	/* de GHS à buhcd */
	fprintf(frds, "%4.4s%04d%1d%05d%1d", ghs_val_2024.ghs, ghs_val_2024.nbjxsup, ghs_val_2024.sejxinf, (int)(ghs_val_2024.nbjxinf), ghs_val_2024.buhcd);
	/* nbsuppléments réa à nbjssc */
	fprintf(frds, "%03d%03d%03d%03d%03d", ghs_val_2024.nbjrea, ghs_val_2024.nbrep, ghs_val_2024.nbjsrc, ghs_val_2024.nbjstf_issuderea, ghs_val_2024.nbjstf_tot);

	/*nb suppléments menant aux GHS 9610, 9611, 9612*/
	fprintf(frds, "%03d%03d%03d", ghs_val_2024.nbac687, ghs_val_2024.nbac688, ghs_val_2024.nbac689);

	/*nb suppléments menant aux GHS 9619 et 9620*/
	fprintf(frds, "%03d%03d", ghs_val_2024.nbprot, ghs_val_2024.nbict);

	/*nb suppléments RX1,RX2, aphérése et RCMI*/
	fprintf(frds, "%03d%03d%03d%03d", ghs_val_2024.nbacRX1, ghs_val_2024.nbacRX2, ghs_val_2024.nbacRX3, ghs_val_2024.nbRCMI);

	/*nb suppléments GHS 9623,9625,9631,9632,9633*/
	fprintf(frds, "%03d%03d%03d%03d%03d", ghs_val_2024.nbactsupp9623, ghs_val_2024.nbactsupp9625, ghs_val_2024.nbactsupp9631, ghs_val_2024.nbactsupp9632, ghs_val_2024.nbactsupp9633);

	/*présence d'actes de prélèvement d'organes*/
	fprintf(frds, "%1d", ghs_val_2024.acprlvtorg);
	/*neonat*/
	fprintf(frds, "%03d%03d%03d", ghs_val_2024.nbjnna, ghs_val_2024.nbjnnb, ghs_val_2024.nbjnnc);
	/*GHS avant innovation*/
	fprintf(frds, "%4.4s", ghs_val_2024.ghsavantInnov);

	/*acte dialyse supplémentaires*/
	fprintf(frds, "%03d%03d%03d%03d", ghs_val_2024.nbhd, ghs_val_2024.nbent1, ghs_val_2024.nbent2, ghs_val_2024.nbent3);
	/*caissons hyperbare*/
	fprintf(frds, "%03d", ghs_val_2024.nbchypb);

	/*suppléments antepartum*/
	fprintf(frds, "%03d", ghs_val_2024.nbantepartum);
	/* supplement radiotherapie*/
	fprintf(frds, "%03d", ghs_val_2024.nbradiopedia);

	/*Indicateur de GHS minoré*/
	fprintf(frds, "%1d", ghs_val_2024.ghsminor);

	/*supplément SDC*/
	fprintf(frds, "%1d", ghs_val_2024.supplSDC);

	/*top eligibilité gradation pour les 0j*/
	if (gradationHDJ_2024 < 0)
		fprintf(frds, " ");/*non concernés*/
	else
		fprintf(frds, "%1d", gradationHDJ_2024);

	/*filler sur 1*/
	/*fprintf(frds, " ");*/

	/*séjour non programmé*/
	fprintf(frds, "%c", sejNonprog_2024);

    /*supplément CarTCell*/
	fprintf(frds, "  %1d", ghs_val_2024.supplCarTCell);

	/*flag Avastin*/
	fprintf(frds, "%1d", ghs_val_2024.flagAvastin);
	
    /*nb suppléments menant aux GHS 9639 (protonthérapie patient age < 18ans)*/
    fprintf(frds, "%03d", ghs_val_2024.nbprotped);
        
    /*filler*/
	fprintf(frds, " ");

	if (strncmp(grp_res_2025.cmd, "90", 2) == 0)
	{
		/* DP et DR */
		fprintf(frds, "%6.6s%6.6s", "      ", "      ");
		/* nbDAS et nb Zones d'actes */
		fprintf(frds, "0000000");
	}
	else
	{
		/* DP et DR */
		fprintf(frds, "%6.6s%6.6s", rss_inf_2024.diaglist.listdiag, rss_inf_2024.diaglist.listdiag + lgdiag_2024);
		/* nbDAS et nb Zones d'actes */
		fprintf(frds, "%02d%05d", rss_inf_2024.diaglist.nbdiag - 2, rss_inf_2024.actlist.nbac);
		/*DAS*/
		fwrite(rss_inf_2024.diaglist.listdiag + lgdiag_2024 * 2, sizeof(char), lgdiag_2024 * (rss_inf_2024.diaglist.nbdiag - 2), frds);
		/*actes*/
		fwrite(rss_inf_2024.actlist.listzac, sizeof(char), 29 * rss_inf_2024.actlist.nbac, frds);
	}
	fprintf(frds, "\n");
	/* --------------------- Fin génération du RDS --------------------- */

}
void genereRDS_V2025(FILE* frds, char* rum[])
{
    int lg;
    char zone[20];
    lg = strlen(rum[0]);
    /* ----------------------- Génération du RDS ----------------------- */
    /* de néRSS à sexe */

    if (datedernregles_renseignee_2025 < 0)
        strncpy(zone, rum[0] + 108, 8);
    else
        strncpy(zone, rum[datedernregles_renseignee_2025] + 108, 8);
    zone[8] = 0;

    if (agegest_renseigne_2025 < 0)
        fprintf(frds, "%20.20s%9.9s%3.3s%3.3s%2.2s%2.2s%4.4s%3.3s%02d%03d%03d%2.2s%8.8s%c", rum[0] + 12, rum[0], "R10", "122", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, grp_res_2025.cret, grp_ent_2025.ns, rss_inf_2025.agea, rss_inf_2025.agej, rum[0] + 106, zone, *(rum[0] + 70));
    else
        fprintf(frds, "%20.20s%9.9s%3.3s%3.3s%2.2s%2.2s%4.4s%3.3s%02d%03d%03d%2.2s%8.8s%c", rum[0] + 12, rum[0], "R10", "122", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, grp_res_2025.cret, grp_ent_2025.ns, rss_inf_2025.agea, rss_inf_2025.agej, rum[agegest_renseigne_2025] + 106, zone, *(rum[0] + 70));
    /* de mode entrée à destination */
    fprintf(frds, "%c%c%2.2s%4.4s%c%c", *(rum[0] + 85), *(rum[0] + 86), rum[grp_ent_2025.ns - 1] + 87 + 2, rum[grp_ent_2025.ns - 1] + 87 + 4, *(rum[grp_ent_2025.ns - 1] + 95), *(rum[grp_ent_2025.ns - 1] + 96));
    /* durée de séjour totale et code postal */
    if (rss_inf_2025.dstot > 9999)
        fprintf(frds, "9999%5.5s", rum[0] + 97);
    else
        fprintf(frds, "%4.4d%5.5s", rss_inf_2025.dstot, rum[0] + 97);
    /* poids d'entrée */
    if (lg < 106)
        fprintf(frds, "%4.4s", "    ");
    else
        fprintf(frds, "%4.4s", rum[0] + 102);

    /* nbseances et nnbseances avant SROS*/
    fprintf(frds, "%02d", ghs_val_2025.nbseance);

    /* igs */
    /*sprintf(zone,"%03d",_igs_2025);*/
    fprintf(frds, "%03d", _igs_2025);
    /* de GHS à buhcd */
    fprintf(frds, "%4.4s%04d%1d%05d%1d", ghs_val_2025.ghs, ghs_val_2025.nbjxsup, ghs_val_2025.sejxinf, (int)(ghs_val_2025.nbjxinf), ghs_val_2025.buhcd);
    /* nbsuppléments réa à nbjstftot */
    fprintf(frds, "%03d%03d%03d%03d%03d%03d", ghs_val_2025.nbjrea, ghs_val_2025.nbrep, ghs_val_2025.nbjsrc, ghs_val_2025.nbjstf_issuderea, ghs_val_2025.nbj_usip, ghs_val_2025.nbjstf_tot);

    /*nb suppléments menant aux GHS 9610, 9611, 9612*/
    fprintf(frds, "%03d%03d%03d", ghs_val_2025.nbac687, ghs_val_2025.nbac688, ghs_val_2025.nbac689);

    /*nb suppléments menant aux GHS 9619 et 9620*/
    fprintf(frds, "%03d%03d", ghs_val_2025.nbprot, ghs_val_2025.nbict);

    /*nb suppléments RX1,RX2, aphérése et RCMI*/
    fprintf(frds, "%03d%03d%03d%03d", ghs_val_2025.nbacRX1, ghs_val_2025.nbacRX2, ghs_val_2025.nbacRX3, ghs_val_2025.nbRCMI);

    /*nb suppléments GHS 9623,9625,9631,9632,9633*/
    fprintf(frds, "%03d%03d%03d%03d%03d", ghs_val_2025.nbactsupp9623, ghs_val_2025.nbactsupp9625, ghs_val_2025.nbactsupp9631, ghs_val_2025.nbactsupp9632, ghs_val_2025.nbactsupp9633);

    /*présence d'actes de prélévement d'organes*/
    fprintf(frds, "%1d", ghs_val_2025.acprlvtorg);
    /*neonat*/
    fprintf(frds, "%03d%03d%03d", ghs_val_2025.nbjnna, ghs_val_2025.nbjnnb, ghs_val_2025.nbjnnc);
    /*GHS avant innovation*/
    fprintf(frds, "%4.4s", ghs_val_2025.ghsavantInnov);

    /*acte dialyse supplémentaires*/
    fprintf(frds, "%03d%03d%03d%03d", ghs_val_2025.nbhd, ghs_val_2025.nbent1, ghs_val_2025.nbent2, ghs_val_2025.nbent3);
    /*caissons hyperbare*/
    fprintf(frds, "%03d", ghs_val_2025.nbchypb);

    /*suppléments antepartum*/
    fprintf(frds, "%03d", ghs_val_2025.nbantepartum);
    /* supplement radiotherapie*/
    fprintf(frds, "%03d", ghs_val_2025.nbradiopedia);

    /*Indicateur de GHS minoré*/
    fprintf(frds, "%1d", ghs_val_2025.ghsminor);

    /*supplément SDC*/
    fprintf(frds, "%1d", ghs_val_2025.supplSDC);

    /*top eligibilité gradation pour les 0j*/
    if (gradationHDJ_2025 < 0)
        fprintf(frds, " ");/*non concernés*/
    else
        fprintf(frds, "%1d", gradationHDJ_2025);

    /*filler sur 1*/
    /*fprintf(frds, " ");*/

    /*séjour non programmé*/
    fprintf(frds, "%c", sejNonprog_2025);

    /*supplément CarTCell*/
    fprintf(frds, "  %1d", ghs_val_2025.supplCarTCell);

    /*flag Avastin*/
    fprintf(frds, "%1d", ghs_val_2025.flagAvastin);

    /*nb suppléments menant aux GHS 9639 (protonthérapie patient age < 18ans)*/
    fprintf(frds, "%03d", ghs_val_2025.nbprotped);

    /*filler*/
    fprintf(frds, " ");

    if (strncmp(grp_res_2025.cmd, "90", 2) == 0)
    {
        /* DP et DR */
        fprintf(frds, "%6.6s%6.6s", "      ", "      ");
        /* nbDAS et nb Zones d'actes */
        fprintf(frds, "0000000");
    }
    else
    {
        /* DP et DR */
        fprintf(frds, "%6.6s%6.6s", rss_inf_2025.diaglist.listdiag, rss_inf_2025.diaglist.listdiag + lgdiag_2025);
        /* nbDAS et nb Zones d'actes */
        fprintf(frds, "%02d%05d", rss_inf_2025.diaglist.nbdiag - 2, rss_inf_2025.actlist.nbac);
        /*DAS*/
        fwrite(rss_inf_2025.diaglist.listdiag + lgdiag_2025 * 2, sizeof(char), lgdiag_2025 * (rss_inf_2025.diaglist.nbdiag - 2), frds);
        /*actes*/
        fwrite(rss_inf_2025.actlist.listzac, sizeof(char), 29 * rss_inf_2025.actlist.nbac, frds);
    }
    fprintf(frds, "\n");
    /* --------------------- Fin génération du RDS --------------------- */

}

/*
Argv[1]=nom du fichier de RSS à traiter
Argv[2]=répertoire des tables
Argv[3]=1 si établissement ex DGF, 2 si ex OQN
Argv[4]= nom du fichier d'autorisations d'Unités Médicales
sortie=même nom avec des suffixes sup,err,log, grp
*/
int main(int argc, char * argv[])
{
	FILE *ent, *sor, *ferr, *fsup, *flog, *frds, *fstp;

    char *rum[tab_max];
	char  bufin[31001],bufav[31001];
	int pm,dm,eof,i;
    int ret,nbsej,deb,j;
    long  nbr_mf,nbrss,nbrss_err,nbrum,nbrum_err;
    char  csj;
    char  defsuf[516],nf[520];
    int fgutilisee,lgchaine,posslash;

	/*CD modif du 12/03/04 :le main est appelé avec 3 arguments:
							1) nom du fichier RSS
							2) répertoire des tables (finissant par /)
							3) type d'établissement : 1:DGF ; 2:OQN
                            4) nom du fichier d'autorisation d'UM 
                            5) répertoire de travail(avec droits d'écriture)*/

	if(argc<6)
    {
        printf("syntaxe : %s {nom du fichier RSS} {repertoire des tables finissant par '/'} {type d'etablissement 1:DGF 2:OQN} {nom complet du fichier d'autorisation d'UM} {repertoire de travail (avec droits d'ecriture)}\n",argv[0]);
        return(1);
    }
    if (atoi(argv[3])==1) /*etablissements ex-DGF*/
    {
		grp_ent_2025.type_etab = 1;
		grp_ent_2024.type_etab = 1;
	}
    else
    if (atoi(argv[3])==2) /*etablissement ex-OQN*/
    {
		grp_ent_2025.type_etab = 2;
		grp_ent_2024.type_etab = 2;
	}
    else
    {
        printf("syntaxe : %s {nom du fichier RSS} {repertoire des tables finissant par '/'} {type d'etablissement 1:DGF 2:OQN} {nom complet du fichier d'autorisation d'UM} {repertoire de travail (avec droits d'ecriture)}\n",argv[0]);
        return(1);
    }

    for(i=0;i<tab_max;i++)  {  rum[i]=NULL; };

    ent=sor=ferr=fsup=flog=frds=fstp=NULL;

    nbenr=nbr_mf=nbrss=nbrss_err=nbrum=nbrum_err=0;

    strcpy(defsuf,argv[5]);
    lgchaine = strlen(defsuf);
    if((defsuf[lgchaine-1]!='/') && (defsuf[lgchaine-1]!='\\'))
        strcat(defsuf,"/");
    posslash=trouveSlash(argv[1]);
    lgchaine = strlen(argv[1]);
    if(posslash!=-1)
    {
        if(posslash!=lgchaine-1)
        {
            strcat(defsuf,argv[1]+posslash+1);
        }
    }
    else
    {
        strcat(defsuf,argv[1]);
    }

    sprintf(nf,"%s.sup",defsuf);
    if ((fsup=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }


    sprintf(nf,"%s.err",defsuf);
    if ((ferr=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }

    sprintf(nf,"%s.log",defsuf);
    if ((flog=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }

    sprintf(nf,"%s.grp",defsuf);
    if ((sor=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }

    sprintf(nf,"%s.rds",defsuf);
    if ((frds=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }

    sprintf(nf,"%s.stp.txt",defsuf);
    if ((fstp=fopen(nf,"w"))==NULL)
    {
        /*_fcloseall();*/
        return(1);
    }

    /*Initialisation des répertoires des tables binaires des fonctions groupages*/
	sprintf(grp_ent_2025.dirtab, "%s%s", argv[2], "V2025/");
	sprintf(grp_ent_2024.dirtab, "%s%s", argv[2], "V2024/");

	/*construction des fichiers d'autorisations d'UM reconnues par les FG*/
	strcpy(grp_ent_2024.ficum, argv[5]);
	lgchaine = strlen(grp_ent_2024.ficum);
	if ((grp_ent_2024.ficum[lgchaine - 1] != '/') && (grp_ent_2024.ficum[lgchaine - 1] != '\\'))
		strcat(grp_ent_2024.ficum, "/");
	strcat(grp_ent_2024.ficum, "ficum.fg2024$.txt");
	if (GenereFichierUM(grp_ent_2024.dirtab, argv[4], grp_ent_2024.ficum, flog, 1, 1))
	{
		/*_fcloseall();*/
		return 1;
	}

	strcpy(grp_ent_2025.ficum, argv[5]);
	lgchaine = strlen(grp_ent_2025.ficum);
	if ((grp_ent_2025.ficum[lgchaine - 1] != '/') && (grp_ent_2025.ficum[lgchaine - 1] != '\\'))
		strcat(grp_ent_2025.ficum, "/");
	strcat(grp_ent_2025.ficum, "ficum.fg2025$.txt");
	if (GenereFichierUM(grp_ent_2025.dirtab, argv[4], grp_ent_2025.ficum, flog, 1, 1))
	{
		/*_fcloseall();*/
		return 1;
	}


	if ((ent = fopen(argv[1], "rb")) == 0)
    {
        fprintf(flog,"Probleme ouverture %s\n",argv[1]);
        /*_fcloseall();*/
        return(1);
    }

    dm=1;
    pm=0;
    eof=0;
    nbsej=0;
    mfgets_2025(bufav,31000,ent);

    while(!eof) /*pour chaque RUM lu (les rum peuvent faire parti de RSS différents)*/
    {
        strcpy(bufin,bufav);
        nbenr++;
        if (mfgets_2025(bufav,31000,ent)==0)
        {
            eof=1;
            strcpy(bufav,"ZZZZZZZZZZZZZZZZZZZZZZZZZ");
        }
        pm=dm;
        dm=0;
        
		if (
            ((Test_Ver(bufin, "022") != 0) && (Test_Ver(bufin, "021") != 0))
            || (strlen(bufin) < 130)
           )
        {
            for(i=0;i<nbsej-1;i++)
            {
                if(rum[i]!=NULL)
                {
                    free(rum[i]);
                    rum[i]=NULL;
                }
            }
            fprintf(ferr,"N° d'enregistrement : %ld -  N° de RSS : %20.20s -> Version %3.3s  - Longueur : %d\n",nbenr,bufin+12,bufin+9,strlen(bufin));
            nbsej=0;
            nbr_mf++;
            continue;
        }
        /*Comparaison des identifiants de RSS, de manière à savoir si l'on est dans un autre RSS
        dm signale par conséquant le fait de finir le RSS  précédent */
        if(strncmp(bufin+12,bufav+12,20)!=0)
            dm=1;
        if (pm==1) /**/
        {
            nbsej=0;
        }
        /*On alloue le rum*/
        rum[nbsej]=(char *)malloc(strlen(bufin)+1);

        /*Si il n'y a pas de pbs d'allocation, on le stock*/
        if (rum[nbsej]==NULL)
        {
            fprintf(ferr,"N° de RSS : %20.20s -> Erreur FGM001 : Pb d'allocation mémoire \n",bufin+12);
            for(i=0;i<nbsej-1;i++)
            {
                free(rum[i]);
                rum[i]=NULL;
            }
            /*_fcloseall();*/
            return(1);
        }
        strcpy(rum[nbsej],bufin);

        /*On passe au séjour suivant*/
        nbsej++;

        if (dm==1) /*Avant de passer au RSS suivant, on effectue le groupage du RSS en cours*/
        {

            if((contfmt_2025(rum[nbsej-1]+87,"Z9Z99999",1,7)!=0) ||
                (contdate_2025(rum[nbsej-1]+87)!=0) || (!date_strict_sup_2025("01032025",rum[nbsej-1]+87)))
            {
                /*après 1er mars 2025 : groupage V2025*/
                for(i=0;i<nbsej;i++)
                {
                    if(Test_Ver(rum[i],"022")!=0)
                        nbr_mf++;
                    grp_ent_2025.rum2[i]=rum[i];
                }
                grp_ent_2025.ns=nbsej;
                fgutilisee=V2025;
                ret=grp_2025(grp_ent_2025,&grp_res_2025,&ghs_val_2025,&rss_inf_2025);
            }
            else
            {
                /*avant 1er mars 2025 : groupage V2024*/
                for(i=0;i<nbsej;i++)
                {
                    if(Test_Ver(rum[i], "022") != 0)
                        nbr_mf++;
                    grp_ent_2024.rum2[i]=rum[i];
                }
                grp_ent_2024.ns=nbsej;
                fgutilisee=V2024;
                ret=grp_2024(grp_ent_2024,(GRP_RESULTAT_2024*)(&grp_res_2025),&ghs_val_2024,&rss_inf_2024);
            }

            if(strncmp(grp_res_2025.cmd,"90",2)==0)
                nbrss_err++;
            else
                nbrss++;

            if(fgutilisee==V2025)
            /*V2025*/
            {
                genereRDS_V2025(frds, rum);
                /*génération du fichier .stp.txt*/
                fprintf(fstp,"%20.20s%5.5s%20.20s%8.8s\n",rum[0]+12,rss_inf_2025.sigfg,rss_inf_2025.sigrss,rss_inf_2025.sigrssghsfg);
            }
            else
            /*V2024*/
            {
                genereRDS_V2024(frds,rum);
                /*génération du fichier .stp.txt*/
                fprintf(fstp,"%20.20s%5.5s%20.20s%8.8s\n",rum[0]+12,rss_inf_2024.sigfg,rss_inf_2024.sigrss,rss_inf_2024.sigrssghsfg);
            }

            for(i=0;i<nbsej;i++)
            {
                if (strncmp(grp_res_2025.cmd,"90",2)==0 )
                {
                    nbrum_err++;
                    fprintf(ferr,"%20.20s,%4.4s,%2.2s,%4.4s,%3.3s,",rum[i]+12,rum[i]+71,grp_res_2025.cmd,grp_res_2025.ghm,grp_res_2025.cret);
                    deb=0;
                    if (i>0)
                        for(j=1;j<i+1;j++)
                            deb += grp_res_2025.ErrCtrl[j];
                    for(j=0;j<grp_res_2025.ErrCtrl[i+1];j++)
                    {
                        fprintf(ferr,"%d,",grp_res_2025.ErrCtrl[nbsej+deb+j+1]);
                    }
                    fprintf(ferr,"\n");
                    
					fprintf(sor, "%2.2s%2.2s%4.4s%2.2s%2.2s%3.3s%s\n", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, " 1", rum[i] + 10, grp_res_2025.cret, rum[i]);
                }
                else
                {
                    nbrum++;
					fprintf(sor, "%2.2s%2.2s%4.4s%2.2s%2.2s%3.3s%s\n", grp_res_2025.version, grp_res_2025.cmd, grp_res_2025.ghm, " 1", rum[i] + 10, grp_res_2025.cret, rum[i]);

                    if(fsup!=NULL)
                    {
                        csj=' ';
                        if (grp_res_2025.sejp==i)  csj='X';
                        fprintf(fsup,"%20.20s,%4.4s,%2.2s,%4.4s,%c,%d,",rum[i]+12,rum[i]+71,grp_res_2025.cmd,grp_res_2025.ghm,csj,nbsej);

                        deb=0;
                        if (i>0)
                            for(j=1;j<i+1;j++)
                                deb += grp_res_2025.ErrCtrl[j];

                        fprintf(fsup,"%d,",grp_res_2025.ErrCtrl[i+1]);
                        for(j=0;j<grp_res_2025.ErrCtrl[i+1];j++)
                            fprintf(fsup,"%d,",grp_res_2025.ErrCtrl[nbsej+deb+j+1]);
                        fprintf(fsup,"\n");
                    }
                }
            }
            if(fgutilisee==V2024)
                free_ptr_2024();
            else
                free_ptr_2025();
            for(i=0;i<nbsej;i++)
            {
                free(rum[i]);
                rum[i]=NULL;
            }
        }
    } /* fermeture du while */

    grpclose_2024();
    grpclose_2025();

    fprintf(flog,"Nombre d'enregistrements dans le fichier d'entrée   : %ld \n",nbenr);
    fprintf(flog,"Nombre d'enregistrements ayant un format non traité : %ld \n",nbr_mf);
    fprintf(flog,"Nombre de RUM traités                               : %ld \n",nbrum);
    fprintf(flog,"Nombre de RUM en erreur (CM 90)                     : %ld \n",nbrum_err);
    fprintf(flog,"Nombre de RSS traités                               : %ld \n",nbrss);
    fprintf(flog,"Nombre de RSS en erreur                             : %ld \n",nbrss_err);
    fclose(flog);
    if(fsup!=NULL)
        fclose(fsup);
    fclose(ferr);
    fclose(ent);
    fclose(frds);
    fclose(fstp);

    /*_fcloseall();*/
    return(0);
} /*main*/

