Application console de gestion cabinet médicale avec le langage C
Application console de gestion cabinet médicale avec le langage C
Cet article propose en détaille une application console de gestion cabinet médicale avec le langage C en utilisant la POO.
On utilise dans cette application :
- L'héritage
- Le polymorphisme
- La surcharge des méthodes
- L'accès aux fichiers <fstream>
- Le cryptage des fichiers
- L'utilisation des dates/heures
- Le formatage des données <sstream, strstream>
- Avec un propre couche présentation (classes d'interface)
Vous pourrez télécharger le fichier au format zip il contient le code sources complet
Extrait du code source :
#include "console.h"
void InterfaceGraphique(Cconsole & Cout)
{
Cout.TailleEcran(100, 50);
Cout.set_window_title("ESPRIT # 1C-INFO-01 Mini Projet POO C++");
Cout.AfficherModeleDeBase();
Cout.AfficherClesDeNavigation();
Cout.DessinerFrame(5,8,90,30," CONNEXION ");
Cout.AfficherCurseur(true);
return;
}
… … … …
#include "Reglements.h"
void DessinerInterfaceReglement(Cconsole &console)
{
//Ecrire textes:
console.set_text_background(InternalFrameBackGroundColor);
console.set_text_foreground(InternalFrameTextColor);
console.set_cursor_position(9,13); cout << "Date r" << E_AccentGrave << "glement : [jj/mm/aaaa]";
console.set_cursor_position(9,17); cout << "Heure r" << E_AccentGrave << "glement: [HH:mm]";
console.set_cursor_position(9,21); cout << "Code patient :";
console.set_cursor_position(9,25); cout << "Visite " << A_AccentGrave << " payer : [jj/mm/aaaa] Heure :";
console.set_cursor_position(9,29); cout << "Mnt honoraire : Mnt d" << E_AccentAigue << "j" << A_AccentGrave << " pay" << E_AccentAigue << " :";
console.set_cursor_position(9,33); cout << "Mnt " << A_AccentGrave << " payer :";
console.set_cursor_position(71,10); cout << SmplCoinHautGauche << SmplHorizontale << " Impay" << E_AccentAigue << "s patient: " << SmplHorizontale << SmplCoinHautDroite;
console.set_cursor_position(71,11);
cout << SmplVerticale << " " << SmplVerticale;
console.set_cursor_position(71,12);
cout << SmplVerticale << " Dat visite" << SmplVerticale << " Impay" << E_AccentAigue << " " << SmplVerticale;
console.set_cursor_position(71,13);
cout << SmplVerticale << " " << CharString(10,SmplHorizontale) << char(197) << CharString(7,SmplHorizontale) << " " << SmplVerticale;
for(int i=14 ; i < 34 ; i++) {console.set_cursor_position(71,i);
cout << SmplVerticale << " .........." << SmplVerticale << "....... " << SmplVerticale;}
console.set_cursor_position(71,34);cout << SmplVerticale << " " << CharString(10,SmplHorizontale) << char(193) << CharString(7,SmplHorizontale) << " " << SmplVerticale;
console.set_cursor_position(71,35);cout << SmplVerticale << " TOTAL : .......... " << SmplVerticale;
console.set_cursor_position(71,36); cout << SmplCoinBasGauche << CharString(20,SmplHorizontale) << SmplCoinBasDroite;
console.ConstruireChampsDeSaisie(62,25,5,true); //Un champs pour l'affichage seulement
}
void ResetInterfaceReglements(Cconsole &console, Interface & Reglement_Interface)
{
Reglement_Interface[0]->SetValue(DateSystFormatee());
Reglement_Interface[1]->SetValue(HeureSystFormatee());
for (int i = 2; i<4; i++) Reglement_Interface[i]->SetValue("");
Reglement_Interface[4]->SetValue((float)0);
console.SetFieldText(21,37,CharString(34,' '),InternalFrameBackGroundColor,InternalFrameTextColor);//Effacer un éventuel affichage du nom patient
console.SetFieldText(25,62,CharString(5,' '),FieldBackGroundColor,FieldForeGroundColor);//Effacer un éventuel affichage de l'heure visite relative
console.SetFieldText(29,26," ",InternalFrameBackGroundColor,FieldForeGroundColor);//Effacer un éventuel affichage de l'honoraire visite relative
console.SetFieldText(29,52," ",InternalFrameBackGroundColor,FieldForeGroundColor);//Effacer un éventuel affichage du mnt déja payé de la visite relative
Reglement_Interface[0]->SetFocus();
Reglement_Interface.SetIndexChampsEnCours(0);
return;
}
void AfficherImpayesPatient(Cconsole &console, vector<Reglement> &ListeDesReglements,vector<Visite> &ListeDesVisites, string patient)
{ //Effacer touts les impayés éventuellement affichés
COORD AnciennePosition = {console.get_current_position_x() , console.get_current_position_y()}; // Garder la position actuelle du curseur
console.set_text_background(InternalFrameBackGroundColor);
console.set_text_foreground(InternalFrameTextColor);
for(int i=14 ; i < 34 ; i++) {console.set_cursor_position(71,i);
cout << SmplVerticale << " .........." << SmplVerticale << "....... " << SmplVerticale;}
console.SetFieldText(35,72," TOTAL : ..........",InternalFrameBackGroundColor,InternalFrameTextColor);
if (patient.length() == 0) goto ret; //Appel pour nettoyage du tableau
int NumLigne = 14; //Num ligne d'affichage tableau
float TotalImpayePatient = 0;
for(unsigned int i=0;i<ListeDesVisites.size();i++)
if (ListeDesVisites[i].getPatient() == patient)
{ float TotalPayeVisite = 0;
for(unsigned int j=0;j<ListeDesReglements.size();j++)
if (ListeDesReglements[j].getPatient() == ListeDesVisites[i].getPatient() &&
ListeDesReglements[j].getDatVisite().str() == ListeDesVisites[i].getDate().str() &&
ListeDesReglements[j].getHeureVisite().str() == ListeDesVisites[i].getHeure().str())
TotalPayeVisite += ListeDesReglements[j].getPaye();
if (TotalPayeVisite < ListeDesVisites[i].getHonoraire()) //Visite pas encore totalement payée!
{
TotalImpayePatient += ListeDesVisites[i].getHonoraire() - TotalPayeVisite;
char ligne18[19]; sprintf_s(ligne18,"%s%c%s",ListeDesVisites[i].getDate().str().c_str(), SmplVerticale, FloatToRightStr(ListeDesVisites[i].getHonoraire() - TotalPayeVisite,7,'.').c_str());
console.SetFieldText(NumLigne,73,string(ligne18),InternalFrameBackGroundColor,InternalFrameTextColor);
NumLigne++;
}
}
console.SetFieldText(35,72," TOTAL : " + FloatToRightStr(TotalImpayePatient,10,'.'),InternalFrameBackGroundColor,InternalFrameTextColor);
ret:
console.set_text_background(FieldBackGroundColor);
console.set_text_foreground(FieldForeGroundColor);
console.set_cursor_position(AnciennePosition.X,AnciennePosition.Y); // Restituer la position actueelle du curseur
return;
}
void TryToDisplayPatient_EcranReglements(Cconsole &console, string patient, vector<Patient> &ListPatients)
{
string CodePatient = trim(patient);
string NomEtPrenom;
for(unsigned int i = 0; i < ListPatients.size(); i++)
if(ListPatients[i].getCode() == CodePatient) // Patient existant
{
NomEtPrenom = ListPatients[i].getNom() + " " + ListPatients[i].getPrenom();
NomEtPrenom.resize(34,' ');
console.SetFieldText(21,37,NomEtPrenom,InternalFrameBackGroundColor,InternalFrameTextColor);
return;
}
console.SetFieldText(21,37,CharString(34,' '),InternalFrameBackGroundColor,InternalFrameTextColor);
}
void TryToDisplayVisite_EcranReglement(Cconsole &console, string datereglement, string heurereglement, string patient, string datevisite, vector<Visite> &ListeDesVisites,vector<Reglement> &ListeDesReglements) //S'il s'agit de l'un des champs (DateVisite ou Patient), et s'il a été changé, afficher l'heure Visite correspondante
{
string DateVisiteFieldValue = trim(datevisite);
string PatientFieldValue = trim(patient);
for(unsigned int i = 0; i<ListeDesVisites.size(); i++)
if((ListeDesVisites[i].getDate().str() == DateVisiteFieldValue)&&(ListeDesVisites[i].getPatient() == PatientFieldValue)) // Visite existante
{
console.SetFieldText(25,62,ListeDesVisites[i].getHeure().str(),FieldBackGroundColor,FieldForeGroundColor);
char buff[10];
sprintf_s(buff, "%4.3f",ListeDesVisites[i].getHonoraire());
console.SetFieldText(29,26,string(buff),InternalFrameBackGroundColor,FieldForeGroundColor);
float TotalPayeVisite = 0;
for(unsigned int j=0;j<ListeDesReglements.size();j++)
if (ListeDesReglements[j].getPatient() == PatientFieldValue &&
ListeDesReglements[j].getDatVisite().str() == DateVisiteFieldValue &&
ListeDesReglements[j].getHeureVisite().str() == (console.GetFieldText(25,62,66)) &&
(ListeDesReglements[j].getDate().str() != datereglement ||
ListeDesReglements[j].getHeure().str() != heurereglement))// Somme de tous les reglements de la visite sauf celui qui est affiché (en cours de modif)
TotalPayeVisite += ListeDesReglements[j].getPaye();
sprintf_s(buff, "%4.3f",TotalPayeVisite); console.SetFieldText(29,52,string(buff),InternalFrameBackGroundColor,FieldForeGroundColor);
return;
}
console.SetFieldText(25,62," ", FieldBackGroundColor, FieldForeGroundColor);
console.SetFieldText(29,26," ",InternalFrameBackGroundColor,FieldForeGroundColor);
console.SetFieldText(29,52," ",InternalFrameBackGroundColor,FieldForeGroundColor);
return;
}
bool VisiteCompletementPayee(Cconsole &console,Interface &Reglement_Interface)
{
float MntHonoraire = StrToFloat(console.GetFieldText(29,26,33));
float MntDejaPaye = StrToFloat(console.GetFieldText(29,52,59));
float MntAPayer; Reglement_Interface[4]->GetValue(&MntAPayer);
if(MntDejaPaye + MntAPayer > MntHonoraire)
{
char StrAide [150]; //Taille max d'un message d'info help
sprintf_s(StrAide,"La somme du montant saisi et celui d%cj%c pay%c d%cpasse le montant d'honoraire visite.",E_AccentAigue,A_AccentGrave,E_AccentAigue,E_AccentAigue);
console.Aide(StrAide);
Reglement_Interface.SetIndexChampsEnCours(4);
Reglement_Interface[4]->SetErrorBackground();
Reglement_Interface[4]->SetFocus();
_putch(7);
return true;
}
return false;
}
bool VerifierDifferenceDates(Cconsole &console, Interface &Reglement_Interface)
{ //Vérifier si la date visite est inférieure à la date reglement
BP_Date DateReglement; Reglement_Interface[0]->GetValue(&DateReglement);
BP_Date DateVisite; Reglement_Interface[3]->GetValue(&DateVisite);
if(DateReglement.gettimet() < DateVisite.gettimet())
{
char StrAide [150]; //Taille max d'un message d'info help
sprintf_s(StrAide,"La date du r%cglement ne peut pas %ctre inf%crieure %c celle de la visite.",E_AccentGrave,E_AccentCirconflexe, E_AccentAigue,A_AccentGrave);
console.Aide(StrAide);
Reglement_Interface.SetIndexChampsEnCours(0);
Reglement_Interface[0]->SetErrorBackground();
Reglement_Interface[0]->SetFocus();
_putch(7);
return false;
}
if(DateReglement.gettimet() == DateVisite.gettimet())
{
BP_Date HeureReglement; Reglement_Interface[1]->GetValue(&DateReglement);
BP_Date HeureVisite;
HeureVisite.setformat("hh:nn");
HeureVisite.set(console.GetFieldText(25,62,66));
if(HeureReglement.gettimet() < HeureVisite.gettimet()) // Cas très rare mais possible!
{
char StrAide [150]; //Taille max d'un message d'info help
sprintf_s(StrAide,"L'heure du r%cglement ne peut pas %ctre inf%crieure %c celle de la visite.",E_AccentGrave,E_AccentCirconflexe, E_AccentAigue,A_AccentGrave);
console.Aide(StrAide);
Reglement_Interface.SetIndexChampsEnCours(1);
Reglement_Interface[1]->SetErrorBackground();
Reglement_Interface[1]->SetFocus();
_putch(7);
return false;
}
}
return true;
}
void TryToDisplayReglement(Cconsole &console, Interface & Reglement_Interface,vector<Reglement> &ListeDesReglements, vector<Visite> &ListeDesVisites, vector<Patient> &ListPatients) //S'il s'agit de l'un des champs clé (Date ou heure), et s'il a été changé, afficher le reglement s'il est existant
{
string FirstFieldValue = Reglement_Interface[0]->GetStrValue();
string SecondFieldValue = Reglement_Interface[1]->GetStrValue();
unsigned short Tmp_IndexChampsEnCours = Reglement_Interface.GetIndexChampsEnCours(); //Indispensable lors d'un écran à clés multiples
COORD AnciennePosition = {console.get_current_position_x() , console.get_current_position_y()}; // Garder la position actueelle du curseur
for(unsigned int i = 0; i<ListeDesReglements.size(); i++)
if((ListeDesReglements[i].getDate().str() == FirstFieldValue)&&(ListeDesReglements[i].getHeure().str() == SecondFieldValue)) // Reglement existant
{
Reglement_Interface[2]->SetValue (ListeDesReglements[i].getPatient());
Reglement_Interface[3]->SetValue (ListeDesReglements[i].getDatVisite().str());
Reglement_Interface[4]->SetValue (ListeDesReglements[i].getPaye());
TryToDisplayPatient_EcranReglements(console, Reglement_Interface[2]->GetStrValue(), ListPatients);
TryToDisplayVisite_EcranReglement(console,Reglement_Interface[0]->GetStrValue(),Reglement_Interface[1]->GetStrValue(),Reglement_Interface[2]->GetStrValue(),Reglement_Interface[3]->GetStrValue(),ListeDesVisites,ListeDesReglements);
console.set_cursor_position(AnciennePosition.X,AnciennePosition.Y); // Restituer la position actueelle du curseur
char StrHelp [200];
sprintf_s(StrHelp,"R%glement existant! Vous pouvez le modifier ou le supprimer.",E_AccentGrave);
console.Aide(StrHelp);
return;
}