@@ -303,35 +303,44 @@ func ComputeYTDTaxSummary(
303303
304304// WriteValueSummary writes the portfolio value summary with pregnant (unrealized) tax as formatted text.
305305func WriteValueSummary (writer io.Writer , summary * ValueSummary , config * ibctlconfig.Config , formatBaseMicros func (int64 ) string ) {
306- fmt . Fprintf (writer , "Portfolio Value: %s \n " , formatBaseMicros (summary .TotalValueMicros ))
307- fmt .Fprintf (writer , " \n " )
308- fmt . Fprintf (writer , "Pregnant STCG: %s \n " , formatBaseMicros (summary .TotalSTCGMicros ))
309- fmt . Fprintf (writer , "Pregnant STCG Tax (%.1f%%): %s \n " , config .TaxRateSTCG * 100 , formatBaseMicros (summary .STCGTaxMicros ))
310- fmt . Fprintf (writer , "Pregnant LTCG: %s \n " , formatBaseMicros (summary .TotalLTCGMicros ))
311- fmt . Fprintf (writer , "Pregnant LTCG Tax (%.1f%%): %s \n " , config .TaxRateLTCG * 100 , formatBaseMicros (summary .LTCGTaxMicros ))
312- fmt . Fprintf (writer , "Total Pregnant Tax: %s \n " , formatBaseMicros (summary .TotalTaxMicros ))
306+ writeValueLine (writer , "Portfolio Value" , formatBaseMicros (summary .TotalValueMicros ))
307+ fmt .Fprintln (writer )
308+ writeValueLine (writer , "Pregnant STCG" , formatBaseMicros (summary .TotalSTCGMicros ))
309+ writeValueLine (writer , fmt . Sprintf ( "Pregnant STCG Tax (%.1f%%)" , config .TaxRateSTCG * 100 ) , formatBaseMicros (summary .STCGTaxMicros ))
310+ writeValueLine (writer , "Pregnant LTCG" , formatBaseMicros (summary .TotalLTCGMicros ))
311+ writeValueLine (writer , fmt . Sprintf ( "Pregnant LTCG Tax (%.1f%%)" , config .TaxRateLTCG * 100 ) , formatBaseMicros (summary .LTCGTaxMicros ))
312+ writeValueLine (writer , "Total Pregnant Tax" , formatBaseMicros (summary .TotalTaxMicros ))
313313}
314314
315315// WriteYTDTaxSummary writes the YTD realized income tax summary as formatted text.
316316func WriteYTDTaxSummary (writer io.Writer , summary * YTDTaxSummary , config * ibctlconfig.Config , formatBaseMicros func (int64 ) string ) {
317- fmt . Fprintf (writer , "YTD Realized Dividends: %s \n " , formatBaseMicros (summary .DividendMicros ))
318- fmt . Fprintf (writer , "YTD Realized Dividend Tax (%.1f%%): %s \n " , config .TaxRateDividend * 100 , formatBaseMicros (summary .DividendTaxMicros ))
319- fmt . Fprintf (writer , "YTD Realized Interest: %s \n " , formatBaseMicros (summary .InterestMicros ))
320- fmt . Fprintf (writer , "YTD Realized Interest Tax (%.1f%%): %s \n " , config .TaxRateInterest * 100 , formatBaseMicros (summary .InterestTaxMicros ))
321- fmt . Fprintf (writer , "YTD Realized STCG: %s \n " , formatBaseMicros (summary .STCGMicros ))
322- fmt . Fprintf (writer , "YTD Realized STCG Tax (%.1f%%): %s \n " , config .TaxRateSTCG * 100 , formatBaseMicros (summary .STCGTaxMicros ))
323- fmt . Fprintf (writer , "YTD Realized LTCG: %s \n " , formatBaseMicros (summary .LTCGMicros ))
324- fmt . Fprintf (writer , "YTD Realized LTCG Tax (%.1f%%): %s \n " , config .TaxRateLTCG * 100 , formatBaseMicros (summary .LTCGTaxMicros ))
325- fmt . Fprintf (writer , "YTD Realized Tax Owed: %s \n " , formatBaseMicros (summary .TotalTaxOwedMicros ))
326- fmt . Fprintf (writer , "YTD Realized Tax Paid: %s \n " , formatBaseMicros (summary .TaxPaidMicros ))
327- fmt . Fprintf (writer , "YTD Realized Tax Remaining: %s \n " , formatBaseMicros (summary .TaxRemainingMicros ))
317+ writeValueLine (writer , "YTD Realized Dividends" , formatBaseMicros (summary .DividendMicros ))
318+ writeValueLine (writer , fmt . Sprintf ( "YTD Realized Dividend Tax (%.1f%%)" , config .TaxRateDividend * 100 ) , formatBaseMicros (summary .DividendTaxMicros ))
319+ writeValueLine (writer , "YTD Realized Interest" , formatBaseMicros (summary .InterestMicros ))
320+ writeValueLine (writer , fmt . Sprintf ( "YTD Realized Interest Tax (%.1f%%)" , config .TaxRateInterest * 100 ) , formatBaseMicros (summary .InterestTaxMicros ))
321+ writeValueLine (writer , "YTD Realized STCG" , formatBaseMicros (summary .STCGMicros ))
322+ writeValueLine (writer , fmt . Sprintf ( "YTD Realized STCG Tax (%.1f%%)" , config .TaxRateSTCG * 100 ) , formatBaseMicros (summary .STCGTaxMicros ))
323+ writeValueLine (writer , "YTD Realized LTCG" , formatBaseMicros (summary .LTCGMicros ))
324+ writeValueLine (writer , fmt . Sprintf ( "YTD Realized LTCG Tax (%.1f%%)" , config .TaxRateLTCG * 100 ) , formatBaseMicros (summary .LTCGTaxMicros ))
325+ writeValueLine (writer , "YTD Realized Tax Owed" , formatBaseMicros (summary .TotalTaxOwedMicros ))
326+ writeValueLine (writer , "YTD Realized Tax Paid" , formatBaseMicros (summary .TaxPaidMicros ))
327+ writeValueLine (writer , "YTD Realized Tax Remaining" , formatBaseMicros (summary .TaxRemainingMicros ))
328328}
329329
330330// WriteAfterTaxValue writes the combined after-tax portfolio value.
331331// After-tax value = portfolio value - pregnant tax - YTD tax remaining.
332332func WriteAfterTaxValue (writer io.Writer , valueSummary * ValueSummary , ytdSummary * YTDTaxSummary , formatBaseMicros func (int64 ) string ) {
333333 afterTaxMicros := valueSummary .TotalValueMicros - valueSummary .TotalTaxMicros - ytdSummary .TaxRemainingMicros
334- fmt .Fprintf (writer , "After-Tax Value: %s\n " , formatBaseMicros (afterTaxMicros ))
334+ writeValueLine (writer , "After-Tax Value" , formatBaseMicros (afterTaxMicros ))
335+ }
336+
337+ // valueLabelWidth is the fixed column width for value summary labels, sized to accommodate
338+ // the longest label ("YTD Realized Dividend Tax (XX.X%)").
339+ const valueLabelWidth = 36
340+
341+ // writeValueLine writes a single label-value line with consistent column alignment.
342+ func writeValueLine (writer io.Writer , label string , value string ) {
343+ fmt .Fprintf (writer , "%-*s %s\n " , valueLabelWidth , label + ":" , value )
335344}
336345
337346// WriteHoldingListTable writes the holding list as a table with securities,
0 commit comments