Programme principal



#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include <dos.h>

#include <ctype.h>

#include <fcntl.h>

#include <sys\stat.h>

#include <io.h>

#include <math.h>

#include <strstrea.h>

#include <iomanip.h>

#include "saisie.h"

#include "type_def.h"

#include "code.h"

#include "fct_base.h"

#include "auto_op.h"









void Affiche_compte (char *nom_fich, int debut, int fin, int ligne_1)

// 11090

// d -> debut

// f -> fin

// vb -> ligne_1

{

int i;

char chaine[LONG_VISU+1];

Fiche fiche;



  for (i = debut; i <= fin; i++) {

    Lecture_ligne (nom_fich, i, fiche);

    formatte_fiche (fiche, chaine, i);

    gotoxy (1, i - debut + ligne_1);

    printf ("%s",chaine);

    clreol ();

  }

}





int Mode_paiement (pctxt contexte, Mode_Paiement &mode_paiement, int again,

              int saisie_cheque = 1)

// 10980

// c retourné

// pm$(c) dans le libelle

// ca -> again

// saisie_cheque : 1 pour demander la saisie du numéro de chèque

{

int ky;

char pm[6][9] = { "CHEQUE  ", "CB.     ", "PREL.   ", "VIR.    ", "TIP     ", "AUTRE   " };

static int c=0;

int i;

char tampon[9];



  if (!again) {

    gotoxy (1,17);

    printf ("Type de paiement");

    do {

      c += 6;

      c %= 6;

      for (i=0; i < 6; i++) {

        gotoxy (10*i+1,18);

        if (i == c) textattr (INVERSE);

        cprintf ("%s", pm[i]);

        textattr (NORMAL);

      }

      ky = getch ();

      if ( ky == 0) {

        ky = 1000 + getch ();

      }

      switch (ky) {

        case FL_DR :

          c++;

          break;

        case FL_GA :

          c--;

          break;

        case ESCAPE :

          return -1;

        case RETURN :

          break;

        default :

          break;

      }

    }

    while (ky != RETURN);

  }

  if ((c == 0) && (saisie_cheque == 1) && (again <= 1)) {

  char defaut[9];

    gotoxy (1,18);

    clreol ();

    gotoxy (1,17);

    clreol ();

    printf ("N° de chèque ");

    if (contexte->num_chq != 0) {

      sprintf (defaut,"%08li",contexte->num_chq +1);

      Saisie_clavier (NON_VIDE, 8, tampon, defaut);

    }

    else {

      Saisie_clavier (NON_VIDE, 8, tampon);

    }

    if (tampon[0] == ESCAPE) {

      return -1;

    }

    mode_paiement.numero_chq = atol (tampon);

  }

  else {

    mode_paiement.numero_chq = 0;

  }

  mode_paiement.type = TYPE_CHEQUE + c;

  gotoxy (1,17);

  clreol ();

  gotoxy (1,18);

  clreol ();

  return c;

}



int Recherche_ligne (pctxt contexte, Fiche &fiche, int marquee_ok = 0)

// retourne -1 si escape

//        le numéro de l'enregistrement sinon

// 11440

// xe -> marquée_ok

// a$(1) -> chaine

{

char pm[5][20] = {"N. D'ENREGISTREMENT", "DATE               ",

            "TYPE DE PAIEMENT   ", "CREDIT/DEBIT       ",

            "CODE COMPTA.       "};

static int c=0;

int i, l;

int ky;

int encore;

Fiche fiche_ex;

char chaine_aff[LONG_VISU+1];

char chaine_cherchee[30];

char tampon[30];

char reponse[2];

int debut, longueur;

TMontant val;

TDate date;



  if (!contexte->again) {

    gotoxy (1, 16);

    printf ("Choisissez le moyen d'identification");

    do {

      c +=5;

      c %= 5;

      for (i = 0; i < 5; i++) {

        gotoxy (20 * (i - 3 * (i > 2))+1, 17 + i / 3);

        if (i == c) {

          textattr (INVERSE);

        }

        cprintf ("%s", pm[i]);

        textattr (NORMAL);

      }

      ky = getch ();

      if (ky == 0) {

        ky = 1000 + getch ();

      }

      switch (ky) {

        case FL_DR :

          c++;

          break;

        case FL_GA :

          c--;

          break;

        case FL_HA :

        case FL_BA :

        case ESPACE :

          if (c < 2)

            c += 3;

          else

            if (c > 2)

              c += 2;

          break;

        case ESCAPE :

          eff_esp_trav ();

          return -1;

        case RETURN :

          break;

        default :

          break;

      }

    }

    while (ky != RETURN);

  } // fin du if

  gotoxy (1, 17);

  clreol ();

  gotoxy (1, 18);

  clreol ();

  switch (c) {

    case 2 : // Type de paiement

      debut = (int) ((int) &(fiche_ex.mode_paiement) - (int) &(fiche_ex));

      longueur = sizeof(fiche_ex.mode_paiement);

      l = Mode_paiement (contexte, fiche_ex.mode_paiement, contexte->again, 1);

      if (l == -1) {

        eff_esp_trav();

        return -1;

      }

      break;

    case 1 : // Date

      debut = (int) ((int) &(fiche_ex.Date_Op) - (int) &(fiche_ex));

      longueur = sizeof (fiche_ex.Date_Op);

      eff_esp_trav ();

      l = Saisie_date (contexte, fiche_ex.Date_Op);

      if (l != 0) {

        eff_esp_trav();

        return -1;

      }

      break;

    case 0 : // Numero d'enregistrement

      eff_esp_trav ();

      do {

      char defaut[5];

        gotoxy (1,16);

        printf ("%s ", pm[0]);

        sprintf (defaut, "%-4i", contexte->suivant -1);  // par defaut le dernier

        Saisie_clavier (NON_VIDE, 4, chaine_cherchee, defaut);

        if (chaine_cherchee[0] == ESCAPE) {

          eff_esp_trav();

          return -1;

        }

        l = atoi (chaine_cherchee);

      }

      while ((l < 1) || (l >= contexte->suivant));

      Lecture_ligne (contexte->nom_fichier, l, fiche);

      return l;

    case 3 : // Credit Debit

      eff_esp_trav ();

      gotoxy (1,16);

      printf ("(C)rédit ou (D)ébit ?");

      do {

        encore = 0;

        debut = (int) ((int) &(fiche_ex.montant) - (int) &(fiche_ex));

        longueur = sizeof(fiche_ex.montant);

        switch (getch ()) {

          case ESCAPE :

            eff_esp_trav();

            return -1;

          case 'C' :

          case 'c' :

            do {

              eff_esp_trav ();

              gotoxy (1,16);

              printf ("Crédit ");

              Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, tampon);

              if (tampon[0] == ESCAPE) {

                eff_esp_trav();

                return -1;

              }

              fiche_ex.montant = TMontant (tampon, LONG_MAX_MONTANT);

              fiche_ex.montant = abs(fiche_ex.montant);

            }

            while (!(fiche_ex.montant.IsValid()));

            break;

          case 'D' :

          case 'd' :

            do {

              eff_esp_trav ();

              gotoxy (1,16);

              printf ("Débit ");

              Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, tampon);

              if (tampon[0] == ESCAPE) {

                eff_esp_trav();

                return -1;

              }

              fiche_ex.montant = TMontant (tampon, LONG_MAX_MONTANT);

              fiche_ex.montant = -abs(fiche_ex.montant);

            }

            while (!(val.IsValid()));

            break;

          default :

            encore = 1;

        }

      }

      while (encore);

      break;

    case 4 : // Code compta

      debut = (int) ((int) &(fiche_ex.code) - (int) &(fiche_ex));

      longueur = sizeof(fiche_ex.code);

      eff_esp_trav();

      gotoxy (1,16);

      printf ("Code compta. ");

      l = Saisie_clavier (NON_VIDE, longueur-1, fiche_ex.code);

      if (chaine_cherchee[0] == ESCAPE) {

        eff_esp_trav();

        return -1;

      }

      strupr (fiche_ex.code);

      for (i=l; i<longueur-1; i++) {

        fiche_ex.code[i] = ' ';

      }

      fiche_ex.code[longueur-1] = 0;

      break;

  }

  // recherche de fiche_ex

  i = contexte->suivant;

  while ( --i >= contexte->rang_max ) {

    eff_esp_trav ();

    Lecture_ligne (contexte->nom_fichier, i, fiche);

    if ( ((memcmp (((char*)&fiche)+debut, ((char*)&fiche_ex)+debut, longueur)) == 0)

      && ((fiche.Date_Marquage.Year() == ANNEE_NON_MARQ)

        || (marquee_ok == 0)) ) {

      gotoxy (1,16);

      formatte_fiche (fiche, chaine_aff, i);

      printf ("%s",chaine_aff);

      do {

        encore = 0;

        gotoxy (1,17);

        printf ("Est-ce la bonne fiche (O/N) ");

        Saisie_clavier (NON_VIDE, 1, reponse, "N");

        switch (reponse[0]) {

          case ESCAPE :

            return -1;

          case 'N' :

          case 'n' :

            break;

          case 'O' :

          case 'o' :

            return i;

          default :

            encore = 1;

        }

      }

      while (encore);

    }

  } // fin du while

  printf ("Donnée non trouvée");

  return -1;

}





int creation_fichier (char *nom)

// cree le fichier de nom

// retourne -1 si annulation

// sinon 0

{

char solde[LONG_MAX_MONTANT+1], solde2[LONG_MAX_MONTANT+1];

int i;

TDate date;

ctxt Contexte;



  eff_esp_trav ();

  gotoxy (1,16);

  printf ("Numéro de compte (%i caract. max.)", LONG_NUM_COMPTE);

  Saisie_clavier (NON_VIDE, LONG_NUM_COMPTE, Contexte.numero_compte);

  if ( Contexte.numero_compte [0] == ESCAPE ) {

    eff_esp_trav ();

    return -1;

  }

  i = Saisie_date (NULL, Contexte.date_creation);

  if (i != 0 ) {

    eff_esp_trav ();

    return -1;

  }

  gotoxy (1, 20);

  cout << "Solde banque du compte au " << Contexte.date_creation;

  Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, solde);

  if (solde[0] == ESCAPE ) {

    eff_esp_trav ();

    return -1;

  }

  Contexte.solde_banque = TMontant (solde, LONG_MAX_MONTANT);

  Contexte.solde_banque_init = TMontant (solde, LONG_MAX_MONTANT);

  gotoxy (1, 21);

  cout << "Solde réel du compte au " << Contexte.date_creation;

  Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, solde2, solde);

  if (solde2[0] == ESCAPE) {

    eff_esp_trav ();

    return -1;

  }

  Contexte.solde_reel = TMontant (solde2, LONG_MAX_MONTANT);

  Contexte.solde_reel_init = TMontant (solde2, LONG_MAX_MONTANT);

  // Valeurs de debut constantes

  Contexte.suivant = 1;

  Contexte.rang_max = 0;

  Contexte.date_sys = Contexte.date_creation;

  Contexte.num_chq = 0;

  // enregistrement

  close ( creat (nom, S_IREAD | S_IWRITE)); // cree le fichier

  Ecriture_ligne (nom, 0, Contexte);

  return 0;                 // tout est OK

}





void nouveau_fichier ()

{

char nom[LONG_NOM_FICHIER];

char Ext[5];

int i;

FILE *fichier;



  eff_esp_trav ();

  gotoxy (1, 16);

  printf ("Nom du fichier ");

  Saisie_clavier (NON_VIDE, LONG_NOM_FICHIER - 1 - strlen(DIR_COMPTE), nom);

  if ( nom [0] == ESCAPE ) {

    eff_esp_trav ();

    return;

  }

  // Recherche l'extension

  Ext[0] = 0;

  for (i=strlen (nom); i>0; i--) {

    if (nom[i] == '.') {

      strncpy (Ext, nom+i, 4);

      Ext[4] = 0;

      break;

    }

    else if (nom[i] == '\\') {

      break;

    }

  }

  if (Ext[0] == 0) {

    // Ajoute l'extension

    strcat (nom, EXT_COMPTE);

  }

  if (strchr(nom,'\\') == NULL) {

    // pas de path, on rajoute en defaut

    Ajoute_Path (nom);

  }

  if ((fichier = fopen ( (char *) nom, "r")) == NULL ) {

    //  Nouveau compte

    if (creation_fichier (nom) == -1) {

      // si pas création

      return;

    }

  }

  else {

    fclose (fichier);

  }

  fichier = fopen (NOM_FICHIER , "wt");

  if (fichier != NULL) {

    fprintf (fichier, "%s\n", nom);

    fclose (fichier);

  }

  eff_esp_trav ();

  gotoxy (1,16);

  printf ("INITIALISATION EFFECTUE");

}





int quitter (pctxt contexte)

{

char ky;



  eff_esp_trav ();

  gotoxy (1, 17);

  printf ("Voulez-vous vraiment quitter (O/N) ?");

  do {

    ky = getch ();

    if (ky == 0) {

      getch ();

    }

    ky = toupper (ky);

    if ( (ky == 'N') || (ky == ESCAPE)) {

      eff_esp_trav ();

      return 0;

    }

  }

  while ( ky != 'O');

  eff_esp_trav ();

  gotoxy (1,17);

  printf ("Voulez-vous imprimer l'état (O/N) ?");

  do {

    ky = getch ();

    if (ky == 0) {

      getch ();

    }

    if (ky == ESCAPE) {

      eff_esp_trav ();

      return 0;

    }

    ky = toupper (ky);

  }

  while (( ky != 'O') && ( ky != 'N'));

  if ( ky == 'O') {

  char reel[LONG_MAX_MONTANT+1],banque[LONG_MAX_MONTANT+1];



    fprintf (stdprn, "Etat au %0.2i/%0.2i/%0.2i\n",

            contexte->date_sys.Day(),

            contexte->date_sys.Month(),

            contexte->date_sys.Year());

    ostrstream (banque, LONG_MAX_MONTANT+1) << setw(LONG_MAX_MONTANT)

                              << contexte->solde_banque;

    ostrstream (reel, LONG_MAX_MONTANT+1) << setw(LONG_MAX_MONTANT)

                              << contexte->solde_reel;

    fprintf (stdprn, "FICHIER: %s\n SOLDE BANQUE: %s SOLDE REEL: %s\n",

          contexte->nom_fichier,

          banque, reel);

  }

  return 1;

}







void part1 ()

{

int c = 0;

int ky;

char pm[2][34] = { "ACCES AU COMPTE                  ",

           "INITIALISATION DU FICHIER DONNEES"};





  eff_esp_menu ();

  eff_esp_fich ();

  gotoxy (10,25);

  textattr (INVERSE);

  cprintf (" MENU PRINCIPAL ");

  textattr (NORMAL);

  clreol ();

  gotoxy (1,22);

  printf ("%s\n%s", pm[0], pm[1]);

  do {

    do {

      gotoxy (1,22+c);

      textattr (INVERSE);

      cprintf ("%s", pm[c]);

      textattr (NORMAL);

      ky = getch ();

      if (ky == 0) {

        ky = 1000 + getch ();

      }

      switch (ky) {

        case FL_GA :

        case FL_DR :

        case ' ' :

        case FL_HA :

        case FL_BA :

          gotoxy(1,22+c);

          printf ("%s",pm[c]);

          c++;

          c %= 2;

          break;

        default :

          break;

      }

    }

    while (ky != RETURN);

    eff_esp_trav ();

    if ( c == 1 ) {

      nouveau_fichier ();

    }

  }

  while ( c == 1);

  eff_esp_trav ();

  eff_esp_menu ();

  gotoxy (1, 25);

  clreol ();

  gotoxy (1,16);

  printf ("Accès au compte en cours...");

}





void marquage (pctxt contexte)

{

int c, cr;

Fiche fiche;

TDate date;

char ligne[LONG_VISU+1];



  eff_esp_trav ();

  c = Recherche_ligne (contexte, fiche, 1);

  if (c == -1) {

    return;

  }

  eff_esp_trav ();

  if (fiche.Date_Marquage.Year() != ANNEE_NON_MARQ) {

    gotoxy (1, 17);

    printf ("Le marquage a déjà été opéré sur cette donnée");

    return;

  }

  gotoxy (1,20);

  textattr (INVERSE);

  formatte_fiche (fiche, ligne, c);

  cprintf ("%s",ligne);

  textattr (NORMAL);

  gotoxy (1,16);

  printf ("Entrez la date du marquage");

  cr = Saisie_date (contexte, fiche.Date_Marquage);

  if (cr != 0) {

    eff_esp_trav ();

    return;

  }

  contexte->solde_banque += fiche.montant;

  eff_esp_trav ();

  Ecriture_ligne (contexte->nom_fichier, c, fiche);

  gotoxy (1,16);

  printf ("Marquage effectué");

  return;

}



void debit (pctxt contexte)

{

Fiche fiche;

char tampon[LONG_MAX_MONTANT+1];

int c,i;

long val=0;

TMontant montant;

int pasbon;



  eff_esp_trav ();

  i = Saisie_date (contexte, fiche.Date_Op);

  eff_esp_trav ();

  if (i != 0) {

    return;

  }

  gotoxy (1,16);

  cout << "DATE : " << fiche.Date_Op;

  c = Mode_paiement (contexte, fiche.mode_paiement, contexte->again, (contexte->again != 2));

  if (c == -1) {

    eff_esp_trav ();

    return;

  }

  gotoxy (1,17);

  clreol ();

  if (c == 0) {

    if (contexte->again == 2) {

      val = contexte->num_chq + 1;

      fiche.mode_paiement.numero_chq = val;

    }

    else {

      val = fiche.mode_paiement.numero_chq;

    }

    printf ("Cheque : ");

  }

  printf ("%s", mode2str(fiche.mode_paiement));

  gotoxy (1,18);

  printf ("Objet (%i Caracts. max.)", LONG_LIB-1);

  c = Saisie_clavier (VIDE_OK, LONG_LIB-1, fiche.libelle);

  if (fiche.libelle[0] == ESCAPE) {

    eff_esp_trav ();

    return;

  }

  if (stricmp (fiche.libelle, "annule") == 0) {

    strupr (fiche.libelle);

    fiche.montant = 0.0;

    strcpy (fiche.code, "ANNULE   ");

    fiche.Date_Marquage = fiche.Date_Op;

  }

  else {

    gotoxy (1,19);

    printf ("Débit ");

    Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, tampon);

    if (tampon[0] == ESCAPE ) {

      eff_esp_trav ();

      return;

    }

    fiche.montant = TMontant (tampon, LONG_MAX_MONTANT);

    if (fiche.montant > 0) {

      fiche.montant *= -1;

    }

    do {

      pasbon =0;

      gotoxy (1,20);

      printf ("Code compta. (%i Caracts. max.)", LONG_CODE-1);

      c = Saisie_clavier (NON_VIDE, LONG_CODE-1, fiche.code);

      if (fiche.code[0] == ESCAPE) {

        eff_esp_trav ();

        return;

      }

      for (i=c; i<LONG_CODE-1; i++) {

        fiche.code[i] = ' ';

      }

      fiche.code[LONG_CODE-1]=0;

      if (Code_bon (contexte->nom_fich_code, contexte->nb_code, fiche.code) == -1) {

        gotoxy (1,21);

        printf ("Code compta incorrect");

        pasbon = 1;

      }

    }

    while (pasbon==1);

  }

  fiche.Date_Marquage = TDate (1, 1, ANNEE_NON_MARQ);

  Ecriture_ligne (contexte->nom_fichier, contexte->suivant++, fiche);

  tri_fichier (contexte, contexte->suivant-1);

  eff_esp_trav ();

  contexte->solde_reel += fiche.montant;

  if ( val !=0 ) {

    contexte->num_chq = val;

  }

}



void credit (pctxt contexte)

{

Fiche fiche;

int c,i;

int pasbon;

char tampon[LONG_MAX_MONTANT+1];



  eff_esp_trav ();

  i = Saisie_date (contexte, fiche.Date_Op);

  eff_esp_trav ();

  if (i != 0) {

    return;

  }

  gotoxy (1,16);

  cout << "DATE : " << fiche.Date_Op;

  c = Mode_paiement (contexte, fiche.mode_paiement, contexte->again, 0);

  if (c == -1) {

    eff_esp_trav ();

    return;

  }

  fiche.mode_paiement.numero_chq = 0;

  gotoxy (1,17);

  printf ("%s", mode2str (fiche.mode_paiement));

  gotoxy (1,18);

  printf ("Objet (%i Caracts. max.)", LONG_LIB-1);

  c = Saisie_clavier (VIDE_OK, LONG_LIB-1, fiche.libelle);

  if (fiche.libelle[0] == ESCAPE) {

    eff_esp_trav ();

    return;

  }

  gotoxy (1,19);

  printf ("Crédit ");

  Saisie_clavier (NON_VIDE, LONG_MAX_MONTANT, tampon);

  if (tampon[0] == ESCAPE ) {

    eff_esp_trav ();

    return;

  }

  fiche.montant = TMontant (tampon, LONG_MAX_MONTANT);

  if (fiche.montant < 0) {

    fiche.montant *= -1;

  }

  do {

    pasbon =0;

    gotoxy (1,20);

    printf ("Code compta. (%i Caracts. max.)", LONG_CODE-1);

    c = Saisie_clavier (NON_VIDE, LONG_CODE-1, fiche.code);

    if (fiche.code[0] == ESCAPE) {

      eff_esp_trav ();

      return;

    }

    for (i=c; i<LONG_CODE-1; i++) {

      fiche.code[i] = ' ';

    }

    fiche.code[LONG_CODE-1]=0;

    if (Code_bon (contexte->nom_fich_code, contexte->nb_code, fiche.code) == -1) {

      gotoxy (1,21);

      printf ("Code compta incorrect");

      pasbon = 1;

    }

  }

  while (pasbon==1);

  fiche.Date_Marquage = TDate (1, 1, ANNEE_NON_MARQ);

  Ecriture_ligne (contexte->nom_fichier, contexte->suivant++, fiche);

  tri_fichier (contexte, contexte->suivant-1);

  eff_esp_trav ();

  contexte->solde_reel += fiche.montant;

}





void modification_ligne (pctxt contexte)

{

Fiche fiche;

char ligne[LONG_VISU+1];

char tampon[LONG_VISU+1], tampon2[LONG_VISU+1];

int c,i;

int num_enr;

char pm[8][17] = {"DATE            ", "TYPE DE PAIEMENT", "OBJET           ",

            "CREDIT          ", "DEBIT           ", "CODE COMPTA.    ",

            "MARQUAGE        ", "RETOUR MENU     "};

int ky;

int encore_une_fois;

TMontant modif_solde_banque;

TMontant modif_solde_reel;



  eff_esp_trav ();

  num_enr = Recherche_ligne (contexte, fiche);

  if ( num_enr == -1) {

    return;

  }

  contexte->again = 0;

  c = 0;

  do {

    encore_une_fois = 1;

    eff_esp_trav ();

    do {

      c += 8;

      c %= 8;

      gotoxy (1,20);

      textattr (INVERSE);

      formatte_fiche (fiche, ligne, num_enr);

      cprintf ("%s",ligne);

      textattr (NORMAL);

      clreol ();

      gotoxy (1,16);

      printf ("Que voulez-vous modifier ?");

      for (i=0; i<8; i++) {

        gotoxy (20*(i%4)+1, 17 + i/4);

        if (i==c) {

          textattr (INVERSE);

        }

        cprintf ("%s", pm[i]);

        textattr (NORMAL);

      }

      gotoxy (27,25);

      printf ("DATE SYSTEME : %0.2i/%0.2i/%0.4i",

            contexte->date_sys.DayOfMonth(),

            contexte->date_sys.Month(),

            contexte->date_sys.Year());

      ky = getch ();



      if (ky == 0) {

        ky = 1000+getch();

      }

      switch (ky) {

        case FL_DR :

          c++;

          break;

        case FL_GA :

          c--;

          break;

        case ESPACE :

        case FL_BA :

        case FL_HA :

          c += 4;

          break;

        case ESCAPE :

          return;

        case RETURN :

          encore_une_fois = 0;

          break;

      } // fin switch

    }

    while (encore_une_fois); // fin selection menu

    switch (c) {

      case 0 : // date op

        eff_esp_trav ();

        gotoxy (1,20);

        textattr(INVERSE);

        cprintf ("%s",ligne);

        textattr(NORMAL);

        gotoxy(1,16);

        printf ("Modification de ");

        textattr (INVERSE);

        cout << fiche.Date_Op;

        textattr (NORMAL);

        // La date n'est pas modifiee si escape

        Saisie_date (contexte, fiche.Date_Op);

        break;

      case 1 :  // mode de paiement

        eff_esp_trav ();

        gotoxy (1,20);

        textattr(INVERSE);

        cprintf ("%s", ligne);

        textattr(NORMAL);

        gotoxy (1,16);

        printf ("Modification de ");

        textattr(INVERSE);

        cprintf ("%.8s", mode2str (fiche.mode_paiement));

        textattr (NORMAL);

        Mode_paiement (contexte, fiche.mode_paiement, contexte->again,

                  (fiche.montant <= 0));

        break;

      case 2 : { // objet

        char defaut[LONG_LIB];

          eff_esp_trav ();

          gotoxy (1,20);

          textattr(INVERSE);

          cprintf ("%s", ligne);

          textattr(NORMAL);

          gotoxy (1,16);

          printf ("Modification de ");

          textattr(INVERSE);

          cprintf ("%.*s", LONG_LIB-1, fiche.libelle);

          textattr (NORMAL);

          gotoxy (1,18);

          printf ("%s ", pm[2]);

          sprintf (defaut, "%.*s", LONG_LIB-1, fiche.libelle);

          Saisie_clavier (VIDE_OK, LONG_LIB-1, tampon, defaut);

          if ((tampon[0] != 27) && (tampon[0] != 0)) {

            strcpy (fiche.libelle, tampon);

          }

          break;

        } // case objet

      case 3 : { // credit

        char defaut[LONG_MAX_MONTANT+1];

          eff_esp_trav ();

          gotoxy (1,20);

          textattr(INVERSE);

          cprintf ("%s", ligne);

          textattr(NORMAL);

          gotoxy (1,16);

          printf ("Modification de ");

          textattr(INVERSE);

          cout << setw (LONG_MAX_MONTANT) << fiche.montant << ends;

          textattr (NORMAL);

          gotoxy (1,18);

          printf ("%s ", pm[c]);

          ostrstream def (defaut, LONG_MAX_MONTANT+1);

          def << setw (LONG_MAX_MONTANT) << fiche.montant << ends;

          Saisie_clavier (VIDE_OK, LONG_MAX_MONTANT, tampon, defaut);

          if ((tampon[0] != 27) && (tampon[0] != 0)) {

          TMontant montant(tampon, LONG_MAX_MONTANT);

            if (montant < 0) {

              montant = abs(montant);

            }

            modif_solde_reel -= fiche.montant - montant;

            if (fiche.Date_Marquage.Year() != ANNEE_NON_MARQ) {

              modif_solde_banque -= fiche.montant - montant;

            }

            fiche.montant = montant;

          }

          break;

        }

      case 4 : { // debit

        char defaut[LONG_MAX_MONTANT+1];

          eff_esp_trav ();

          gotoxy (1,20);

          textattr(INVERSE);

          cprintf ("%s", ligne);

          textattr(NORMAL);

          gotoxy (1,16);

          printf ("Modification de ");

          textattr(INVERSE);

          cout << setw (LONG_MAX_MONTANT) << fiche.montant << ends;

          textattr (NORMAL);

          gotoxy (1,18);

          printf ("%s ", pm[c]);

          ostrstream def (defaut, LONG_MAX_MONTANT+1);

          def << setw (LONG_MAX_MONTANT) << fiche.montant << ends;

          Saisie_clavier (VIDE_OK, LONG_MAX_MONTANT, tampon, defaut);

          if ((tampon[0] != 27) && (tampon[0] != 0)) {

          TMontant montant(tampon, LONG_MAX_MONTANT);

            if (montant > 0) {

              montant = -abs(montant);

            }

            modif_solde_reel -= fiche.montant - montant;

            if (fiche.Date_Marquage.Year() != ANNEE_NON_MARQ) {

              modif_solde_banque -= fiche.montant - montant;

            }

            fiche.montant = montant;

          }

          break;

        }

      case 5 : { // code compta

        char defaut[10];

          eff_esp_trav ();

          gotoxy (1,20);

          textattr(INVERSE);

          cprintf ("%s", ligne);

          textattr(NORMAL);

          gotoxy (1,16);

          printf ("Modification de ");

          textattr(INVERSE);

          cprintf ("%.*s", LONG_CODE-1, fiche.code);

          textattr (NORMAL);

          sprintf (defaut, "%.*s", LONG_CODE-1, fiche.code);

          do {

            gotoxy (1,18);

            printf ("%s ", pm[5]);

            Saisie_clavier (NON_VIDE, LONG_CODE-1, tampon, defaut);

            if (tampon[0] == 27) {

              break;

            }

            sprintf (tampon2, "%-*s", LONG_CODE-1, tampon);

            strupr (tampon2);

            i = Code_bon (contexte->nom_fich_code, contexte->nb_code, tampon2);

            if (i == -1) {

              gotoxy (1,19);

              printf ("Code compta Incorrect !");

            }

            else {

              strcpy (fiche.code, tampon2);

            }

          }

          while (i==-1);

          break;

        }

      case 6 : // date marquage

        if (fiche.Date_Marquage.Year() == ANNEE_NON_MARQ) {

          break;

        }

        eff_esp_trav ();

        gotoxy (1,20);

        textattr(INVERSE);

        cprintf ("%s", ligne);

        textattr(NORMAL);

        gotoxy (1,16);

        printf ("Modification de ");

        textattr(INVERSE);

        cout << fiche.Date_Marquage;

        textattr (NORMAL);

        printf (" (Alt-Entree pour annuler le marquage)");

        i = Saisie_date (contexte, fiche.Date_Marquage, 1);

        if (i == RET_VIDE) {

          fiche.Date_Marquage = TDate (1, 1, ANNEE_NON_MARQ);

          modif_solde_banque -= fiche.montant;

          break;

        }

        break;

      case 7 :

        Ecriture_ligne (contexte->nom_fichier, num_enr, fiche);

        tri_fichier (contexte, num_enr);

        contexte->solde_banque += modif_solde_banque;

        contexte->solde_reel += modif_solde_reel;

        return;

    }

    /* Place le curseur sur la retour menu */

    c = 7;

  }

  while (1);

}





void  modification (pctxt contexte)

{

char pm[3][15] ={ "DONNEE GESBANQ", "CODES COMPTA. ", "OP. AUTO.     "};

int i;

static int c=0;

int ky;

int encore_une_fois=1;



  eff_esp_trav ();

  gotoxy (1,17);

  printf ("Que voulez-vous modifier ?");

  do {

    c %= 3;

    for (i=0; i<3; i++) {

      gotoxy (i*19 +1, 19);

      if ( i == c ) {

        textattr (INVERSE);

      }

      cprintf ("%s", pm[i]);

      textattr (NORMAL);

    }

    ky = getch ();

    if (ky == 0) {

      ky = 1000 + getch ();

    }

    switch (ky) {

      case FL_DR :

        c++;

        break;

      case FL_GA :

        c--;

        break;

      case ESCAPE :

        eff_esp_trav ();

        return;

      case RETURN :

        encore_une_fois = 0;

        break;

    }

  }

  while (encore_une_fois);

  switch (c) {

    case 0 :

      modification_ligne (contexte);

      break;

    case 1 :

      edite_code (contexte);

      break;

    case 2 :

//      edite_op_auto (contexte);

      break;

  }

  eff_esp_trav ();

}





void recherche (pctxt contexte)

{

int num_enr;

int deb, ligne1;

int ky;

Fiche fiche;



  eff_esp_trav ();

  num_enr = Recherche_ligne (contexte, fiche);

  if (num_enr == -1)

    return;

  eff_esp_trav ();

  do {

    if (num_enr < 12) {

      ligne1 = 14 - num_enr;

      deb = 1;

    }

    else {

      ligne1 = 2;

      deb = num_enr - 11;

    }

    Affiche_compte (contexte->nom_fichier, deb, num_enr, ligne1);

    ky = getch ();

    if (ky == 0) {

      ky = 1000 + getch ();

    }

    switch (ky) {

      case SCR_HA :

        num_enr -= 12;

        if (num_enr <= 1) {

          num_enr = 1;

        }

        break;

      case SCR_BA :

      case ' ' :

        num_enr += 12;

        if (num_enr >= contexte->suivant) {

          num_enr = contexte->suivant-1;

        }

        break;

      case FL_BA :

        if (num_enr != contexte->suivant -1) {

          num_enr++;

        }

        break;

      case FL_HA :

        if (num_enr > 1) {

          num_enr--;

        }

        break;

      case ESCAPE :

        return;

      case HOME :

        if (contexte->suivant < 13) {

          num_enr = contexte->suivant - 1;

        }

        else {

          num_enr = 12;

        }

        break;

      case FIN :

        num_enr = contexte->suivant -1;

        break;

    }

  }

  while (1);

}



void listing (pctxt contexte)

{

char pm[2][12] = { "IMPRIMANTE ", "ECRAN      " };

static int c=0;

int c2 = 0;

int encore = 0, encore2 = 0;

int i,j;

int ky;

char tampon[2],tampon2[20], tampon3[10];

int inf,sup;

FILE *sortie;

int nligne;

Fiche fiche;

char ligne[LONG_VISU+1];

char pm2[4][13] = { "N. DE CHEQUE", "CB.         ", "CODE COMPTA.", "NON DEBITE  " };

int co;

TMontant cr,de;

int encore_une_fois;





  eff_esp_trav ();

  if (!contexte->again) {

    do {

      c %= 2;

      for (i=0; i<2; i++) {

        gotoxy (1+ 19*i,16);

        if (i==c) {

          textattr (INVERSE);

        }

        cprintf ("%s", pm[i]);

        textattr (NORMAL);

      }

      ky = getch();

      if (ky == 0) {

        ky = 1000 + getch();

      }

      switch (ky) {

        case FL_DR :

        case FL_GA :

          c ++;

          break;

        case ESCAPE :

          eff_esp_trav ();

          return;

        case RETURN :

          encore = 1;

          break;

      }

    }

    while (encore == 0);

  }

  if (c == 0) {

    sortie = stdprn;

  }

  else {

    sortie = stdout;

  }

  gotoxy (1,16);

  clreol ();

  printf ("Edition sur l'%s", pm[c]);

  clreol();

  do {

    encore = 1;

    gotoxy (1,17);

    printf ("Voulez-vous un tri (O/N) ");

    Saisie_clavier (NON_VIDE, 1, tampon, "O");

    strupr (tampon);

    switch (tampon[0]) {

      case 'O' :

        gotoxy (1,17);

        clreol ();

        printf ("Tri sur quoi ?");

        do {

          c2 += 4;

          c2 %= 4;

          for (i=0 ; i<4; i++) {

            gotoxy (20*i +1,18);

            if (i == c2) {

              textattr (INVERSE);

            }

            cprintf ("%s", pm2[i]);

            textattr (NORMAL);

          }

          ky = getch ();

          if (ky == 0) {

            ky = 1000+getch ();

          }

          switch (ky) {

            case FL_DR :

              c2++;

              break;

            case FL_GA :

              c2--;

              break;

            case ESCAPE :

              eff_esp_trav ();

              return;

            case RETURN :

              encore2 = 1;

              break;

          }

        }

        while (encore2 == 0);

        eff_esp_trav();

        switch (c2) {

          case 0 : {

            Mode_Paiement cle;



            // Numero de cheque

            cle.type = TYPE_CHEQUE;

            gotoxy (1,16);

            printf ("%s", pm2[c2]);

            do {

              Saisie_clavier (NON_VIDE, 8, tampon2);

              if (tampon2[0] == ESCAPE) {

                eff_esp_trav ();

                return;

              }

            }

            while ((cle.numero_chq = atol (tampon2)) == 0);

            if (c==0) {

              fprintf (sortie, "\rTRI SUR %s\rLE : %0.2i/%0.2i/%0.2i\r"

                    "\rNo   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                      "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                      ,pm2[c2], contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

            }

            cr = 0;

            de = 0;

            co = 0;

            nligne = 2;

            if (c == 1) {

              eff_esp_fich ();

            }

            for (i=1; i<contexte->suivant; i++) {

              if (kbhit () && (getch () == ESCAPE)) {

                return;

              }

              Lecture_ligne (contexte->nom_fichier, i, fiche);

              if (fiche.mode_paiement.numero_chq == cle.numero_chq) {

                if (c==1) {

                  if (nligne == 14) {

                    getch ();

                    nligne = 2;

                    eff_esp_fich ();

                  }

                  gotoxy (1,nligne);

                }

                formatte_fiche (fiche, ligne, i);

                fprintf (sortie, "%s\r", ligne);

                nligne ++;

                co++;

                if (fiche.montant >= 0) {

                  cr += fiche.montant;

                }

                else {

                  de += fiche.montant;

                }

              }

            }

            if (co == 0) {

              gotoxy (1,17);

              fprintf (sortie, "Aucune donnée trouvée\r");

            }

            if (c == 0) {

            char credit[LONG_MAX_MONTANT+1], debit[LONG_MAX_MONTANT+1];

            ostrstream out_cr(credit, LONG_MAX_MONTANT+1);

            ostrstream out_de(debit, LONG_MAX_MONTANT+1);



              out_cr << setw(LONG_MAX_MONTANT) << cr << ends;

              out_de << setw(LONG_MAX_MONTANT) << de << ends;

              fprintf (sortie, "\rCrédit : %s\rDébit : %s\r", credit, debit);

            }

            eff_esp_trav ();

            getch ();

          }

          break;



          case 1 :

            // CB

            if (c==0) {

              fprintf (sortie, "\rTRI SUR %s\rLE : %0.2i/%0.2i/%0.2i\r"

                    "\rNo   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                      "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                      ,pm2[c2], contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

            }

            cr = 0;

            de = 0;

            nligne = 2;

            if (c == 1) {

              eff_esp_fich ();

            }

            for (i=1; i<contexte->suivant; i++) {

              if (kbhit () && (getch () == ESCAPE)) {

                return;

              }

              Lecture_ligne (contexte->nom_fichier, i, fiche);

              if (fiche.mode_paiement.type == TYPE_CB) {

                if (c==1) {

                  if (nligne == 14) {

                    getch ();

                    nligne = 2;

                    eff_esp_fich ();

                  }

                  gotoxy (1,nligne);

                }

                formatte_fiche (fiche, ligne, i);

                fprintf (sortie, "%s\r", ligne);

                nligne ++;

                co++;

                if (fiche.montant >= 0) {

                  cr += fiche.montant;

                }

                else {

                  de += fiche.montant;

                }

              }

            }

            if (co == 0) {

              gotoxy (1,17);

              fprintf (sortie, "Aucune donnée trouvée\r");

            }

            if (c == 0) {

            char credit[LONG_MAX_MONTANT+1], debit[LONG_MAX_MONTANT+1];

            ostrstream out_cr(credit, LONG_MAX_MONTANT+1);

            ostrstream out_de(debit, LONG_MAX_MONTANT+1);



              out_cr << setw(LONG_MAX_MONTANT) << cr << ends;

              out_de << setw(LONG_MAX_MONTANT) << de << ends;

              fprintf (sortie, "\rCrédit : %s\rDébit : %s\r", credit, debit);

            }

            eff_esp_trav ();

            getch ();

            break;

          case 3 : // non debité

            if (c==0) {

              fprintf (sortie, "\rTRI SUR %s\rLE : %0.2i/%0.2i/%0.2i\r"

                    "\rNo   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                      "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                      ,pm2[c2], contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

            }

            cr = 0;

            de = 0;

            nligne = 2;

            if (c == 1) {

              eff_esp_fich ();

            }

            for (i=1; i<contexte->suivant; i++) {

              if (kbhit () && (getch () == ESCAPE)) {

                return;

              }

              Lecture_ligne (contexte->nom_fichier, i, fiche);

              if (fiche.Date_Marquage.Year() == ANNEE_NON_MARQ) {

                if (c==1) {

                  if (nligne == 14) {

                    getch ();

                    nligne = 2;

                    eff_esp_fich ();

                  }

                  gotoxy (1,nligne);

                }

                formatte_fiche (fiche, ligne, i);

                fprintf (sortie, "%s\r", ligne);

                nligne ++;

                co++;

                if (fiche.montant >= 0) {

                  cr += fiche.montant;

                }

                else {

                  de += fiche.montant;

                }

              }

            }

            if (co == 0) {

              gotoxy (1,17);

              fprintf (sortie, "Aucune donnée trouvée\r");

            }

            if (c == 0) {

            char credit[LONG_MAX_MONTANT+1], debit[LONG_MAX_MONTANT+1];

            ostrstream out_cr(credit, LONG_MAX_MONTANT+1);

            ostrstream out_de(debit, LONG_MAX_MONTANT+1);



              out_cr << setw(LONG_MAX_MONTANT) << cr << ends;

              out_de << setw(LONG_MAX_MONTANT) << de << ends;

              fprintf (sortie, "\rCrédit : %s\rDébit : %s\r", credit, debit);

            }

            eff_esp_trav ();

            getch ();

            break;

          case 2 : // code compta

            do {

              gotoxy (1,16);

              printf ("Tous les codes compta (O/N) ? ");

              Saisie_clavier (NON_VIDE, 1, tampon2, "N");

              if (tampon2[0] == ESCAPE) {

                eff_esp_trav ();

                return;

              }

              strupr (tampon2);

            }

            while ((tampon2[0] != 'O') && (tampon2[0] != 'N'));

            switch (tampon2[0]) {

              case 'O' :

                encore = 1;

                if ( c == 0) {

                  fprintf (sortie, "\rLISTING AVEC TRI SUR TOUS LES CODES COMPTA.\rLE : %0.2i/%0.2i/%0.2i\r\r"

                              "No   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                              "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                              ,contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

                }

                cr = 0;

                de = 0;

                for ( i=1; i<=contexte->nb_code; i++) {

                  co = 0;

                  Lecture_code (contexte->nom_fich_code, i, tampon3);

                  if (c == 1) {

                    gotoxy (1,17);

                    fprintf (sortie, "Code compta : %s", tampon3);

                    clreol ();

                    eff_esp_fich ();

                  }

                  nligne = 2;

                  for (j=1; j<contexte->suivant; j++) {

                    if (kbhit () && (getch () == ESCAPE)) {

                      return;

                    }

                    Lecture_ligne (contexte->nom_fichier, j, fiche);

                    if (!strncmp (tampon3, fiche.code, 9)) {

                      if (c==1) {

                        if (nligne == 14) {

                          getch();

                          nligne = 2;

                          eff_esp_fich ();

                        }

                        gotoxy (1,nligne);

                      }

                      formatte_fiche (fiche, ligne, j);

                      fprintf (sortie, "%s\r", ligne);

                      nligne ++;

                      co++;

                      if (fiche.montant >= 0) {

                        cr += fiche.montant;

                      }

                      else {

                        de += fiche.montant;

                      }

                    }

                  }

                  if (c == 1) {

                    if (co == 0) {

                      gotoxy (1,18);

                      printf ("Aucune donnée trouvée\r");

                    }

                    getch();

                    gotoxy (1,18);

                    clreol ();

                  }

                }

                if (c == 0) {

                char credit[LONG_MAX_MONTANT+1], debit[LONG_MAX_MONTANT+1];

                ostrstream out_cr(credit, LONG_MAX_MONTANT+1);

                ostrstream out_de(debit, LONG_MAX_MONTANT+1);



                  out_cr << setw(LONG_MAX_MONTANT) << cr << ends;

                  out_de << setw(LONG_MAX_MONTANT) << de << ends;

                  fprintf (sortie, "\rCrédit : %s\rDébit : %s\r", credit, debit);

                }

                eff_esp_trav ();

                break;

              case 'N' :

                encore = 1;

                encore_une_fois = 0;

                do {

                int l,i;



                  gotoxy (1,16);

                  printf ("Code compta. ");

                  l = Saisie_clavier (NON_VIDE, 9, tampon3);

                  if (tampon3[0] == ESCAPE) {

                    eff_esp_trav ();

                    return;

                  }

                  for (i=l; i<9; i++) tampon3[i]=' ';

                  tampon3[9]=0;

                  if  (Code_bon (contexte->nom_fich_code, contexte->nb_code, tampon3)) {

                    encore_une_fois = 1;

                    gotoxy (1,17);

                    printf ("Code compta Incorrect");

                  }

                }

                while (encore_une_fois);

                if (c==0) {

                  fprintf (sortie, "\rTRI SUR %s\rLE : %0.2i/%0.2i/%0.2i\r"

                        "\rNo   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                          "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                        ,pm2[c2], contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

                }

                cr = 0;

                de = 0;

                nligne = 2;

                if (c == 1) {

                  eff_esp_fich ();

                }

                for (i=1; i<contexte->suivant; i++) {

                  if (kbhit () && (getch () == ESCAPE)) {

                    return;

                  }

                  Lecture_ligne (contexte->nom_fichier, i, fiche);

                  if (!strncmp (tampon3, fiche.code, 9)) {

                    if (c==1) {

                      if (nligne == 14) {

                        while (!kbhit ());

                        nligne = 2;

                        eff_esp_fich ();

                      }

                      gotoxy (1,nligne);

                    }

                    formatte_fiche (fiche, ligne, i);

                    fprintf (sortie, "%s\r", ligne);

                    nligne ++;

                    co++;

                    if (fiche.montant >= 0) {

                      cr += fiche.montant;

                    }

                    else {

                      de += fiche.montant;

                    }

                  }

                }

                if (co == 0) {

                  gotoxy (1,16);

                  fprintf (sortie, "Aucune donnée trouvée\r");

                  clreol ();

                }

                if (c == 0) {

                char credit[LONG_MAX_MONTANT+1], debit[LONG_MAX_MONTANT+1];

                ostrstream out_cr(credit, LONG_MAX_MONTANT+1);

                ostrstream out_de(debit, LONG_MAX_MONTANT+1);



                  out_cr << setw(LONG_MAX_MONTANT) << cr << ends;

                  out_de << setw(LONG_MAX_MONTANT) << de << ends;

                  fprintf (sortie, "\rCrédit : %s\rDébit : %s\r", credit, debit);

                }

                eff_esp_trav ();

                getch ();

                break;

            }

            break;

        }

        break;

      case 'N' : // pas de tri

        gotoxy (1,17);

        printf ("Entrez les bornes de l'intervalle");

        do {

          gotoxy (1,18);

          printf ("Borne Inférieure ");

          Saisie_clavier (NON_VIDE, 6, tampon2, "1");

          if (tampon2[0] == ESCAPE) {

            eff_esp_trav ();

            return;

          }

          inf = atoi (tampon2);

        }

        while ((inf < 1) || (inf >= contexte->suivant));

        do {

        char defaut[5];

          gotoxy (1,19);

          printf ("Borne Supérieure ");

          sprintf (defaut, "%i", contexte->suivant-1);

          Saisie_clavier (NON_VIDE, 6, tampon2, defaut);

          if (tampon2[0] == ESCAPE) {

            eff_esp_trav ();

            return;

          }

          sup = atoi (tampon2);

        }

        while (((sup < 1) || (sup >= contexte->suivant)) && (sup < inf));

        eff_esp_trav ();

        gotoxy (1,16);

        printf ("Edition sur l'%s...",pm[c]);

        if (c == 0) {

          fprintf (sortie, "\rLISTING DES LIGNES %i A %i LE :%0.2i/%0.2i/%0.2i\r"

                    "\r\rNo   DATE    TYPE       OBJET                 CREDIT   DEBIT     CODE      MARQ.\r"

                       "---- ----- -------- ------------------------- -------- --------- --------- -----\r"

                    , inf, sup, contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year() );

        }

        else {

          eff_esp_fich ();

        }

        nligne = 2;

        for (i= inf ; i <= sup; i++) {

          if (kbhit () && (getch () == ESCAPE)) {

            return;

          }

          if ( (nligne == 14) && (c == 1) ) {

            nligne = 2;

            while (!kbhit ());

            eff_esp_fich ();

          }

          Lecture_ligne  (contexte->nom_fichier, i, fiche);

          if (c==1) {

            gotoxy (1,nligne);

          }

          formatte_fiche (fiche, ligne, i);

          fprintf (sortie, "%s\r", ligne);

          nligne++;

        }

        if (c==0) {

        char banque[LONG_MAX_MONTANT+1], reel[LONG_MAX_MONTANT+1];

        ostrstream out_ba(banque, LONG_MAX_MONTANT+1);

        ostrstream out_re(reel, LONG_MAX_MONTANT+1);



          out_ba << setw(LONG_MAX_MONTANT) << contexte->solde_banque << ends;

          out_re << setw(LONG_MAX_MONTANT) << contexte->solde_reel << ends;

          printf ("\rSolde Banque : %s\rSolde Réel : %s\r\r\r",

                banque, reel);

        }

        else {

          getch ();

          eff_esp_fich ();

          eff_esp_trav ();

        }

        break;

      case ESCAPE :

        eff_esp_trav ();

        return;

      default :

        encore = 0;

        break;

    }

  }

  while (encore == 0);

  eff_esp_fich ();

}





void change_fichier (pctxt contexte)

{

char nom[LONG_NOM_FICHIER], Ext[5];

int encore, i;

FILE *fichier, *fichier2;



  eff_esp_trav ();

  do {

    gotoxy (1,17);

    printf ("Nom du fichier ");

    Saisie_clavier (NON_VIDE, LONG_NOM_FICHIER - 1 , nom, contexte->nom_fichier);

    if (nom[0] == ESCAPE) {

      eff_esp_trav ();

      return;

    }

    // Recherche l'extension

    Ext[0] = 0;

    for (i=strlen (nom); i>0; i--) {

      if (nom[i] == '.') {

        strncpy (Ext, nom+i, 4);

        Ext[4] = 0;

        break;

      }

      else if (nom[i] == '\\') {

        break;

      }

    }

    if (Ext[0] == 0) {

      // Ajoute l'extension

      strcat (nom, EXT_COMPTE);

    }

    if (strchr(nom,'\\') == NULL) {

      // pas de path, on rajoute en defaut

      Ajoute_Path (nom);

    }

    if ((fichier2 = fopen ( (char *) nom, "r")) == NULL ) {

    char Reponse[1];



      encore = 1;

      gotoxy (1,19);

      printf ("Fichier non existant");

      gotoxy (1,20);

      printf ("Voulez-vous le creer ? ");

      Saisie_clavier (NON_VIDE, 1, Reponse, "N");

      if ((Reponse[0] == 'o') || (Reponse[0] == 'O')) {

        encore = creation_fichier (nom);

      }

    }

    else {

      fclose (fichier2);

      encore = 0;

    }

  }

  while (encore);

  fichier = fopen (NOM_FICHIER , "wt");

  if (fichier != NULL) {

    fprintf (fichier, "%s\n", nom);

    fclose (fichier);

  }

  strcpy (contexte->nom_fichier, nom);

  eff_esp_trav ();

  eff_esp_fich ();

}



int Mise_A_Jour_Auto (pctxt contexte)

{

FILE* fich_auto;

int cr=0;

Op_Auto op_auto;



  eff_esp_trav ();

  fich_auto = fopen (contexte->Nom_auto, "rb");

  if (fich_auto != NULL) {

    // mise a jour

    gotoxy (1,17);

    printf ("Mise a jour des operations automatiques");



    contexte->nb_op_auto = 0;

    while ( fread (&op_auto, sizeof (op_auto), 1, fich_auto) == 1) {

      op_auto.Mise_A_Jour (contexte);

      contexte->nb_op_auto++;

      cr = 1;

    }



    // Aujourd'hui on a mis a jour

    contexte->date_utilisation = TDate();

    fclose (fich_auto);

  }

  return cr;

}



void part2 (char *fich_code)

{

Fiche fiche;

FILE *fichier;

TDate date_sys;

int i, cr;

char m[8][13] = {"DEBIT       ", "CREDIT      ", "MARQUAGE    ",

            "MODIFICATION", "RECHERCHE   ", "LISTING     ",

            "FICHIER     ", "FIN         "};

static int c=0;

int encore;

int quitte=0;

ctxt Contexte;

pctxt contexte=&Contexte;

int ch;

int Ligne_Aff;

char chaine[LONG_CODE];

int mise_a_jour=1;



  clrscr ();

  strcpy (contexte->nom_fich_code, fich_code);

  do {

    Lecture_code (fich_code, 0, chaine);

    if (chaine[0] == 0) {

      // fichier vide création automatique

      edite_code (contexte);

    }

  }

  while ((contexte->nb_code = atoi (chaine)) == 0);

  // Lecture du compte a ouvrir

  fichier = fopen(NOM_FICHIER, "rt");

  if (fichier == NULL) {

    nouveau_fichier();

    fichier = fopen(NOM_FICHIER, "rt");

    if (fichier == NULL) {

      cerr << "Ouverture impossible du fichier " << NOM_FICHIER << "\n";

      return;

    }

  }

  fscanf (fichier, "%s", contexte->nom_fichier);

  fclose (fichier);

  do {

    // boucle jusqu'a lecture reussie

    cr = Lecture_ligne (contexte->nom_fichier, 0, *contexte);

    if (cr != 0) {

      // erreur de lecture

      change_fichier (contexte);

    }

  } while (cr != 0);

  do {

    Lecture_ligne (contexte->nom_fichier, 0, *contexte);

    if (mise_a_jour) {

      int i;

      char Ext[5];



      strcpy (contexte->Nom_auto, contexte->nom_fichier);

      // Recherche l'extension

      Ext[0] = 0;

      for (i=strlen (contexte->Nom_auto); i>0; i--) {

        if (contexte->Nom_auto[i] == '.') {

          strncpy (Ext, contexte->Nom_auto+i, 4);

          Ext[4] = 0;

          break;

        }

        else if (contexte->Nom_auto[i] == '\\') {

          break;

        }

      }

      if (Ext[0] == 0) {

        // Ajoute l'extension

        strcat (contexte->Nom_auto, EXT_AUTO);

      }

      else {

        // remplace l'extension

        strcpy (contexte->Nom_auto+i, EXT_AUTO);

      }

      if (Mise_A_Jour_Auto (contexte)) {

        // Des modifs ont ete faite

        // enrgistrement du contexte

        Ecriture_ligne (contexte->nom_fichier, 0, *contexte);

      }

      mise_a_jour = 0;

    }

    gotoxy (1,25);

    printf ("COMPTE No %.*s", LONG_NUM_COMPTE, contexte->numero_compte);

    gotoxy (55,25);

    printf ("FICHIER %*.*s", LONG_AFF_NOM_FICH, LONG_AFF_NOM_FICH, contexte->nom_fichier);

    gotoxy (1,15);

    printf ("GESBANQ "VERSION);

    gotoxy (1,1);

    textattr (INVERSE);

    cprintf (" No  DATE    TYPE       OBJET                 CREDIT    DEBIT    CODE      MARQ.");

    textattr (NORMAL);

    gotoxy (27,25);

    printf ("DATE SYSTEME : %0.2i/%0.2i/%0.4i", contexte->date_sys.DayOfMonth(), contexte->date_sys.Month(), contexte->date_sys.Year());

    Ligne_Aff = contexte->suivant;

    Affiche_compte (contexte->nom_fichier, max(1,(Ligne_Aff-12)), Ligne_Aff-1, max(2,(15-Ligne_Aff)));

    gotoxy (24,15);

    textattr (INVERSE);

    cout << "SOLDE BANQUE: " << setw(LONG_SOLDE) << contexte->solde_banque;

    gotoxy (55,15);

    cout << "SOLDE REEL: " << setw(LONG_SOLDE) << contexte->solde_reel;

    textattr (NORMAL);

    contexte->again = 0;

    do {

      encore = 0;

      c += 8;

      c %= 8;

      for (i=0; i<8; i++) {

        gotoxy (1 + 20 * (i - 4*( (int) i/4)), 22 + i/4);

        if (i == c) {

          textattr (INVERSE);

        }

        cprintf ("%s",m[i]);

        textattr (NORMAL);

      }

      ch = getch ();

      if (ch == 0) {

        ch = 1000 + getch ();

      }

      switch (ch) {

        case FL_DR :

          c++;

          break;

        case CTRL_R :

          contexte->again = 2;

          encore = 1;

          break;

        case CTRL_A :

          contexte->again = 1;

          encore = 1;

          break;

        case FL_GA :

          c--;

          break;

        case ESPACE :

        case FL_HA :

        case FL_BA :

          c += 4;

          break;

        case RETURN :

          encore = 1;

          break;

        case SCR_HA :

          eff_esp_fich ();

          if (contexte->suivant != 1) {

            // Le fichier n'est pas vide

            Ligne_Aff -= 12;

            if (Ligne_Aff <= 2) {

              Ligne_Aff = 2;

            }

          }

          Affiche_compte (contexte->nom_fichier, max(1,(Ligne_Aff-12)),

                    Ligne_Aff-1, max(2,(15-Ligne_Aff)));

          break;



        case HOME :

          eff_esp_fich ();

          if (contexte->suivant != 1) {

            // Le fichier n'est pas vide

            Ligne_Aff = 2;

          }

          Affiche_compte (contexte->nom_fichier, max(1,(Ligne_Aff-12)),

                    Ligne_Aff-1, max(2,(15-Ligne_Aff)));

          break;



        case FIN :

          eff_esp_fich ();

          Ligne_Aff = contexte->suivant;

          Affiche_compte (contexte->nom_fichier, max(1,(Ligne_Aff-12)),

                    Ligne_Aff-1, max(2,(15-Ligne_Aff)));

          break;



        case SCR_BA :

          eff_esp_fich ();

          Ligne_Aff += 12;

          if (Ligne_Aff > contexte->suivant) {

            Ligne_Aff = contexte->suivant;

          }

          Affiche_compte (contexte->nom_fichier, max(1,(Ligne_Aff-12)),

                    Ligne_Aff-1, max(2,(15-Ligne_Aff)));

          break;

      }

    }

    while (encore == 0);

    switch (c) {

      case 0 :

        debit (contexte);

        Ecriture_ligne (contexte->nom_fichier, 0, *contexte);

        break;

      case 1 :

        credit (contexte);

        Ecriture_ligne (contexte->nom_fichier, 0, *contexte);

        break;

      case 2 :

        marquage (contexte);

        Ecriture_ligne (contexte->nom_fichier, 0, *contexte);

        break;

      case 3 :

        modification (contexte);

        Ecriture_ligne (contexte->nom_fichier, 0, *contexte);

        break;

      case 4 :

        recherche (contexte);

        break;

      case 5 :

        listing (contexte);

        break;

      case 6 :

        change_fichier (contexte);

        mise_a_jour=1;

        break;

      case 7 :

        quitte = quitter (contexte);

        break;

    }

  }

  while (quitte == 0);

  clrscr ();

}





void main ()

{

  TDate().SetPrintOption(TDate::EuropeanNumbers);

  textmode (C80);

  textattr (NORMAL);

  clrscr ();

  _setcursortype (_NOCURSOR);

//  part1 ();

  part2 ("code.gec");

  _setcursortype (_NORMALCURSOR);

}