finmodeling 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. data/.gitignore +0 -0
  2. data/Gemfile +2 -0
  3. data/README.md +289 -269
  4. data/Rakefile +12 -0
  5. data/TODO.txt +113 -20
  6. data/examples/{dump_report.rb → dump_latest_10k.rb} +1 -1
  7. data/examples/list_disclosures.rb +50 -0
  8. data/examples/lists/nasdaq-mid-to-mega-tech-symbols.txt +0 -0
  9. data/examples/show_report.rb +112 -32
  10. data/examples/show_reports.rb +162 -33
  11. data/finmodeling.gemspec +4 -1
  12. data/lib/finmodeling/annual_report_filing.rb +97 -18
  13. data/lib/finmodeling/array_with_stats.rb +0 -0
  14. data/lib/finmodeling/assets_calculation.rb +12 -3
  15. data/lib/finmodeling/assets_item.rb +0 -0
  16. data/lib/finmodeling/assets_item_vectors.rb +0 -0
  17. data/lib/finmodeling/balance_sheet_analyses.rb +19 -4
  18. data/lib/finmodeling/balance_sheet_calculation.rb +52 -37
  19. data/lib/finmodeling/calculation_summary.rb +119 -14
  20. data/lib/finmodeling/can_cache_classifications.rb +0 -0
  21. data/lib/finmodeling/can_cache_summaries.rb +0 -0
  22. data/lib/finmodeling/can_choose_successive_periods.rb +15 -0
  23. data/lib/finmodeling/can_classify_rows.rb +0 -0
  24. data/lib/finmodeling/capm.rb +80 -0
  25. data/lib/finmodeling/cash_change_calculation.rb +3 -3
  26. data/lib/finmodeling/cash_change_item.rb +0 -0
  27. data/lib/finmodeling/cash_change_item_vectors.rb +0 -0
  28. data/lib/finmodeling/cash_change_summary_from_differences.rb +36 -0
  29. data/lib/finmodeling/cash_flow_statement_analyses.rb +36 -0
  30. data/lib/finmodeling/cash_flow_statement_calculation.rb +28 -52
  31. data/lib/finmodeling/classifiers.rb +2 -0
  32. data/lib/finmodeling/company.rb +0 -0
  33. data/lib/finmodeling/company_filing.rb +30 -7
  34. data/lib/finmodeling/company_filing_calculation.rb +16 -6
  35. data/lib/finmodeling/company_filings.rb +112 -46
  36. data/lib/finmodeling/comprehensive_income_calculation.rb +60 -0
  37. data/lib/finmodeling/comprehensive_income_statement_calculation.rb +74 -0
  38. data/lib/finmodeling/comprehensive_income_statement_item.rb +20 -0
  39. data/lib/finmodeling/comprehensive_income_statement_item_vectors.rb +235 -0
  40. data/lib/finmodeling/config.rb +0 -0
  41. data/lib/finmodeling/debt_cost_of_capital.rb +14 -0
  42. data/lib/finmodeling/equity_change_calculation.rb +43 -0
  43. data/lib/finmodeling/equity_change_item.rb +25 -0
  44. data/lib/finmodeling/equity_change_item_vectors.rb +156 -0
  45. data/lib/finmodeling/factory.rb +0 -0
  46. data/lib/finmodeling/fama_french_cost_of_equity.rb +119 -0
  47. data/lib/finmodeling/float_helpers.rb +14 -8
  48. data/lib/finmodeling/forecasted_reformulated_balance_sheet.rb +55 -0
  49. data/lib/finmodeling/forecasted_reformulated_income_statement.rb +110 -0
  50. data/lib/finmodeling/forecasts.rb +4 -4
  51. data/lib/finmodeling/has_string_classifer.rb +0 -0
  52. data/lib/finmodeling/income_statement_analyses.rb +23 -17
  53. data/lib/finmodeling/income_statement_calculation.rb +46 -43
  54. data/lib/finmodeling/income_statement_item.rb +1 -1
  55. data/lib/finmodeling/income_statement_item_vectors.rb +24 -13
  56. data/lib/finmodeling/invalid_filing_error.rb +4 -0
  57. data/lib/finmodeling/liabs_and_equity_calculation.rb +18 -8
  58. data/lib/finmodeling/liabs_and_equity_item.rb +1 -1
  59. data/lib/finmodeling/liabs_and_equity_item_vectors.rb +24 -24
  60. data/lib/finmodeling/linear_trend_forecasting_policy.rb +23 -0
  61. data/lib/finmodeling/net_income_calculation.rb +23 -10
  62. data/lib/finmodeling/net_income_summary_from_differences.rb +51 -0
  63. data/lib/finmodeling/paths.rb +0 -0
  64. data/lib/finmodeling/period_array.rb +8 -4
  65. data/lib/finmodeling/quarterly_report_filing.rb +9 -4
  66. data/lib/finmodeling/rate.rb +8 -0
  67. data/lib/finmodeling/ratio.rb +0 -0
  68. data/lib/finmodeling/reformulated_balance_sheet.rb +47 -88
  69. data/lib/finmodeling/reformulated_cash_flow_statement.rb +18 -41
  70. data/lib/finmodeling/reformulated_income_statement.rb +44 -206
  71. data/lib/finmodeling/reformulated_shareholder_equity_statement.rb +50 -0
  72. data/lib/finmodeling/reoi_valuation.rb +104 -0
  73. data/lib/finmodeling/shareholder_equity_statement_calculation.rb +34 -0
  74. data/lib/finmodeling/string_helpers.rb +18 -1
  75. data/lib/finmodeling/time_series_estimator.rb +25 -0
  76. data/lib/finmodeling/trailing_avg_forecasting_policy.rb +23 -0
  77. data/lib/finmodeling/version.rb +1 -1
  78. data/lib/finmodeling/weighted_avg_cost_of_capital.rb +35 -0
  79. data/lib/finmodeling/yahoo_finance_helpers.rb +20 -0
  80. data/lib/finmodeling.rb +33 -2
  81. data/spec/annual_report_filing_spec.rb +81 -45
  82. data/spec/assets_calculation_spec.rb +7 -4
  83. data/spec/assets_item_spec.rb +9 -14
  84. data/spec/balance_sheet_analyses_spec.rb +13 -13
  85. data/spec/balance_sheet_calculation_spec.rb +45 -51
  86. data/spec/calculation_summary_spec.rb +113 -21
  87. data/spec/can_classify_rows_spec.rb +0 -0
  88. data/spec/cash_change_calculation_spec.rb +1 -10
  89. data/spec/cash_change_item_spec.rb +10 -18
  90. data/spec/cash_flow_statement_calculation_spec.rb +10 -24
  91. data/spec/company_beta_spec.rb +53 -0
  92. data/spec/company_filing_calculation_spec.rb +39 -49
  93. data/spec/company_filing_spec.rb +0 -0
  94. data/spec/company_filings_spec.rb +75 -25
  95. data/spec/company_spec.rb +37 -47
  96. data/spec/comprehensive_income_statement_calculation_spec.rb +54 -0
  97. data/spec/comprehensive_income_statement_item_spec.rb +56 -0
  98. data/spec/debt_cost_of_capital_spec.rb +19 -0
  99. data/spec/equity_change_calculation_spec.rb +33 -0
  100. data/spec/equity_change_item_spec.rb +58 -0
  101. data/spec/factory_spec.rb +2 -2
  102. data/spec/forecasts_spec.rb +2 -2
  103. data/spec/income_statement_analyses_spec.rb +23 -21
  104. data/spec/income_statement_calculation_spec.rb +17 -49
  105. data/spec/income_statement_item_spec.rb +17 -29
  106. data/spec/liabs_and_equity_calculation_spec.rb +6 -3
  107. data/spec/liabs_and_equity_item_spec.rb +14 -22
  108. data/spec/linear_trend_forecasting_policy_spec.rb +37 -0
  109. data/spec/matchers/custom_matchers.rb +79 -0
  110. data/spec/mocks/calculation.rb +0 -0
  111. data/spec/mocks/income_statement_analyses.rb +0 -0
  112. data/spec/mocks/sec_query.rb +0 -0
  113. data/spec/net_income_calculation_spec.rb +16 -10
  114. data/spec/period_array.rb +0 -0
  115. data/spec/quarterly_report_filing_spec.rb +21 -38
  116. data/spec/rate_spec.rb +0 -0
  117. data/spec/ratio_spec.rb +0 -0
  118. data/spec/reformulated_balance_sheet_spec.rb +56 -33
  119. data/spec/reformulated_cash_flow_statement_spec.rb +18 -10
  120. data/spec/reformulated_income_statement_spec.rb +16 -15
  121. data/spec/reformulated_shareholder_equity_statement_spec.rb +43 -0
  122. data/spec/reoi_valuation_spec.rb +146 -0
  123. data/spec/shareholder_equity_statement_calculation_spec.rb +59 -0
  124. data/spec/spec_helper.rb +4 -1
  125. data/spec/string_helpers_spec.rb +15 -13
  126. data/spec/time_series_estimator_spec.rb +61 -0
  127. data/spec/trailing_avg_forecasting_policy_spec.rb +37 -0
  128. data/spec/weighted_avg_cost_of_capital_spec.rb +32 -0
  129. data/tools/create_equity_change_training_vectors.rb +49 -0
  130. data/tools/time_specs.sh +7 -0
  131. metadata +182 -36
  132. data/lib/finmodeling/constant_forecasting_policy.rb +0 -23
  133. data/lib/finmodeling/generic_forecasting_policy.rb +0 -19
  134. data/spec/constant_forecasting_policy_spec.rb +0 -37
  135. data/spec/generic_forecasting_policy_spec.rb +0 -33
@@ -13,7 +13,7 @@ module FinModeling
13
13
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
14
14
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
15
15
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
16
- {:klass=>:fl, :item_string=>"Minority Interest"},
16
+ {:klass=>:mi, :item_string=>"Minority Interest"},
17
17
 
18
18
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
19
19
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
@@ -115,7 +115,7 @@ module FinModeling
115
115
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
116
116
  {:klass=>:ol, :item_string=>"Pension And Other Postretirement And Postemployment Benefit Plans Liabilities Noncurrent"},
117
117
  {:klass=>:ol, :item_string=>"Other Liabilities Noncurrent"},
118
- {:klass=>:fl, :item_string=>"Minority Interest"},
118
+ {:klass=>:mi, :item_string=>"Minority Interest"},
119
119
  {:klass=>:cse, :item_string=>"Common Stock Value"},
120
120
  {:klass=>:cse, :item_string=>"Additional Paid In Capital"},
121
121
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
@@ -280,7 +280,7 @@ module FinModeling
280
280
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
281
281
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
282
282
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
283
- {:klass=>:fl, :item_string=>"Minority Interest"},
283
+ {:klass=>:mi, :item_string=>"Minority Interest"},
284
284
 
285
285
  {:klass=>:fl, :item_string=>"Notes And Loans Payable Current"},
286
286
  {:klass=>:ol, :item_string=>"Accounts Payable And Accrued Liabilities Current"},
@@ -376,7 +376,7 @@ module FinModeling
376
376
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
377
377
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
378
378
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
379
- {:klass=>:fl, :item_string=>"Minority Interest"},
379
+ {:klass=>:mi, :item_string=>"Minority Interest"},
380
380
 
381
381
  {:klass=>:ol, :item_string=>"Other Liabilities Noncurrent"},
382
382
  {:klass=>:fl, :item_string=>"Accrued Income Taxes Current"},
@@ -410,7 +410,7 @@ module FinModeling
410
410
  {:klass=>:cse, :item_string=>"Additional Paid In Capital"},
411
411
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
412
412
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
413
- {:klass=>:fl, :item_string=>"Minority Interest"},
413
+ {:klass=>:mi, :item_string=>"Minority Interest"},
414
414
 
415
415
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
416
416
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
@@ -447,7 +447,7 @@ module FinModeling
447
447
  {:klass=>:fl, :item_string=>"Accrued Income Taxes Noncurrent"},
448
448
  {:klass=>:ol, :item_string=>"Deferred Revenue Noncurrent"},
449
449
  {:klass=>:ol, :item_string=>"Other Liabilities Noncurrent"},
450
- {:klass=>:fl, :item_string=>"Minority Interest"},
450
+ {:klass=>:mi, :item_string=>"Minority Interest"},
451
451
  {:klass=>:fl, :item_string=>"Preferred Stock Value"},
452
452
  {:klass=>:cse, :item_string=>"Common Stock Including Additional Paid In Capital"},
453
453
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
@@ -485,7 +485,7 @@ module FinModeling
485
485
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
486
486
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
487
487
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
488
- {:klass=>:fl, :item_string=>"Minority Interest"},
488
+ {:klass=>:mi, :item_string=>"Minority Interest"},
489
489
 
490
490
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
491
491
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
@@ -512,7 +512,7 @@ module FinModeling
512
512
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
513
513
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
514
514
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
515
- {:klass=>:fl, :item_string=>"Minority Interest"},
515
+ {:klass=>:mi, :item_string=>"Minority Interest"},
516
516
 
517
517
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
518
518
  {:klass=>:ol, :item_string=>"Deferred Revenue Current"},
@@ -810,7 +810,7 @@ module FinModeling
810
810
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
811
811
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
812
812
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
813
- {:klass=>:fl, :item_string=>"Minority Interest"},
813
+ {:klass=>:mi, :item_string=>"Minority Interest"},
814
814
 
815
815
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
816
816
  {:klass=>:ol, :item_string=>"Employee Related Liabilities Current"},
@@ -875,7 +875,7 @@ module FinModeling
875
875
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
876
876
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
877
877
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
878
- {:klass=>:fl, :item_string=>"Minority Interest"},
878
+ {:klass=>:mi, :item_string=>"Minority Interest"},
879
879
 
880
880
  {:klass=>:fl, :item_string=>"Convertible Debt Noncurrent"},
881
881
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
@@ -971,7 +971,7 @@ module FinModeling
971
971
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
972
972
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
973
973
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
974
- {:klass=>:fl, :item_string=>"Minority Interest"},
974
+ {:klass=>:mi, :item_string=>"Minority Interest"},
975
975
 
976
976
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
977
977
  {:klass=>:ol, :item_string=>"Accrued Revenue Share Obligation And Rebates"},
@@ -1067,7 +1067,7 @@ module FinModeling
1067
1067
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1068
1068
 
1069
1069
  {:klass=>:cse, :item_string=>"Stockholders Equity"},
1070
- {:klass=>:fl, :item_string=>"Minority Interest"},
1070
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1071
1071
  {:klass=>:ol, :item_string=>"Other Liabilities Noncurrent"},
1072
1072
  {:klass=>:fl, :item_string=>"Accrued Income Taxes Noncurrent"},
1073
1073
  {:klass=>:ol, :item_string=>"Deferred Revenue Noncurrent"},
@@ -1115,7 +1115,7 @@ module FinModeling
1115
1115
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
1116
1116
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1117
1117
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1118
- {:klass=>:fl, :item_string=>"Minority Interest"},
1118
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1119
1119
 
1120
1120
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1121
1121
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
@@ -1188,7 +1188,7 @@ module FinModeling
1188
1188
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1189
1189
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1190
1190
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
1191
- {:klass=>:fl, :item_string=>"Minority Interest"},
1191
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1192
1192
 
1193
1193
  {:klass=>:fl, :item_string=>"Notes And Loans Payable Current"},
1194
1194
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
@@ -1202,7 +1202,7 @@ module FinModeling
1202
1202
  {:klass=>:fl, :item_string=>"Preferred Stock Value"},
1203
1203
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1204
1204
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1205
- {:klass=>:fl, :item_string=>"Minority Interest"},
1205
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1206
1206
 
1207
1207
  {:klass=>:ol, :item_string=>"Deferred Revenue Current"},
1208
1208
  {:klass=>:fl, :item_string=>"Deferred Tax Liabilities Current"},
@@ -1236,7 +1236,7 @@ module FinModeling
1236
1236
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Available For Sale Securities Adjustment Net Of Tax"},
1237
1237
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Foreign Currency Translation Adjustment Net Of Tax"},
1238
1238
 
1239
- {:klass=>:fl, :item_string=>"Minority Interest"},
1239
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1240
1240
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1241
1241
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1242
1242
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
@@ -1330,7 +1330,7 @@ module FinModeling
1330
1330
  {:klass=>:cse, :item_string=>"Additional Paid In Capital"},
1331
1331
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1332
1332
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1333
- {:klass=>:fl, :item_string=>"Minority Interest"},
1333
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1334
1334
 
1335
1335
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
1336
1336
  {:klass=>:ol, :item_string=>"Employee Related Liabilities Current"},
@@ -1377,7 +1377,7 @@ module FinModeling
1377
1377
  {:klass=>:cse, :item_string=>"Additional Paid In Capital"},
1378
1378
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1379
1379
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1380
- {:klass=>:fl, :item_string=>"Minority Interest"},
1380
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1381
1381
  {:klass=>:fl, :item_string=>"Redeemable Noncontrolling Interest Equity Carrying Amount"},
1382
1382
 
1383
1383
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
@@ -1647,7 +1647,7 @@ module FinModeling
1647
1647
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
1648
1648
  {:klass=>:cse, :item_string=>"Retained Earnings Unappropriated"},
1649
1649
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1650
- {:klass=>:fl, :item_string=>"Minority Interest"},
1650
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1651
1651
 
1652
1652
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
1653
1653
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
@@ -1664,7 +1664,7 @@ module FinModeling
1664
1664
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
1665
1665
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1666
1666
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1667
- {:klass=>:fl, :item_string=>"Minority Interest"},
1667
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1668
1668
 
1669
1669
  {:klass=>:ol, :item_string=>"Accounts Payable And Accrued Liabilities Current"},
1670
1670
  {:klass=>:ol, :item_string=>"Deferred Revenue Subscription And Support Current"},
@@ -1737,7 +1737,7 @@ module FinModeling
1737
1737
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1738
1738
  {:klass=>:fl, :item_string=>"Statutory Accounting Practices Statutory Capital And Surplus Balance"},
1739
1739
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1740
- {:klass=>:fl, :item_string=>"Minority Interest"},
1740
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1741
1741
 
1742
1742
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
1743
1743
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
@@ -1861,7 +1861,7 @@ module FinModeling
1861
1861
  {:klass=>:cse, :item_string=>"Additional Paid In Capital Common Stock"},
1862
1862
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1863
1863
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1864
- {:klass=>:fl, :item_string=>"Minority Interest"},
1864
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1865
1865
 
1866
1866
  {:klass=>:ol, :item_string=>"Deferred Revenue Current"},
1867
1867
  {:klass=>:ol, :item_string=>"Accounts Payable And Accrued Liabilities Current"},
@@ -1888,7 +1888,7 @@ module FinModeling
1888
1888
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1889
1889
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
1890
1890
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1891
- {:klass=>:fl, :item_string=>"Minority Interest"},
1891
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1892
1892
 
1893
1893
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
1894
1894
  {:klass=>:ol, :item_string=>"Employee Related Liabilities Current"},
@@ -1916,7 +1916,7 @@ module FinModeling
1916
1916
  {:klass=>:cse, :item_string=>"Treasury Stock Value"},
1917
1917
  {:klass=>:cse, :item_string=>"Retained Earnings Accumulated Deficit"},
1918
1918
  {:klass=>:cse, :item_string=>"Accumulated Other Comprehensive Income Loss Net Of Tax"},
1919
- {:klass=>:fl, :item_string=>"Minority Interest"},
1919
+ {:klass=>:mi, :item_string=>"Minority Interest"},
1920
1920
 
1921
1921
  {:klass=>:ol, :item_string=>"Accounts Payable Current"},
1922
1922
  {:klass=>:ol, :item_string=>"Accrued Liabilities Current"},
@@ -0,0 +1,23 @@
1
+ module FinModeling
2
+ class LinearTrendForecastingPolicy
3
+ def initialize(args)
4
+ @vals = args
5
+ end
6
+
7
+ def revenue_on(date)
8
+ @vals[:revenue_estimator].estimate_on(date)
9
+ end
10
+
11
+ def sales_pm_on(date)
12
+ @vals[:sales_pm_estimator].estimate_on(date)
13
+ end
14
+
15
+ def fi_over_nfa_on(date)
16
+ @vals[:fi_over_nfa_estimator].estimate_on(date)
17
+ end
18
+
19
+ def sales_over_noa_on(date)
20
+ @vals[:sales_over_noa_estimator].estimate_on(date)
21
+ end
22
+ end
23
+ end
@@ -6,16 +6,17 @@ module FinModeling
6
6
 
7
7
  BASE_FILENAME = File.join(FinModeling::BASE_PATH, "summaries/net_income_")
8
8
 
9
- ALL_STATES = [ :or, :cogs, :oe, :oibt, :fibt, :tax, :ooiat, :fiat ]
10
- NEXT_STATES = { nil => [ :or, :cogs, :oe, :oibt, :fibt, :tax, :ooiat, :fiat ],
11
- :or => [ :or, :cogs, :oe, :oibt, :fibt, :tax, :ooiat, :fiat ],
12
- :cogs => [ :cogs, :oe, :oibt, :fibt, :tax, :ooiat, :fiat ],
13
- :oe => [ :oe, :oibt, :fibt, :tax, :ooiat, :fiat ],
14
- :oibt => [ :oibt, :fibt, :tax, :ooiat, :fiat ], # obit/fibt can cycle back/forth
15
- :fibt => [ :obit, :fibt, :tax, :ooiat, :fiat ], # obit/fibt can cycle back/forth
16
- :tax => [ :ooiat, :fiat ], # tax can't go to itself. only 1 such item.
17
- :ooiat => [ :ooiat, :fiat ], # ooiat/fiat can cycle back/forth
18
- :fiat => [ :ooiat, :fiat ] }# ooiat/fiat can cycle back/forth
9
+ ALL_STATES = [ :or, :cogs, :oe, :oibt, :fibt, :tax, :ooiat, :ooiat_nci, :fiat ]
10
+ NEXT_STATES = { nil => [ :or ],
11
+ :or => [ :or, :cogs, :oe, :oibt, :fibt ],
12
+ :cogs => [ :cogs, :oe, :oibt, :fibt, :tax ],
13
+ :oe => [ :oe, :oibt, :fibt, :tax ],
14
+ :oibt => [ :oibt, :fibt, :tax ], # obit/fibt can cycle back/forth
15
+ :fibt => [ :obit, :fibt, :tax ], # obit/fibt can cycle back/forth
16
+ :tax => [ :ooiat, :ooiat_nci, :fiat ], # tax can't go to itself. only 1 such item.
17
+ :ooiat => [ :ooiat, :ooiat_nci, :fiat ], # other operating income after taxes
18
+ :ooiat_nci => [ :ooiat, :ooiat_nci, :fiat ], # ooiat related to non-controlling interest
19
+ :fiat => [ :ooiat, :ooiat_nci, :fiat ] }# financing income after taxes
19
20
 
20
21
  def summary(args)
21
22
  summary_cache_key = args[:period].to_pretty_s
@@ -37,5 +38,17 @@ module FinModeling
37
38
  return thesummary
38
39
  end
39
40
 
41
+ def has_revenue_item?
42
+ @has_revenue_item ||= leaf_items.any? do |leaf|
43
+ leaf.name.matches_any_regex?([/revenue/i, /sales/i])
44
+ end
45
+ end
46
+
47
+ def has_tax_item?
48
+ @has_tax_item ||= leaf_items.any? do |leaf|
49
+ leaf.name.matches_any_regex?([/tax/i])
50
+ end
51
+ end
52
+
40
53
  end
41
54
  end
@@ -0,0 +1,51 @@
1
+ module FinModeling
2
+
3
+ class NetIncomeSummaryFromDifferences
4
+ def initialize(ris1, ris2)
5
+ @ris1 = ris1
6
+ @ris2 = ris2
7
+ end
8
+
9
+ def filter_by_type(key)
10
+ cs = FinModeling::CalculationSummary.new
11
+ case key
12
+ when :or
13
+ cs.title = "Operating Revenues"
14
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.operating_revenues.total] ),
15
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.operating_revenues.total] ) ]
16
+ when :cogs
17
+ cs.title = "Cost of Revenues"
18
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.cost_of_revenues.total] ),
19
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.cost_of_revenues.total] ) ]
20
+ when :oe
21
+ cs.title = "Operating Expenses"
22
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.operating_expenses.total] ),
23
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.operating_expenses.total] ) ]
24
+ when :oibt
25
+ cs.title = "Operating Income from Sales, Before taxes"
26
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.operating_income_after_tax.rows[1].vals.first] ),
27
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.operating_income_after_tax.rows[1].vals.first] ) ]
28
+ when :fibt
29
+ cs.title = "Financing Income, Before Taxes"
30
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.net_financing_income.rows[0].vals.first] ),
31
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.net_financing_income.rows[0].vals.first] ) ]
32
+ when :tax
33
+ cs.title = "Taxes"
34
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.income_from_sales_after_tax.rows[1].vals.first] ),
35
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.income_from_sales_after_tax.rows[1].vals.first] ) ]
36
+ when :ooiat
37
+ cs.title = "Other Operating Income, After Taxes"
38
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.operating_income_after_tax.rows[3].vals.first] ),
39
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.operating_income_after_tax.rows[3].vals.first] ) ]
40
+ when :fiat
41
+ cs.title = "Financing Income, After Taxes"
42
+ cs.rows = [ CalculationRow.new(:key => "First Row", :vals => [ @ris1.net_financing_income.rows[2].vals.first] ),
43
+ CalculationRow.new(:key => "Second Row", :vals => [-@ris2.net_financing_income.rows[2].vals.first] ) ]
44
+ else
45
+ return nil
46
+ end
47
+ return cs
48
+ end
49
+ end
50
+
51
+ end
File without changes
@@ -1,22 +1,26 @@
1
1
  module FinModeling
2
2
  class PeriodArray < Array
3
3
  def quarterly
4
- PeriodArray.new(self.select{ |x| (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 2*28) &&
4
+ PeriodArray.new(self.select{ |x| x.is_duration? &&
5
+ (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 2*28) &&
5
6
  (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) <= 4*31) })
6
7
  end
7
8
 
8
9
  def halfyearly
9
- PeriodArray.new(self.select{ |x| (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 5*30) &&
10
+ PeriodArray.new(self.select{ |x| x.is_duration? &&
11
+ (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 5*30) &&
10
12
  (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) <= 7*31) })
11
13
  end
12
14
 
13
15
  def threequarterly
14
- PeriodArray.new(self.select{ |x| (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 8*30) &&
16
+ PeriodArray.new(self.select{ |x| x.is_duration? &&
17
+ (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 8*30) &&
15
18
  (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) <= 10*31) })
16
19
  end
17
20
 
18
21
  def yearly
19
- PeriodArray.new(self.select{ |x| (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 11*30) &&
22
+ PeriodArray.new(self.select{ |x| x.is_duration? &&
23
+ (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) >= 11*30) &&
20
24
  (Xbrlware::DateUtil.days_between(x.value["end_date"], x.value["start_date"]) <= 13*31) })
21
25
  end
22
26
  end
@@ -2,9 +2,14 @@ module FinModeling
2
2
  class QuarterlyReportFiling < AnnualReportFiling
3
3
 
4
4
  def write_constructor(file, item_name)
5
- balance_sheet.write_constructor( file, bs_name = item_name + "_bs")
6
- income_statement.write_constructor( file, is_name = item_name + "_is")
7
- cash_flow_statement.write_constructor(file, cfs_name = item_name + "_cfs")
5
+ balance_sheet .write_constructor(file, bs_name = item_name + "_bs" )
6
+ income_statement .write_constructor(file, is_name = item_name + "_is" ) if has_an_income_statement?
7
+ comprehensive_income_statement.write_constructor(file, cis_name = item_name + "_cis") if has_a_comprehensive_income_statement?
8
+ cash_flow_statement .write_constructor(file, cfs_name = item_name + "_cfs")
9
+
10
+ is_name = "nil" if !has_an_income_statement?
11
+ cis_name = "nil" if !has_a_comprehensive_income_statement?
12
+ ses_name = "nil" # because these only get reported in 10-k's?
8
13
 
9
14
  names_of_discs = []
10
15
  disclosures.each_with_index do |disclosure, idx|
@@ -16,7 +21,7 @@ module FinModeling
16
21
 
17
22
  file.puts "#{SCHEMA_VERSION_ITEM} = #{CURRENT_SCHEMA_VERSION}"
18
23
 
19
- file.puts "#{item_name} = FinModeling::CachedQuarterlyFiling.new(#{bs_name}, #{is_name}, #{cfs_name}, #{names_of_discs_str})"
24
+ file.puts "#{item_name} = FinModeling::CachedQuarterlyFiling.new(#{bs_name}, #{is_name}, #{cis_name}, #{cfs_name}, #{ses_name}, #{names_of_discs_str})"
20
25
  end
21
26
 
22
27
  end
@@ -1,5 +1,7 @@
1
1
  module FinModeling
2
2
  class Rate
3
+ attr_reader :value
4
+
3
5
  def initialize(value)
4
6
  @value = value
5
7
  end
@@ -16,5 +18,11 @@ module FinModeling
16
18
  annualize(from_days=365.0/4.0, to_days=365.0)
17
19
  end
18
20
  end
21
+
22
+ class DiscountRate < Rate
23
+ def annualize(from_days=365, to_days=365)
24
+ @value**(to_days.to_f/from_days.to_f)
25
+ end
26
+ end
19
27
  end
20
28
 
File without changes
@@ -1,45 +1,37 @@
1
+ # encoding: utf-8
2
+
1
3
  module FinModeling
2
4
  class ReformulatedBalanceSheet
3
5
  attr_accessor :period
6
+ attr_accessor :operating_assets, :financial_assets
7
+ attr_accessor :operating_liabilities, :financial_liabilities
8
+ attr_accessor :minority_interest
4
9
 
5
- def initialize(period, assets_summary, liabs_and_equity_summary)
10
+ def initialize(period, assets, liabs_and_equity)
6
11
  @period = period
7
- @oa = assets_summary.filter_by_type(:oa)
8
- @fa = assets_summary.filter_by_type(:fa)
9
- @ol = liabs_and_equity_summary.filter_by_type(:ol)
10
- @fl = liabs_and_equity_summary.filter_by_type(:fl)
11
- @cse = liabs_and_equity_summary.filter_by_type(:cse)
12
- end
13
-
14
- def operating_assets
15
- @oa
16
- end
17
12
 
18
- def financial_assets
19
- @fa
20
- end
13
+ @operating_assets = assets.filter_by_type(:oa)
14
+ @financial_assets = assets.filter_by_type(:fa)
15
+ @operating_liabilities = liabs_and_equity.filter_by_type(:ol)
16
+ @financial_liabilities = liabs_and_equity.filter_by_type(:fl)
21
17
 
22
- def operating_liabilities
23
- @ol
24
- end
25
-
26
- def financial_liabilities
27
- @fl
18
+ #@cse = liabs_and_equity.filter_by_type(:cse)
19
+ @minority_interest = liabs_and_equity.filter_by_type(:mi)
28
20
  end
29
21
 
30
22
  def net_operating_assets
31
23
  cs = FinModeling::CalculationSummary.new
32
24
  cs.title = "Net Operational Assets"
33
- cs.rows = [ CalculationRow.new( :key => "OA", :vals => [ @oa.total ] ),
34
- CalculationRow.new( :key => "OL", :vals => [ -@ol.total ] ) ]
25
+ cs.rows = [ CalculationRow.new( :key => "OA", :vals => [ @operating_assets.total ] ),
26
+ CalculationRow.new( :key => "OL", :vals => [ -@operating_liabilities.total ] ) ]
35
27
  return cs
36
28
  end
37
29
 
38
30
  def net_financial_assets
39
31
  cs = FinModeling::CalculationSummary.new
40
32
  cs.title = "Net Financial Assets"
41
- cs.rows = [ CalculationRow.new( :key => "FA", :vals => [ @fa.total ] ),
42
- CalculationRow.new( :key => "FL", :vals => [ -@fl.total ] ) ]
33
+ cs.rows = [ CalculationRow.new( :key => "FA", :vals => [ @financial_assets.total ] ),
34
+ CalculationRow.new( :key => "FL", :vals => [ -@financial_liabilities.total ] ) ]
43
35
  return cs
44
36
  end
45
37
 
@@ -47,7 +39,8 @@ module FinModeling
47
39
  cs = FinModeling::CalculationSummary.new
48
40
  cs.title = "Common Shareholders' Equity"
49
41
  cs.rows = [ CalculationRow.new( :key => "NOA", :vals => [ net_operating_assets.total ] ),
50
- CalculationRow.new( :key => "NFA", :vals => [ net_financial_assets.total ] ) ]
42
+ CalculationRow.new( :key => "NFA", :vals => [ net_financial_assets.total ] ),
43
+ CalculationRow.new( :key => "MI", :vals => [ -@minority_interest.total ] ) ]
51
44
  return cs
52
45
  end
53
46
 
@@ -55,13 +48,21 @@ module FinModeling
55
48
  net_operating_assets.total / net_financial_assets.total
56
49
  end
57
50
 
51
+ def change_in_noa(prev)
52
+ net_operating_assets.total - prev.net_operating_assets.total
53
+ end
54
+
55
+ def change_in_cse(prev)
56
+ common_shareholders_equity.total - prev.common_shareholders_equity.total
57
+ end
58
+
58
59
  def noa_growth(prev)
59
- rate = (net_operating_assets.total - prev.net_operating_assets.total) / prev.net_operating_assets.total
60
+ rate = change_in_noa(prev) / prev.net_operating_assets.total
60
61
  return annualize_rate(prev, rate)
61
62
  end
62
63
 
63
64
  def cse_growth(prev)
64
- rate = (common_shareholders_equity.total - prev.common_shareholders_equity.total) / prev.common_shareholders_equity.total
65
+ rate = change_in_cse(prev) / prev.common_shareholders_equity.total
65
66
  return annualize_rate(prev, rate)
66
67
  end
67
68
 
@@ -73,27 +74,36 @@ module FinModeling
73
74
 
74
75
  analysis.rows = []
75
76
  if Config.balance_detail_enabled?
76
- analysis.rows << CalculationRow.new(:key => "A ($MM)",:vals => [@oa.total.to_nearest_million +
77
- @fa.total.to_nearest_million])
78
- analysis.rows << CalculationRow.new(:key => "L ($MM)",:vals => [@ol.total.to_nearest_million +
79
- @fl.total.to_nearest_million])
77
+ analysis.rows << CalculationRow.new(:key => "A ($MM)",:vals => [@operating_assets.total.to_nearest_million +
78
+ @financial_assets.total.to_nearest_million])
79
+ analysis.rows << CalculationRow.new(:key => "L ($MM)",:vals => [@operating_liabilities.total.to_nearest_million +
80
+ @financial_liabilities.total.to_nearest_million])
80
81
  end
81
82
  analysis.rows << CalculationRow.new(:key => "NOA ($MM)", :vals => [net_operating_assets.total.to_nearest_million])
82
83
  if Config.balance_detail_enabled?
83
- analysis.rows << CalculationRow.new(:key => "OA ($MM)",:vals => [operating_assets.total.to_nearest_million])
84
- analysis.rows << CalculationRow.new(:key => "OL ($MM)",:vals => [operating_liabilities.total.to_nearest_million])
84
+ analysis.rows << CalculationRow.new(:key => "OA ($MM)",:vals => [@operating_assets.total.to_nearest_million])
85
+ analysis.rows << CalculationRow.new(:key => "OL ($MM)",:vals => [@operating_liabilities.total.to_nearest_million])
85
86
  end
86
87
  analysis.rows << CalculationRow.new(:key => "NFA ($MM)", :vals => [net_financial_assets.total.to_nearest_million])
87
88
  if Config.balance_detail_enabled?
88
- analysis.rows << CalculationRow.new(:key => "FA ($MM)",:vals => [financial_assets.total.to_nearest_million])
89
- analysis.rows << CalculationRow.new(:key => "FL ($MM)",:vals => [financial_liabilities.total.to_nearest_million])
89
+ analysis.rows << CalculationRow.new(:key => "FA ($MM)",:vals => [@financial_assets.total.to_nearest_million])
90
+ analysis.rows << CalculationRow.new(:key => "FL ($MM)",:vals => [@financial_liabilities.total.to_nearest_million])
90
91
  end
92
+ analysis.rows << CalculationRow.new(:key => "Minority Interest ($MM)", :vals => [@minority_interest.total.to_nearest_million])
91
93
  analysis.rows << CalculationRow.new(:key => "CSE ($MM)", :vals => [common_shareholders_equity.total.to_nearest_million])
92
94
  analysis.rows << CalculationRow.new(:key => "Composition Ratio", :vals => [composition_ratio] )
93
95
  if prev.nil?
96
+ if Config.balance_detail_enabled?
97
+ analysis.rows << CalculationRow.new(:key => "NOA Δ ($MM)", :vals => [nil] )
98
+ analysis.rows << CalculationRow.new(:key => "CSE Δ ($MM)", :vals => [nil] )
99
+ end
94
100
  analysis.rows << CalculationRow.new(:key => "NOA Growth", :vals => [nil] )
95
101
  analysis.rows << CalculationRow.new(:key => "CSE Growth", :vals => [nil] )
96
102
  else
103
+ if Config.balance_detail_enabled?
104
+ analysis.rows << CalculationRow.new(:key => "NOA Δ ($MM)", :vals => [change_in_noa(prev).to_nearest_million] )
105
+ analysis.rows << CalculationRow.new(:key => "CSE Δ ($MM)", :vals => [change_in_cse(prev).to_nearest_million] )
106
+ end
97
107
  analysis.rows << CalculationRow.new(:key => "NOA Growth", :vals => [noa_growth(prev)] )
98
108
  analysis.rows << CalculationRow.new(:key => "CSE Growth", :vals => [cse_growth(prev)] )
99
109
  end
@@ -102,9 +112,9 @@ module FinModeling
102
112
  end
103
113
 
104
114
  def self.forecast_next(period, policy, last_re_bs, next_re_is)
105
- noa = next_re_is.operating_revenues.total / Ratio.new(policy.sales_over_noa).yearly_to_quarterly
115
+ noa = next_re_is.operating_revenues.total / Ratio.new(policy.sales_over_noa_on(period.value)).yearly_to_quarterly
106
116
  cse = last_re_bs.common_shareholders_equity.total + next_re_is.comprehensive_income.total
107
- nfa = cse - noa
117
+ nfa = cse - noa # FIXME: this looks suspect. What about minority interests?
108
118
 
109
119
  ForecastedReformulatedBalanceSheet.new(period, noa, nfa, cse)
110
120
  end
@@ -122,55 +132,4 @@ module FinModeling
122
132
  end
123
133
  end
124
134
 
125
- class ForecastedReformulatedBalanceSheet < ReformulatedBalanceSheet
126
- def initialize(period, noa, nfa, cse)
127
- @period = period
128
- @noa = noa
129
- @nfa = nfa
130
- @cse = cse
131
- end
132
-
133
- def operating_assets
134
- nil
135
- end
136
-
137
- def financial_assets
138
- nil
139
- end
140
-
141
- def operating_liabilities
142
- nil
143
- end
144
-
145
- def financial_liabilities
146
- nil
147
- end
148
-
149
- def net_operating_assets
150
- cs = FinModeling::CalculationSummary.new
151
- cs.title = "Net Operational Assets"
152
- cs.rows = [ CalculationRow.new( :key => "NOA", :vals => [@noa] ) ]
153
- return cs
154
- end
155
-
156
- def net_financial_assets
157
- cs = FinModeling::CalculationSummary.new
158
- cs.title = "Net Financial Assets"
159
- cs.rows = [ CalculationRow.new( :key => "NFA", :vals => [@nfa] ) ]
160
- return cs
161
- end
162
-
163
- def common_shareholders_equity
164
- cs = FinModeling::CalculationSummary.new
165
- cs.title = "Common Shareholders' Equity"
166
- cs.rows = [ CalculationRow.new( :key => "CSE", :vals => [@cse] ) ]
167
- return cs
168
- end
169
-
170
- def analysis(prev)
171
- analysis = super(prev)
172
- analysis.header_row.vals[0] += "E" # for estimated
173
- return analysis
174
- end
175
- end
176
135
  end