rem: (!operation
add: (!transaction
context: gint verification_validation_operation ( struct structure_operation *operation ){    gchar **tableau_char;    GSList *liste_tmp;    /* on vérifie qu'il y a bien une date */    if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_DATE) ) != style_entree_formulaire[ENCLAIR] )    {	dialogue_error ( _("You must enter a date.") );	return (FALSE);    }    /* vérifie que la date est correcte */    if ( !modifie_date ( widget_formulaire_par_element (TRANSACTION_FORM_DATE) ))    {	dialogue_error ( _("Invalid date") );	gtk_entry_select_region ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_DATE) ),				  0,				  -1);	gtk_widget_grab_focus ( widget_formulaire_par_element (TRANSACTION_FORM_DATE) );	return (FALSE);    }    /* vérifie que la date de valeur est correcte */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_VALUE_DATE )	 &&	 gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_VALUE_DATE) ) == style_entree_formulaire[ENCLAIR]	 &&	 !modifie_date ( widget_formulaire_par_element (TRANSACTION_FORM_VALUE_DATE) ) )    {	dialogue_error ( _("Invalid value date.") );	gtk_entry_select_region ( GTK_ENTRY (  widget_formulaire_par_element (TRANSACTION_FORM_VALUE_DATE) ),				  0,				  -1);	gtk_widget_grab_focus ( widget_formulaire_par_element (TRANSACTION_FORM_VALUE_DATE) );	return (FALSE);    }    /* vérification que ce n'est pas un virement sur lui-même */    /* et que le compte de virement existe */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CATEGORY )	 &&	 gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) ) -> entry ) == style_entree_formulaire[ENCLAIR] )    {	tableau_char = g_strsplit ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) )),				    ":",				    2 );	tableau_char[0] = g_strstrip ( tableau_char[0] );	if ( tableau_char[1] )	    tableau_char[1] = g_strstrip ( tableau_char[1] );	/* Si c'est un virement, on fait les vérifications */		if ( !strcmp ( tableau_char[0], _("Transfer") ) )	{	    /* S'il n'y a rien après "Transfer", alors : */	    	    if ( !tableau_char[1] ||		 !strlen ( tableau_char[1] ) )	    {		dialogue_error ( _("There is no associated account for this transfer.") );		return (FALSE);	    }	    	    /* si c'est un virement vers un compte supprimé, laisse passer */	    if ( strcmp ( tableau_char[1],			  _("Deleted account") ) )	    {		/* recherche le no de compte du virement */		gint compte_virement;		GSList *list_tmp;		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),					 tableau_char[1] ) )			compte_virement = i;		    list_tmp = list_tmp -> next;		}		if ( compte_virement == -1 )		{		    dialogue_warning ( _("Associated account of this transfer is invalid.") );		    return (FALSE);		}		if ( compte_virement == compte_courant )		{		    dialogue_error ( _("Can't issue a transfer its own account.") );		    return (FALSE);		}		/* 		    vérifie si le compte n'est pas clos */		if ( gsb_account_get_closed_account (compte_virement) )		{		    dialogue_error ( _("Can't issue a transfer on a closed account." ));		    return ( FALSE );		}	    }	}	g_strfreev ( tableau_char );    }    /* pour les types qui sont à incrémentation automatique ( surtout les chèques ) */    /* on fait le tour des operations pour voir si le no n'a pas déjà été utilisé */    /* si operation n'est pas nul, c'est une modif donc on ne fait pas ce test */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CHEQUE )	 &&	 GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_CHEQUE) ))    {	struct struct_type_ope *type;	type = gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ) -> menu_item ),				     "adr_type" );	if ( type -> numerotation_auto )	{	    struct structure_operation *operation_tmp;	    /* vérifie s'il y a quelque chose */	    if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_CHEQUE) ) == style_entree_formulaire[ENGRIS] )	    {		if ( question ( _("Selected method of payment has an automatic incremental number\nbut doesn't contain any number.\nContinue anyway?") ) )		    goto sort_test_cheques;		else		    return (FALSE);	    }	    /* vérifie si le no de chèque n'est pas déjà utilisé */	    operation_tmp = operation_par_cheque ( my_atoi ( g_strdup ( gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_CHEQUE) )))),						   compte_courant );	    /* si on a trouvé le même no de chèque, si c'est une nouvelle opé, c'est pas normal, */	    /* si c'est une modif d'opé, c'est normal que si c'est cette opé qu'on a trouvé */	    if ( operation_tmp		 &&		 (!operation		  ||		  operation_tmp -> no_operation != operation -> no_operation ))	    {		if ( question ( _("Warning: this cheque number is already used.\nContinue anyway?") ))		    goto sort_test_cheques;		else		    return (FALSE);	    }	}    }sort_test_cheques :    /* vérifie  si c'est une opération ventilée, */    /* si c'est le cas, si la liste des ventilation existe (soit adr de liste, soit -1), on va l'enregistrer plus tard */    /* sinon on va ventiler tout de suite */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CATEGORY )	 &&	 GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_BREAKDOWN))	 &&	 !gtk_object_get_data ( GTK_OBJECT ( formulaire ),				"liste_adr_ventilation" ))    {	enregistre_ope_au_retour = 1;	if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_DEBIT) ) == style_entree_formulaire[ENCLAIR] )	    ventiler_operation ( -my_strtod ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_DEBIT))),					      NULL ));	else	    ventiler_operation ( my_strtod ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_CREDIT))),					     NULL ));	return (FALSE);    }    /* on vérifie si le tiers est un état, que c'est une nouvelle opération */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_PARTY )	 &&	 !strncmp ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_PARTY) ))),		    COLON(_("Report")),		    7 ))    {	gint trouve;	/* on vérifie d'abord si c'est une modif d'opé */	if ( operation )	{	    dialogue_error ( _("A transaction with a multiple third party must be a new one.") );	    return (FALSE);	}	/* on vérifie maintenant si l'état existe */	tableau_char = g_strsplit ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_PARTY) ))),				    ":",				    2 );	if ( tableau_char[1] )	{	    tableau_char[1] = g_strstrip ( tableau_char[1] );	    liste_tmp = liste_struct_etats;	    trouve = 0;	    while ( liste_tmp )	    {		struct struct_etat *etat;		etat = liste_tmp -> data;		if ( !strcmp ( etat -> nom_etat,			       tableau_char[1] ))		{		    trouve = 1;		    liste_tmp = NULL;		}		else		    liste_tmp = liste_tmp -> next;	    }	    g_strfreev ( tableau_char );	    if ( !trouve )	    {		dialogue_error ( _("Invalid multiple third party.") );		return (FALSE);	    }	}	else	{	    dialogue_error  ( _("The word \"Report\" is reserved. Please use another one."));		return FALSE;	}    }    /* Check if there is no budgetary line (see #208) */    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_BUDGET )	 &&	 gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_BUDGET) ) -> entry ) == style_entree_formulaire[ENGRIS] )      {	dialogue_conditional_hint ( _("No budgetary line was entered"),				    _("This transaction has no budgetary line entered.  You should use them to easily produce budgets and make reports on them."),				    &(etat.display_message_no_budgetary_line) );	return FALSE;     }    return ( TRUE );}