// Fonctions de bases
#include <strstrea.h>
#include <iomanip.h>
#include "fct_base.h"
static const ctxt Contexte_const;
static const int Offset_Ctxt=((int) &(Contexte_const.nb_code)
- (int) &(Contexte_const));
void Ajoute_Path (char *nom)
// rajoute le directory des comptes au nom
{
char nombis[LONG_NOM_FICHIER];
strcpy(nombis,nom);
strcpy(nom,DIR_COMPTE);
strcat(nom,nombis);
}
int Lecture_ligne (char* nom, int numero, Fiche &fiche)
// 10300 -> 10310
// A$ = ligne
// FI$ = nom
// I= numero
{
FILE *fichier;
fichier = fopen (nom, "rb");
if (fichier != NULL) {
if (numero == 0) {
printf ("Erreur programmation");
}
else {
fseek (fichier, ((long) numero - 1) * sizeof(Fiche) + Offset_Ctxt,
SEEK_SET);
fread (&fiche, sizeof(Fiche), 1, fichier);
}
fclose (fichier);
}
else {
return -1;
}
return 0;
}
int Lecture_ligne (char* nom, int numero, ctxt &contexte)
// 10300 -> 10310
// A$ = ligne
// FI$ = nom
// I= numero
{
FILE *fichier;
fichier = fopen (nom, "rb");
if (fichier != NULL) {
if (numero == 0) {
fseek (fichier, 0, SEEK_SET);
fread (&contexte, Offset_Ctxt, 1, fichier);
}
else {
printf ("Erreur programmation");
}
fclose (fichier);
}
else {
return -1;
}
return 0;
}
int Ecriture_ligne (char *nom, int numero, Fiche &fiche)
// 10250->10280
// A$ = ligne
// FI$ = nom
// I= numero
{
FILE *fichier;
fichier = fopen (nom, "r+b");
if (fichier != NULL) {
if (numero != 0) {
fseek (fichier, ((long) numero - 1) * sizeof (Fiche) + Offset_Ctxt,
SEEK_SET);
fwrite (&fiche, sizeof (Fiche), 1, fichier );
}
else {
printf ("Erreur programmation\n");
}
fclose (fichier);
}
else {
printf ("Erreur ouverture fichier\n");
return -1;
}
return 0;
}
int Ecriture_ligne (char *nom, int numero, ctxt &contexte)
// 10250->10280
// A$ = ligne
// FI$ = nom
// I= numero
{
FILE *fichier;
fichier = fopen (nom, "r+b");
if (fichier != NULL) {
if (numero != 0) {
printf ("Erreur programmation\n");
}
else {
fseek (fichier, 0, SEEK_SET);
fwrite (&contexte, Offset_Ctxt, 1, fichier );
}
fclose (fichier);
}
else {
printf ("Erreur ouverture fichier\n");
return -1;
}
return 0;
}
int Saisie_date (pctxt contexte, TDate &date, int mode)
//10100->10180
// M -> mode 0 : saisie normal
// 1 : possibilité entrée vide en appuyant ALT lors de la validation
// ARG sor : date = non modifie si pas ok
// RETOUR : 0 OK
// 1 ESCAPE appuyÚ (RET_ESCAPE)
// 2 ALT-ENTREE (RET_VIDE)
{
int a,m,j;
int l;
TDate cejour;
char defaut[5];
char date_char[5];
int Encore;
do {
do {
gotoxy (1,17);
printf ("Jour (2 caract. max.) ");
if (contexte == NULL) {
j = cejour.DayOfMonth();
}
else {
j = contexte->date_sys.DayOfMonth();
}
sprintf (defaut,"%0.2i",j);
l = Saisie_clavier (NON_VIDE, 2, date_char, defaut, mode);
if (l == -1) {
return RET_VIDE;
}
if (date_char[0] == ESCAPE) {
return RET_ESCAPE;
}
j = atoi (date_char);
}
while ((j < 1) || (j > 31));
do {
gotoxy (1,18);
printf ("Mois (2 caract. max.) ");
if (contexte == NULL) {
m = cejour.Month();
}
else {
m = contexte->date_sys.Month();
}
sprintf (defaut, "%0.2i", m);
l = Saisie_clavier (NON_VIDE, 2, date_char, defaut);
if ( date_char[0] == ESCAPE ) {
return RET_ESCAPE;
}
m = atoi (date_char);
}
while ((m < 1) || (m > 12));
do {
gotoxy (1,19);
printf ("Année (4 caract. max.) ");
if (contexte == NULL) {
a = cejour.Year();
}
else {
a = contexte->date_sys.Year();
}
sprintf (defaut, "%0.4i", a);
l = Saisie_clavier (NON_VIDE, 4, date_char, defaut);
if ( date_char[0] == ESCAPE ) {
return RET_ESCAPE;
}
a = atoi (date_char);
}
while ((a < 1900) || (a > 2100));
TDate New_Date(j, m, a);
if (New_Date.IsValid()) {
contexte->date_sys = New_Date;
date = New_Date;
Encore = 0;
}
else {
Encore = 1;
}
}
while ( Encore );
return 0;
}
void eff_esp_trav ()
// 10040
{
int i;
for (i = 16; i <= 21; i++) {
gotoxy (1, i);
clreol ();
}
}
void eff_lign_etat ()
// 10030
{
gotoxy (1, 15);
clreol ();
}
void eff_esp_fich ()
// 10020
{
int i;
for (i = 2; i <= 14; i++) {
gotoxy (1, i);
clreol ();
}
}
void eff_esp_menu ()
// 10010
{
int i;
for (i = 22; i <= 24; i++) {
gotoxy (1,i);
clreol ();
}
}
inline int date_inferieur (Fiche &fiche1, Fiche &fiche2)
// teste si la date de la ligne1 est inferieure stricte
// a celle de la ligne2
{
return (fiche1.Date_Op < fiche2.Date_Op);
}
void tri_fichier (pctxt contexte, int Indice_Ajout)
// tri le fichier par la date d'opération
// Indice_Ajout donne l'endroit ou la ligne a ÚtÚ modifiÚe ou ajoutÚe
{
Fiche fiche_prim, fiche_sec;
int index_prim,index_sec;
index_prim = Indice_Ajout;
Lecture_ligne (contexte->nom_fichier, index_prim, fiche_prim);
// Decale les ligne vers le bas si nÚcessaire
index_sec = index_prim;
while ((index_sec != 1)
&& (Lecture_ligne(contexte->nom_fichier, index_sec-1, fiche_sec),
date_inferieur (fiche_prim, fiche_sec))) {
Ecriture_ligne (contexte->nom_fichier, index_sec, fiche_sec);
index_sec--;
}
if (index_sec==index_prim) {
// Pas de changement effectuÚ
// il faut voir vers le bas si c'est bon
index_sec = index_prim;
while ((index_sec != contexte->suivant-1)
&& (Lecture_ligne(contexte->nom_fichier, index_sec+1, fiche_sec),
date_inferieur (fiche_sec, fiche_prim))) {
Ecriture_ligne (contexte->nom_fichier, index_sec, fiche_sec);
index_sec++;
}
}
// Verification si des changement ont ÚtÚ effectuÚs
if (index_sec!=index_prim) { // il faut rÚÚcrire la donnÚe
Ecriture_ligne (contexte->nom_fichier, index_sec, fiche_prim);
}
}
void formatte_fiche (Fiche &fiche, char *chaine, int Num)
{
char libelle[LONG_LIB_AFF+1];
ostrstream out(chaine, LONG_VISU+1);
out << setw(4) << Num << " "
<< setfill ('0') << setw(2) << fiche.Date_Op.DayOfMonth()
<< "/"
<< setfill ('0') << setw(2) << fiche.Date_Op.Month()
<< setfill (' ') << " "
<< mode2str (fiche.mode_paiement)
<< " ";
out.setf(ios::left, ios::adjustfield);
if (strlen (fiche.libelle) > LONG_LIB_AFF) {
strncpy (libelle, fiche.libelle, LONG_LIB_AFF);
libelle[LONG_LIB_AFF] = 0;
out << setw(LONG_LIB_AFF) << libelle;
}
else {
out << setw(LONG_LIB_AFF) << fiche.libelle;
}
out << " ";
out.setf(ios::right, ios::adjustfield);
if (fiche.montant > 0) {
// c'est un crÚdit
out << setw(LONG_CREDIT) << fiche.montant << " " << setw(LONG_DEBIT) << " ";
}
else {
// DÚbit
out << setw(LONG_CREDIT) << " " << " " << setw(LONG_DEBIT) << fiche.montant;
}
out << " " << fiche.code << " ";
if (fiche.Date_Marquage.Year() == ANNEE_NON_MARQ) {
out << setw(5) << " ";
}
else {
out << setfill ('0') << setw(2) << fiche.Date_Marquage.DayOfMonth()
<< "/"
<< setfill ('0') << setw(2) << fiche.Date_Marquage.Month();
}
out << ends;
}
char* mode2str(Mode_Paiement &mode_paiement)
{
static char Chaine[LONG_TYPPAI];
static char Type_chaine[][LONG_TYPPAI] = { "CHEQUE ", "CB. ", "PREL. ", "VIR. ", "TIP ", "AUTRE " };
if ((mode_paiement.type == TYPE_CHEQUE)
&& (mode_paiement.numero_chq != 0)) {
// valeur
ostrstream out(Chaine, sizeof(Chaine));
out << setfill ('0') << setw (LONG_TYPPAI-1) << mode_paiement.numero_chq;
}
else {
strcpy (Chaine, Type_chaine[mode_paiement.type - TYPE_CHEQUE]);
}
return Chaine;
}