Bill Gribble's qif import updates.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3474 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2001-01-15 22:38:13 +00:00
parent e29fc65b3e
commit 556a293d49
6 changed files with 193 additions and 100 deletions

View File

@ -1,3 +1,19 @@
2001-01-15 Bill Gribble <grib@billgribble.com>
* src/gnome/druid-qif-import.c: remove printout
* src/scm/qif-import/qif-parse.scm: Warning dialog on unknown
Action type. Add new actions from Q2000.
* src/scm/qif-import/qif-to-gnc.scm: Fix handling of commissions
for (hopefully) the last time. Add new security Action types.
Don't puke on unknown Action.
* src/scm/qif-import/qif-dialog-utils.scm: Change default account
for ShrsIn/ShrsOut to 'Retained Earnings', which is a normal
account; replaces old policy of stock-denominated Equity
subaccounts.
2001-01-15 Rob Browning <rlb@cs.utexas.edu>
* configure.in (G_WRAP_LINK_ARGS): require g-wrap 1.1.5. This

View File

@ -364,7 +364,6 @@ gnc_ui_qif_import_load_file_next_cb(GnomeDruidPage * page,
else {
/* call the field parser */
parse_return = gh_call1(qif_file_parse, gh_car(imported_files));
gh_display(parse_return); gh_newline();
/* warning means the date format is ambiguous. Set up the
* format selector page. */

View File

@ -24,19 +24,27 @@
brokerage (gnc:account-separator-char)
security))
(define (default-capital-return-acct brokerage security)
(string-append "Cap Return" (gnc:account-separator-char)
brokerage (gnc:account-separator-char)
security))
(define (default-cglong-acct brokerage security)
(string-append "Cap. gain (long)" (gnc:account-separator-char)
brokerage (gnc:account-separator-char)
security))
(define (default-cgmid-acct brokerage security)
(string-append "Cap. gain (mid)" (gnc:account-separator-char)
brokerage (gnc:account-separator-char)
security))
(define (default-cgshort-acct brokerage security)
(string-append "Cap. gain (short)" (gnc:account-separator-char)
brokerage (gnc:account-separator-char)
security))
(define (default-equity-holding security)
(string-append "Retained Earnings" (gnc:account-separator-char)
security))
(define (default-equity-holding security) "Retained Earnings")
(define (default-equity-account) "Retained Earnings")
@ -44,6 +52,10 @@
(string-append "Commissions" (gnc:account-separator-char)
brokerage))
(define (default-margin-interest-acct brokerage)
(string-append "Margin Interest" (gnc:account-separator-char)
brokerage))
;; the account-display is a 3-columned list of accounts in the QIF
;; import dialog (the "Account" page of the notebook). Column 1 is
;; the account name in the QIF file, column 2 is the number of QIF
@ -122,20 +134,21 @@
;; an interest, dividend, or CG account.
(case action
((buy buyx sell sellx reinvint reinvdiv reinvsh reinvsg
reinvlg shrsin shrsout stksplit)
reinvlg reinvmd shrsin shrsout stksplit)
(set! qif-account
(default-stock-acct from-acct stock-acct))
(set! qif-account-types (list GNC-STOCK-TYPE
GNC-MUTUAL-TYPE
GNC-ASSET-TYPE)))
((div cgshort cglong intinc miscinc miscexp xin xout)
((div cgshort cgmid cglong intinc miscinc miscexp
margint rtrncap xin xout)
(set! qif-account from-acct)
(set! qif-account-types (list GNC-BANK-TYPE
GNC-CCARD-TYPE
GNC-CASH-TYPE
GNC-ASSET-TYPE)))
((divx cgshortx cglongx intincx)
((divx cgshortx cgmidx cglongx intincx margintx rtrncapx)
(set! qif-account
(qif-split:category
(car (qif-xtn:splits xtn))))
@ -204,6 +217,11 @@
(set! qif-account
(default-cgshort-acct from-acct stock-acct))
(set! qif-account-types (list GNC-INCOME-TYPE)))
((cgmid cgmidx reinvmd)
(set! qif-account
(default-cgmid-acct from-acct stock-acct))
(set! qif-account-types (list GNC-INCOME-TYPE)))
((cglong cglongx reinvlg)
(set! qif-account
@ -220,10 +238,20 @@
(default-dividend-acct from-acct stock-acct))
(set! qif-account-types (list GNC-INCOME-TYPE)))
((rtrncap rtrncapx)
(set! qif-account
(default-capital-return-acct from-acct))
(set! qif-account-types (list GNC-INCOME-TYPE)))
((shrsin shrsout)
(set! qif-account
(default-equity-holding stock-acct))
(set! qif-account-types (list GNC-EQUITY-TYPE)))
((margint margintx)
(set! qif-account
(default-margin-interest-acct from-acct))
(set! qif-account-types (list GNC-EXPENSE-TYPE)))
((miscinc miscexp miscincx miscexpx)
;; these reference a category on the other end

View File

@ -38,6 +38,7 @@
(valid-acct-types
'(type:bank type:cash
type:ccard type:invst
type:port
#{type:oth\ a}# #{type:oth\ l}#))
(progress-dialog #f)
(file-stats (stat path))
@ -78,7 +79,7 @@
(begin
(set! qstate-type (qif-parse:parse-bang-field value))
(case qstate-type
((type:bank type:cash type:ccard type:invst
((type:bank type:cash type:ccard type:invst type:port
#{type:oth\ a}# #{type:oth\ l}#)
(if ignore-accounts
(set! current-account-name last-seen-account-name))
@ -109,7 +110,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(case qstate-type
((type:bank type:cash type:ccard type:invst
((type:bank type:cash type:ccard type:invst type:port
#{type:oth\ a}# #{type:oth\ l}#)
(case tag
;; D : transaction date
@ -141,7 +142,8 @@
;; there's both an action and a number in gnucash,
;; one for securities, one for banks.
((#\N)
(if (eq? qstate-type 'type:invst)
(if (or (eq? qstate-type 'type:invst)
(eq? qstate-type 'type:port))
(qif-xtn:set-action! current-xtn value)
(qif-xtn:set-number! current-xtn value)))
@ -208,8 +210,10 @@
opening-balance-payee))
(set! first-xtn #f)))
(if (and (eq? qstate-type 'type:invst)
(not (qif-xtn:security-name current-xtn)))
(if (and
(or (eq? qstate-type 'type:invst)
(eq? qstate-type 'type:port))
(not (qif-xtn:security-name current-xtn)))
(qif-xtn:set-security-name! current-xtn ""))
(qif-xtn:set-from-acct! current-xtn

View File

@ -194,57 +194,82 @@
'buy)
((buyx kaufx)
'buyx)
((sell) ;; verkaufen
'sell)
((sellx)
'sellx)
((div) ;; dividende
'div)
((divx)
'divx)
((int intinc aktzu) ;; zinsen
'intinc)
((intx intincx)
'intincx)
((cglong) ;; Kapitalgewinnsteuer
'cglong)
((cglongx)
'cglongx)
((cgmid) ;; Kapitalgewinnsteuer
'cgmid)
((cgmidx)
'cgmidx)
((cgshort)
'cgshort)
((cgshortx)
'cgshortx)
((shrsin)
'shrsin)
((shrsout)
'shrsout)
((xin)
'xin)
((xout)
'xout)
((stksplit)
'stksplit)
((reinvdiv)
'reinvdiv)
((reinvint)
'reinvint)
((reinvsg)
'reinvsg)
((reinvsh)
'reinvsh)
((reinvlg reinvkur)
'reinvlg)
((miscinc)
'miscinc)
((miscincx)
'miscincx)
((div) ;; dividende
'div)
((divx)
'divx)
; ((exercise)
; 'exercise)
; ((exercisx)
; 'exercisx)
; ((expire)
; 'expire)
; ((grant)
; 'grant)
((int intinc aktzu) ;; zinsen
'intinc)
((intx intincx)
'intincx)
((margint)
'margint)
((margintx)
'margintx)
((miscexp)
'miscexp)
((miscexpx)
'miscexpx)
((miscinc)
'miscinc)
((miscincx)
'miscincx)
((reinvdiv)
'reinvdiv)
((reinvint)
'reinvint)
((reinvlg reinvkur)
'reinvlg)
((reinvmd)
'reinvmd)
((reinvsg)
'reinvsg)
((reinvsh)
'reinvsh)
((reminder)
'reminder)
((sell) ;; verkaufen
'sell)
((sellx)
'sellx)
((shrsin)
'shrsin)
((shrsout)
'shrsout)
((stksplit)
'stksplit)
((xin)
'xin)
((xout)
'xout)
; ((vest)
; 'vest)
(else
(display "qif-parse:parse-action-field : unknown action field ")
(write read-value) (newline)
(gnc:warning-dialog
(string-append
(sprintf #f "The file contains an unknown Action '%s'.\n"
read-value)
"Some transactions may be discarded."))
#f)))
#f))

View File

@ -198,13 +198,15 @@
security security
gnc-acct-hash account-group))
(security
(qif-import:find-or-make-acct acctinfo
default-currency security
gnc-acct-hash account-group))
(qif-import:find-or-make-acct
acctinfo
default-currency security
gnc-acct-hash account-group))
(#t
(qif-import:find-or-make-acct acctinfo
default-currency default-currency
gnc-acct-hash account-group)))))
(qif-import:find-or-make-acct
acctinfo
default-currency default-currency
gnc-acct-hash account-group)))))
sorted-accounts-list)
;; before trying to mark transactions, prune down the list of
@ -400,31 +402,28 @@
;; "action" encoded in the Number field. It's generally the
;; security account (for buys, sells, and reinvests) but can
;; also be an interest, dividend, or SG/LG account.
(let ((share-price (amt-cvt (qif-xtn:share-price qif-xtn)))
(num-shares (amt-cvt (qif-xtn:num-shares qif-xtn)))
(split-amt (amt-cvt
(qif-split:amount (car (qif-xtn:splits qif-xtn)))))
(qif-accts #f)
(qif-near-acct #f)
(qif-far-acct #f)
(qif-commission-acct #f)
(far-acct-info #f)
(far-acct-name #f)
(far-acct #f)
(commission-acct #f)
(commission-amt (amt-cvt (qif-xtn:commission qif-xtn)))
(commission-split #f)
(defer-share-price #f)
(gnc-far-split (gnc:split-create)))
(let* ((share-price (amt-cvt (qif-xtn:share-price qif-xtn)))
(num-shares (amt-cvt (qif-xtn:num-shares qif-xtn)))
(split-amt (n* share-price num-shares))
(xtn-amt (amt-cvt
(qif-split:amount (car (qif-xtn:splits qif-xtn)))))
(qif-accts #f)
(qif-near-acct #f)
(qif-far-acct #f)
(qif-commission-acct #f)
(far-acct-info #f)
(far-acct-name #f)
(far-acct #f)
(commission-acct #f)
(commission-amt (amt-cvt (qif-xtn:commission qif-xtn)))
(commission-split #f)
(defer-share-price #f)
(gnc-far-split (gnc:split-create)))
(if (not num-shares) (set! num-shares (gnc:numeric-zero)))
(if (not share-price) (set! share-price (gnc:numeric-zero)))
(if (not split-amt) (set! split-amt (n* num-shares share-price)))
;; it appears that the QIF total line contains the commission.
(if commission-amt
(set! split-amt (nsub split-amt commission-amt)))
;; I don't think this should ever happen, but I want
;; to keep this check just in case.
(if (> (length splits) 1)
@ -458,44 +457,54 @@
;; the amounts and signs: are shares going in or out?
;; are amounts currency or shares?
(case qif-action
((buy buyx reinvint reinvdiv reinvsg reinvsh reinvlg)
((buy buyx reinvint reinvdiv reinvsg reinvsh reinvmd reinvlg)
(if (not share-price) (set! share-price (gnc:numeric-zero)))
(gnc:split-set-share-amount gnc-near-split num-shares)
(gnc:split-set-share-amount gnc-far-split (n- num-shares))
(gnc:split-set-value gnc-near-split split-amt)
(gnc:split-set-value gnc-far-split (n- split-amt)))
(gnc:split-set-value gnc-far-split (n- xtn-amt))
(gnc:split-set-share-amount gnc-far-split (n- xtn-amt)))
((sell sellx)
(if (not share-price) (set! share-price (gnc:numeric-zero)))
(gnc:split-set-share-amount gnc-near-split (n- num-shares))
(gnc:split-set-share-amount gnc-far-split num-shares)
(gnc:split-set-value gnc-near-split (n- split-amt))
(gnc:split-set-value gnc-far-split split-amt))
(gnc:split-set-value gnc-far-split xtn-amt)
(gnc:split-set-share-amount gnc-far-split xtn-amt))
((cgshort cgshortx cglong cglongx intinc intincx div divx
miscinc miscincx xin)
((cgshort cgshortx cgmid cgmidx cglong cglongx intinc intincx
div divx miscinc miscincx xin rtrncap rtrncapx)
(gnc:split-set-value gnc-near-split split-amt)
(gnc:split-set-value gnc-far-split (n- split-amt))
(gnc:split-set-share-amount gnc-near-split split-amt)
(gnc:split-set-share-amount gnc-far-split (n- split-amt)))
(gnc:split-set-value gnc-far-split (n- xtn-amt))
(gnc:split-set-share-amount gnc-far-split (n- xtn-amt)))
((xout miscexp miscexpx)
((xout miscexp miscexpx margint margintx)
(gnc:split-set-value gnc-near-split (n- split-amt))
(gnc:split-set-value gnc-far-split split-amt)
(gnc:split-set-share-amount gnc-near-split (n- split-amt))
(gnc:split-set-share-amount gnc-far-split split-amt))
(gnc:split-set-value gnc-far-split xtn-amt)
(gnc:split-set-share-amount gnc-far-split xtn-amt))
((shrsin)
;; for shrsin, the near account is the security account.
;; we'll need to set the share-price after a little
;; trickery post-adding-to-account
;; getting rid of the old equity-acct-per-stock trick.
;; you must now have a cash value for the stock.
(gnc:split-set-share-amount gnc-near-split num-shares)
(gnc:split-set-value gnc-far-split num-shares))
(gnc:split-set-value gnc-near-split split-amt)
(gnc:split-set-value gnc-far-split (n- xtn-amt))
(gnc:split-set-share-amount gnc-far-split (n- xtn-amt)))
;;; (gnc:split-set-share-amount gnc-near-split num-shares)
;;; (gnc:split-set-value gnc-far-split num-shares))
((shrsout)
;; shrsout is like shrsin
(gnc:split-set-share-amount gnc-near-split (n- num-shares))
(gnc:split-set-value gnc-far-split (n- num-shares)))
(gnc:split-set-value gnc-near-split (n- split-amt))
(gnc:split-set-value gnc-far-split xtn-amt)
(gnc:split-set-share-amount gnc-far-split xtn-amt))
;; stock splits: QIF just specifies the split ratio, not
;; the number of shares in and out, so we have to fetch
@ -511,10 +520,8 @@
(gnc:split-set-share-amount gnc-near-split out-shares)
(gnc:split-set-share-amount gnc-far-split (n- in-shares))
(gnc:split-set-value gnc-near-split (n- split-amt))
(gnc:split-set-value gnc-far-split split-amt)))
(else
(display "symbol = " ) (write qif-action) (newline)))
(gnc:split-set-value gnc-far-split split-amt))))
(let ((cleared (qif-split:matching-cleared
(car (qif-xtn:splits qif-xtn)))))
(if (eq? 'cleared cleared)
@ -639,7 +646,8 @@
;; transactions to match up. Quicken thinks the near
;; and far accounts are different than we do.
(case action
((intincx divx cglongx cgshortx sellx)
((intincx divx cglongx cgmidx cgshortx rtrncapx margintx
sellx)
(set! amount (- amount))
(set! near-acct-name (qif-xtn:from-acct xtn))
(set! far-acct-name (qif-split:category split)))
@ -709,6 +717,7 @@
(let ((split (car splits-left)))
;; does the account match up?
(if (and (qif-split:category-is-account? split)
(string? acct-name)
(string=? (qif-split:category split) acct-name))
;; if so, get the amount
(let ((this-amt (qif-split:amount split))
@ -784,11 +793,12 @@
(begin
(case action
((buy buyx sell sellx reinvint reinvdiv reinvsg reinvsh
reinvlg shrsin shrsout stksplit)
reinvlg reinvmd shrsin shrsout stksplit)
(set! near-acct-name (default-stock-acct from-acct security)))
((div cgshort cglong intinc miscinc miscexp xin xout)
((div cgshort cglong cgmid intinc miscinc miscexp
rtrncap margint xin xout)
(set! near-acct-name from-acct))
((divx cgshortx cglongx intincx)
((divx cgshortx cglongx cgmidx intincx rtrncapx margintx)
(set! near-acct-name
(qif-split:category (car (qif-xtn:splits xtn)))))
((miscincx miscexpx)
@ -812,16 +822,25 @@
((cglong cglongx reinvlg)
(set! far-acct-name
(default-cglong-acct from-acct security)))
((cgmid cgmidx reinvmd)
(set! far-acct-name
(default-cgmid-acct from-acct security)))
((intinc intincx reinvint)
(set! far-acct-name
(default-interest-acct from-acct security)))
((margint margintx)
(set! far-acct-name
(default-margin-interest-acct from-acct)))
((rtrncap rtrncapx)
(set! far-acct-name
(default-return-capital-acct from-acct)))
((div divx reinvdiv)
(set! far-acct-name
(default-dividend-acct from-acct security)))
((shrsin shrsout)
(set! far-acct-name
(default-equity-holding security))))
;; the commission account, if it exists
(if (qif-xtn:commission xtn)
(set! commission-acct-name
@ -890,7 +909,8 @@
;; information about what went on, so use it.
((and action o-action o-security)
(case o-action
((buyx sellx cgshortx cglongx intincx divx miscincx miscexpx)
((buyx sellx cgshortx cgmidx cglongx intincx divx
margintx rtrncapx miscincx miscexpx)
(qif-xtn:mark-split xtn split)
(qif-import:merge-xtn-info xtn other-xtn)
(qif-split:set-matching-cleared!
@ -920,6 +940,7 @@
(qif-split:set-matching-cleared!
split (qif-xtn:cleared other-xtn))))))))))
(define (qif-import:merge-xtn-info from-xtn to-xtn)
(if (and (qif-xtn:payee from-xtn)
(not (qif-xtn:payee to-xtn)))