r23716 - gnucash/trunk/src/report/standard-reports - Advanced Portfolio: Fix realized gain calculation and handling of brockerage fees.

Mike Alexander mta at code.gnucash.org
Sun Jan 19 02:10:14 EST 2014


Author: mta
Date: 2014-01-19 02:10:14 -0500 (Sun, 19 Jan 2014)
New Revision: 23716
Trac: http://svn.gnucash.org/trac/changeset/23716

Modified:
   gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm
Log:
Advanced Portfolio: Fix realized gain calculation and handling of brockerage fees.

Modified: gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm	2014-01-19 07:10:04 UTC (rev 23715)
+++ gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm	2014-01-19 07:10:14 UTC (rev 23716)
@@ -607,36 +607,43 @@
 
 				 ;; we have units, handle all cases of that
 				 ((not (gnc-numeric-zero-p split-units))
-				  (begin
-				    
-
 				    ;; are we dealing with the actual stock/fund?
 				    (if (same-account? current (xaccSplitGetAccount s))
-					(begin
+					(let ((split-value-currency (gnc:gnc-monetary-amount 
+									(exchange-fn (gnc:make-gnc-monetary 
+									   commod-currency split-value) currency)))
+			                      (orig-basis (sum-basis basis-list currency-frac)))
                                           (gnc:debug "going in to basis list " basis-list " " (gnc-numeric-to-string split-units) " "
                                                      (gnc-numeric-to-string split-value))
 
 					  ;; adjust the basis
-					  (set! basis-list (basis-builder basis-list split-units (gnc:gnc-monetary-amount 
-												  (exchange-fn (gnc:make-gnc-monetary 
-														commod-currency split-value) 
-													       currency)) 
-													       basis-method 
-													       currency-frac))
+					  (set! basis-list (basis-builder basis-list split-units split-value-currency 
+									  basis-method currency-frac))
                                           (gnc:debug  "coming out of basis list " basis-list)
                                           
-					  ;; adjust moneyin/out
+					  ;; adjust moneyin/out and calculate the gain
 					  (if (gnc-numeric-positive-p split-value)
 					      ;; but only adjust moneyin if it's not a spinoff
 					      (if (or (null? (xaccSplitGetOtherSplit s))
 						      (not (gnc-numeric-zero-p (xaccSplitGetAmount (xaccSplitGetOtherSplit s)))))
 					       (begin (gnc:debug "Money in 2 " (gnc-numeric-to-string split-value))
 					              (moneyincoll 'add commod-currency split-value)))
-					      (begin (gnc:debug "Money out 2 " (gnc-numeric-to-string (gnc-numeric-neg split-value)))
-					             (moneyoutcoll 'add commod-currency (gnc-numeric-neg split-value))))
+					      (if (gnc-numeric-negative-p split-value)
+                                                ;; Split value is negative, money is going out of stock account
+                                                (let* ((new-basis (sum-basis basis-list currency-frac))
+                                                        ;; Capital gain is money out minus change in basis
+                                                        (gain (gnc-numeric-sub (gnc-numeric-abs split-value-currency)
+                                                                          (gnc-numeric-sub orig-basis new-basis
+                                                                                           currency-frac GNC-RND-ROUND)
+                                                                          currency-frac GNC-RND-ROUND)))
+                                                       (gnc:debug "Old basis=" (gnc-numeric-to-string orig-basis)
+                                                                  " New basis=" (gnc-numeric-to-string new-basis)
+                                                                  " Gain=" (gnc-numeric-to-string gain))
+                                                       (gaincoll 'add currency gain)
+                                                       (gnc:debug "Money out 2 " (gnc-numeric-to-string (gnc-numeric-neg split-value)))
+                                                       (moneyoutcoll 'add commod-currency (gnc-numeric-neg split-value)))))
 					  )
 					)
-				    )
 				  )
 
 				 ;; here is where we handle a spin-off txn. This will be a no-units
@@ -697,21 +704,15 @@
 		  )  
 		)
 
-	    ;; what this means is gain = moneyout - moneyin + basis-of-current-shares, and
-	    ;; adjust for brokers and dividends.
-	    (gaincoll 'add currency (sum-basis basis-list currency-frac))
 	    (gnc:debug "basis we're using to build rows is " (gnc-numeric-to-string (sum-basis basis-list 
 	                                                            currency-frac)))
 	    (gnc:debug "but the actual basis list is " basis-list)
 
-	    (gaincoll 'merge moneyoutcoll #f)
-	    (gaincoll 'minusmerge moneyincoll #f)
-
             ;; This removes the already-counted reinvested dividends from moneyin.
 	    (moneyincoll 'minusmerge dividend-reincoll #f)
 
             (if (not ignore-brokerage-fees)
-	      (moneyincoll 'merge brokeragecoll #f))
+	      (gaincoll 'minusmerge brokeragecoll #f))
 
 	  (if (or include-empty (not (gnc-numeric-zero-p units)))
 	    (let* ((moneyin (gnc:sum-collector-commodity moneyincoll currency exchange-fn))
@@ -728,11 +729,7 @@
 									      (gnc:gnc-monetary-amount ugain)
 									      currency-frac GNC-RND-ROUND)))
 		  (totalreturn (gnc:make-gnc-monetary currency (gnc-numeric-add (gnc:gnc-monetary-amount bothgain)
-										(if ignore-brokerage-fees
 										    (gnc:gnc-monetary-amount income)
-										    (gnc-numeric-sub (gnc:gnc-monetary-amount income)
-												     (gnc:gnc-monetary-amount brokerage)
-												     currency-frac GNC-RND-ROUND))
 										currency-frac GNC-RND-ROUND)))
 
 		  (activecols (list (gnc:html-account-anchor current)))
@@ -948,11 +945,7 @@
 										      (gnc-commodity-get-fraction currency) GNC-RND-ROUND)))
 	  (set! sum-total-brokerage (gnc:sum-collector-commodity total-brokerage currency exchange-fn))
 	  (set! sum-total-totalreturn (gnc:make-gnc-monetary currency (gnc-numeric-add (gnc:gnc-monetary-amount sum-total-both-gains)
-										       (if ignore-brokerage-fees
 										           (gnc:gnc-monetary-amount sum-total-income)
-											   (gnc-numeric-sub (gnc:gnc-monetary-amount sum-total-income)
-													    (gnc:gnc-monetary-amount sum-total-brokerage)
-													    (gnc-commodity-get-fraction currency) GNC-RND-ROUND))
 										       (gnc-commodity-get-fraction currency) GNC-RND-ROUND)))
 
           (gnc:html-table-append-row/markup!



More information about the gnucash-changes mailing list