rem: gint compte_virement; gint i; struct struct_devise *devise; struct struct_devise *devise_compte_2;
add: struct struct_devise *devise, *devise_compte_2;
context: void validation_virement_operation ( struct structure_operation *operation,				     gint modification,				     gchar *nom_compte_vire ){  gint compte_virement;  gint i;  struct struct_devise *devise;  struct struct_devise *devise_compte_2;  struct structure_operation *contre_operation;  gpointer **save_ptab;  save_ptab = p_tab_nom_de_compte_variable;  /* on n'a plus besoin de faire de tests, ceux ci ont t fait dans verification_validation_operation */  /* rcupre le no du compte de la contre opration */  compte_virement = -1;  for ( i = 0 ; i < nb_comptes ; i++ )    {      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + i;      if ( !g_strcasecmp ( NOM_DU_COMPTE,			   nom_compte_vire ))	{	  compte_virement = i;	  i = nb_comptes;	}    }  /*   2 possibilits, soit c'est un nouveau virement ou une modif qui n'tait pas un virement, */  /* soit c'est une modif de virement */  /*     dans le 2nd cas, si on a modifi le compte de la contre opration */  /*     on supprime l'ancienne contre opration et c'est un nouveau virement */  if ( modification )    {      /*       c'est une modif d'op */      /* 	soit c'tait un virement vers un autre compte et dans ce cas on vire la contre-opration pour la recrer plus tard */      /* soit c'est un virement vers le mme compte et dans ce cas on fait rien, la contre op sera modifie automatiquement */      /* soit ce n'tait pas un virement et dans ce cas on considre l'op comme une nouvelle op */      if ( operation -> relation_no_operation )	{	  /* c'tait dj un virement, on ne vire la contre op que si le compte cible a chang */	  if ( operation -> relation_no_compte != compte_virement )	    {	      /* il faut retirer l'ancienne contre opration */	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	      contre_operation = g_slist_find_custom ( LISTE_OPERATIONS,						       GINT_TO_POINTER ( operation -> relation_no_operation ),						       ( GCompareFunc ) recherche_operation_par_no ) -> data;	      contre_operation -> relation_no_operation = 0;	      supprime_operation ( contre_operation );	      modification = 0;	    }	}      else	{	  /* ce n'tait pas un virement, on considre que c'est une nouvelle op pour crer la contre opration */	  modification = 0;	}    }  /*   on en est maintenant  soit nouveau virement, soit modif de virement sans chgt de compte */  p_tab_nom_de_compte_variable = p_tab_nom_de_compte + compte_virement;  if ( modification       &&       operation -> relation_no_operation )    contre_operation = g_slist_find_custom ( LISTE_OPERATIONS,					     GINT_TO_POINTER ( operation -> relation_no_operation ),					     ( GCompareFunc ) recherche_operation_par_no ) -> data;  else    {      contre_operation = calloc ( 1,			     sizeof ( struct structure_operation ) );      contre_operation -> no_compte = compte_virement;      contre_operation -> taux_change = 0;      contre_operation -> frais_change = 0;    }  /* remplit la nouvelle op */        contre_operation -> jour = operation -> jour;  contre_operation -> mois = operation -> mois;  contre_operation -> annee = operation -> annee;  contre_operation -> date = g_date_new_dmy ( contre_operation->jour,					      contre_operation->mois,					      contre_operation->annee);  contre_operation -> montant = -operation -> montant;  /* si c'est la devise du compte ou si c'est un compte qui doit passer  l'euro ( la transfo se fait au niveau */  /* de l'affichage de la liste ) ou si c'est un compte en euro et l'op est dans une devise qui doit passer  l'euro -> ok */  devise_compte_2 = g_slist_find_custom ( liste_struct_devises,					  GINT_TO_POINTER ( DEVISE ),					  ( GCompareFunc ) recherche_devise_par_no ) -> data;  devise = gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[TRANSACTION_FORM_DEVISE] ) -> menu_item ),				 "adr_devise" );  contre_operation -> devise = operation -> devise;  if ( !( contre_operation-> no_operation	  ||	  devise -> no_devise == DEVISE	  ||	  ( devise_compte_2 -> passage_euro && !strcmp ( devise -> nom_devise, _("Euro") ))	  ||	  ( !strcmp ( devise_compte_2 -> nom_devise, _("Euro") ) && devise -> passage_euro )))    {      /* c'est une devise trangre, on demande le taux de change et les frais de change */	        demande_taux_de_change ( devise_compte_2, devise, 1,			       (gdouble ) 0, (gdouble ) 0, FALSE );      contre_operation -> taux_change = taux_de_change[0];      contre_operation -> frais_change = taux_de_change[1];      if ( contre_operation -> taux_change < 0 )	{	  contre_operation -> taux_change = -contre_operation -> taux_change;	  contre_operation -> une_devise_compte_egale_x_devise_ope = 1;	}    }  contre_operation -> tiers = operation -> tiers;  contre_operation -> categorie = operation -> categorie;  contre_operation -> sous_categorie = operation -> sous_categorie;  if ( operation -> notes )    contre_operation -> notes = g_strdup ( operation -> notes);  contre_operation -> auto_man = operation -> auto_man;  /* rcupration du type de l'autre op */  if ( GTK_WIDGET_VISIBLE ( widget_formulaire_operations[TRANSACTION_FORM_CONTRA] ))    contre_operation -> type_ope = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_operations[TRANSACTION_FORM_CONTRA] ) -> menu_item ),								      "no_type" ));  else    {      contre_operation -> type_ope = 0;      operation -> contenu_type = NULL;    }  if ( operation -> contenu_type )    contre_operation -> contenu_type = g_strdup ( operation -> contenu_type );  contre_operation -> no_exercice = operation -> no_exercice;  contre_operation -> imputation = operation -> imputation;  contre_operation -> sous_imputation = operation -> sous_imputation;  if ( operation -> no_piece_comptable )    contre_operation -> no_piece_comptable = g_strdup ( operation -> no_piece_comptable );  if ( operation -> info_banque_guichet )    contre_operation -> info_banque_guichet = g_strdup ( operation -> info_banque_guichet );  /*   on a fini de remplir l'op, on peut l'ajouter  la liste */  ajout_operation ( contre_operation );  /* on met maintenant les relations entre les diffrentes op */  operation -> relation_no_operation = contre_operation -> no_operation;  operation -> relation_no_compte = contre_operation -> no_compte;  contre_operation -> relation_no_operation = operation -> no_operation;  contre_operation -> relation_no_compte = operation -> no_compte;  p_tab_nom_de_compte_variable = save_ptab;}