2003-02-04 Benoit Gr�goire <bock@step.polymtl.ca>

* src/import-export/import-backend.c: Add heuristic for duplicate matching by check number.
	* doc/README.OFX: Update


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7945 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Benoit Grégoire 2003-02-05 00:01:16 +00:00
parent bc9f171dd7
commit dc840a9ef7
3 changed files with 78 additions and 51 deletions

View File

@ -1,3 +1,8 @@
2003-02-04 Benoit Grégoire <bock@step.polymtl.ca>
* src/import-export/import-backend.c: Add heuristic for duplicate matching by check number.
* doc/README.OFX: Update
2003-02-04 Derek Atkins <derek@ihtfp.com> 2003-02-04 Derek Atkins <derek@ihtfp.com>
* src/import-export/qif-import/qif-file.scm: mark "splits" as negative * src/import-export/qif-import/qif-file.scm: mark "splits" as negative

View File

@ -56,8 +56,8 @@ Implemented features (some of these are from the generic import module):
-Commodity import and matching, for investment transactions. -Commodity import and matching, for investment transactions.
-Transaction duplicate detection, using the unique OFX transaction ID. Even if -Transaction duplicate detection, using the unique OFX transaction ID. Even if
downloaded twice, transactions are only imported once. downloaded twice, transactions are only imported once.
-Transaction duplicate detection, using amount, date, full or partial memo, -Transaction duplicate detection, using amount, date, check number,
full or partial description. full or partial memo, full or partial description.
-"Destination" account matching, using exact string match on either -"Destination" account matching, using exact string match on either
memo or description. memo or description.
-Saves ALL transaction data currently supported by LibOFX. -Saves ALL transaction data currently supported by LibOFX.
@ -66,7 +66,9 @@ Implemented features (some of these are from the generic import module):
-Files containing multiple statements are supported, and transactions can -Files containing multiple statements are supported, and transactions can
be matched at the same time. be matched at the same time.
4.The import process and transaction matching----------
4.The import process and transaction matching
----------
First, you must successfully download an OFX response file from your bank. First, you must successfully download an OFX response file from your bank.
@ -228,9 +230,9 @@ version of GnuCash from.
(4) When I import in OFX/HBCI, and change the destination account in the (4) When I import in OFX/HBCI, and change the destination account in the
matcher, why doesn't other transaction with the same memo/description change? matcher, why doesn't other transaction with the same memo/description change?
The matcher already "learns" where transactions are assigned. The only problem The matcher already "learns" where transactions are assigned. The only problem
is thatcurrently, it only uses what it has learned on the next import. is thatcurrently, it only uses what it has learned on the next import.
Re-processing the list during the import process is a feature you can hopefor Re-processing the list during the import process is a feature you can hopefor
early in the 1.8 series. early in the 1.8 series.
(5) Can GnuCash support QFX files (Quicken Financial eXchange?) (5) Can GnuCash support QFX files (Quicken Financial eXchange?)

View File

@ -493,68 +493,88 @@ static void split_find_match (GNCImportTransInfo * trans_info,
/*DEBUG("heuristics: probability - 10 (date)"); */ /*DEBUG("heuristics: probability - 10 (date)"); */
} }
/* Check number heuristics */
/* Memo heuristics */ if(strlen(xaccTransGetNum(gnc_import_TransInfo_get_trans (trans_info)))!=0)
if((strcmp(xaccSplitGetMemo(gnc_import_TransInfo_get_fsplit (trans_info)), {
xaccSplitGetMemo(split)) if((strcmp(xaccTransGetNum
==0)) (gnc_import_TransInfo_get_trans (trans_info)),
{ xaccTransGetNum(xaccSplitGetParent(split)))
/* An exact match of description gives a +2 */ ==0))
prob = prob+2; {
/* DEBUG("heuristics: probability + 2 (memo)"); */ /*An exact match of the Check number gives a +5 */
prob = prob+5;
/*DEBUG("heuristics: probability + 5 (Check number)");*/
}
} }
else if((strncmp(xaccSplitGetMemo(gnc_import_TransInfo_get_fsplit (trans_info)),
xaccSplitGetMemo(split), /* Memo heuristics */
strlen(xaccSplitGetMemo(split))/2) if(strlen(xaccSplitGetMemo(gnc_import_TransInfo_get_fsplit (trans_info)))!=0)
==0))
{ {
/* Very primitive fuzzy match worth +1. This matches the if((strcmp(xaccSplitGetMemo(gnc_import_TransInfo_get_fsplit (trans_info)),
first 50% of the strings to skip annoying transaction xaccSplitGetMemo(split))
number some banks seem to include in the memo but someone ==0))
should write something more sophisticated */ {
prob = prob+1; /* An exact match of description gives a +2 */
/*DEBUG("heuristics: probability + 1 (memo)"); */ prob = prob+2;
/* DEBUG("heuristics: probability + 2 (memo)"); */
}
else if((strncmp(xaccSplitGetMemo(gnc_import_TransInfo_get_fsplit (trans_info)),
xaccSplitGetMemo(split),
strlen(xaccSplitGetMemo(split))/2)
==0))
{
/* Very primitive fuzzy match worth +1. This matches the
first 50% of the strings to skip annoying transaction
number some banks seem to include in the memo but someone
should write something more sophisticated */
prob = prob+1;
/*DEBUG("heuristics: probability + 1 (memo)"); */
}
} }
/* Description heuristics */ /* Description heuristics */
if((strcmp(xaccTransGetDescription if(strlen(xaccTransGetDescription(gnc_import_TransInfo_get_trans (trans_info)))!=0)
(gnc_import_TransInfo_get_trans (trans_info)),
xaccTransGetDescription(xaccSplitGetParent(split)))
==0))
{
/*An exact match of Description gives a +2 */
prob = prob+2;
/*DEBUG("heuristics: probability + 2 (description)");*/
}
else if((strncmp(xaccTransGetDescription
(gnc_import_TransInfo_get_trans (trans_info)),
xaccTransGetDescription(xaccSplitGetParent(split)),
strlen(xaccTransGetDescription
(gnc_import_TransInfo_get_trans (trans_info)))/2)
==0))
{ {
/* Very primitive fuzzy match worth +1. This matches the if((strcmp(xaccTransGetDescription
first 50% of the strings to skip annoying transaction (gnc_import_TransInfo_get_trans (trans_info)),
number some banks seem to include in the memo but someone xaccTransGetDescription(xaccSplitGetParent(split)))
should write something more sophisticated */ ==0))
prob = prob+1; {
/*DEBUG("heuristics: probability + 1 (description)"); */ /*An exact match of Description gives a +2 */
prob = prob+2;
/*DEBUG("heuristics: probability + 2 (description)");*/
}
else if((strncmp(xaccTransGetDescription
(gnc_import_TransInfo_get_trans (trans_info)),
xaccTransGetDescription(xaccSplitGetParent(split)),
strlen(xaccTransGetDescription
(gnc_import_TransInfo_get_trans (trans_info)))/2)
==0))
{
/* Very primitive fuzzy match worth +1. This matches the
first 50% of the strings to skip annoying transaction
number some banks seem to include in the memo but someone
should write something more sophisticated */
prob = prob+1;
/*DEBUG("heuristics: probability + 1 (description)"); */
}
} }
/*Online id punishment*/
if ((gnc_import_get_trans_online_id(xaccSplitGetParent(split))!=NULL) && if ((gnc_import_get_trans_online_id(xaccSplitGetParent(split))!=NULL) &&
(strlen(gnc_import_get_trans_online_id(xaccSplitGetParent(split)))>0)) (strlen(gnc_import_get_trans_online_id(xaccSplitGetParent(split)))>0))
{ {
/* If the pref is to show match even with online ID's, /* If the pref is to show match even with online ID's,
puninsh the transaction with online if */ puninsh the transaction with online id */
prob = prob-3; prob = prob-3;
} }
/* Is the probability high enough? Otherwise do nothing and return. */ /* Is the probability high enough? Otherwise do nothing and return. */
if(prob < display_threshold) if(prob < display_threshold)
{ {
return; return;
} }
/* The probability is high enough, so allocate an object /* The probability is high enough, so allocate an object
here. Allocating it only when it's actually being used is here. Allocating it only when it's actually being used is
probably quite some performance gain. */ probably quite some performance gain. */
@ -563,8 +583,8 @@ static void split_find_match (GNCImportTransInfo * trans_info,
match_info->probability = prob; match_info->probability = prob;
match_info->split = split; match_info->split = split;
match_info->trans = xaccSplitGetParent(split); match_info->trans = xaccSplitGetParent(split);
/* Append that to the list. */ /* Append that to the list. */
trans_info->match_list = trans_info->match_list =
g_list_append(trans_info->match_list, g_list_append(trans_info->match_list,