[grisbi-devel] [PATCH] Fixes bug 1582. Simplification of research of existing transactions
pbiava
pierre.biava at nerim.net
Tue May 7 21:05:55 CEST 2013
---
src/gsb_data_transaction.c | 48 +++-
src/gsb_data_transaction.h | 2 +
src/import.c | 634 ++++++++++++++++++++++-----------------------
3 files changed, 359 insertions(+), 325 deletions(-)
diff --git a/src/gsb_data_transaction.c b/src/gsb_data_transaction.c
index 45954ba..d89592b 100644
--- a/src/gsb_data_transaction.c
+++ b/src/gsb_data_transaction.c
@@ -2546,8 +2546,7 @@ gint gsb_data_transaction_find_by_id ( gchar *id, gint account_number )
&&
!strcmp ( id, transaction -> transaction_id )
&&
- account_number == gsb_data_transaction_get_account_number (
- transaction -> transaction_number ) )
+ account_number == transaction -> account_number )
return transaction -> transaction_number;
tmp_list = tmp_list -> next;
@@ -2779,6 +2778,51 @@ gboolean gsb_data_transaction_remove_transaction_in_transaction_list ( gint tran
/**
+ * renvoie la liste des opérations concernées par un fichier importé.
+ *
+ * \param account_number
+ * \param first_date_import date de début de recherche
+ *
+ * \return
+ * */
+GSList *gsb_import_get_transactions_list_for_import ( gint account_number,
+ GDate *first_date_import )
+{
+ GSList *tmp_list;
+ GSList *ope_list = NULL;
+
+ tmp_list = g_slist_copy ( transactions_list );
+ tmp_list = g_slist_sort ( tmp_list, (GCompareFunc) classement_sliste_transactions_par_date_decroissante );
+
+ while ( tmp_list )
+ {
+ struct_transaction *transaction;
+ GDate *ope_date;
+
+ transaction = tmp_list->data;
+
+ if ( transaction->value_date && g_date_valid ( transaction->value_date ) )
+ ope_date = transaction->value_date;
+ else
+ ope_date = transaction->date;
+
+ if ( transaction->account_number == account_number
+ &&
+ g_date_compare ( ope_date, first_date_import ) >= 0 )
+ {
+ ope_list = g_slist_append ( ope_list, GINT_TO_POINTER ( transaction->transaction_number ) );
+ }
+
+ tmp_list = tmp_list->next;
+ }
+
+ g_slist_free ( tmp_list );
+
+ return ope_list;
+}
+
+
+/**
*
*
*
diff --git a/src/gsb_data_transaction.h b/src/gsb_data_transaction.h
index f0095fe..4a96630 100644
--- a/src/gsb_data_transaction.h
+++ b/src/gsb_data_transaction.h
@@ -72,6 +72,8 @@ const gchar *gsb_data_transaction_get_transaction_id ( gint transaction_number )
gint gsb_data_transaction_get_transaction_number ( gpointer transaction_pointer );
GSList *gsb_data_transaction_get_transactions_list ( void );
GSList *gsb_data_transaction_get_transactions_list_by_date ( void );
+GSList *gsb_import_get_transactions_list_for_import ( gint account_number,
+ GDate *first_date_import );
const GDate *gsb_data_transaction_get_value_date ( gint transaction_number );
const GDate *gsb_data_transaction_get_value_date_or_date ( gint transaction_number );
const gchar *gsb_data_transaction_get_voucher ( gint transaction_number );
diff --git a/src/import.c b/src/import.c
index a324eef..feda780 100644
--- a/src/import.c
+++ b/src/import.c
@@ -2,7 +2,7 @@
/* */
/* Copyright (C) 2000-2008 Cédric Auger (cedric at grisbi.org) */
/* 2004-2008 Benjamin Drieu (bdrieu at april.org) */
-/* 2008-2009 Pierre Biava (grisbi at pierre.biava.name) */
+/* 2008-2013 Pierre Biava (grisbi at pierre.biava.name) */
/* http://www.grisbi.org */
/* */
/* This program is free software; you can redistribute it and/or modify */
@@ -2049,6 +2049,8 @@ void gsb_import_add_imported_transactions ( struct struct_compte_importation *im
account_number,
first_date_import );
+ g_date_free ( first_date_import );
+
/* if we are not sure about some transactions, ask now */
if ( demande_confirmation )
confirmation_enregistrement_ope_import ( imported_account, account_number );
@@ -2121,16 +2123,19 @@ gboolean gsb_import_define_action ( struct struct_compte_importation *imported_a
gint account_number,
GDate *first_date_import )
{
+ GSList *ope_list;
GSList *list_tmp;
gint demande_confirmation = FALSE;
- GSList *list_tmp_transactions;
- list_tmp = imported_account -> operations_importees;
+ /* on récupère la liste des opérations dans l'intervalle de recherche pour l'import */
+ ope_list = gsb_import_get_transactions_list_for_import ( account_number, first_date_import );
+
+ list_tmp = imported_account->operations_importees;
while ( list_tmp )
{
+ GSList *list_tmp_transactions;
struct struct_ope_importation *imported_transaction;
- gint transaction_no;
imported_transaction = list_tmp -> data;
@@ -2141,91 +2146,71 @@ gboolean gsb_import_define_action ( struct struct_compte_importation *imported_a
imported_transaction -> tiers = my_strdelimit (
imported_transaction -> tiers, "&", "°" );
- /* first check the id */
- if ( imported_transaction -> id_operation
- &&
- ( transaction_no = gsb_data_transaction_find_by_id (
- imported_transaction -> id_operation, account_number ) ) )
+ list_tmp_transactions = ope_list;
+ while ( list_tmp_transactions )
{
- /* the id exists with the same account_nb, so the transaction is already
- * in grisbi we will forget that transaction */
- if ( g_date_compare ( imported_transaction -> date,
- gsb_data_transaction_get_date ( transaction_no ) ) == 0 )
+ gint transaction_number;
+ const gchar *tmp_str;
+ GDate *date_debut_comparaison;
+ GDate *date_fin_comparaison;
+ GDateDay day;
+ GDateMonth month;
+ GDateYear year;
+
+ transaction_number = GPOINTER_TO_INT ( list_tmp_transactions->data );
+
+ list_tmp_transactions = list_tmp_transactions->next;
+
+ /* first check the id */
+ tmp_str = gsb_data_transaction_get_id ( transaction_number );
+ if ( tmp_str && strcmp ( imported_transaction->id_operation, tmp_str ) == 0 )
{
+ imported_transaction->action = IMPORT_TRANSACTION_LEAVE_TRANSACTION;
+ continue;
+ }
+ /* if no id, check the cheque */
+ if ( imported_transaction->cheque
+ &&
+ gsb_data_transaction_find_by_payment_content ( imported_transaction -> cheque, account_number ) )
+ {
+ /* found the cheque, forget that transaction */
imported_transaction -> action = IMPORT_TRANSACTION_LEAVE_TRANSACTION;
+ continue;
}
- }
+ /* no id, no cheque, try to find the transaction */
+ day = g_date_get_day ( imported_transaction->date );
+ month = g_date_get_month ( imported_transaction->date );
+ year = g_date_get_year ( imported_transaction->date );
- /* if no id, check the cheque */
- if ( imported_transaction -> action != IMPORT_TRANSACTION_LEAVE_TRANSACTION
- &&
- imported_transaction -> cheque
- &&
- gsb_data_transaction_find_by_payment_content ( imported_transaction -> cheque,
- account_number ) )
- {
- /* found the cheque, forget that transaction */
- imported_transaction -> action = IMPORT_TRANSACTION_LEAVE_TRANSACTION;
- }
+ date_debut_comparaison = g_date_new_dmy ( day, month, year );
+ g_date_subtract_days ( date_debut_comparaison, valeur_echelle_recherche_date_import );
- /* no id, no cheque, try to find the transaction */
- if ( imported_transaction -> action != IMPORT_TRANSACTION_LEAVE_TRANSACTION )
- {
- list_tmp_transactions = gsb_data_transaction_get_transactions_list ();
+ date_fin_comparaison = g_date_new_dmy ( day, month, year );
+ g_date_add_days ( date_fin_comparaison, valeur_echelle_recherche_date_import );
- while ( list_tmp_transactions )
+ if ( !gsb_real_cmp ( gsb_data_transaction_get_amount (
+ transaction_number), imported_transaction->montant )
+ &&
+ ( g_date_compare ( gsb_data_transaction_get_date (
+ transaction_number), date_debut_comparaison ) >= 0 )
+ &&
+ ( g_date_compare ( gsb_data_transaction_get_date (
+ transaction_number ), date_fin_comparaison ) <= 0 )
+ &&
+ !imported_transaction -> ope_de_ventilation
+ &&
+ ( !etat.get_fusion_import_transactions
+ ||
+ !gsb_data_transaction_get_id ( transaction_number ) ) )
{
- gint transaction_number;
-
- transaction_number = gsb_data_transaction_get_transaction_number (
- list_tmp_transactions -> data);
- if ( gsb_data_transaction_get_account_number (
- transaction_number ) == account_number
- &&
- g_date_compare ( gsb_data_transaction_get_date ( transaction_number ),
- first_date_import ) > 0 )
- {
- GDate *date_debut_comparaison;
- GDate *date_fin_comparaison;
-
- date_debut_comparaison = g_date_new_dmy ( g_date_get_day ( imported_transaction -> date ),
- g_date_get_month ( imported_transaction -> date ),
- g_date_get_year ( imported_transaction -> date ));
- g_date_subtract_days ( date_debut_comparaison,
- valeur_echelle_recherche_date_import );
-
- date_fin_comparaison = g_date_new_dmy ( g_date_get_day ( imported_transaction -> date ),
- g_date_get_month ( imported_transaction -> date ),
- g_date_get_year ( imported_transaction -> date ));
- g_date_add_days ( date_fin_comparaison,
- valeur_echelle_recherche_date_import );
-
- if ( !gsb_real_cmp ( gsb_data_transaction_get_amount (
- transaction_number), imported_transaction -> montant )
- &&
- ( g_date_compare ( gsb_data_transaction_get_date (
- transaction_number), date_debut_comparaison ) >= 0 )
- &&
- ( g_date_compare ( gsb_data_transaction_get_date (
- transaction_number ), date_fin_comparaison ) <= 0 )
- &&
- !imported_transaction -> ope_de_ventilation
- &&
- ( !etat.get_fusion_import_transactions
- ||
- !gsb_data_transaction_get_id ( transaction_number ) ) )
- {
- /* the imported transaction has the same date and same amount,
- * will ask the user */
- imported_transaction -> action = IMPORT_TRANSACTION_ASK_FOR_TRANSACTION;
- imported_transaction -> ope_correspondante = transaction_number;
- demande_confirmation = TRUE;
- }
- g_date_free ( date_debut_comparaison );
- g_date_free ( date_fin_comparaison );
- }
- list_tmp_transactions = list_tmp_transactions -> next;
+ /* the imported transaction has the same date and same amount,
+ * will ask the user */
+ imported_transaction->action = IMPORT_TRANSACTION_ASK_FOR_TRANSACTION;
+ imported_transaction->ope_correspondante = transaction_number;
+ demande_confirmation = TRUE;
}
+ g_date_free ( date_debut_comparaison );
+ g_date_free ( date_fin_comparaison );
}
list_tmp = list_tmp -> next;
}
@@ -2915,18 +2900,29 @@ gint gsb_import_create_transaction ( struct struct_ope_importation *imported_tra
void pointe_opes_importees ( struct struct_compte_importation *imported_account,
gint account_number )
{
+ GSList *ope_list;
GSList *list_tmp;
GSList *liste_opes_import_celibataires;
+ GDate *first_date_import = NULL;
/* si le compte importé a une id, on la vérifie ici */
/* si elle est absente, on met celle importée */
/* si elle est différente, on demande si on la remplace */
- if ( imported_account -> id_compte )
+ if ( imported_account->id_compte )
{
- if ( ! gsb_import_set_id_compte ( account_number, imported_account -> id_compte ) )
+ if ( !gsb_import_set_id_compte ( account_number, imported_account->id_compte ) )
return;
}
+ /* pour gagner en rapidité, on va récupérer la date de la première
+ * opération qui est dans le fichier importé */
+ first_date_import = gsb_import_get_first_date ( imported_account->operations_importees );
+
+ /* on récupère la liste des opérations dans l'intervalle de recherche pour l'import */
+ ope_list = gsb_import_get_transactions_list_for_import ( account_number, first_date_import );
+
+ g_date_free ( first_date_import );
+
/* on fait le tour des opés importées et recherche dans la liste d'opé s'il y a la
* correspondance */
list_tmp = imported_account -> operations_importees;
@@ -2934,285 +2930,277 @@ void pointe_opes_importees ( struct struct_compte_importation *imported_account,
while ( list_tmp )
{
- GSList *liste_ope_importees_tmp;
- GSList *ope_trouvees;
- struct struct_ope_importation *ope_import;
- gint transaction_number;
- gint i;
+ GSList *liste_ope_importees_tmp;
+ GSList *ope_trouvees;
+ GSList *list_tmp_transactions;
+ struct struct_ope_importation *ope_import;
+ gint transaction_number;
+ gint i;
- ope_import = list_tmp -> data;
- ope_trouvees = NULL;
+ ope_import = list_tmp -> data;
+ ope_trouvees = NULL;
- /* set now the account number of the transaction */
- ope_import -> no_compte = account_number;
+ /* set now the account number of the transaction */
+ ope_import -> no_compte = account_number;
- /* si l'opé d'import a une id, on recherche dans la liste d'opé pour trouver
- une id comparable */
- if ( ope_import -> id_operation
- &&
- (transaction_number = gsb_data_transaction_find_by_id (
- ope_import -> id_operation, account_number ) ) )
- ope_trouvees = g_slist_append ( ope_trouvees,
- GINT_TO_POINTER (transaction_number));
-
- /* si on n'a rien trouvé par id, */
- /* on fait le tour de la liste d'opés pour trouver des opés comparable */
- /* cad même date avec + ou - une échelle et même montant et pas une opé de ventil */
- if ( !ope_trouvees )
- {
- GDate *date_debut_comparaison;
- GDate *date_fin_comparaison;
- GSList *list_tmp_transactions;
-
- date_debut_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import -> date ),
- g_date_get_month ( ope_import -> date ),
- g_date_get_year ( ope_import -> date ));
- g_date_subtract_days ( date_debut_comparaison,
- valeur_echelle_recherche_date_import );
-
- date_fin_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import -> date ),
- g_date_get_month ( ope_import -> date ),
- g_date_get_year ( ope_import -> date ));
- g_date_add_days ( date_fin_comparaison,
- valeur_echelle_recherche_date_import );
+ list_tmp_transactions = ope_list;
+ while ( list_tmp_transactions )
+ {
+ gint transaction_number;
+ const gchar *tmp_str;
+ GDate *date_debut_comparaison;
+ GDate *date_fin_comparaison;
+ GDateDay day;
+ GDateMonth month;
+ GDateYear year;
+
+ transaction_number = GPOINTER_TO_INT ( list_tmp_transactions->data );
+
+ list_tmp_transactions = list_tmp_transactions->next;
+
+ /* si l'opé d'import a une id, on recherche dans la liste d'opé pour trouver
+ * une id comparable */
+ tmp_str = gsb_data_transaction_get_id ( transaction_number );
+ if ( tmp_str && strcmp ( ope_import->id_operation, tmp_str ) == 0 )
+ {
+ ope_trouvees = g_slist_append ( ope_trouvees, list_tmp_transactions->data );
+ continue;
+ }
- if ( imported_account -> invert_transaction_amount )
- ope_import -> montant = gsb_real_opposite ( ope_import -> montant );
+ /* si on n'a rien trouvé par id, */
+ /* on fait le tour de la liste d'opés pour trouver des opés comparable */
+ /* cad même date avec + ou - une échelle et même montant et pas une opé de ventil */
+ day = g_date_get_day ( ope_import->date );
+ month = g_date_get_month ( ope_import->date );
+ year = g_date_get_year ( ope_import->date );
- list_tmp_transactions = gsb_data_transaction_get_transactions_list ();
+ date_debut_comparaison = g_date_new_dmy ( day, month, year );
+ g_date_subtract_days ( date_debut_comparaison, valeur_echelle_recherche_date_import );
- while ( list_tmp_transactions )
- {
- transaction_number = gsb_data_transaction_get_transaction_number (
- list_tmp_transactions -> data);
- if ( gsb_data_transaction_get_account_number (transaction_number) == account_number )
- {
- if ( !gsb_real_cmp ( gsb_data_transaction_get_amount (transaction_number),
- ope_import -> montant )
- &&
- ( g_date_compare ( gsb_data_transaction_get_date (transaction_number),
- date_debut_comparaison ) >= 0 )
- &&
- ( g_date_compare ( gsb_data_transaction_get_date (transaction_number),
- date_fin_comparaison ) <= 0 )
- &&
- !gsb_data_transaction_get_mother_transaction_number (transaction_number)
+ date_fin_comparaison = g_date_new_dmy ( day, month, year );
+ g_date_add_days ( date_fin_comparaison, valeur_echelle_recherche_date_import );
+
+ if ( imported_account->invert_transaction_amount )
+ ope_import->montant = gsb_real_opposite ( ope_import->montant );
+
+ if ( !gsb_real_cmp ( gsb_data_transaction_get_amount ( transaction_number ), ope_import -> montant )
+ &&
+ ( g_date_compare ( gsb_data_transaction_get_date ( transaction_number), date_debut_comparaison ) >= 0 )
+ &&
+ ( g_date_compare ( gsb_data_transaction_get_date ( transaction_number ), date_fin_comparaison ) <= 0 )
+ &&
+ !gsb_data_transaction_get_mother_transaction_number ( transaction_number )
&&
gsb_data_transaction_get_marked_transaction ( transaction_number ) < 2 )
- /* on a retouvé une opé de même date et même montant, on l'ajoute à la liste
- * des opés trouvées */
- ope_trouvees = g_slist_append ( ope_trouvees,
- GINT_TO_POINTER (transaction_number));
- }
- list_tmp_transactions = list_tmp_transactions -> next;
- }
- }
- /* à ce stade, ope_trouvees contient la ou les opés qui sont comparables à l'opé importée */
- /* soit il n'y en n'a qu'une, et on la pointe, soit il y en a plusieurs, et on recherche */
- /* les opés importées s'il y en a d'autre comparables, et on pointe les opés en fonction */
- /* du nb de celles importées */
- switch ( g_slist_length ( ope_trouvees ))
- {
- case 0:
- /* aucune opé comparable n'a été retrouvée */
- /* on marque donc cette opé comme seule */
- /* sauf si c'est une opé de ventil */
+ {
+ /* on a retouvé une opé de même date et même montant, on l'ajoute à la liste
+ * des opés trouvées */
+ ope_trouvees = g_slist_append ( ope_trouvees, list_tmp_transactions->data );
+ }
+ }
- if ( !ope_import -> ope_de_ventilation )
- {
- /* on met le no de compte et la devise de l'opération si plus tard on l'enregistre */
+ /* à ce stade, ope_trouvees contient la ou les opés qui sont comparables à l'opé importée */
+ /* soit il n'y en n'a qu'une, et on la pointe, soit il y en a plusieurs, et on recherche */
+ /* les opés importées s'il y en a d'autre comparables, et on pointe les opés en fonction */
+ /* du nb de celles importées */
+ switch ( g_slist_length ( ope_trouvees ))
+ {
+ case 0:
+ /* aucune opé comparable n'a été retrouvée */
+ /* on marque donc cette opé comme seule */
+ /* sauf si c'est une opé de ventil */
- if (imported_account -> bouton_devise)
- ope_import -> devise = gsb_currency_get_currency_from_combobox (
- imported_account -> bouton_devise);
- else
- ope_import -> devise = gsb_data_currency_get_number_by_code_iso4217 (
- imported_account -> devise);
+ if ( !ope_import -> ope_de_ventilation )
+ {
+ /* on met le no de compte et la devise de l'opération si plus tard on l'enregistre */
- liste_opes_import_celibataires = g_slist_append ( liste_opes_import_celibataires,
- ope_import );
- }
+ if (imported_account -> bouton_devise)
+ ope_import -> devise = gsb_currency_get_currency_from_combobox (
+ imported_account -> bouton_devise);
+ else
+ ope_import -> devise = gsb_data_currency_get_number_by_code_iso4217 (
+ imported_account -> devise);
- break;
+ liste_opes_import_celibataires = g_slist_append ( liste_opes_import_celibataires,
+ ope_import );
+ }
- case 1:
- /* il n'y a qu'une opé retrouvée, on la pointe */
- /* si elle est déjà pointée ou relevée, on ne fait rien */
- /* si l'opé d'import a une id et pas l'opé, on marque l'id dans l'opé */
+ break;
- transaction_number = GPOINTER_TO_INT ( ope_trouvees -> data );
+ case 1:
+ /* il n'y a qu'une opé retrouvée, on la pointe */
+ /* si elle est déjà pointée ou relevée, on ne fait rien */
+ /* si l'opé d'import a une id et pas l'opé, on marque l'id dans l'opé */
- if ( strlen ( gsb_data_transaction_get_transaction_id ( transaction_number ) ) == 0
- &&
- ope_import -> id_operation )
- gsb_data_transaction_set_transaction_id ( transaction_number,
- ope_import -> id_operation );
+ transaction_number = GPOINTER_TO_INT ( ope_trouvees -> data );
- if ( !gsb_data_transaction_get_marked_transaction (transaction_number))
- {
- gsb_data_transaction_set_marked_transaction ( transaction_number,
- 2 );
- /* si c'est une opé ventilée, on recherche les opé filles pour leur mettre
- * le même pointage que la mère */
- if ( gsb_data_transaction_get_split_of_transaction (transaction_number))
- {
- GSList *list_tmp_transactions;
-
- list_tmp_transactions = gsb_data_transaction_get_transactions_list ();
-
- while ( list_tmp_transactions )
- {
- gint transaction_number_tmp;
- transaction_number_tmp = gsb_data_transaction_get_transaction_number (
- list_tmp_transactions -> data);
-
- if ( gsb_data_transaction_get_account_number (transaction_number_tmp) == account_number
- &&
- gsb_data_transaction_get_mother_transaction_number (transaction_number_tmp) == transaction_number)
- gsb_data_transaction_set_marked_transaction ( transaction_number_tmp, 2 );
- list_tmp_transactions = list_tmp_transactions -> next;
- }
- }
- }
+ if ( strlen ( gsb_data_transaction_get_transaction_id ( transaction_number ) ) == 0
+ &&
+ ope_import -> id_operation )
+ gsb_data_transaction_set_transaction_id ( transaction_number,
+ ope_import -> id_operation );
- /* récupération de la date de valeur */
- if ( ope_import -> date_de_valeur )
- {
- gint fyear = 0;
+ if ( !gsb_data_transaction_get_marked_transaction (transaction_number))
+ {
+ gsb_data_transaction_set_marked_transaction ( transaction_number, 2 );
+ /* si c'est une opé ventilée, on recherche les opé filles pour leur mettre
+ * le même pointage que la mère */
+ if ( gsb_data_transaction_get_split_of_transaction (transaction_number))
+ {
+ list_tmp_transactions = ope_list;
- gsb_data_transaction_set_value_date ( transaction_number,
- ope_import -> date_de_valeur );
- /* set the financial year according to the date or value date */
- if ( etat.get_fyear_by_value_date )
- fyear = gsb_data_fyear_get_from_date ( ope_import -> date_de_valeur );
- if (fyear > 0)
- gsb_data_transaction_set_financial_year_number ( transaction_number, fyear );
+ while ( list_tmp_transactions )
+ {
+ gint transaction_number_tmp;
- }
+ transaction_number_tmp = gsb_data_transaction_get_transaction_number (
+ list_tmp_transactions->data);
- break;
+ if ( gsb_data_transaction_get_mother_transaction_number (
+ transaction_number_tmp ) == transaction_number )
+ gsb_data_transaction_set_marked_transaction ( transaction_number_tmp, 2 );
- default:
- /* il y a plusieurs opé trouvées correspondant à l'opé importée */
+ list_tmp_transactions = list_tmp_transactions->next;
+ }
+ }
+ }
- /* on va voir s'il y a d'autres opées importées ayant la même date et le même montant
- si on retrouve autant d'opé importées que d'opé trouvées, on peut marquer cette
- opé sans s'en préoccuper */
- i=0;
- liste_ope_importees_tmp = imported_account -> operations_importees;
+ /* récupération de la date de valeur */
+ if ( ope_import -> date_de_valeur )
+ {
+ gint fyear = 0;
- while ( liste_ope_importees_tmp )
- {
- struct struct_ope_importation *ope_import_tmp;
- GDate *date_debut_comparaison;
- GDate *date_fin_comparaison;
-
- ope_import_tmp = liste_ope_importees_tmp -> data;
-
- /* we look for a date around ope_import_tmp with +- valeur_echelle_recherche_date_import */
- date_debut_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import_tmp -> date ),
- g_date_get_month ( ope_import_tmp -> date ),
- g_date_get_year ( ope_import_tmp -> date ));
- g_date_subtract_days ( date_debut_comparaison,
- valeur_echelle_recherche_date_import );
-
- date_fin_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import_tmp -> date ),
- g_date_get_month ( ope_import_tmp -> date ),
- g_date_get_year ( ope_import_tmp -> date ));
- g_date_add_days ( date_fin_comparaison,
- valeur_echelle_recherche_date_import );
-
- if ( !gsb_real_cmp ( ope_import_tmp -> montant,
- ope_import -> montant )
- &&
- ( g_date_compare ( ope_import -> date,
- date_debut_comparaison ) >= 0 )
- &&
- ( g_date_compare ( ope_import -> date,
- date_fin_comparaison ) <= 0 )
-
- &&
- !ope_import_tmp -> ope_de_ventilation )
- /* on a retouvé une opé d'import de même date et même montant, on incrémente
- * le nb d'opé d'import semblables trouvees */
- i++;
-
- liste_ope_importees_tmp = liste_ope_importees_tmp -> next;
- }
+ gsb_data_transaction_set_value_date ( transaction_number, ope_import->date_de_valeur );
+ /* set the financial year according to the date or value date */
+ if ( etat.get_fyear_by_value_date )
+ fyear = gsb_data_fyear_get_from_date ( ope_import->date_de_valeur );
+ if (fyear > 0)
+ gsb_data_transaction_set_financial_year_number ( transaction_number, fyear );
- if ( i == g_slist_length ( ope_trouvees ))
- {
- /* on a trouvé autant d'opé d'import semblables que d'opés semblables dans la
- * liste d'opé donc on peut marquer les opés trouvées */
- /* pour celles qui sont déjà pointées, on ne fait rien */
- /* si l'opé importée à une id, on met cette id dans l'opération si elle n'en a pas */
+ }
- GSList *list_tmp_2;
+ break;
- list_tmp_2 = ope_trouvees;
+ default:
+ /* il y a plusieurs opé trouvées correspondant à l'opé importée */
- while ( list_tmp_2 )
- {
- gint transaction_number;
+ /* on va voir s'il y a d'autres opées importées ayant la même date et le même montant
+ si on retrouve autant d'opé importées que d'opé trouvées, on peut marquer cette
+ opé sans s'en préoccuper */
+ i=0;
+ liste_ope_importees_tmp = imported_account->operations_importees;
- transaction_number = GPOINTER_TO_INT (list_tmp_2 -> data);
+ while ( liste_ope_importees_tmp )
+ {
+ struct struct_ope_importation *ope_import_tmp;
+ GDate *date_debut_comparaison;
+ GDate *date_fin_comparaison;
+
+ ope_import_tmp = liste_ope_importees_tmp -> data;
+
+ /* we look for a date around ope_import_tmp with +- valeur_echelle_recherche_date_import */
+ date_debut_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import_tmp -> date ),
+ g_date_get_month ( ope_import_tmp -> date ),
+ g_date_get_year ( ope_import_tmp -> date ));
+ g_date_subtract_days ( date_debut_comparaison,
+ valeur_echelle_recherche_date_import );
+
+ date_fin_comparaison = g_date_new_dmy ( g_date_get_day ( ope_import_tmp -> date ),
+ g_date_get_month ( ope_import_tmp -> date ),
+ g_date_get_year ( ope_import_tmp -> date ));
+ g_date_add_days ( date_fin_comparaison,
+ valeur_echelle_recherche_date_import );
+
+ if ( !gsb_real_cmp ( ope_import_tmp -> montant,
+ ope_import -> montant )
+ &&
+ ( g_date_compare ( ope_import -> date,
+ date_debut_comparaison ) >= 0 )
+ &&
+ ( g_date_compare ( ope_import -> date,
+ date_fin_comparaison ) <= 0 )
- if ( strlen ( gsb_data_transaction_get_transaction_id ( transaction_number ) ) == 0
- &&
- ope_import -> id_operation )
- gsb_data_transaction_set_transaction_id ( transaction_number,
- ope_import -> id_operation );
+ &&
+ !ope_import_tmp -> ope_de_ventilation )
+ /* on a retouvé une opé d'import de même date et même montant, on incrémente
+ * le nb d'opé d'import semblables trouvees */
+ i++;
- if ( !gsb_data_transaction_get_marked_transaction (transaction_number))
- {
- gsb_data_transaction_set_marked_transaction ( transaction_number, 2 );
+ liste_ope_importees_tmp = liste_ope_importees_tmp -> next;
+ }
- /* si c'est une opé ventilée, on recherche les opé filles pour leur mettre
- * le même pointage que la mère */
- if ( gsb_data_transaction_get_split_of_transaction (transaction_number))
- {
- GSList *list_tmp_transactions;
-
- list_tmp_transactions = gsb_data_transaction_get_transactions_list ();
-
- while ( list_tmp_transactions )
- {
- gint transaction_number_tmp;
- transaction_number_tmp = gsb_data_transaction_get_transaction_number (list_tmp_transactions -> data);
-
- if ( gsb_data_transaction_get_account_number (transaction_number_tmp) == account_number )
- {
- if ( gsb_data_transaction_get_mother_transaction_number (transaction_number_tmp) == transaction_number)
- gsb_data_transaction_set_marked_transaction ( transaction_number_tmp,
- 2 );
- }
- list_tmp_transactions = list_tmp_transactions -> next;
- }
- }
- }
- list_tmp_2 = list_tmp_2 -> next;
- }
- }
- else
- {
- /* on a trouvé un nombre différent d'opés d'import et d'opés semblables dans
- * la liste d'opés on marque donc cette opé d'import comme seule */
+ if ( i == g_slist_length ( ope_trouvees ))
+ {
+ /* on a trouvé autant d'opé d'import semblables que d'opés semblables dans la
+ * liste d'opé donc on peut marquer les opés trouvées */
+ /* pour celles qui sont déjà pointées, on ne fait rien */
+ /* si l'opé importée à une id, on met cette id dans l'opération si elle n'en a pas */
- ope_import -> devise = gsb_currency_get_currency_from_combobox (
- imported_account -> bouton_devise);
- liste_opes_import_celibataires = g_slist_append (
- liste_opes_import_celibataires, ope_import );
+ GSList *list_tmp_2;
- }
- }
- g_slist_free ( ope_trouvees );
- list_tmp = list_tmp -> next;
+ list_tmp_2 = ope_trouvees;
+
+ while ( list_tmp_2 )
+ {
+ gint transaction_number;
+
+ transaction_number = GPOINTER_TO_INT (list_tmp_2 -> data);
+
+ if ( strlen ( gsb_data_transaction_get_transaction_id ( transaction_number ) ) == 0
+ &&
+ ope_import -> id_operation )
+ gsb_data_transaction_set_transaction_id ( transaction_number,
+ ope_import -> id_operation );
+
+ if ( !gsb_data_transaction_get_marked_transaction (transaction_number))
+ {
+ gsb_data_transaction_set_marked_transaction ( transaction_number, 2 );
+
+ /* si c'est une opé ventilée, on recherche les opé filles pour leur mettre
+ * le même pointage que la mère */
+ if ( gsb_data_transaction_get_split_of_transaction (transaction_number))
+ {
+ GSList *list_tmp_transactions;
+
+ list_tmp_transactions = gsb_data_transaction_get_transactions_list ();
+
+ while ( list_tmp_transactions )
+ {
+ gint transaction_number_tmp;
+ transaction_number_tmp = gsb_data_transaction_get_transaction_number (list_tmp_transactions -> data);
+
+ if ( gsb_data_transaction_get_account_number (transaction_number_tmp) == account_number )
+ {
+ if ( gsb_data_transaction_get_mother_transaction_number (transaction_number_tmp) == transaction_number)
+ gsb_data_transaction_set_marked_transaction ( transaction_number_tmp,
+ 2 );
+ }
+ list_tmp_transactions = list_tmp_transactions -> next;
+ }
+ }
+ }
+ list_tmp_2 = list_tmp_2 -> next;
+ }
+ }
+ else
+ {
+ /* on a trouvé un nombre différent d'opés d'import et d'opés semblables dans
+ * la liste d'opés on marque donc cette opé d'import comme seule */
+
+ ope_import -> devise = gsb_currency_get_currency_from_combobox (
+ imported_account -> bouton_devise);
+ liste_opes_import_celibataires = g_slist_append (
+ liste_opes_import_celibataires, ope_import );
+
+ }
+ }
+ g_slist_free ( ope_trouvees );
+ list_tmp = list_tmp -> next;
}
/* a ce niveau, liste_opes_import_celibataires contient les opés d'import dont on
* n'a pas retrouvé l'opé correspondante
* on les affiche dans une liste en proposant de les ajouter à la liste */
-
if ( liste_opes_import_celibataires )
gsb_import_show_orphan_transactions ( liste_opes_import_celibataires, account_number );
}
--
1.8.1.5
More information about the devel
mailing list