wbportfolio 2.2.1__py2.py3-none-any.whl

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.

Potentially problematic release.


This version of wbportfolio might be problematic. Click here for more details.

Files changed (486) hide show
  1. wbportfolio/__init__.py +1 -0
  2. wbportfolio/admin/__init__.py +12 -0
  3. wbportfolio/admin/asset.py +47 -0
  4. wbportfolio/admin/custodians.py +9 -0
  5. wbportfolio/admin/portfolio.py +127 -0
  6. wbportfolio/admin/portfolio_relationships.py +22 -0
  7. wbportfolio/admin/product_groups.py +42 -0
  8. wbportfolio/admin/products.py +80 -0
  9. wbportfolio/admin/reconciliations.py +14 -0
  10. wbportfolio/admin/registers.py +17 -0
  11. wbportfolio/admin/roles.py +19 -0
  12. wbportfolio/admin/synchronization/__init__.py +2 -0
  13. wbportfolio/admin/synchronization/admin.py +114 -0
  14. wbportfolio/admin/synchronization/portfolio_synchronization.py +18 -0
  15. wbportfolio/admin/synchronization/price_computation.py +21 -0
  16. wbportfolio/admin/transactions/__init__.py +5 -0
  17. wbportfolio/admin/transactions/claim.py +16 -0
  18. wbportfolio/admin/transactions/dividends.py +14 -0
  19. wbportfolio/admin/transactions/fees.py +35 -0
  20. wbportfolio/admin/transactions/trades.py +49 -0
  21. wbportfolio/admin/transactions/transactions.py +37 -0
  22. wbportfolio/analysis/__init__.py +0 -0
  23. wbportfolio/analysis/claims.py +235 -0
  24. wbportfolio/apps.py +5 -0
  25. wbportfolio/contrib/__init__.py +0 -0
  26. wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  27. wbportfolio/contrib/company_portfolio/admin.py +28 -0
  28. wbportfolio/contrib/company_portfolio/apps.py +29 -0
  29. wbportfolio/contrib/company_portfolio/configs/__init__.py +3 -0
  30. wbportfolio/contrib/company_portfolio/configs/display.py +182 -0
  31. wbportfolio/contrib/company_portfolio/configs/endpoints.py +34 -0
  32. wbportfolio/contrib/company_portfolio/configs/previews.py +37 -0
  33. wbportfolio/contrib/company_portfolio/constants.py +1 -0
  34. wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +87 -0
  35. wbportfolio/contrib/company_portfolio/factories.py +32 -0
  36. wbportfolio/contrib/company_portfolio/filters.py +127 -0
  37. wbportfolio/contrib/company_portfolio/management.py +19 -0
  38. wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +214 -0
  39. wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  40. wbportfolio/contrib/company_portfolio/models.py +334 -0
  41. wbportfolio/contrib/company_portfolio/scripts.py +76 -0
  42. wbportfolio/contrib/company_portfolio/serializers.py +303 -0
  43. wbportfolio/contrib/company_portfolio/tasks.py +19 -0
  44. wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  45. wbportfolio/contrib/company_portfolio/tests/conftest.py +161 -0
  46. wbportfolio/contrib/company_portfolio/tests/test_models.py +161 -0
  47. wbportfolio/contrib/company_portfolio/urls.py +29 -0
  48. wbportfolio/contrib/company_portfolio/viewsets.py +195 -0
  49. wbportfolio/defaults/__init__.py +0 -0
  50. wbportfolio/defaults/fees/__init__.py +0 -0
  51. wbportfolio/defaults/fees/default.py +92 -0
  52. wbportfolio/defaults/portfolio/__init__.py +0 -0
  53. wbportfolio/defaults/portfolio/default_rebalancing.py +45 -0
  54. wbportfolio/dynamic_preferences_registry.py +58 -0
  55. wbportfolio/factories/__init__.py +35 -0
  56. wbportfolio/factories/adjustments.py +17 -0
  57. wbportfolio/factories/assets.py +75 -0
  58. wbportfolio/factories/claim.py +39 -0
  59. wbportfolio/factories/custodians.py +11 -0
  60. wbportfolio/factories/dividends.py +14 -0
  61. wbportfolio/factories/fees.py +15 -0
  62. wbportfolio/factories/indexes.py +17 -0
  63. wbportfolio/factories/portfolio_cash_flow.py +20 -0
  64. wbportfolio/factories/portfolio_cash_targets.py +15 -0
  65. wbportfolio/factories/portfolio_swing_pricings.py +15 -0
  66. wbportfolio/factories/portfolios.py +59 -0
  67. wbportfolio/factories/product_groups.py +28 -0
  68. wbportfolio/factories/products.py +56 -0
  69. wbportfolio/factories/pytest_utils.py +121 -0
  70. wbportfolio/factories/reconciliations.py +23 -0
  71. wbportfolio/factories/roles.py +20 -0
  72. wbportfolio/factories/synchronization.py +40 -0
  73. wbportfolio/factories/trades.py +35 -0
  74. wbportfolio/factories/transactions.py +21 -0
  75. wbportfolio/fdm/__init__.py +0 -0
  76. wbportfolio/fdm/tasks.py +12 -0
  77. wbportfolio/filters/__init__.py +32 -0
  78. wbportfolio/filters/assets.py +485 -0
  79. wbportfolio/filters/assets_and_net_new_money_progression.py +42 -0
  80. wbportfolio/filters/custodians.py +10 -0
  81. wbportfolio/filters/esg.py +22 -0
  82. wbportfolio/filters/performances.py +171 -0
  83. wbportfolio/filters/portfolios.py +24 -0
  84. wbportfolio/filters/positions.py +178 -0
  85. wbportfolio/filters/products.py +157 -0
  86. wbportfolio/filters/roles.py +26 -0
  87. wbportfolio/filters/signals.py +92 -0
  88. wbportfolio/filters/transactions/__init__.py +20 -0
  89. wbportfolio/filters/transactions/claim.py +394 -0
  90. wbportfolio/filters/transactions/fees.py +66 -0
  91. wbportfolio/filters/transactions/trades.py +224 -0
  92. wbportfolio/filters/transactions/transactions.py +98 -0
  93. wbportfolio/import_export/__init__.py +0 -0
  94. wbportfolio/import_export/backends/__init__.py +2 -0
  95. wbportfolio/import_export/backends/ubs/__init__.py +3 -0
  96. wbportfolio/import_export/backends/ubs/asset_position.py +45 -0
  97. wbportfolio/import_export/backends/ubs/fees.py +63 -0
  98. wbportfolio/import_export/backends/ubs/instrument_price.py +44 -0
  99. wbportfolio/import_export/backends/ubs/mixin.py +15 -0
  100. wbportfolio/import_export/backends/utils.py +58 -0
  101. wbportfolio/import_export/backends/wbfdm/__init__.py +2 -0
  102. wbportfolio/import_export/backends/wbfdm/adjustment.py +50 -0
  103. wbportfolio/import_export/backends/wbfdm/dividend.py +16 -0
  104. wbportfolio/import_export/backends/wbfdm/mixin.py +15 -0
  105. wbportfolio/import_export/handlers/__init__.py +0 -0
  106. wbportfolio/import_export/handlers/adjustment.py +39 -0
  107. wbportfolio/import_export/handlers/asset_position.py +167 -0
  108. wbportfolio/import_export/handlers/dividend.py +80 -0
  109. wbportfolio/import_export/handlers/fees.py +58 -0
  110. wbportfolio/import_export/handlers/portfolio_cash_flow.py +57 -0
  111. wbportfolio/import_export/handlers/register.py +43 -0
  112. wbportfolio/import_export/handlers/trade.py +191 -0
  113. wbportfolio/import_export/parsers/__init__.py +0 -0
  114. wbportfolio/import_export/parsers/default_mapping.py +30 -0
  115. wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  116. wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +63 -0
  117. wbportfolio/import_export/parsers/jpmorgan/fees.py +64 -0
  118. wbportfolio/import_export/parsers/jpmorgan/strategy.py +116 -0
  119. wbportfolio/import_export/parsers/jpmorgan/valuation.py +41 -0
  120. wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  121. wbportfolio/import_export/parsers/leonteq/customer_trade.py +47 -0
  122. wbportfolio/import_export/parsers/leonteq/equity.py +81 -0
  123. wbportfolio/import_export/parsers/leonteq/fees.py +70 -0
  124. wbportfolio/import_export/parsers/leonteq/trade.py +94 -0
  125. wbportfolio/import_export/parsers/leonteq/valuation.py +39 -0
  126. wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  127. wbportfolio/import_export/parsers/natixis/customer_trade.py +62 -0
  128. wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +66 -0
  129. wbportfolio/import_export/parsers/natixis/d1_equity.py +80 -0
  130. wbportfolio/import_export/parsers/natixis/d1_fees.py +58 -0
  131. wbportfolio/import_export/parsers/natixis/d1_trade.py +70 -0
  132. wbportfolio/import_export/parsers/natixis/d1_valuation.py +41 -0
  133. wbportfolio/import_export/parsers/natixis/dividend.py +53 -0
  134. wbportfolio/import_export/parsers/natixis/equity.py +60 -0
  135. wbportfolio/import_export/parsers/natixis/fees.py +53 -0
  136. wbportfolio/import_export/parsers/natixis/trade.py +63 -0
  137. wbportfolio/import_export/parsers/natixis/utils.py +76 -0
  138. wbportfolio/import_export/parsers/natixis/valuation.py +46 -0
  139. wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  140. wbportfolio/import_export/parsers/refinitiv/adjustment.py +24 -0
  141. wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  142. wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +70 -0
  143. wbportfolio/import_export/parsers/sg_lux/customer_trade.py +75 -0
  144. wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +140 -0
  145. wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +80 -0
  146. wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +57 -0
  147. wbportfolio/import_export/parsers/sg_lux/equity.py +137 -0
  148. wbportfolio/import_export/parsers/sg_lux/fees.py +56 -0
  149. wbportfolio/import_export/parsers/sg_lux/perf_fees.py +51 -0
  150. wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +29 -0
  151. wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +36 -0
  152. wbportfolio/import_export/parsers/sg_lux/registers.py +210 -0
  153. wbportfolio/import_export/parsers/sg_lux/sylk.py +248 -0
  154. wbportfolio/import_export/parsers/sg_lux/utils.py +36 -0
  155. wbportfolio/import_export/parsers/sg_lux/valuation.py +53 -0
  156. wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  157. wbportfolio/import_export/parsers/societe_generale/customer_trade.py +54 -0
  158. wbportfolio/import_export/parsers/societe_generale/strategy.py +94 -0
  159. wbportfolio/import_export/parsers/societe_generale/valuation.py +37 -0
  160. wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  161. wbportfolio/import_export/parsers/tellco/customer_trade.py +64 -0
  162. wbportfolio/import_export/parsers/tellco/equity.py +86 -0
  163. wbportfolio/import_export/parsers/tellco/valuation.py +52 -0
  164. wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  165. wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  166. wbportfolio/import_export/parsers/ubs/api/asset_position.py +106 -0
  167. wbportfolio/import_export/parsers/ubs/api/fees.py +31 -0
  168. wbportfolio/import_export/parsers/ubs/api/instrument_price.py +20 -0
  169. wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  170. wbportfolio/import_export/parsers/ubs/customer_trade.py +60 -0
  171. wbportfolio/import_export/parsers/ubs/equity.py +97 -0
  172. wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +67 -0
  173. wbportfolio/import_export/parsers/ubs/valuation.py +52 -0
  174. wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  175. wbportfolio/import_export/parsers/vontobel/asset_position.py +97 -0
  176. wbportfolio/import_export/parsers/vontobel/customer_trade.py +54 -0
  177. wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +40 -0
  178. wbportfolio/import_export/parsers/vontobel/instrument.py +34 -0
  179. wbportfolio/import_export/parsers/vontobel/management_fees.py +86 -0
  180. wbportfolio/import_export/parsers/vontobel/performance_fees.py +35 -0
  181. wbportfolio/import_export/parsers/vontobel/trade.py +38 -0
  182. wbportfolio/import_export/parsers/vontobel/utils.py +17 -0
  183. wbportfolio/import_export/parsers/vontobel/valuation.py +29 -0
  184. wbportfolio/import_export/resources/__init__.py +0 -0
  185. wbportfolio/import_export/resources/assets.py +68 -0
  186. wbportfolio/import_export/resources/trades.py +41 -0
  187. wbportfolio/import_export/utils.py +42 -0
  188. wbportfolio/metric/__init__.py +0 -0
  189. wbportfolio/metric/backends/__init__.py +2 -0
  190. wbportfolio/metric/backends/base.py +86 -0
  191. wbportfolio/metric/backends/constants.py +222 -0
  192. wbportfolio/metric/backends/portfolio_base.py +255 -0
  193. wbportfolio/metric/backends/portfolio_esg.py +66 -0
  194. wbportfolio/metric/tests/__init__.py +0 -0
  195. wbportfolio/metric/tests/conftest.py +4 -0
  196. wbportfolio/metric/tests/test_portfolio_base.py +135 -0
  197. wbportfolio/metric/tests/test_portfolio_esg.py +69 -0
  198. wbportfolio/migrations/0001_initial_squashed.py +13848 -0
  199. wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +3836 -0
  200. wbportfolio/migrations/0040_instrument_financial_instrument.py +26 -0
  201. wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +129 -0
  202. wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +71 -0
  203. wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +238 -0
  204. wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +35 -0
  205. wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +26 -0
  206. wbportfolio/migrations/0046_add_product_default_account.py +166 -0
  207. wbportfolio/migrations/0047_remove_product_default_sub_account.py +14 -0
  208. wbportfolio/migrations/0048_alter_trade_status.py +29 -0
  209. wbportfolio/migrations/0049_trade_claimed_shares.py +25 -0
  210. wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +44 -0
  211. wbportfolio/migrations/0051_delete_macroreview.py +11 -0
  212. wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +888 -0
  213. wbportfolio/migrations/0053_remove_product_group.py +132 -0
  214. wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +270 -0
  215. wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +139 -0
  216. wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +56 -0
  217. wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +36 -0
  218. wbportfolio/migrations/0058_pmsinstrument.py +23 -0
  219. wbportfolio/migrations/0059_fees_unique_fees.py +51 -0
  220. wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +21 -0
  221. wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +175 -0
  222. wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +20 -0
  223. wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +133 -0
  224. wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +40 -0
  225. wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +73 -0
  226. wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +108 -0
  227. wbportfolio/migrations/0067_assetposition_unique_asset_position.py +77 -0
  228. wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +59 -0
  229. wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +56 -0
  230. wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +82 -0
  231. wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +22 -0
  232. wbportfolio/migrations/__init__.py +0 -0
  233. wbportfolio/models/__init__.py +26 -0
  234. wbportfolio/models/adjustments.py +246 -0
  235. wbportfolio/models/asset.py +869 -0
  236. wbportfolio/models/custodians.py +101 -0
  237. wbportfolio/models/indexes.py +33 -0
  238. wbportfolio/models/mixins/__init__.py +0 -0
  239. wbportfolio/models/mixins/instruments.py +127 -0
  240. wbportfolio/models/mixins/liquidity_stress_test.py +1307 -0
  241. wbportfolio/models/portfolio.py +1039 -0
  242. wbportfolio/models/portfolio_cash_flow.py +167 -0
  243. wbportfolio/models/portfolio_cash_targets.py +46 -0
  244. wbportfolio/models/portfolio_relationship.py +135 -0
  245. wbportfolio/models/portfolio_swing_pricings.py +51 -0
  246. wbportfolio/models/product_groups.py +230 -0
  247. wbportfolio/models/products.py +569 -0
  248. wbportfolio/models/reconciliations/__init__.py +2 -0
  249. wbportfolio/models/reconciliations/account_reconciliation_lines.py +192 -0
  250. wbportfolio/models/reconciliations/account_reconciliations.py +102 -0
  251. wbportfolio/models/reconciliations/reconciliations.py +25 -0
  252. wbportfolio/models/registers.py +132 -0
  253. wbportfolio/models/roles.py +208 -0
  254. wbportfolio/models/synchronization/__init__.py +3 -0
  255. wbportfolio/models/synchronization/portfolio_synchronization.py +292 -0
  256. wbportfolio/models/synchronization/price_computation.py +200 -0
  257. wbportfolio/models/synchronization/synchronization.py +188 -0
  258. wbportfolio/models/transactions/__init__.py +7 -0
  259. wbportfolio/models/transactions/claim.py +634 -0
  260. wbportfolio/models/transactions/dividends.py +31 -0
  261. wbportfolio/models/transactions/expiry.py +7 -0
  262. wbportfolio/models/transactions/fees.py +153 -0
  263. wbportfolio/models/transactions/trade_proposals.py +502 -0
  264. wbportfolio/models/transactions/trades.py +704 -0
  265. wbportfolio/models/transactions/transactions.py +211 -0
  266. wbportfolio/models/utils.py +12 -0
  267. wbportfolio/permissions.py +13 -0
  268. wbportfolio/pms/__init__.py +0 -0
  269. wbportfolio/pms/statistics/__init__.py +0 -0
  270. wbportfolio/pms/trading/__init__.py +1 -0
  271. wbportfolio/pms/trading/handler.py +164 -0
  272. wbportfolio/pms/typing.py +194 -0
  273. wbportfolio/preferences.py +6 -0
  274. wbportfolio/reports/__init__.py +0 -0
  275. wbportfolio/reports/monthly_position_report.py +74 -0
  276. wbportfolio/risk_management/__init__.py +0 -0
  277. wbportfolio/risk_management/backends/__init__.py +11 -0
  278. wbportfolio/risk_management/backends/accounts.py +166 -0
  279. wbportfolio/risk_management/backends/controversy_portfolio.py +63 -0
  280. wbportfolio/risk_management/backends/exposure_portfolio.py +203 -0
  281. wbportfolio/risk_management/backends/instrument_list_portfolio.py +89 -0
  282. wbportfolio/risk_management/backends/liquidity_risk.py +86 -0
  283. wbportfolio/risk_management/backends/liquidity_stress_instrument.py +86 -0
  284. wbportfolio/risk_management/backends/mixins.py +220 -0
  285. wbportfolio/risk_management/backends/product_integrity.py +111 -0
  286. wbportfolio/risk_management/backends/stop_loss_instrument.py +24 -0
  287. wbportfolio/risk_management/backends/stop_loss_portfolio.py +36 -0
  288. wbportfolio/risk_management/backends/ucits_portfolio.py +63 -0
  289. wbportfolio/risk_management/tests/__init__.py +0 -0
  290. wbportfolio/risk_management/tests/conftest.py +15 -0
  291. wbportfolio/risk_management/tests/test_accounts.py +98 -0
  292. wbportfolio/risk_management/tests/test_controversy_portfolio.py +33 -0
  293. wbportfolio/risk_management/tests/test_exposure_portfolio.py +94 -0
  294. wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +60 -0
  295. wbportfolio/risk_management/tests/test_liquidity_risk.py +47 -0
  296. wbportfolio/risk_management/tests/test_product_integrity.py +55 -0
  297. wbportfolio/risk_management/tests/test_stop_loss_instrument.py +110 -0
  298. wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +119 -0
  299. wbportfolio/risk_management/tests/test_ucits_portfolio.py +39 -0
  300. wbportfolio/serializers/__init__.py +42 -0
  301. wbportfolio/serializers/adjustments.py +24 -0
  302. wbportfolio/serializers/assets.py +166 -0
  303. wbportfolio/serializers/custodians.py +26 -0
  304. wbportfolio/serializers/portfolio_cash_flow.py +48 -0
  305. wbportfolio/serializers/portfolio_cash_targets.py +20 -0
  306. wbportfolio/serializers/portfolio_relationship.py +53 -0
  307. wbportfolio/serializers/portfolio_swing_pricing.py +20 -0
  308. wbportfolio/serializers/portfolios.py +143 -0
  309. wbportfolio/serializers/positions.py +76 -0
  310. wbportfolio/serializers/product_group.py +88 -0
  311. wbportfolio/serializers/products.py +331 -0
  312. wbportfolio/serializers/reconciliations.py +171 -0
  313. wbportfolio/serializers/registers.py +72 -0
  314. wbportfolio/serializers/roles.py +60 -0
  315. wbportfolio/serializers/signals.py +157 -0
  316. wbportfolio/serializers/synchronization.py +18 -0
  317. wbportfolio/serializers/transactions/__init__.py +24 -0
  318. wbportfolio/serializers/transactions/claim.py +310 -0
  319. wbportfolio/serializers/transactions/dividends.py +18 -0
  320. wbportfolio/serializers/transactions/expiry.py +18 -0
  321. wbportfolio/serializers/transactions/fees.py +32 -0
  322. wbportfolio/serializers/transactions/trades.py +315 -0
  323. wbportfolio/serializers/transactions/transactions.py +84 -0
  324. wbportfolio/tasks.py +125 -0
  325. wbportfolio/tests/__init__.py +0 -0
  326. wbportfolio/tests/conftest.py +164 -0
  327. wbportfolio/tests/models/__init__.py +0 -0
  328. wbportfolio/tests/models/test_account_reconciliation.py +191 -0
  329. wbportfolio/tests/models/test_assets.py +193 -0
  330. wbportfolio/tests/models/test_custodians.py +12 -0
  331. wbportfolio/tests/models/test_customer_trades.py +113 -0
  332. wbportfolio/tests/models/test_dividends.py +7 -0
  333. wbportfolio/tests/models/test_imports.py +192 -0
  334. wbportfolio/tests/models/test_instrument_mixins.py +48 -0
  335. wbportfolio/tests/models/test_merge.py +133 -0
  336. wbportfolio/tests/models/test_portfolio_cash_flow.py +112 -0
  337. wbportfolio/tests/models/test_portfolio_cash_targets.py +27 -0
  338. wbportfolio/tests/models/test_portfolio_swing_pricings.py +42 -0
  339. wbportfolio/tests/models/test_portfolios.py +676 -0
  340. wbportfolio/tests/models/test_product_groups.py +80 -0
  341. wbportfolio/tests/models/test_products.py +187 -0
  342. wbportfolio/tests/models/test_roles.py +82 -0
  343. wbportfolio/tests/models/test_splits.py +233 -0
  344. wbportfolio/tests/models/test_synchronization.py +617 -0
  345. wbportfolio/tests/models/transactions/__init__.py +0 -0
  346. wbportfolio/tests/models/transactions/test_claim.py +129 -0
  347. wbportfolio/tests/models/transactions/test_fees.py +65 -0
  348. wbportfolio/tests/models/transactions/test_trades.py +204 -0
  349. wbportfolio/tests/models/utils.py +13 -0
  350. wbportfolio/tests/serializers/__init__.py +0 -0
  351. wbportfolio/tests/serializers/test_claims.py +21 -0
  352. wbportfolio/tests/signals.py +151 -0
  353. wbportfolio/tests/tests.py +31 -0
  354. wbportfolio/tests/viewsets/__init__.py +0 -0
  355. wbportfolio/tests/viewsets/test_assets.py +67 -0
  356. wbportfolio/tests/viewsets/test_performances.py +72 -0
  357. wbportfolio/tests/viewsets/test_products.py +92 -0
  358. wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  359. wbportfolio/tests/viewsets/transactions/test_claims.py +146 -0
  360. wbportfolio/urls.py +247 -0
  361. wbportfolio/utils.py +30 -0
  362. wbportfolio/viewsets/__init__.py +57 -0
  363. wbportfolio/viewsets/adjustments.py +46 -0
  364. wbportfolio/viewsets/assets.py +562 -0
  365. wbportfolio/viewsets/assets_and_net_new_money_progression.py +117 -0
  366. wbportfolio/viewsets/charts/__init__.py +1 -0
  367. wbportfolio/viewsets/charts/assets.py +247 -0
  368. wbportfolio/viewsets/configs/__init__.py +6 -0
  369. wbportfolio/viewsets/configs/buttons/__init__.py +23 -0
  370. wbportfolio/viewsets/configs/buttons/adjustments.py +13 -0
  371. wbportfolio/viewsets/configs/buttons/assets.py +145 -0
  372. wbportfolio/viewsets/configs/buttons/claims.py +83 -0
  373. wbportfolio/viewsets/configs/buttons/custodians.py +76 -0
  374. wbportfolio/viewsets/configs/buttons/fees.py +14 -0
  375. wbportfolio/viewsets/configs/buttons/mixins.py +88 -0
  376. wbportfolio/viewsets/configs/buttons/portfolios.py +115 -0
  377. wbportfolio/viewsets/configs/buttons/products.py +41 -0
  378. wbportfolio/viewsets/configs/buttons/reconciliations.py +65 -0
  379. wbportfolio/viewsets/configs/buttons/registers.py +11 -0
  380. wbportfolio/viewsets/configs/buttons/signals.py +68 -0
  381. wbportfolio/viewsets/configs/buttons/trade_proposals.py +25 -0
  382. wbportfolio/viewsets/configs/buttons/trades.py +144 -0
  383. wbportfolio/viewsets/configs/display/__init__.py +61 -0
  384. wbportfolio/viewsets/configs/display/adjustments.py +81 -0
  385. wbportfolio/viewsets/configs/display/assets.py +265 -0
  386. wbportfolio/viewsets/configs/display/claim.py +299 -0
  387. wbportfolio/viewsets/configs/display/custodians.py +24 -0
  388. wbportfolio/viewsets/configs/display/esg.py +88 -0
  389. wbportfolio/viewsets/configs/display/fees.py +133 -0
  390. wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +103 -0
  391. wbportfolio/viewsets/configs/display/portfolio_relationship.py +38 -0
  392. wbportfolio/viewsets/configs/display/portfolios.py +125 -0
  393. wbportfolio/viewsets/configs/display/positions.py +75 -0
  394. wbportfolio/viewsets/configs/display/product_groups.py +54 -0
  395. wbportfolio/viewsets/configs/display/product_performance.py +241 -0
  396. wbportfolio/viewsets/configs/display/products.py +249 -0
  397. wbportfolio/viewsets/configs/display/reconciliations.py +151 -0
  398. wbportfolio/viewsets/configs/display/registers.py +71 -0
  399. wbportfolio/viewsets/configs/display/roles.py +49 -0
  400. wbportfolio/viewsets/configs/display/trade_proposals.py +97 -0
  401. wbportfolio/viewsets/configs/display/trades.py +359 -0
  402. wbportfolio/viewsets/configs/display/transactions.py +55 -0
  403. wbportfolio/viewsets/configs/endpoints/__init__.py +75 -0
  404. wbportfolio/viewsets/configs/endpoints/adjustments.py +17 -0
  405. wbportfolio/viewsets/configs/endpoints/assets.py +115 -0
  406. wbportfolio/viewsets/configs/endpoints/claim.py +106 -0
  407. wbportfolio/viewsets/configs/endpoints/custodians.py +6 -0
  408. wbportfolio/viewsets/configs/endpoints/esg.py +14 -0
  409. wbportfolio/viewsets/configs/endpoints/fees.py +26 -0
  410. wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +23 -0
  411. wbportfolio/viewsets/configs/endpoints/portfolios.py +43 -0
  412. wbportfolio/viewsets/configs/endpoints/positions.py +18 -0
  413. wbportfolio/viewsets/configs/endpoints/product_groups.py +11 -0
  414. wbportfolio/viewsets/configs/endpoints/product_performance.py +29 -0
  415. wbportfolio/viewsets/configs/endpoints/products.py +37 -0
  416. wbportfolio/viewsets/configs/endpoints/reconciliations.py +31 -0
  417. wbportfolio/viewsets/configs/endpoints/roles.py +9 -0
  418. wbportfolio/viewsets/configs/endpoints/trade_proposals.py +17 -0
  419. wbportfolio/viewsets/configs/endpoints/trades.py +82 -0
  420. wbportfolio/viewsets/configs/endpoints/transactions.py +17 -0
  421. wbportfolio/viewsets/configs/menu/__init__.py +30 -0
  422. wbportfolio/viewsets/configs/menu/adjustments.py +8 -0
  423. wbportfolio/viewsets/configs/menu/assets.py +8 -0
  424. wbportfolio/viewsets/configs/menu/claim.py +41 -0
  425. wbportfolio/viewsets/configs/menu/custodians.py +11 -0
  426. wbportfolio/viewsets/configs/menu/fees.py +13 -0
  427. wbportfolio/viewsets/configs/menu/instrument_prices.py +10 -0
  428. wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +8 -0
  429. wbportfolio/viewsets/configs/menu/portfolios.py +15 -0
  430. wbportfolio/viewsets/configs/menu/positions.py +14 -0
  431. wbportfolio/viewsets/configs/menu/product_groups.py +10 -0
  432. wbportfolio/viewsets/configs/menu/product_performance.py +25 -0
  433. wbportfolio/viewsets/configs/menu/products.py +15 -0
  434. wbportfolio/viewsets/configs/menu/reconciliations.py +7 -0
  435. wbportfolio/viewsets/configs/menu/registers.py +10 -0
  436. wbportfolio/viewsets/configs/menu/roles.py +16 -0
  437. wbportfolio/viewsets/configs/menu/trades.py +18 -0
  438. wbportfolio/viewsets/configs/menu/transactions.py +8 -0
  439. wbportfolio/viewsets/configs/previews/__init__.py +1 -0
  440. wbportfolio/viewsets/configs/previews/portfolios.py +21 -0
  441. wbportfolio/viewsets/configs/titles/__init__.py +65 -0
  442. wbportfolio/viewsets/configs/titles/adjustments.py +19 -0
  443. wbportfolio/viewsets/configs/titles/assets.py +57 -0
  444. wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +6 -0
  445. wbportfolio/viewsets/configs/titles/claim.py +81 -0
  446. wbportfolio/viewsets/configs/titles/custodians.py +12 -0
  447. wbportfolio/viewsets/configs/titles/esg.py +10 -0
  448. wbportfolio/viewsets/configs/titles/fees.py +25 -0
  449. wbportfolio/viewsets/configs/titles/instrument_prices.py +20 -0
  450. wbportfolio/viewsets/configs/titles/portfolios.py +32 -0
  451. wbportfolio/viewsets/configs/titles/positions.py +11 -0
  452. wbportfolio/viewsets/configs/titles/product_groups.py +12 -0
  453. wbportfolio/viewsets/configs/titles/product_performance.py +16 -0
  454. wbportfolio/viewsets/configs/titles/products.py +6 -0
  455. wbportfolio/viewsets/configs/titles/registers.py +12 -0
  456. wbportfolio/viewsets/configs/titles/roles.py +23 -0
  457. wbportfolio/viewsets/configs/titles/trades.py +51 -0
  458. wbportfolio/viewsets/configs/titles/transactions.py +8 -0
  459. wbportfolio/viewsets/custodians.py +66 -0
  460. wbportfolio/viewsets/esg.py +165 -0
  461. wbportfolio/viewsets/mixins.py +48 -0
  462. wbportfolio/viewsets/portfolio_cash_flow.py +31 -0
  463. wbportfolio/viewsets/portfolio_cash_targets.py +8 -0
  464. wbportfolio/viewsets/portfolio_relationship.py +46 -0
  465. wbportfolio/viewsets/portfolio_swing_pricing.py +8 -0
  466. wbportfolio/viewsets/portfolios.py +154 -0
  467. wbportfolio/viewsets/positions.py +292 -0
  468. wbportfolio/viewsets/product_groups.py +84 -0
  469. wbportfolio/viewsets/product_performance.py +646 -0
  470. wbportfolio/viewsets/products.py +529 -0
  471. wbportfolio/viewsets/reconciliations.py +160 -0
  472. wbportfolio/viewsets/registers.py +75 -0
  473. wbportfolio/viewsets/roles.py +44 -0
  474. wbportfolio/viewsets/signals.py +42 -0
  475. wbportfolio/viewsets/synchronization.py +25 -0
  476. wbportfolio/viewsets/transactions/__init__.py +40 -0
  477. wbportfolio/viewsets/transactions/claim.py +933 -0
  478. wbportfolio/viewsets/transactions/fees.py +190 -0
  479. wbportfolio/viewsets/transactions/mixins.py +19 -0
  480. wbportfolio/viewsets/transactions/trade_proposals.py +93 -0
  481. wbportfolio/viewsets/transactions/trades.py +395 -0
  482. wbportfolio/viewsets/transactions/transactions.py +123 -0
  483. wbportfolio-2.2.1.dist-info/METADATA +21 -0
  484. wbportfolio-2.2.1.dist-info/RECORD +486 -0
  485. wbportfolio-2.2.1.dist-info/WHEEL +5 -0
  486. wbportfolio-2.2.1.dist-info/licenses/LICENSE +4 -0
@@ -0,0 +1,87 @@
1
+ from contextlib import suppress
2
+
3
+ from django.db.utils import ProgrammingError
4
+ from dynamic_preferences.preferences import Section
5
+ from dynamic_preferences.registries import global_preferences_registry
6
+ from wbcore.contrib.directory.models import CustomerStatus
7
+ from wbcore.contrib.dynamic_preferences.types import (
8
+ CallableDefaultModelChoicePreference,
9
+ )
10
+
11
+ portfolio = Section("wbportfolio")
12
+
13
+
14
+ def get_default_returning_client_customer_status():
15
+ with suppress(ProgrammingError):
16
+ return CustomerStatus.objects.filter(title="Returning Client").first()
17
+
18
+
19
+ def get_default_lost_client_customer_status():
20
+ with suppress(ProgrammingError):
21
+ return CustomerStatus.objects.filter(title="Lost Client").first()
22
+
23
+
24
+ def get_default_tpm_customer_status():
25
+ with suppress(ProgrammingError):
26
+ return CustomerStatus.objects.filter(title="Third Party Marketer (TPM)").first()
27
+
28
+
29
+ def get_default_client_customer_status():
30
+ with suppress(ProgrammingError):
31
+ return CustomerStatus.objects.filter(title="Client").first()
32
+
33
+
34
+ @global_preferences_registry.register
35
+ class ReturningClientCustomerStatus(CallableDefaultModelChoicePreference):
36
+ section = portfolio
37
+ name = "returning_client_customer_status"
38
+ model = CustomerStatus
39
+
40
+ verbose_name = "Returning Client customer status"
41
+ help_text = "The customer status corresponding to the Returning Client Group"
42
+
43
+ @property
44
+ def default(self):
45
+ return get_default_returning_client_customer_status()
46
+
47
+
48
+ @global_preferences_registry.register
49
+ class LostClientCustomerStatus(CallableDefaultModelChoicePreference):
50
+ section = portfolio
51
+ name = "lost_client_customer_status"
52
+ model = CustomerStatus
53
+
54
+ verbose_name = "Lost Client customer status"
55
+ help_text = "The customer status corresponding to the Lost Client Group"
56
+
57
+ @property
58
+ def default(self):
59
+ return get_default_lost_client_customer_status()
60
+
61
+
62
+ @global_preferences_registry.register
63
+ class TPMCustomerStatus(CallableDefaultModelChoicePreference):
64
+ section = portfolio
65
+ name = "tpm_customer_status"
66
+ model = CustomerStatus
67
+
68
+ verbose_name = "TPM customer status"
69
+ help_text = "The customer status corresponding to the TPM group"
70
+
71
+ @property
72
+ def default(self):
73
+ return get_default_tpm_customer_status()
74
+
75
+
76
+ @global_preferences_registry.register
77
+ class ClientCustomerStatus(CallableDefaultModelChoicePreference):
78
+ section = portfolio
79
+ name = "client_customer_status"
80
+ model = CustomerStatus
81
+
82
+ verbose_name = "Client customer status"
83
+ help_text = "The customer status corresponding to the Client group"
84
+
85
+ @property
86
+ def default(self):
87
+ return get_default_client_customer_status()
@@ -0,0 +1,32 @@
1
+ import factory
2
+
3
+ from .models import AssetAllocation, AssetAllocationType, GeographicFocus
4
+
5
+
6
+ class AssetAllocationTypeFactory(factory.django.DjangoModelFactory):
7
+ name = factory.Faker("word")
8
+ default_max_investment = factory.Faker("pydecimal", min_value=0.0, max_value=1, right_digits=4)
9
+
10
+ class Meta:
11
+ model = AssetAllocationType
12
+
13
+
14
+ class AssetAllocationFactory(factory.django.DjangoModelFactory):
15
+ company = factory.SubFactory("wbcore.contrib.directory.factories.CompanyFactory")
16
+ asset_type = factory.SubFactory(AssetAllocationTypeFactory)
17
+ percent = factory.Faker("pydecimal", min_value=0.0, max_value=1, right_digits=4)
18
+ max_investment = factory.Faker("pydecimal", min_value=0.0, max_value=1, right_digits=4)
19
+ comment = factory.Faker("sentence")
20
+
21
+ class Meta:
22
+ model = AssetAllocation
23
+
24
+
25
+ class GeographicFocusFactory(factory.django.DjangoModelFactory):
26
+ company = factory.SubFactory("wbcore.contrib.directory.factories.CompanyFactory")
27
+ country = factory.SubFactory("wbcore.contrib.geography.factories.CountryFactory")
28
+ percent = factory.Faker("pydecimal", min_value=0.0, max_value=1, right_digits=4)
29
+ comment = factory.Faker("sentence")
30
+
31
+ class Meta:
32
+ model = GeographicFocus
@@ -0,0 +1,127 @@
1
+ from wbcore import filters
2
+ from wbcore.contrib.directory.filters import CompanyFilter as CF
3
+ from wbcore.contrib.directory.filters import PersonFilter as PF
4
+ from wbcore.contrib.directory.models import Company, Person
5
+
6
+
7
+ class EntryPortfolioFilter(filters.FilterSet):
8
+ asset_under_management_gte = filters.NumberFilter(
9
+ label="AUM",
10
+ help_text="Filter for the Assets under Management",
11
+ field_name="asset_under_management",
12
+ lookup_expr="gte",
13
+ method="aum_filter_gte",
14
+ )
15
+ asset_under_management_lte = filters.NumberFilter(
16
+ label="AUM",
17
+ help_text="Filter for the Assets under Management",
18
+ field_name="asset_under_management",
19
+ lookup_expr="lte",
20
+ method="aum_filter_lte",
21
+ )
22
+
23
+ def aum_filter_gte(self, queryset, name, value):
24
+ if value:
25
+ if self.view.get_model() is Person:
26
+ return queryset.filter(employers__portfolio_data__asset_under_management__gte=value)
27
+ elif self.view.get_model() is Company:
28
+ return queryset.filter(portfolio_data__asset_under_management__gte=value)
29
+ return queryset
30
+
31
+ def aum_filter_lte(self, queryset, name, value):
32
+ if value:
33
+ if self.view.get_model() is Person:
34
+ return queryset.filter(employers__portfolio_data__asset_under_management__lte=value)
35
+ elif self.view.get_model() is Company:
36
+ return queryset.filter(portfolio_data__asset_under_management__lte=value)
37
+ return queryset
38
+
39
+ invested_assets_under_management_usd_gte = filters.NumberFilter(
40
+ label="Invested AUM",
41
+ help_text="Filter for the invested Capital (AUM) with us",
42
+ field_name="invested_assets_under_management_usd",
43
+ lookup_expr="gte",
44
+ method="filter_gte",
45
+ )
46
+ invested_assets_under_management_usd_lte = filters.NumberFilter(
47
+ label="Invested AUM",
48
+ help_text="Filter for the invested Capital (AUM) with us",
49
+ field_name="invested_assets_under_management_usd",
50
+ lookup_expr="lte",
51
+ method="filter_lte",
52
+ )
53
+
54
+ def filter_gte(self, queryset, name, value):
55
+ if value:
56
+ if self.view.get_model() is Person:
57
+ return queryset.filter(employers__portfolio_data__invested_assets_under_management_usd__gte=value)
58
+ elif self.view.get_model() is Company:
59
+ return queryset.filter(portfolio_data__invested_assets_under_management_usd__gte=value)
60
+ return queryset
61
+
62
+ def filter_lte(self, queryset, name, value):
63
+ if value:
64
+ if self.view.get_model() is Person:
65
+ return queryset.filter(employers__portfolio_data__invested_assets_under_management_usd__lte=value)
66
+ elif self.view.get_model() is Company:
67
+ return queryset.filter(portfolio_data__invested_assets_under_management_usd__lte=value)
68
+ return queryset
69
+
70
+ potential_gte = filters.NumberFilter(
71
+ label="Potential",
72
+ help_text="Filter for the potential, e.g. how much potential is there to invest with us",
73
+ field_name="potential",
74
+ lookup_expr="gte",
75
+ method="potential_filter_gte",
76
+ )
77
+ potential_lte = filters.NumberFilter(
78
+ label="Potential",
79
+ help_text="Filter for the potential, e.g. how much potential is there to invest with us",
80
+ field_name="potential",
81
+ lookup_expr="lte",
82
+ method="potential_filter_lte",
83
+ )
84
+
85
+ def potential_filter_gte(self, queryset, name, value):
86
+ if value:
87
+ if self.view.get_model() is Person:
88
+ return queryset.filter(employers__portfolio_data__potential__gte=value)
89
+ elif self.view.get_model() is Company:
90
+ return queryset.filter(portfolio_data__potential__gte=value)
91
+ return queryset
92
+
93
+ def potential_filter_lte(self, queryset, name, value):
94
+ if value:
95
+ if self.view.get_model() is Person:
96
+ return queryset.filter(employers__portfolio_data__potential__lte=value)
97
+ elif self.view.get_model() is Company:
98
+ return queryset.filter(portfolio_data__potential__lte=value)
99
+ return queryset
100
+
101
+
102
+ class CompanyFilter(CF, EntryPortfolioFilter):
103
+ @classmethod
104
+ def get_filter_class_for_remote_filter(cls):
105
+ """
106
+ Define which filterset class sender to user for remote filter registration
107
+ """
108
+ return CF
109
+
110
+ class Meta(CF.Meta):
111
+ fields = {
112
+ **CF.Meta.fields,
113
+ }
114
+
115
+
116
+ class PersonFilter(PF, EntryPortfolioFilter):
117
+ @classmethod
118
+ def get_filter_class_for_remote_filter(cls):
119
+ """
120
+ Define which filterset class sender to user for remote filter registration
121
+ """
122
+ return PF
123
+
124
+ class Meta(PF.Meta):
125
+ fields = {
126
+ **PF.Meta.fields,
127
+ }
@@ -0,0 +1,19 @@
1
+ from django.apps import apps as global_apps
2
+ from django.db import DEFAULT_DB_ALIAS
3
+ from django_celery_beat.models import IntervalSchedule, PeriodicTask
4
+
5
+ from .constants import DEFAULT_PORTFOLIO_DATA_UPDATE_TASK_INTERVAL_MINUTES
6
+
7
+
8
+ def initialize_task(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, apps=global_apps, **kwargs):
9
+ PeriodicTask.objects.update_or_create(
10
+ name="Portfolio: Update Company Portfolio Data",
11
+ defaults={
12
+ "name": "Portfolio: Update Company Portfolio Data",
13
+ "interval": IntervalSchedule.objects.get_or_create(
14
+ every=DEFAULT_PORTFOLIO_DATA_UPDATE_TASK_INTERVAL_MINUTES, period=IntervalSchedule.MINUTES
15
+ )[0],
16
+ "task": "wbportfolio.contrib.company_portfolio.tasks.update_all_portfolio_data",
17
+ "crontab": None,
18
+ },
19
+ )
@@ -0,0 +1,214 @@
1
+ # Generated by Django 4.2.9 on 2024-02-15 17:18
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ initial = True
9
+
10
+ dependencies = [
11
+ ("geography", "0001_initial"),
12
+ ("currency", "0001_initial"),
13
+ ("directory", "0006_employeremployeerelationship_position_name"),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.SeparateDatabaseAndState(
18
+ state_operations=[
19
+ migrations.CreateModel(
20
+ name="AssetAllocationType",
21
+ fields=[
22
+ (
23
+ "id",
24
+ models.BigAutoField(
25
+ auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
26
+ ),
27
+ ),
28
+ ("name", models.CharField(max_length=255)),
29
+ (
30
+ "default_max_investment",
31
+ models.DecimalField(
32
+ decimal_places=4,
33
+ default=0.1,
34
+ help_text="The default percentage this allocation is counted towards the potential.",
35
+ max_digits=5,
36
+ ),
37
+ ),
38
+ ],
39
+ options={
40
+ "verbose_name": "Asset Allocation Type",
41
+ "verbose_name_plural": "Asset Allocation Types",
42
+ },
43
+ ),
44
+ migrations.CreateModel(
45
+ name="GeographicFocus",
46
+ fields=[
47
+ (
48
+ "id",
49
+ models.BigAutoField(
50
+ auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
51
+ ),
52
+ ),
53
+ ("percent", models.DecimalField(decimal_places=4, max_digits=5)),
54
+ ("comment", models.TextField(default="")),
55
+ (
56
+ "company",
57
+ models.ForeignKey(
58
+ on_delete=django.db.models.deletion.CASCADE,
59
+ related_name="geographic_focuses",
60
+ to="directory.company",
61
+ ),
62
+ ),
63
+ (
64
+ "country",
65
+ models.ForeignKey(
66
+ on_delete=django.db.models.deletion.PROTECT,
67
+ to="geography.geography",
68
+ verbose_name="Location",
69
+ ),
70
+ ),
71
+ ],
72
+ options={
73
+ "verbose_name": "Geographic Focus",
74
+ "verbose_name_plural": "Geographic Focuses",
75
+ },
76
+ ),
77
+ migrations.CreateModel(
78
+ name="CompanyPortfolioData",
79
+ fields=[
80
+ (
81
+ "id",
82
+ models.BigAutoField(
83
+ auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
84
+ ),
85
+ ),
86
+ (
87
+ "assets_under_management",
88
+ models.DecimalField(
89
+ blank=True,
90
+ decimal_places=2,
91
+ help_text="The Assets under Management (AUM) that is managed by this company or this person's primary employer.",
92
+ max_digits=17,
93
+ null=True,
94
+ verbose_name="AUM",
95
+ ),
96
+ ),
97
+ (
98
+ "invested_assets_under_management_usd",
99
+ models.DecimalField(
100
+ blank=True,
101
+ decimal_places=2,
102
+ help_text="The invested Assets under Management (AUM).",
103
+ max_digits=17,
104
+ null=True,
105
+ verbose_name="Invested AUM ($)",
106
+ ),
107
+ ),
108
+ (
109
+ "investment_discretion",
110
+ models.CharField(
111
+ choices=[
112
+ ("FULLY_DISCRETIONAIRY", "Fully Discretionairy"),
113
+ ("MOSTLY_DISCRETIONAIRY", "Mostly Discretionairy"),
114
+ ("MIXED", "Mixed"),
115
+ ("MOSTLY_ADVISORY", "Mostly Advisory"),
116
+ ("FULLY_ADVISORY", "Fully Advisory"),
117
+ ],
118
+ default="MIXED",
119
+ help_text="What discretion this company or this person's primary employer has to invest its assets.",
120
+ max_length=21,
121
+ verbose_name="Investment Discretion",
122
+ ),
123
+ ),
124
+ (
125
+ "potential",
126
+ models.DecimalField(
127
+ blank=True,
128
+ decimal_places=2,
129
+ help_text="\n The potential reflects how much potential a company (regardless whether client/propective) has. The formula to calculate the potential is:\n\n AUM * Asset Allocation Percent * Asset Allocation Max Investment - Invested AUM.\n ",
130
+ max_digits=19,
131
+ null=True,
132
+ ),
133
+ ),
134
+ (
135
+ "assets_under_management_currency",
136
+ models.ForeignKey(
137
+ blank=True,
138
+ null=True,
139
+ on_delete=django.db.models.deletion.PROTECT,
140
+ to="currency.currency",
141
+ verbose_name="AUM Currency",
142
+ ),
143
+ ),
144
+ (
145
+ "company",
146
+ models.OneToOneField(
147
+ on_delete=django.db.models.deletion.CASCADE,
148
+ related_name="portfolio_data",
149
+ to="directory.company",
150
+ ),
151
+ ),
152
+ (
153
+ "potential_currency",
154
+ models.ForeignKey(
155
+ blank=True,
156
+ null=True,
157
+ on_delete=django.db.models.deletion.PROTECT,
158
+ related_name="wbportfolio_potential_currencies",
159
+ to="currency.currency",
160
+ ),
161
+ ),
162
+ ],
163
+ options={
164
+ "verbose_name": "Company Portfolio Data",
165
+ "verbose_name_plural": "Company Portfolio Data",
166
+ },
167
+ ),
168
+ migrations.CreateModel(
169
+ name="AssetAllocation",
170
+ fields=[
171
+ (
172
+ "id",
173
+ models.BigAutoField(
174
+ auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
175
+ ),
176
+ ),
177
+ ("percent", models.DecimalField(decimal_places=4, max_digits=5)),
178
+ (
179
+ "max_investment",
180
+ models.DecimalField(
181
+ blank=True,
182
+ decimal_places=4,
183
+ help_text="The percentage this allocation is counted towards the potential. Defaults to the default provided in the asset type.",
184
+ max_digits=5,
185
+ null=True,
186
+ ),
187
+ ),
188
+ ("comment", models.TextField(default="")),
189
+ (
190
+ "asset_type",
191
+ models.ForeignKey(
192
+ on_delete=django.db.models.deletion.PROTECT,
193
+ related_name="asset_allocations",
194
+ to="company_portfolio.assetallocationtype",
195
+ ),
196
+ ),
197
+ (
198
+ "company",
199
+ models.ForeignKey(
200
+ on_delete=django.db.models.deletion.CASCADE,
201
+ related_name="asset_allocations",
202
+ to="directory.company",
203
+ ),
204
+ ),
205
+ ],
206
+ options={
207
+ "verbose_name": "Asset Allocation",
208
+ "verbose_name_plural": "Asset Allocations",
209
+ },
210
+ ),
211
+ ],
212
+ database_operations=[],
213
+ ),
214
+ ]