rem: ajout_operation ( contre_operation );
add: { gsb_transactions_append_transaction ( contre_operation ); gsb_transactions_list_append_new_transaction ( contre_operation ); }
context: void validation_virement_operation ( struct structure_operation *operation,				     gint modification,				     gchar *nom_compte_vire ){    struct struct_devise *devise, *devise_compte_2;    struct structure_operation *contre_operation;    gint compte_virement;    GSList *list_tmp;    /* on n'a plus besoin de faire de tests, ceux ci ont été fait dans verification_validation_operation */    /* récupère le no du compte de la contre opération */    compte_virement = -1;    list_tmp = list_struct_accounts;    while ( list_tmp )    {	gint i;	i = gsb_account_get_no_account ( list_tmp -> data );	if ( !g_strcasecmp ( gsb_account_get_name (i),			     nom_compte_vire ))	{	    compte_virement = i;	    i = gsb_account_get_accounts_amount ();	}	list_tmp = list_tmp -> next;    }    /*   2 possibilités, 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 opération */    /*     on supprime l'ancienne contre opération 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-opération pour la recréer plus tard */	/* soit c'est un virement vers le même compte et dans ce cas on fait rien, la contre opé sera modifiée automatiquement */	/* soit ce n'était pas un virement et dans ce cas on considère l'opé comme une nouvelle opé */	if ( operation -> relation_no_operation )	{	    /* c'était déjà 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 opération */		contre_operation = operation_par_no ( operation -> relation_no_operation,						      operation -> relation_no_compte );		if ( contre_operation )		{		    contre_operation -> relation_no_operation = 0;		    supprime_operation ( contre_operation );		    modification = 0;		}	    }	}	else	{	    /* ce n'était pas un virement, on considère que c'est une nouvelle opé pour créer la contre opération */	    modification = 0;	}    }    /*   on en est maintenant à soit nouveau virement, soit modif de virement sans chgt de compte */    if ( modification	 &&	 operation -> relation_no_operation )	contre_operation = operation_par_no ( operation -> relation_no_operation,					      compte_virement );    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 = devise_par_no ( gsb_account_get_currency (compte_virement) );    devise = devise_par_no ( operation -> devise );    contre_operation -> devise = operation -> devise;    if ( !( contre_operation-> no_operation	    ||	    devise -> no_devise == gsb_account_get_currency (compte_virement)	    ||	    ( devise_compte_2 -> passage_euro && is_euro(devise))	    ||	    ( is_euro(devise_compte_2) && devise -> passage_euro )))    {	/* c'est une devise étrangère, 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;    /* récupération du type de l'autre opé */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA )	 &&	 GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ))	contre_operation -> type_ope = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ) -> menu_item ),									       "no_type" ));    else    {	contre_operation -> type_ope = 0;    }    if ( contre_operation -> type_ope	 &&	 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 );//    contre_operation -> pointe = operation -> pointe;//    contre_operation -> no_rapprochement = operation -> no_rapprochement;    /*   on a fini de remplir l'opé, on peut l'ajouter Ã  la liste */    if ( contre_operation -> no_operation )	modifie_operation ( contre_operation );    else	ajout_operation ( contre_operation );    /* on met maintenant les relations entre les diffÃ©rentes 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;    /*     on réaffiche juste les 2 opés, sans rien modifier d'autre */    /* 	juste pour afficher la categ (virement) */    remplit_ligne_operation ( operation,			      NULL );    remplit_ligne_operation ( contre_operation,			      NULL );	}