[grisbi-cvs] grisbi/src gsb_account_property.c,1.30,1.31
Pierre Biava
pbiava at users.sourceforge.net
Wed Apr 8 23:02:33 CEST 2009
Update of /cvsroot/grisbi/grisbi/src
In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv3729
Modified Files:
gsb_account_property.c
Log Message:
Addition of control of number IBAN
Index: gsb_account_property.c
===================================================================
RCS file: /cvsroot/grisbi/grisbi/src/gsb_account_property.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -d -r1.30 -r1.31
--- gsb_account_property.c 7 Apr 2009 21:07:40 -0000 1.30
+++ gsb_account_property.c 8 Apr 2009 21:02:26 -0000 1.31
@@ -80,6 +80,8 @@
gint start_pos,
gint end_pos,
GtkWidget *combobox );
+static void gsb_account_property_iban_display_bank_data ( gint current_account,
+ gint bank_number );
static gboolean gsb_account_property_iban_focus_in_event ( GtkWidget *entry,
GdkEventFocus *ev,
gpointer data );
@@ -1156,26 +1158,18 @@
if ( iban == NULL || strlen (iban) == 0 )
{
- gsb_account_property_set_label_code_banque ( );
- gsb_autofunc_entry_set_value (detail_guichet,
- gsb_data_account_get_bank_branch_code (
- current_account), current_account);
- gsb_autofunc_entry_set_value (detail_no_compte,
- gsb_data_account_get_bank_account_number (
- current_account), current_account );
- gsb_autofunc_entry_set_value (detail_cle_compte,
- gsb_data_account_get_bank_account_key (
- current_account), current_account );
+ gsb_account_property_iban_display_bank_data ( current_account,
+ bank_number );
return FALSE;
}
s_iban = gsb_account_property_iban_get_struc ( g_strndup (iban, 2) );
- /* on ne fixe pas les données banquaires pour un IBAN sans modèle */
+ /* on affiche les données banquaires pour un IBAN sans modèle */
if ( g_strcmp0 (s_iban -> locale, "XX") == 0 )
{
- gsb_bank_list_set_bank (bank_list_combobox, 0, current_account );
- gtk_label_set_text ( GTK_LABEL (label_code_banque), "" );
+ gsb_account_property_iban_display_bank_data ( current_account,
+ bank_number );
gsb_account_property_iban_switch_bank_data ( TRUE );
return FALSE;
}
@@ -1330,6 +1324,27 @@
/**
+ *
+ *
+ *
+ *
+ * */
+void gsb_account_property_iban_display_bank_data ( gint current_account,
+ gint bank_number )
+{
+ gtk_label_set_text ( GTK_LABEL (label_code_banque),
+ gsb_data_bank_get_code (bank_number) );
+ gsb_autofunc_entry_set_value (detail_guichet,
+ gsb_data_account_get_bank_branch_code (
+ current_account), current_account);
+ gsb_autofunc_entry_set_value (detail_no_compte,
+ gsb_data_account_get_bank_account_number (
+ current_account), current_account );
+ gsb_autofunc_entry_set_value (detail_cle_compte,
+ gsb_data_account_get_bank_account_key (
+ current_account), current_account );
+}
+/**
* Contrôle la validité du numéro IBAN (non opérationnel pour la partie IBAN)
*
* \param le numéro IBAN
@@ -1341,9 +1356,14 @@
struct iso_13616_iban *s_iban;
gchar *model;
gchar *tmpstr = NULL;
+ gchar *substr;
gchar *ptr = NULL;
gchar *buffer = NULL;
+ GString *gstring;
gint i = 0;
+ gulong lnum;
+ gint reste = 0;
+ gint result = 0;
if ( iban == NULL )
return 0;
@@ -1352,24 +1372,29 @@
s_iban = gsb_account_property_iban_get_struc ( g_strndup (iban, 2) );
- /* on ne contrôle pas l'IBAN sans modèle */
- if ( g_strcmp0 (s_iban -> locale, "XX") == 0 )
- return 1;
- else
- {
+ model = my_strdelimit ( s_iban -> iban, " -", "" );
+ tmpstr = my_strdelimit ( iban, " -", "" );
- model = my_strdelimit ( s_iban -> iban, " -", "" );
- tmpstr = my_strdelimit ( iban, " -", "" );
- if ( g_utf8_strlen (model, -1) != g_utf8_strlen (tmpstr, -1) )
- {
- g_free ( model );
- g_free ( tmpstr );
- return 0;
- }
+ /* on ne contrôle pas la longueur d'un IBAN sans modèle */
+ if ( g_strcmp0 (s_iban -> locale, "XX") != 0 &&
+ g_utf8_strlen (model, -1) != g_utf8_strlen (tmpstr, -1) )
+ {
+ g_free ( model );
+ g_free ( tmpstr );
+ return 0;
}
- /* mise en forme de l'IBAN avant contrôle */
- tmpstr = g_strconcat ( tmpstr + 4, g_strndup (tmpstr, 2), "00", NULL );
+ /* mise en forme de l'IBAN avant contrôle
+ * on place les 4 premiers caractères en fin de chaine et on remplace
+ * les 2 chiffres du code de contrôle par des 0.
+ * Ensuite on remplace les lettres par des chiffres selon un
+ * codage particulier A = 10 B = 11 etc...
+ */
+
+ if ( strlen (tmpstr) > 4 )
+ tmpstr = g_strconcat ( tmpstr + 4, g_strndup (tmpstr, 2), "00", NULL );
+ else
+ return 0;
ptr = tmpstr;
while ( ptr[i] )
@@ -1379,7 +1404,7 @@
if ( buffer == NULL )
buffer = g_strdup_printf ( "%c", ptr[i] );
else
- buffer = g_strconcat ( buffer,
+ buffer = g_strconcat ( buffer,
g_strdup_printf ("%c", ptr[i]), NULL );
}
else
@@ -1387,17 +1412,51 @@
if ( buffer == NULL )
buffer = g_strdup_printf ( "%d", ptr[i] - 55 );
else
- buffer = g_strconcat ( buffer,
+ buffer = g_strconcat ( buffer,
g_strdup_printf ("%d", ptr[i] - 55), NULL );
}
i++;
}
- /* pas encore réussi à vérifier le calcul de l'IBAN */
+ g_free ( tmpstr );
+ /* vérification du calcul de l'IBAN
+ *
+ * methode : on procède par étapes
+ * on prend les 9 premiers chiffres et on les divise par 97
+ * on ajoute au reste les 7 ou 8 chiffres suivants que l'on divise par 97
+ * on procède ainsi jusqu'a la fin de la chaine. Ensuite on soustrait le
+ * dernier reste à 98 ce qui donne le code de contrôle
+ */
+ gstring = g_string_new ( buffer );
- g_free ( buffer );
+ while ( gstring -> len > 0 )
+ {
+ substr = g_strndup ( gstring -> str, 9 );
+ lnum = ( gulong ) my_strtod ( substr, NULL );
+ reste = lnum % 97;
+ g_free ( substr );
+
+ if ( gstring -> len >= 9 )
+ {
+ gstring = g_string_erase ( gstring, 0, 9 );
+ gstring = g_string_prepend ( gstring,
+ g_strdup_printf ("%d", reste) );
+ }
+ else
+ break;
+ }
- return 1;
+ g_string_free ( gstring, TRUE );
+
+ tmpstr = g_strdup_printf ("%d", 98 - reste );
+
+ if ( g_strcmp0 ( tmpstr, g_strndup (iban + 2, 2) ) == 0 )
+ result = 1;
+ else
+ result = 0;
+ g_free ( tmpstr );
+
+ return result;
}
/* Local Variables: */
/* c-basic-offset: 4 */
More information about the cvs
mailing list