diff --git a/AUTHORS b/AUTHORS index cdc72fd765..3e01eed274 100644 --- a/AUTHORS +++ b/AUTHORS @@ -107,6 +107,7 @@ Hans de Graaff XML patches Bill Gribble qif importation code, and much much more Mitsuo Hamada messages Japanese translations Otto Hammersmith for RedHat RPM version +David Hampton qif import patch Eric Hanchrow updated currency documentation Alexandru Harsanyi for core dumps, lockups, gtk work John Hasler engine patch diff --git a/doc/sgml/C/xacc-about.sgml b/doc/sgml/C/xacc-about.sgml index dd77deac95..ac9524df2f 100644 --- a/doc/sgml/C/xacc-about.sgml +++ b/doc/sgml/C/xacc-about.sgml @@ -554,6 +554,14 @@ Christiansen for RedHat RPM packaging + + +hampton@employees.org David Hampton + +qif import patch + + + offby1@blarg.net Eric Hanchrow diff --git a/src/gnome/druid-qif-import.c b/src/gnome/druid-qif-import.c index 4ea3474ec5..0b04cfc2e3 100644 --- a/src/gnome/druid-qif-import.c +++ b/src/gnome/druid-qif-import.c @@ -87,6 +87,7 @@ struct _qifimportwindow { SCM gnc_acct_info; SCM stock_hash; SCM new_stocks; + SCM ticker_map; SCM imported_account_group; SCM match_transactions; @@ -139,6 +140,7 @@ gnc_ui_qif_import_druid_make(void) { GtkObject * wobj; SCM load_map_prefs; SCM mapping_info; + SCM create_ticker_map; int i; char * pre_page_names[NUM_PRE_PAGES] = { @@ -173,6 +175,7 @@ gnc_ui_qif_import_druid_make(void) { retval->memo_map_info = SCM_BOOL_F; retval->stock_hash = SCM_BOOL_F; retval->new_stocks = SCM_BOOL_F; + retval->ticker_map = SCM_BOOL_F; retval->imported_account_group = SCM_BOOL_F; retval->match_transactions = SCM_BOOL_F; retval->selected_transaction = 0; @@ -230,6 +233,9 @@ gnc_ui_qif_import_druid_make(void) { retval->cat_map_info = gh_list_ref(mapping_info, gh_int2scm(2)); retval->memo_map_info = gh_list_ref(mapping_info, gh_int2scm(3)); retval->stock_hash = gh_list_ref(mapping_info, gh_int2scm(4)); + + create_ticker_map = gh_eval_str("make-ticker-map"); + retval->ticker_map = gh_call0(create_ticker_map); scm_protect_object(retval->imported_files); scm_protect_object(retval->selected_file); @@ -242,6 +248,7 @@ gnc_ui_qif_import_druid_make(void) { scm_protect_object(retval->acct_map_info); scm_protect_object(retval->stock_hash); scm_protect_object(retval->new_stocks); + scm_protect_object(retval->ticker_map); scm_protect_object(retval->imported_account_group); scm_protect_object(retval->match_transactions); @@ -287,6 +294,7 @@ gnc_ui_qif_import_druid_destroy (QIFImportWindow * window) { scm_unprotect_object(window->acct_map_info); scm_unprotect_object(window->stock_hash); scm_unprotect_object(window->new_stocks); + scm_unprotect_object(window->ticker_map); scm_unprotect_object(window->imported_account_group); scm_unprotect_object(window->match_transactions); @@ -560,8 +568,8 @@ gnc_ui_qif_import_load_file_next_cb(GnomeDruidPage * page, scm_protect_object(wind->selected_file); /* load the file */ - load_return = gh_call2(qif_file_load, gh_car(imported_files), - scm_filename); + load_return = gh_call3(qif_file_load, gh_car(imported_files), + scm_filename, wind->ticker_map); /* a list returned is (#f error-message) for an error, * (#t error-message) for a warning, or just #f for an @@ -1325,8 +1333,8 @@ gnc_ui_qif_import_memo_next_cb(GnomeDruidPage * page, /* if we need to look at stocks, do that, otherwise import * xtns and go to the duplicates page */ scm_unprotect_object(wind->new_stocks); - wind->new_stocks = gh_call2(update_stock, wind->stock_hash, - wind->acct_map_info); + wind->new_stocks = gh_call3(update_stock, wind->stock_hash, + wind->ticker_map, wind->acct_map_info); scm_protect_object(wind->new_stocks); if(wind->new_stocks != SCM_BOOL_F) { @@ -1380,8 +1388,8 @@ gnc_ui_qif_import_currency_next_cb(GnomeDruidPage * page, int show_matches; scm_unprotect_object(wind->new_stocks); - wind->new_stocks = gh_call2(update_stock, wind->stock_hash, - wind->acct_map_info); + wind->new_stocks = gh_call3(update_stock, wind->stock_hash, + wind->ticker_map, wind->acct_map_info); scm_protect_object(wind->new_stocks); if(wind->new_stocks != SCM_BOOL_F) { diff --git a/src/scm/qif-import/qif-dialog-utils.scm b/src/scm/qif-import/qif-dialog-utils.scm index bc9942f5aa..dfeb867fec 100644 --- a/src/scm/qif-import/qif-dialog-utils.scm +++ b/src/scm/qif-import/qif-dialog-utils.scm @@ -587,7 +587,7 @@ ;; new stocks or #f if none. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define (qif-import:update-stock-hash stock-hash acct-hash) +(define (qif-import:update-stock-hash stock-hash ticker-map acct-hash) (let ((names '())) (hash-fold (lambda (qif-name map-entry p) @@ -625,13 +625,15 @@ ;; we know nothing about this security.. we need to ;; ask about it - (begin + (let ((ticker-symbol (qif-ticker-map:lookup-ticker ticker-map stock-name))) + (if (not ticker-symbol) + (set! ticker-symbol stock-name)) (set! names (cons stock-name names)) (hash-set! stock-hash stock-name (gnc:commodity-create stock-name GNC_COMMODITY_NS_NYSE - stock-name + ticker-symbol "" 100000)))))) #f)) diff --git a/src/scm/qif-import/qif-file.scm b/src/scm/qif-import/qif-file.scm index bd5f1a9d6e..69498e71da 100644 --- a/src/scm/qif-import/qif-file.scm +++ b/src/scm/qif-import/qif-file.scm @@ -17,7 +17,7 @@ ;; just store the fields "raw". ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define (qif-file:read-file self path) +(define (qif-file:read-file self path ticker-map) (false-if-exception (let* ((qstate-type #f) (current-xtn #f) @@ -88,6 +88,8 @@ (set! current-xtn (make-qif-cat))) ((account) (set! current-xtn (make-qif-acct))) + ((type:security) + (set! current-xtn (make-qif-stock-symbol))) ((option:autoswitch) (set! ignore-accounts #t)) ((clear:autoswitch) @@ -322,6 +324,35 @@ (display "qif-file:read-file : unknown Cat slot ") (display tag) (display " .. continuing anyway") (newline)))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Security transactions + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ((type:security) + (case tag + ;; N : stock name + ((#\N) + (qif-stock-symbol:set-name! current-xtn value)) + + ;; S : ticker symbol + ((#\S) + (qif-stock-symbol:set-symbol! current-xtn value)) + + ;; T : type + ((#\T) + (qif-stock-symbol:set-type! current-xtn value)) + + ;; end-of-record + ((#\^) + (qif-ticker-map:add-ticker! ticker-map current-xtn) + (set! current-xtn (make-qif-stock-symbol))) + + (else + (display "qif-file:read-file : unknown Security slot ") + (display tag) + (display " .. continuing anyway.") + (newline)))) + ;; trying to sneak one by, eh? (else diff --git a/src/scm/qif-import/qif-objects.scm b/src/scm/qif-import/qif-objects.scm index 051de7ed59..8e72dd41c2 100644 --- a/src/scm/qif-import/qif-objects.scm +++ b/src/scm/qif-import/qif-objects.scm @@ -578,3 +578,77 @@ (define qif-map-entry:set-display?! (simple-obj-setter 'display?)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; [N] stock name : string +;; [S] ticker symbol : string +;; [T] type : string +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define + (make-simple-class + 'qif-stock-symbol + '(name symbol type))) + +(define qif-stock-symbol:name + (simple-obj-getter 'name)) + +(define qif-stock-symbol:set-name! + (simple-obj-setter 'name)) + +(define qif-stock-symbol:symbol + (simple-obj-getter 'symbol)) + +(define qif-stock-symbol:set-symbol! + (simple-obj-setter 'symbol)) + +(define qif-stock-symbol:type + (simple-obj-getter 'type)) + +(define qif-stock-symbol:set-type! + (simple-obj-setter 'type)) + +(define (qif-stock-symbol:print self) + (simple-obj-print self)) + +(define (make-qif-stock-symbol) + (make-simple-obj )) + + + + +(define + (make-simple-class + 'qif-ticker-map + '(stocks))) + +(define qif-ticker-map:ticker-map + (simple-obj-getter 'stocks)) + +(define qif-ticker-map:set-ticker-map! + (simple-obj-setter 'stocks)) + +(define (make-ticker-map) + (let ((self (make-simple-obj ))) + (qif-ticker-map:set-ticker-map! self '()) + self)) + +(define (qif-ticker-map:add-ticker! ticker-map stock-symbol) + (qif-ticker-map:set-ticker-map! + ticker-map + (cons stock-symbol (qif-ticker-map:ticker-map ticker-map)))) + +(define (qif-ticker-map:lookup-ticker ticker-map name) + (let ((retval #f)) + (for-each + (lambda (symbol) + (if (string=? name (qif-stock-symbol:name symbol)) + (begin + (set! retval (qif-stock-symbol:symbol symbol)) + (if (string=? retval "") + (set! retval #f))))) + (qif-ticker-map:ticker-map ticker-map)) + retval)) +