AUDIT: r17090 - gnucash/trunk/src/import-export/qif-import - Bug #511231: QIF importer now takes into account any provided QIF security type

Charles Day cedayiv at cvs.gnucash.org
Thu Apr 17 21:55:02 EDT 2008


Author: cedayiv
Date: 2008-04-17 21:55:02 -0400 (Thu, 17 Apr 2008)
New Revision: 17090
Trac: http://svn.gnucash.org/trac/changeset/17090

Modified:
   gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
   gnucash/trunk/src/import-export/qif-import/qif-dialog-utils.scm
   gnucash/trunk/src/import-export/qif-import/qif-objects.scm
Log:
Bug #511231: QIF importer now takes into account any provided QIF security type
when determining a default namespace for new commodities. Previously saved
security mappings for the same symbol are also considered, if available.
BP


Modified: gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
===================================================================
--- gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-04-17 14:16:08 UTC (rev 17089)
+++ gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-04-18 01:55:02 UTC (rev 17090)
@@ -1617,8 +1617,11 @@
   SCM update_securities = scm_c_eval_string("qif-import:update-security-hash");
 
   /* Get a list of any new QIF securities since the previous call. */
-  updates = scm_call_3(update_securities, wind->security_hash, 
-                       wind->ticker_map, wind->acct_map_info);
+  updates = scm_call_4(update_securities,
+                       wind->security_hash, 
+                       wind->ticker_map,
+                       wind->acct_map_info,
+                       wind->security_prefs);
   if (updates != SCM_BOOL_F)
   {
     /* A list of new QIF securities was returned. Save it. */

Modified: gnucash/trunk/src/import-export/qif-import/qif-dialog-utils.scm
===================================================================
--- gnucash/trunk/src/import-export/qif-import/qif-dialog-utils.scm	2008-04-17 14:16:08 UTC (rev 17089)
+++ gnucash/trunk/src/import-export/qif-import/qif-dialog-utils.scm	2008-04-18 01:55:02 UTC (rev 17090)
@@ -580,13 +580,35 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  qif-dialog:default-namespace
 ;;
-;;  For a given commodity symbol, return a default namespace.
+;;  Given a security's QIF symbol and type, along with all
+;;  previously seen security mapping preferences, return a
+;;  default namespace.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define (qif-dialog:default-namespace s)
-  (if (string? s)
+(define (qif-dialog:default-namespace qif-symbol qif-type prefs)
+
+  ;; Guess a namespace based on the symbol alone.
+  (define (guess-by-symbol s)
+    (if (string? s)
       (let ((l (string-length s))
-            (d (string-index s #\.)))
+            (d (string-index s #\.))
+            (pref-match
+              (if (list? prefs)
+                  (find (lambda (elt)
+                          ;; Does the symbol match, and is the namespace
+                          ;; compatible with the QIF type?
+                          (and (string=? s (caddr elt))
+                               (not (and (string? qif-type)
+                                         (string=? GNC_COMMODITY_NS_MUTUAL
+                                                   (cadr elt))
+                                         (or (string-ci=? qif-type "stock")
+                                             (string-ci=? qif-type "etf"))))))
+                        prefs)
+                   #f)))
         (cond
+          ;; If a preferences match was found, use its namespace.
+          (pref-match
+           (cadr pref-match))
+
           ;; Guess NYSE for symbols of 1-3 characters.
           ((< l 4)
            GNC_COMMODITY_NS_NYSE)
@@ -606,25 +628,47 @@
           ;; Otherwise it's probably a fund.
           (else
            GNC_COMMODITY_NS_MUTUAL)))
+      ;; There's no symbol. Default to a fund.
       GNC_COMMODITY_NS_MUTUAL))
 
+  ;; Was a QIF type given?
+  (if (string? qif-type)
+     ;; Yes. We might be able to definitely determine the namespace.
+     (cond
+       ;; Mutual fund
+       ((string-ci=? qif-type "mutual fund")
+        GNC_COMMODITY_NS_MUTUAL)
 
+       ;; Index
+       ((string-ci=? qif-type "index")
+        ;; This QIF type must be wrong; indexes aren't tradable!
+        GNC_COMMODITY_NS_MUTUAL)
+
+       (else
+        (guess-by-symbol qif-symbol)))
+
+     ;; No QIF type was given, so guess a
+     ;; default namespace by symbol alone.
+     (guess-by-symbol qif-symbol)))
+
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  qif-import:update-security-hash
 ;;
-;;  Make new commodities for each new security in acct-hash
-;;  that isn't already in security-hash.  Return a list of
-;;  the QIF names for which new commodities are created, or
-;;  #f if none.
+;;  For each QIF security in acct-hash, find a matching
+;;  GnuCash security or create a new one, then add it to the
+;;  security-hash table. Return a list of security-hash keys
+;;  for all newly created GnuCash securities, or #f if none.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define (qif-import:update-security-hash security-hash ticker-map acct-hash)
+(define (qif-import:update-security-hash security-hash ticker-map
+                                         acct-hash sec-prefs)
   (let ((names '()))
     (hash-fold
      (lambda (qif-name map-entry p)
        (let ((security-name (qif-import:get-account-name qif-name)))
-         ;; is it: a stock or mutual fund and displayed and not already in
-         ;; the security-hash?
+         ;; Is this account going to be imported, is it security-denominated, 
+         ;; and is the security not already in the security hash table?
          (if (and
               security-name
               (qif-map-entry:display? map-entry)
@@ -638,35 +682,45 @@
                       (gnc-get-current-root-account)
                       (qif-map-entry:gnc-name map-entry)))
                    (book (gnc-account-get-book (gnc-get-current-root-account))))
+               ;; Are we importing to an existing, security-denominated account?
                (if (and (not (null? existing-gnc-acct))
                         (memv (xaccAccountGetType existing-gnc-acct)
                               (list GNC-STOCK-TYPE GNC-MUTUAL-TYPE)))
-                   ;; gnc account already exists... we *know* what the
-                   ;; security is supposed to be
+                   ;; Yes, so that security is the one to use. Add it
+                   ;; to the security hash table.
                    (let ((commodity
                           (xaccAccountGetCommodity existing-gnc-acct)))
                      (hash-set! security-hash security-name commodity))
 
-                   ;; we know nothing about this security.. we need to
-                   ;; ask about it
-                   (let ((ticker-symbol
-                          (qif-ticker-map:lookup-ticker ticker-map
+                   ;; Otherwise, since we can't definitively match this QIF
+                   ;; security to a GnuCash security, create a new one with
+                   ;; some (hopefully) intelligent defaults.
+                   (let* ((qif-symbol
+                            (qif-ticker-map:lookup-symbol ticker-map
+                                                          security-name))
+                          (qif-type
+                            (qif-ticker-map:lookup-type ticker-map
                                                         security-name))
-                         (namespace GNC_COMMODITY_NS_MUTUAL))
+                          (namespace (qif-dialog:default-namespace qif-symbol
+                                                                   qif-type
+                                                                   sec-prefs)))
 
-                     (if (not ticker-symbol)
-                         (set! ticker-symbol security-name)
-                         (set! namespace
-                           (qif-dialog:default-namespace ticker-symbol)))
-                     (set! names (cons security-name names))
+                     ;; If no symbol has been provided, default to the name.
+                     (if (not qif-symbol)
+                         (set! qif-symbol security-name))
+
+                     ;; Create the new security and add it to the hash table.
                      (hash-set! security-hash
                                 security-name
                                 (gnc-commodity-new book
                                                    security-name
                                                    namespace
-                                                   ticker-symbol
+                                                   qif-symbol
                                                    ""
-                                                   100000))))))
+                                                   100000))
+
+                     ;; Add the hash key to the list to be returned.
+                     (set! names (cons security-name names))))))
          #f))
      #f acct-hash)
 

Modified: gnucash/trunk/src/import-export/qif-import/qif-objects.scm
===================================================================
--- gnucash/trunk/src/import-export/qif-import/qif-objects.scm	2008-04-17 14:16:08 UTC (rev 17089)
+++ gnucash/trunk/src/import-export/qif-import/qif-objects.scm	2008-04-18 01:55:02 UTC (rev 17090)
@@ -661,7 +661,7 @@
    ticker-map
    (cons stock-symbol (qif-ticker-map:ticker-map ticker-map))))
 
-(define (qif-ticker-map:lookup-ticker ticker-map name)
+(define (qif-ticker-map:lookup-symbol ticker-map name)
   (let ((retval #f))
     (for-each 
      (lambda (symbol)
@@ -673,3 +673,15 @@
      (qif-ticker-map:ticker-map ticker-map))
     retval))
 
+(define (qif-ticker-map:lookup-type ticker-map name)
+  (let ((retval #f))
+    (for-each 
+     (lambda (symbol)
+       (if (string=? name (qif-stock-symbol:name symbol))
+	   (begin
+	     (set! retval (qif-stock-symbol:type symbol))
+	     (if (string=? retval "")
+		 (set! retval #f)))))
+     (qif-ticker-map:ticker-map ticker-map))
+    retval))
+



More information about the gnucash-changes mailing list