/********************************* CDevilFormPDF **************************************
                                                                                
    Project: MedinTux                                                            
    Copyright (C) 2005 by Roland Sevin  and Data Medical Design            
    E-Mail: data.medical.design@club-internet.fr                                 
                                                                                 
    This program is free software; you can redistribute it and/or modify         
    it under the terms of the CeCILL Version 1 du 21/06/2004                     
    License (GPL compatible)                                                     
                               http://www.cecill.info/                           
    as published by :                                                            
                                                                                 
    Commissariat � l'Energie Atomique                                            
    - CEA,                                                                       
                             31-33 rue de la F�d�ration, 75752 PARIS cedex 15.   
                             FRANCE                                              
    Centre National de la Recherche Scientifique                                 
    - CNRS,                                                                      
                             3 rue Michel-Ange, 75794 Paris cedex 16.            
                             FRANCE                                              
    Institut National de Recherche en Informatique et en Automatique             
    - INRIA,                                                                     
                             Domaine de Voluceau, Rocquencourt, BP 105, 78153    
                             FRANCE                                              
                                                                                 
          This program is distributed in the hope that it will be useful,        
          but WITHOUT ANY WARRANTY; without even the implied warranty of         
          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                   
          CeCILL  License (GPL compatible) for more details.                     
                                                                                 
 **********************************************************************************/
/*! \file

 * Définition de la classe CDevilFormPDF.
*/

/*! \class CDevilFormPDF
 * \brief Classe dépendante de la classe CDevilCrucible qui permet d'effectuer les fonctions PDF de drtux.

 * Exemple pour les masques :
 \code {{:: Form_PDF ( MT ) }} 
 \endcode
 * ou
 \code {{:: Form_PDF ( ALD ) }} 
 \endcode

 * Exemple pour le code (dans CDevilCrucible.cpp):
 * \code CDevilFormPDF *pPDF = new CDevilFormPDF (this);
 * QString resultat_du_calcul = pPDF->Form_PDF (arg1);
  \endcode

 * \param *pCDevil : pointer vers la classe CDevilCrucible appelante.
 * \todo Mettre en plugins. Faire une fenêtre pour permettre le paramétrage de l'application +++
*/


#include "CDevilFormPDF.h"
#define TR QObject::tr

//.................. chemin par defaut OS dependant ...........................
#ifdef Q_WS_MAC
    //! Valeur par defaut de chemin vers pdf toolkit, rubrique Formulaire PDF.  ..  drtux.ini
    #define FORM_PDF            "Formulaires PDF Mac"
    #define DEFAUT_PDFTK		"/usr/local/bin/pdftk"
    //! Valeur par defaut de chemin vers appli visualisatrice de PDF, rubrique Formulaire PDF.  ..  drtux.ini 
    #define DEFAUT_PDFVISU		"/Applications/Preview.app"
#endif
#ifdef Q_WS_WIN
    //! Valeur par defaut de chemin vers pdf toolkit, rubrique Formulaire PDF.  ..  drtux.ini
    #define FORM_PDF            "Formulaires PDF Win"
    #define DEFAUT_PDFTK		"../../pdf/pdftk.exe"
    //! Valeur par defaut de chemin vers appli visualisatrice de PDF, rubrique Formulaire PDF.  ..  drtux.ini 
    #define DEFAUT_PDFVISU		"C:/Program Files/Adobe/Acrobat 5.0/Reader/AcroRd32.exe"
#endif
#ifdef Q_WS_X11
    //! Valeur par defaut de chemin vers pdf toolkit, rubrique Formulaire PDF.  ..  drtux.ini
    #define FORM_PDF            "Formulaires PDF Lin"
    #define DEFAUT_PDFTK		"/usr/bin/pdftk"
    //! Valeur par defaut de chemin vers appli visualisatrice de PDF, rubrique Formulaire PDF.  ..  drtux.ini 
    #define DEFAUT_PDFVISU		"/usr/bin/kpdf"
#endif


//================================================= CDevilFormPDF ==============================================================
//------------------------------------------ CDevilFormPDF ---------------------------------------------------------------
/*! \brief constructeur principal de la classe.
*/

CDevilFormPDF::CDevilFormPDF( CDevilCrucible *pCDevil )
{
   m_pCDevil      = pCDevil;  // pointer vers le CDevilCrucible appelant pour accéder à ses fonctions et variables...
   m_pMB          = pCDevil->GetMB();  // récupère les fonctions de la base de données de CDevilCrucible
   m_IdentPrimKey = pCDevil->GetMIdentPrimKey();
   m_UserDocPk    = pCDevil->GetUserDocPk();
}

//------------------------------------------ Form_PDF ---------------------------------------------------------------
/*! \brief Fonction principale de la classe. Renseigne automatiquement les formulaires PDF de la sécurité sociale française depuis drtux.

 * Exemple pour les masques :
 \code {{:: Form_PDF ( MT ) }} 
 \endcode
 * ou
 \code {{:: Form_PDF ( ALD ) }} 
 \endcode

 * Exemple pour le code (dans CDevilCrucible.cpp):
 * \code CDevilFormPDF *pPDF = new CDevilFormPDF (this);
 * QString resultat_du_calcul = pPDF->Form_PDF (arg1);
  \endcode
 * Lorsque cette fonction est utilisée pour le formulaire d'ALD, vous devez utiliser le masque approprié.

 * \param arg1 : Soit "MT" pour la déclaration du médecin traitant, soit "ALD" pour les ALD.
*/
//--------------------------------------------------------------------------------------------------------------------
QString CDevilFormPDF::Form_PDF(QString &arg1)
{ QString  pdftkPath = "";	// chemin vers pdftk (utilisé pour manipulation des PDF / FDF
  QString  pdfPath   = "";	// arguments à passer à pdftk
  QString  visualPDF = "";	// chemin vers l'appli de visualisation des PDF
  QString  fdfFile   = "";	// contenu du formulaire
  QString  pdfFile   = "";	// nom du fichier PDF formulaire
  QString  tmpPath   = "";	// chemin vers le répertoire temporaire
  QString  val1, capt;
  QString  text	     = "<b><center>Fonction formulaires PDF</center></b><br><br>"; // texte d'alerte erreur
  QMessageBox	box;

  arg1 = arg1.stripWhiteSpace();


  //.......... Récupère les parametres dans drtux.ini et fait les vérifications requises
  //[Formulaires PDF]
  //  Chemin vers PDF = 
  //  Application visualisateur de PDF = 
  //  Chemin vers pdftk = 
  //  Chemin vers tmp = 
  if (!Form_PDF_GetIni(pdfPath, pdftkPath, visualPDF, tmpPath))
   { return QString::null; }

  //.......... Prépare le répertoire PDF
  QDir dirPDF (pdfPath);

  //.......... Prépare le fichier FDF selon le formulaire choisi
  if (arg1.upper() == "MT")
   {	pdfFile  = "declarationMT.pdf";
	// Vérifie que le fichier est sur le disque sinon message d'erreur et avorte   
	QFile test (dirPDF.path() + QDir::separator() + pdfFile);
	if (!test.exists())
	{	//erreur manque le fichier "declarationMT.pdf"
		capt = TR("Erreur");
		text += TR("Dr Tux ne peut pas trouver le formulaire PDF à remplir nommé<br><br>");
		text += dirPDF.path()+pdfFile;
		text += TR("</b>. Ce fichier est nécessaire pour la réalisation de votre demande {{::Form (MT) }}.");
		box.setCaption("Erreur");
		box.setIcon(QMessageBox::Warning);
		box.setTextFormat(Qt::RichText);
		box.setText (text);
		box.setButtonText (0,"Ok");
		box.exec(); 
		return QString::null;
	}
	  
	// Prépare le fichier fdf pour déclaration Médecin Traitant
	fdfFile  = Form_Dec_MT(pdfFile);
   }
  else if (arg1.upper() == "ALD")
   {	pdfFile  = "proto_ALD.pdf";
	
	// Vérifie que le fichier existe sur le disque sinon message et avorte
	QFile test (dirPDF.path() + QDir::separator() + pdfFile);
	if (!test.exists())
	{	//erreur manque le fichier "declarationMT.pdf"
		capt = TR("Erreur");
		text += TR("Dr Tux ne peut pas trouver le formulaire PDF à remplir nommé<br><br>");
		text += dirPDF.path()+pdfFile;
		text += TR("</b>. Ce fichier est nécessaire pour la réalisation de votre demande {{::Form (MT) }}.");
		box.setCaption(capt);
		box.setIcon(QMessageBox::Warning);
		box.setTextFormat(Qt::RichText);
		box.setText (text);
		box.setButtonText (0,"Ok");
		box.exec(); 
		return QString::null;
	}

	// Prépare le fichier FDF pour le protocole ALD	   
	fdfFile  = Form_ALD(pdfFile);
	fdfFile.replace("\t","");
   }

  //........ Vérifie que l'utilisateur à bien demandé un PDF existant dans notre fonction sinon avorte
  if (pdfFile == "") return QString::null;
  QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
  //........ Sauvegarde le fichier FDF en temporaire
  QDir tmp (tmpPath);
  QString  tmpFile = tmp.path() + QDir::separator () + "fdf.txt";
  QFile   fdfToSave (tmpFile );
  if ( fdfToSave.open( IO_WriteOnly ) ) {
        QTextStream stream( &fdfToSave );
	    stream.setEncoding(QTextStream::Latin1);
        stream << fdfFile;
        fdfToSave.close();
    }
    else {} // erreur : impossible d'écrire le fichier temporaire


  //........ Prépare le nom de fichier PDF à sauvegarder  			ATTENTION AUX ACCENTS !!!!!!!
  QString fileNameToSave = "";
  fileNameToSave = QString::fromUtf8(
		   m_pMB->GetFieldValue( m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_NOM,
					 m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey) + "_" + 
		   m_pMB->GetFieldValue( m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_PRENOM,
					 m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey) + "_" + pdfFile );

  //........ Lance le batch avec pdftk et affiche le PDF
  QStringList arg;
  arg.append(pdftkPath);
  arg.append(dirPDF.path()+QDir::separator()+pdfFile);
  arg.append("fill_form");
  arg.append(tmp.path()+QDir::separator()+"fdf.txt");
  arg.append("output");
  arg.append(dirPDF.path()+QDir::separator()+fileNameToSave);
  QProcess proc(arg);
  proc.start();

//   QWidget* l = new QWidget();
//   QTextEdit* ed = new QTextEdit(l);
//   QString msg = "";
//   for (int i=0; i < arg.count();++i)
//    msg += arg[i] + " ";
//   ed->setText(msg);
//   ed->adjustSize();
//   l->show();

  // laisse du temps à pdftk pour terminer ses affaires   (AMELIORABLE)

  SLEEP(1);
  for (int i = 0 ; i < 30 ; ++i)
   { if (proc.isRunning())  
        {SLEEP(1);
        }  
     else break; 
   }

  //........ Efface le fichier FDF temporaire
  fdfToSave.remove();

  //........ Lance le visualisateur de PDF avec notre formulaire fraîchement rempli
  arg.clear();
  arg.append(visualPDF);
  arg.append(dirPDF.path()+QDir::separator()+fileNameToSave);
  QProcess procVisu(arg);
  procVisu.setArguments(arg);
  procVisu.start();
  QApplication::restoreOverrideCursor();
  //........ Fin !
  return QString::null;
}



// ****************************************************************************************************** //
// *					FONCTIONS SECONDAIRES						* //
// ****************************************************************************************************** //


/*! \brief Prépare le Fichier FDF (renvoie l'entête du fichier)
 * \return l'encodage FDF.
*/QString CDevilFormPDF::Entete_FDF()
{  return QString::fromUtf8("%FDF-1.2\n%âãÏÓ\n1 0 obj\n<<\n/FDF\n<<\n/Fields [\n");
}


/*! \brief Prépare le Fichier FDF (renvoie le pied de fichier).
 * \return l'encodage FDF.
*/QString CDevilFormPDF::Pied_FDF()
{  return QString::fromUtf8("  >>\n>>\nendobj\ntrailer\n<< /Root 1 0 R >>\n%%EOF");
}


/*! \brief Ajoute la référence du fichier PDF au fichier FDF à partir des paramètres passés.
 * \param field : nom du fichier à ajouter
 * \return l'encodage FDF.
*/QString CDevilFormPDF::File_PDF_FDF(QString file)
{  return "]/F ("+file+")\n";
}


/*! \brief Renvoie l'encodage d'un nouveau champs FDF à partir des paramètres passés.
 * \param field : nom du champs à ajouter
 * \param value : valeur du champs
 * \return l'encodage FDF.
*/
QString CDevilFormPDF::Add_Field_FDF(QString field, QString value)
{  QString val = value.upper();
   val = val.replace("<BR>","");
   val = val.replace("<BR />","");
   val = val.replace("(","_");
   val = val.replace(")","_");
   val = val.replace("\t","");
   val = val.stripWhiteSpace();
   return "<< /T ("+field+") /V ("+val+") >>\n";
}



//------------------------------------ Form_PDF_GetIni ------------------------------------------------
/*! \brief Récupère les variables stockées dans drtux.ini concernant les Formulaires PDF ou utilise les valeurs par défaut après vérification. Affiche les messages d'alerte en cas d'erreur.
 * \param pdfPath : chemin vers les PDF 
 * \param pdftkPath : chemin vers l'exécutable pdftk
 * \param visualPDF : chemin vers l'appli visualitrice de PDF
 * \param tmpPath : chemin vers le répertoire temporaire de travail pour les PDFs

 * Les divers paramètres stockés dans drtux.ini
* \return La fonction renvoie TRUE si tout c'est déroulé sans erreur , FALSE dans le cas contraire.
*/
//-----------------------------------------------------------------------------------------------------
bool CDevilFormPDF::Form_PDF_GetIni(QString &pdfPath, QString &pdftkPath, QString &visualPDF, QString &tmpPath)
{ QString capt, text;
  QMessageBox box;

  if (G_pCApp->m_pCMoteurBase->Param_ReadParam(G_pCApp->m_DrTuxParam, 
                        FORM_PDF, "Chemin vers PDF", &pdfPath ) != 0)
     {// erreur : chemin vers les fichiers PDF inexistant dans drtux.ini
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver les paramètres nécessaires pour gérer les fichiers PDF à remplir.<br><br>");
        text += TR("Vérifier que le fichier <b>drtux.ini</b> existe et que les paramètres sont renseignés.<br><br>");
        text += TR("Extrait de drtux.ini par défaut :<br>");
        text += TR("["FORM_PDF"]<br>");
        text += TR("&nbsp;&nbsp;<b>Chemin vers PDF = ../../PDF</b><br>");
        text += TR("&nbsp;&nbsp;Application visualisateur de PDF = /usr/bin/acrobat<br>");
        text += TR("&nbsp;&nbsp;Chemin vers pdftk = /usr/bin/pdftk<br>");
        text += TR("&nbsp;&nbsp;Chemin vers tmp = ../../PDF/tmp");
        box.setCaption(capt);
        box.standardIcon(QMessageBox::Information);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec();
        return FALSE;
     }

  if (G_pCApp->m_pCMoteurBase->Param_ReadParam(G_pCApp->m_DrTuxParam, 
                        FORM_PDF, "Chemin vers pdftk", &pdftkPath ) != 0)
     {// erreur chemin vers pdftk inexistant dans drtux.ini
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver les paramètres nécessaires pour gérer les fichiers PDF à remplir.<br><br>");
        text += TR("Vérifier que le fichier <b>drtux.ini</b> existe et que les paramètres sont renseignés.<br><br>");
        text += TR("Extrait de drtux.ini par défaut :<br>");
        text += TR("["FORM_PDF"]<br>");
        text += TR("&nbsp;&nbsp;Chemin vers PDF = ../../PDF<br>");
        text += TR("&nbsp;&nbsp;Application visualisateur de PDF = /usr/bin/acrobat<br>");
        text += TR("&nbsp;&nbsp;<b>Chemin vers pdftk = /usr/bin/pdftk</b><br>");
        text += TR("&nbsp;&nbsp;Chemin vers tmp = ../../PDF/tmp");
        box.setCaption(capt);
        box.standardIcon(QMessageBox::Information);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec(); 
        return FALSE;
     }

  if (G_pCApp->m_pCMoteurBase->Param_ReadParam(G_pCApp->m_DrTuxParam, 
                        FORM_PDF, "Application visualisateur de PDF", &visualPDF ) != 0)
     {// erreur chemin vers appli visualisatrice de PDF inexistant dans drtux.ini
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver les paramètres nécessaires pour gérer les fichiers PDF à remplir.<br><br>");
        text += TR("Vérifier que le fichier <b>drtux.ini</b> existe et que les paramètres sont renseignés.<br><br>");
        text += TR("Extrait de drtux.ini par défaut :<br>");
        text += TR("["FORM_PDF"]<br>");
        text += TR("&nbsp;&nbsp;Chemin vers PDF = ../../PDF<br>");
        text += TR("&nbsp;&nbsp;<b>Application visualisateur de PDF = /usr/bin/acrobat</b><br>");
        text += TR("&nbsp;&nbsp;Chemin vers pdftk = /usr/bin/pdftk<br>");
        text += TR("&nbsp;&nbsp;Chemin vers tmp = ../../PDF/tmp");
        box.setCaption(capt);
        box.standardIcon(QMessageBox::Information);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec(); 
        return FALSE;
     }

  //.......... Vérifie que le répertoire Formulaires_PDF existe sinon avorte la fonction
  QDir dirPDF (G_pCApp->m_PathAppli + pdfPath);
  dirPDF = dirPDF.absPath();
  if (!dirPDF.exists())
    {   // Attention le répertoire contenant les PDF n'existe pas !!!!
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver les fichiers PDF à remplir.<br><br>");
        text += TR("Vérifier que le répertoire <br><b>");
        text += dirPDF.path();
        text += TR("</b> <br> existe et que les fichiers PDF de la sécurité sociale sont bien installés dans ce répertoire.");
        box.setCaption(capt);
        box.setIcon(QMessageBox::Warning);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec(); 
        return FALSE;
    }
  else pdfPath = dirPDF.path();

  //.......... Vérifie l'existence des appli externes

    if (G_pCApp->m_pCMoteurBase->Param_ReadParam(G_pCApp->m_DrTuxParam, 
                        FORM_PDF, "Chemin vers tmp", &tmpPath ) != 0)
     {  // erreur : chemin vers lerépertoire temporaire inexistant dans drtux.ini
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver les paramètres nécessaires pour gérer les fichiers PDF à remplir.<br><br>");
        text += TR("Vérifier que le fichier <b>drtux.ini</b> existe et que les paramètres sont renseignés.<br><br>");
        text += TR("Extrait de drtux.ini par défaut :<br>");
        text += TR("["FORM_PDF"]<br>");
        text += TR("&nbsp;&nbsp;Chemin vers PDF = ../../PDF<br>");
        text += TR("&nbsp;&nbsp;Application visualisateur de PDF = /usr/bin/acrobat<br>");
        text += TR("&nbsp;&nbsp;Chemin vers pdftk = /usr/bin/pdftk<br>");
        text += TR("<b>&nbsp;&nbsp;Chemin vers tmp = ../../PDF/tmp </b>");
        box.setCaption(capt);
        box.setIcon(QMessageBox::Warning);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec(); 
        return FALSE;
     }

  //........ Vérifie l'existence du répertoire temporaire pour les PDF  (Chemin vers tmp = tmpPath)
  tmpPath = G_pCApp->m_PathAppli + tmpPath;
  QDir tmp (tmpPath);
  tmp = tmp.absPath();
  if (!tmp.exists())
     {  // erreur : chemin vers le répertoire temporaire inexistant sur le disque
        capt  = TR("Erreur");
        text += TR("Dr Tux ne peut pas trouver le répertoire temporaire pour travailler les fichiers PDF.<br>");
        text += TR("Vérifiez le fichier <b>drtux.ini</b> et ses paramètres.<br><br>");
        text += TR("Extrait de drtux.ini par défaut :<br>");
        text += TR("["FORM_PDF"]<br>");
        text += TR("&nbsp;&nbsp;Chemin vers PDF = ../../PDF<br>");
        text += TR("&nbsp;&nbsp;Application visualisateur de PDF = /usr/bin/acrobat<br>");
        text += TR("&nbsp;&nbsp;Chemin vers pdftk = /usr/bin/pdftk<br>");
        text += TR("<b>&nbsp;&nbsp;Chemin vers tmp = ../../PDF/tmp </b><br><br>");
        text += TR("Vérifier que le répertoire <b>");
        text += tmp.path();
        text += TR("</b> existe sur votre disque dur.<br><br>");
        box.setCaption("Erreur");
        box.setIcon(QMessageBox::Warning);
        box.setTextFormat(Qt::RichText);
        box.setText (text);
        box.setButtonText (0,"Ok");
        box.exec(); 
        return FALSE;
     }
  else tmpPath = tmp.path();

  // Tout c'est déroulé à merveille renvoie OK
  return TRUE;

}



//------------------------------------------ Form_Dec_MT ----------------------------------------------------
/*! \brief Prépare les données du formulaire "déclaration du médecin traitant" de la sécurité sociale française.
 * \param pdfFile : Nom du fichier "déclaration du médecin traitant". Ce fichier doit être stocké dans le répertoire spécifique aux PDF (cf drtux.ini)
 * \return Les données du formulaire au format FDF (prêtes à l'emploi)
*/
//-----------------------------------------------------------------------------------------------------------
QString CDevilFormPDF::Form_Dec_MT(const QString pdfFile)
{ QString fdfFile = "";
  QString field, value, tmp;
  int i;

 fdfFile  = Entete_FDF();
 field	= field.fromUtf8("nom prénom");
   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_NOM,
					m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey) + " " + 
		  m_pMB->GetFieldValue( m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_PRENOM,
					m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
   fdfFile += Add_Field_FDF ( field, value);
 

   // le patient est-il l'assuré ???    Testé OK
   tmp = m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_IS_ASS, 
				m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);

   if (tmp == "0")
    { // Non --> nom prénom de l'assuré
	field	= "nom";
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_NOM_ASS, 
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);

	field	= field.fromUtf8("prénom");
	value	= m_pMB->GetFieldValue( m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_PRENOM_ASS,
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);

	field	= "nom ben";
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_NOM,
						m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);

	field	= field.fromUtf8("prénom ben");
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_PRENOM, 
						m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);
    }
   else
    {	// Oui --> mettre num sécu chez patient rien ailleurs
	field	= "nom";
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_NOM,
						m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);
	
	field	= field.fromUtf8("prénom");
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_PRENOM, 
						m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);
    }

 QString numss 	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME,  m_pMB->m_DOSS_IDENT_NUMSS,
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
 if (numss.length() == 15)
 { field	= "imm 1";   	 value	= numss[0];    		fdfFile += Add_Field_FDF ( field, value);
   for ( i = 1; i < (int)(numss.length()-2); ++i)
	 {  field = "imm" + QString::number(i+1);	value = numss[i];  fdfFile += Add_Field_FDF ( field, value);  }
   field = field.fromUtf8("clé1"); 	   value	= numss[13];	   fdfFile += Add_Field_FDF ( field, value);

   field = field.fromUtf8("clé2");	   value	= numss[14];	   fdfFile += Add_Field_FDF ( field, value);
 }

  QVariant qvar;
  m_pMB->GetFieldValue(m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_NSS, m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey, &qvar);
  QDate qDteNss = qvar.toDate();
  QString dt   = qDteNss.toString(QString("ddMMyyyy"));
  field	= "j1";	value	= dt[0]; 	fdfFile += Add_Field_FDF ( field, value);
  field	= "j2";	value	= dt[1];	fdfFile += Add_Field_FDF ( field, value);
  field	= "m1";	value	= dt[2];	fdfFile += Add_Field_FDF ( field, value);
  field	= "m2"; value	= dt[3];	fdfFile += Add_Field_FDF ( field, value);
  field	= "an1"; value	= dt[4];	fdfFile += Add_Field_FDF ( field, value);
  field	= "an2"; value	= dt[5];	fdfFile += Add_Field_FDF ( field, value);
  field	= "an3"; value	= dt[6]; 	fdfFile += Add_Field_FDF ( field, value);
  field	= "an4"; value	= dt[7];	fdfFile += Add_Field_FDF ( field, value);

  field	= "adresse1";
  value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_RUE,
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
  fdfFile += Add_Field_FDF ( field, value);

  field	= "adresse2";
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_CODE_POST, 
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);

  field	= "adresse3";
	value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_VILLE,
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	fdfFile += Add_Field_FDF ( field, value);

  field	= "nom medecin";
	value	= m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_NOM, m_pMB->m_USER_IDENT_PRIMKEY, m_UserDocPk);

	fdfFile += Add_Field_FDF ( field, value);

  field	= field.fromUtf8("prénom médecin") ;
	value	= m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_PRENOM, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk);
	fdfFile += Add_Field_FDF ( field, value);

  QString adeli = m_pMB->GetFieldValue(	m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_NUM_ORDRE, 
						m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk);
	adeli = adeli.replace(" ","");
	for ( i = 0; i < (int) adeli.length(); ++i)
	  { field = "num ident med"+QString::number(i+1);  	value	= adeli[i];	fdfFile += Add_Field_FDF ( field, value); }
	field = "num iden med5";  	value	= adeli[4];	fdfFile += Add_Field_FDF ( field, value);

  field	= "identif  medecin";
	value	= "Dr " +  m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_NOM, m_pMB->m_USER_IDENT_PRIMKEY, m_UserDocPk) + " " + m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_PRENOM, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk) + "\n" +  m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_RUE, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk)  + " " + m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_CODE_POST, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk)  + " "+ m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_VILLE, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk) + "\n" + adeli;
	fdfFile += Add_Field_FDF ( field, value);

	dt = QDate::currentDate().toString("ddMMyyyy");
	for ( i = 0 ; i < 8 ; ++i)
	  { field = "dat"+QString::number(i+1);   value = dt[i]; 	fdfFile += Add_Field_FDF ( field, value);  }

	fdfFile += File_PDF_FDF ( pdfFile );
	fdfFile += Pied_FDF();
   return fdfFile;
}


//------------------------------------------ Form_ALD ---------------------------------------------------
/*! \brief Prépare les données du formulaire "Formulaire d'ALD" de la sécurité sociale française.
 * \param pdfFile : Nom du fichier "Formulaire ALD". Ce fichier doit être stocké dans le répertoire spécifique aux PDF (cf drtux.ini)
 * \return Les données du formulaire au format FDF (prêtes à l'emploi)
*/
//--------------------------------------------------------------------------------------------------------
QString CDevilFormPDF::Form_ALD(const QString pdfFile)
{ QString fdfFile = "";
  QString field, value, tmp1, tmp2, tmp3, tmp4, doc_type;
   doc_type = TR("Observation");

 fdfFile = Entete_FDF();

 field	= field.fromUtf8("nom prénom");
   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_NOM,
					m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey) + " " + 
		  m_pMB->GetFieldValue( m_pMB->m_DOSS_INDEX_TBL_NAME, m_pMB->m_DOSS_INDEX_PRENOM,
					m_pMB->m_DOSS_INDEX_PRIM_KEY , m_IdentPrimKey);
   fdfFile += Add_Field_FDF ( field, value);
 

   // le patient est-il l'assuré ???    Testé OK
   tmp4		= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_IS_ASS, 
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);

   if (tmp4 == "0")
    { // Non --> mettre num sécu chez l'assuré + nom prénom de l'assuré
	 field	= field.fromUtf8("nom prénom ass");
	   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_NOM_ASS, 
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey) + " " + 
			  m_pMB->GetFieldValue( m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_PRENOM_ASS,
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	   fdfFile += Add_Field_FDF ( field, value);

	 field	= "immat ass";
	   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME,  m_pMB->m_DOSS_IDENT_NUMSS,
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	   fdfFile += Add_Field_FDF ( field, value.left(13));

	 field	= field.fromUtf8("clé ass");
	   fdfFile += Add_Field_FDF ( field, value.right(2));
    }
   else
    { // Oui --> mettre num sécu chez patient rien ailleurs
	 field	= "immat";
	   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME,  m_pMB->m_DOSS_IDENT_NUMSS,
						m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	   fdfFile += Add_Field_FDF ( field, value.left(13));

	 field	= field.fromUtf8("clé");
	   fdfFile += Add_Field_FDF ( field, value.right(2));
    }


 field	= "adresse";
   value	= m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_RUE,
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey) + "  " +
		m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_CODE_POST, 
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey) + "  " +
		m_pMB->GetFieldValue(	m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_VILLE,
					m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey);
	
   fdfFile += Add_Field_FDF ( field, value);


 field	= "date naiss";
   QVariant qvar;
   m_pMB->GetFieldValue(m_pMB->m_DOSS_IDENT_TBL_NAME, m_pMB->m_DOSS_IDENT_NSS, m_pMB->m_DOSS_IDENT_REF_PK , m_IdentPrimKey, &qvar);
   QDate qDteNss = qvar.toDate();
   QString dt   = qDteNss.toString(QString("ddMMyyyy"));
   fdfFile += Add_Field_FDF ( field, dt);

 field	= "diag1";
   tmp1 	= "Diagnostic 1.";
   tmp2		= "En date pr";
   tmp3		= "";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value	= value.stripWhiteSpace();
   fdfFile += Add_Field_FDF ( field, value);

 field	= "diag2";
   tmp1 	= "Diagnostic 2.";
   tmp2		= "En date pr";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   fdfFile += Add_Field_FDF ( field, value);

   field	= "diag3";
   tmp1 	= "Diagnostic 3.";
   tmp2		= "En date pr";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   fdfFile += Add_Field_FDF ( field, value);

   field	= "date diag1";
   tmp1 	= "// dd-MM-yyyy //&nbsp;1:";
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
//   value	= value.replace("-","");      value = value.replace("/","");	value = value.replace(".","");
   fdfFile += Add_Field_FDF ( field, value);

   field	= "date diag2";
   tmp1 	= "// dd-MM-yyyy //&nbsp;2:";
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
//   value	= value.replace("-","");      value = value.replace("/","");	value = value.replace(".","");
   fdfFile += Add_Field_FDF ( field, value);

   field	= "date diag3";
   tmp1 	= "// dd-MM-yyyy //&nbsp;3:";
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
//   value	= value.replace("-","");      value = value.replace("/","");	value = value.replace(".","");
   fdfFile += Add_Field_FDF ( field, value);

   field	= "arguments";
   tmp1 	= "Argumentaire (en 6 lignes maximum)&nbsp;: ~&";
   tmp2		= "&~";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3).upper();
   value.replace("<BR>","\n");
   value.replace("<BR />","\n");
   value.stripWhiteSpace();
   fdfFile += "<< /T ("+field+") /V ("+value+") >>\n";

   // Récupère les spécialités pharmaceutiques proposées à l'ALD
   value 	= "";
   tmp4		= "";
   int i;
   int j;
   for (i = 0; i < 12; ++i)
     {	tmp1 	= tmp1.fromUtf8("Médicament proposé à l\'ALD "+QString::number(i+1)+"= ");
	tmp2	= "FinDeLigne";
	tmp4	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3) ;
	if (tmp4 != "") { value += tmp4 + "/;/"; }
     }
   i = 0;
   QStringList	medic = QStringList::split("/;/",value);
   for ( j = 0; j < (int)medic.count(); ++j)
    { if (medic[j] != "" && medic[j]!= " ")
       {field	= field.fromUtf8("spé phar"+QString::number(i+1));
	value	= medic[j];
	fdfFile += Add_Field_FDF ( field, value);
	i++;
       }
    }
  
   // Récupère les bio proposées		testé OK
   for ( i = 0; i < 3; ++i)
     {	field	= "suivi bio"+QString::number(i+1);
	tmp1 	= tmp1.fromUtf8("Biologie proposée "+QString::number(i+1)+".");
	tmp2	= "FinDeLigne";
	value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3) ;
	fdfFile += Add_Field_FDF ( field, value);
     }

   // Récupère les Cs spécialisées proposées	testé OK
   for ( i = 0; i < 3; ++i)
     {	field	= field.fromUtf8("rec spé"+QString::number(i+1));
	tmp1 	= tmp1.fromUtf8("Cs spécialisée "+QString::number(i+1)+".");
	tmp2	= "FinDeLigne";
	value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3) ;
	fdfFile += Add_Field_FDF ( field, value);
     }

   // Récupère les paramédicaux proposées	testé OK
   for ( i = 0; i < 3; ++i)
     {	field	= "rec pro"+QString::number(i+1);
	tmp1 	= tmp1.fromUtf8("Para-Médicaux "+QString::number(i+1)+".");
	tmp2	= "FinDeLigne";
	value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3) ;
	fdfFile += Add_Field_FDF ( field, value);
     }

   // Informations au patient
   field	= "infos mal";
   tmp1 	= "Informations pour le patient concernant sa maladie&nbsp;: ~&";
   tmp2		= "&~";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value.replace("<br>","\n");
   value.replace("<br />","\n");
   value.stripWhiteSpace();
   fdfFile += "<< /T ("+field+") /V ("+value+") >>\n";

   field	= "infos mal2";
   value	= value.fromUtf8("Informations expliquées au patient.");
   fdfFile += Add_Field_FDF ( field, value);

   field	= "date pro";
   value	= QDate::currentDate().toString("dd/MM/yyyy");;
   fdfFile += Add_Field_FDF ( field, value);

   // Identification du médecin
   field	= field.fromUtf8("ident méd");
   value	= "Dr " +  m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_NOM, m_pMB->m_USER_IDENT_PRIMKEY, m_UserDocPk) + " " + m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_PRENOM, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk);
   fdfFile += Add_Field_FDF ( field, value);

   field	= field.fromUtf8("ident méd2");
   value	= m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_RUE, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk)  + " " + m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_CODE_POST, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk)  + " "+ m_pMB->GetFieldValue(m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_VILLE, m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk);
   fdfFile += Add_Field_FDF ( field, value);

   field	= field.fromUtf8("num ident méd");
   value	= m_pMB->GetFieldValue(	m_pMB->m_USER_IDENT_TBL_NAME, m_pMB->m_USER_IDENT_NUM_ORDRE, 
						m_pMB->m_USER_IDENT_PRIMKEY , m_UserDocPk);
   fdfFile += Add_Field_FDF ( field, value);

   // Proposition d'ALD (cases à cocher)  ATTENTION fonctionne avec une liste qui ne doit pas être modifiée !!!
   //								Testé OK
   tmp1 	= tmp1.fromUtf8("ALD proposée&nbsp;:");
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value 	= value.stripWhiteSpace();

   if (value == "ALD 30")
     { field = "ALD2"; }
   else if (value == "ALD autres")
     { field = "ALD5"; }
   else if (value == "ALD hors-liste")
     { field = "ALD3"; }
   else if (value == QString::fromUtf8("ALD non exonérante"))
     { field = "ALD1"; }
   else if (value == "Poly-pathologie")
     { field = "ALD4"; }
   else { field = "ALD5"; }
   value	= "Oui";
   fdfFile +=  "<< /T ("+field+") /V ("+value+") >>\n";

   // Durées : soins, arrêt de travail
   field	= field.fromUtf8("durée soins");
   tmp1 	= value.fromUtf8("durée prévisible des soins :");
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   fdfFile += Add_Field_FDF ( field, value);

   field	= field.fromUtf8("durée arrêt");
   tmp1 	= value.fromUtf8("durée prévisible de l'arrêt de travail, s'il y a lieu :");
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   fdfFile += Add_Field_FDF ( field, value);

   // Reclassement professionnel
   field	= "Recl pro";
   tmp1 	= value.fromUtf8("reclassement professionnel est envisagé =");
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value.replace("\t","");
   value 	= value.stripWhiteSpace();
   if (value.lower() == "oui")		{ value = "Oui"; }  
   else if (value.lower() == "non") 	{ value = "Off"; }
   else 				{ value = ""; }
   fdfFile += "<< /T ("+field+") /V ("+value+") >>\n";

   // Pour le réglement ,  Date d'examen
   field	= "date examen";
   tmp1 	= "examen // dd/MM/yyyy //</span> :";
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value 	= value.stripWhiteSpace();
   fdfFile += Add_Field_FDF ( field, value);

   // Examen en C ou en V
   field	= "exam";
   tmp1 	= "En consultation (C) ou en visite (V) :";
   tmp2		= "FinDeLigne";
   value	= m_pCDevil->Func_Extract(doc_type, tmp1, tmp2, tmp3, tmp3);
   value 	= value.stripWhiteSpace();
   if (value.lower() == "c")		{ value = "oui"; }  
   else if (value.lower() == "v") 	{ value = "non"; }
   else 				{ value = ""; }
   fdfFile += "<< /T ("+field+") /V ("+value+") >>\n";

   fdfFile += File_PDF_FDF ( pdfFile );
  fdfFile += Pied_FDF();
 return fdfFile;
}


