fx-shared-models 0.2.78__tar.gz → 0.2.80__tar.gz

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 (198) hide show
  1. {fx_shared_models-0.2.78/fx_shared_models.egg-info → fx_shared_models-0.2.80}/PKG-INFO +1 -1
  2. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80/fx_shared_models.egg-info}/PKG-INFO +1 -1
  3. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/fx_shared_models.egg-info/SOURCES.txt +2 -0
  4. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/setup.py +1 -1
  5. fx_shared_models-0.2.80/shared_models/ib_commission/migrations/0012_clientibmapping_agreement_path_and_more.py +24 -0
  6. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/services/commission_cache_service.py +112 -82
  7. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/services/commission_calculator_service.py +3 -3
  8. fx_shared_models-0.2.80/shared_models/referrals/migrations/0003_referralsource_agreement_path_referralsource_ib_path.py +23 -0
  9. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/LICENSE +0 -0
  10. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/MANIFEST.in +0 -0
  11. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/README.md +0 -0
  12. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/fx_shared_models.egg-info/dependency_links.txt +0 -0
  13. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/fx_shared_models.egg-info/requires.txt +0 -0
  14. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/fx_shared_models.egg-info/top_level.txt +0 -0
  15. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/setup.cfg +0 -0
  16. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/__init__.py +0 -0
  17. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/__init__.py +0 -0
  18. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/apps.py +0 -0
  19. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0001_initial.py +0 -0
  20. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0002_remove_account_group_type_account_has_bonus_and_more.py +0 -0
  21. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0003_account_is_archived_account_is_trading_enabled.py +0 -0
  22. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0004_alter_account_created_at_alter_account_created_by_and_more.py +0 -0
  23. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0005_account_currency.py +0 -0
  24. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0006_alter_account_options.py +0 -0
  25. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/0007_alter_account_options.py +0 -0
  26. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/migrations/__init__.py +0 -0
  27. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/accounts/models.py +0 -0
  28. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/common/base.py +0 -0
  29. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/common/mixins.py +0 -0
  30. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/common/utils.py +0 -0
  31. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/__init__.py +0 -0
  32. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/apps.py +0 -0
  33. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/migrations/0001_initial.py +0 -0
  34. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/migrations/0002_alter_companybankaccount_options.py +0 -0
  35. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/migrations/__init__.py +0 -0
  36. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/company_ba/models.py +0 -0
  37. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/constants.py +0 -0
  38. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/__init__.py +0 -0
  39. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/apps.py +0 -0
  40. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/migrations/0001_initial.py +0 -0
  41. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/migrations/0002_alter_companycryptowallet_options.py +0 -0
  42. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/migrations/__init__.py +0 -0
  43. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/crypto_wallet/models.py +0 -0
  44. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/__init__.py +0 -0
  45. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/apps.py +0 -0
  46. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/migrations/0001_initial.py +0 -0
  47. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/migrations/0002_alter_customercryptowallet_options.py +0 -0
  48. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/migrations/__init__.py +0 -0
  49. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_crypto_wallet/models.py +0 -0
  50. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/__init__.py +0 -0
  51. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/apps.py +0 -0
  52. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/migrations/0001_initial.py +0 -0
  53. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/migrations/0002_alter_customerupi_options.py +0 -0
  54. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/migrations/__init__.py +0 -0
  55. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customer_upi/models.py +0 -0
  56. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/__init__.py +0 -0
  57. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/apps.py +0 -0
  58. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/enums.py +0 -0
  59. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0001_initial.py +0 -0
  60. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0002_alter_customer_email_alter_customer_first_name_and_more.py +0 -0
  61. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0004_customerauth_two_factor_backup_codes_and_more.py +0 -0
  62. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0005_customerauth_temp_webauthn_challenge.py +0 -0
  63. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0006_customerauth_webauthn_challenge.py +0 -0
  64. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0007_customerauth_blocked_customerauth_blocked_at_and_more.py +0 -0
  65. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0008_customer_email_hash.py +0 -0
  66. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0009_remove_customerauth_blocked_by_and_more.py +0 -0
  67. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0010_customerauth_blocked_by_customerauth_unblocked_by.py +0 -0
  68. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0011_customerauth_reset_token_and_more.py +0 -0
  69. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0012_alter_customer_email_alter_customer_first_name_and_more.py +0 -0
  70. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0013_alter_customerauth_blocked_by_and_more.py +0 -0
  71. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/0014_alter_customer_options.py +0 -0
  72. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/migrations/__init__.py +0 -0
  73. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/customers/models.py +0 -0
  74. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/__init__.py +0 -0
  75. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/apps.py +0 -0
  76. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/migrations/0001_initial.py +0 -0
  77. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/migrations/0002_alter_emailcampaign_options_and_more.py +0 -0
  78. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/migrations/__init__.py +0 -0
  79. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_campaigns/models.py +0 -0
  80. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_log/__init__.py +0 -0
  81. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_log/apps.py +0 -0
  82. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_log/migrations/0001_initial.py +0 -0
  83. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_log/migrations/__init__.py +0 -0
  84. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/email_log/models.py +0 -0
  85. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/__init__.py +0 -0
  86. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/apps.py +0 -0
  87. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0001_initial.py +0 -0
  88. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0002_alter_commissiondistribution_processed_time.py +0 -0
  89. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0003_clientibmapping_idx_client_mapping_lookup_and_more.py +0 -0
  90. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0004_ibonboardingstatus.py +0 -0
  91. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0005_ibonboardingstatus_ib_journey_form_submitted_and_more.py +0 -0
  92. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0006_ibonboardingstatus_creation_source.py +0 -0
  93. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0007_ibquestionnaire.py +0 -0
  94. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0008_ibcommissionrule_lot_size.py +0 -0
  95. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0009_ibcommissionrule_min_volume.py +0 -0
  96. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0010_alter_commissiondistribution_rule_and_more.py +0 -0
  97. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/0011_alter_clientibmapping_agreement_and_more.py +0 -0
  98. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/migrations/__init__.py +0 -0
  99. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/model/ib_onboarding.py +0 -0
  100. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/model/ib_questionnaire.py +0 -0
  101. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/models.py +0 -0
  102. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ib_commission/services/__init__.py +0 -0
  103. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/__init__.py +0 -0
  104. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/apps.py +0 -0
  105. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/migrations/0001_initial.py +0 -0
  106. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/migrations/0002_alter_referralreward_payment_gateway_and_more.py +0 -0
  107. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/migrations/__init__.py +0 -0
  108. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/referrals/models.py +0 -0
  109. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/services/group_resolver.py +0 -0
  110. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/apps.py +0 -0
  111. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0001_initial.py +0 -0
  112. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0002_rename_is_enabled_systemsetting_is_active.py +0 -0
  113. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0003_tradingplatformserver.py +0 -0
  114. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0004_tradingplatformserver_connection_timeout_and_more.py +0 -0
  115. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0005_accountsequence_accounttype.py +0 -0
  116. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0006_alter_accounttype_sequence.py +0 -0
  117. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0007_remove_accounttype_default_group_type_and_more.py +0 -0
  118. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0008_paymentgatewayconfig_paymentmethodconfig_and_more.py +0 -0
  119. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0009_alter_accountsequence_created_at_and_more.py +0 -0
  120. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0010_alter_paymentgatewayconfig_gateway_and_more.py +0 -0
  121. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0011_tradingplatformserverlog.py +0 -0
  122. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0012_alter_emailcontent_content_sections.py +0 -0
  123. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0013_kycrequirementrule.py +0 -0
  124. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0014_alter_paymentgatewayconfig_payment_method_and_more.py +0 -0
  125. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0015_alter_paymentgatewayconfig_payment_method_and_more.py +0 -0
  126. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0016_alter_emailconfiguration_options_and_more.py +0 -0
  127. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0017_brokerconfiguration.py +0 -0
  128. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/0018_accounttype_demo_auto_deposit_amount.py +0 -0
  129. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/migrations/__init__.py +0 -0
  130. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/__init__.py +0 -0
  131. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/account_sequence.py +0 -0
  132. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/account_types.py +0 -0
  133. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/base.py +0 -0
  134. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/broker_config.py +0 -0
  135. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/email.py +0 -0
  136. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/group_configurations.py +0 -0
  137. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/payment_methods.py +0 -0
  138. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/trading_platform.py +0 -0
  139. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/models/transaction_configs.py +0 -0
  140. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/system_settings/serializers.py +0 -0
  141. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/__init__.py +0 -0
  142. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/apps.py +0 -0
  143. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/0001_initial.py +0 -0
  144. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/0002_alter_deal_id.py +0 -0
  145. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/0003_alter_deal_id.py +0 -0
  146. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/0004_alter_deal_id.py +0 -0
  147. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/0005_deal_idx_deal_position_lookup_and_more.py +0 -0
  148. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/migrations/__init__.py +0 -0
  149. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/trading/models.py +0 -0
  150. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/__init__.py +0 -0
  151. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/apps.py +0 -0
  152. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/constants.py +0 -0
  153. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/enums.py +0 -0
  154. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0001_initial.py +0 -0
  155. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0002_transaction_mt5_ticket.py +0 -0
  156. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0003_alter_transaction_options.py +0 -0
  157. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0004_alter_transaction_created_by.py +0 -0
  158. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0005_alter_transaction_status.py +0 -0
  159. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0006_transaction_approved_at.py +0 -0
  160. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0007_transaction_assigned_user_and_more.py +0 -0
  161. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0008_alter_transaction_payment_method.py +0 -0
  162. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0009_alter_transaction_approved_by_and_more.py +0 -0
  163. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0010_alter_transaction_payment_method.py +0 -0
  164. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0011_alter_transaction_options.py +0 -0
  165. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/0012_transaction_transaction_custome_fb8ec8_idx.py +0 -0
  166. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/migrations/__init__.py +0 -0
  167. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/transactions/models.py +0 -0
  168. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ui_elements/__init__.py +0 -0
  169. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ui_elements/apps.py +0 -0
  170. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ui_elements/migrations/0001_initial.py +0 -0
  171. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ui_elements/migrations/__init__.py +0 -0
  172. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/ui_elements/models.py +0 -0
  173. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/__init__.py +0 -0
  174. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/apps.py +0 -0
  175. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/migrations/0001_initial.py +0 -0
  176. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/migrations/0002_alter_companyupiid_options.py +0 -0
  177. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/migrations/__init__.py +0 -0
  178. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/upi_id/models.py +0 -0
  179. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/__init__.py +0 -0
  180. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/apps.py +0 -0
  181. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/managers.py +0 -0
  182. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0001_initial.py +0 -0
  183. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0002_alter_crmuser_managers.py +0 -0
  184. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0003_alter_crmuser_options_alter_crmuser_managers.py +0 -0
  185. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0004_alter_crmuser_options.py +0 -0
  186. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0005_remove_crmuser_is_2fa_enabled_and_more.py +0 -0
  187. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0006_rename_preferred_2fa_method_usersettings_default_2fa_method_and_more.py +0 -0
  188. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0007_alter_usersettings_options_alter_usersettings_table.py +0 -0
  189. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0008_usersettings_temp_webauthn_challenge.py +0 -0
  190. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0009_alter_userprofile_profile_picture.py +0 -0
  191. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0010_alter_crmuser_options.py +0 -0
  192. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0011_alter_crmuser_options.py +0 -0
  193. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0012_alter_crmuser_managers_usersettings_is_2fa_enabled_and_more.py +0 -0
  194. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0013_usersettings_is_2fa_enabled_and_more.py +0 -0
  195. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0014_alter_crmuser_groups_alter_crmuser_user_permissions_and_more.py +0 -0
  196. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/0015_alter_crmuser_options.py +0 -0
  197. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/migrations/__init__.py +0 -0
  198. {fx_shared_models-0.2.78 → fx_shared_models-0.2.80}/shared_models/users/models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fx-shared-models
3
- Version: 0.2.78
3
+ Version: 0.2.80
4
4
  Summary: Shared models for FX Backend
5
5
  Home-page: https://github.com/fxbackend/fx-shared-models
6
6
  Author: FX Backend
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fx-shared-models
3
- Version: 0.2.78
3
+ Version: 0.2.80
4
4
  Summary: Shared models for FX Backend
5
5
  Home-page: https://github.com/fxbackend/fx-shared-models
6
6
  Author: FX Backend
@@ -90,6 +90,7 @@ shared_models/ib_commission/migrations/0008_ibcommissionrule_lot_size.py
90
90
  shared_models/ib_commission/migrations/0009_ibcommissionrule_min_volume.py
91
91
  shared_models/ib_commission/migrations/0010_alter_commissiondistribution_rule_and_more.py
92
92
  shared_models/ib_commission/migrations/0011_alter_clientibmapping_agreement_and_more.py
93
+ shared_models/ib_commission/migrations/0012_clientibmapping_agreement_path_and_more.py
93
94
  shared_models/ib_commission/migrations/__init__.py
94
95
  shared_models/ib_commission/model/ib_onboarding.py
95
96
  shared_models/ib_commission/model/ib_questionnaire.py
@@ -101,6 +102,7 @@ shared_models/referrals/apps.py
101
102
  shared_models/referrals/models.py
102
103
  shared_models/referrals/migrations/0001_initial.py
103
104
  shared_models/referrals/migrations/0002_alter_referralreward_payment_gateway_and_more.py
105
+ shared_models/referrals/migrations/0003_referralsource_agreement_path_referralsource_ib_path.py
104
106
  shared_models/referrals/migrations/__init__.py
105
107
  shared_models/services/group_resolver.py
106
108
  shared_models/system_settings/apps.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages # Import find_packages
2
2
 
3
3
  setup(
4
4
  name='fx-shared-models',
5
- version='0.2.78', # Incremented version after adding shared_models/__init__.py
5
+ version='0.2.80', # Incremented version after adding shared_models/__init__.py
6
6
  packages=find_packages(include=['shared_models', 'shared_models.*']), # Find packages under the shared_models directory
7
7
  install_requires=[
8
8
  'Django>=4.2', # Match the version from requirements.txt if possible
@@ -0,0 +1,24 @@
1
+ # Generated by Django 4.2.20 on 2025-08-14 12:32
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('ib_commission', '0011_alter_clientibmapping_agreement_and_more'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='clientibmapping',
16
+ name='agreement_path',
17
+ field=models.TextField(blank=True, help_text='Agreement IDs for each IB level in hierarchy (dot-separated). Empty positions use IB default.', null=True),
18
+ ),
19
+ migrations.AddField(
20
+ model_name='ibhierarchy',
21
+ name='default_agreement',
22
+ field=models.ForeignKey(blank=True, help_text='Default agreement when not specified in client mapping', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_for_hierarchies', to='ib_commission.ibagreement'),
23
+ ),
24
+ ]
@@ -30,7 +30,8 @@ class CommissionCacheService:
30
30
  """Service for caching commission-related data using Django's cache framework"""
31
31
 
32
32
  # Cache key patterns (use consistent patterns across projects)
33
- RULE_CACHE_KEY = "commission_rule:{agreement_id}:{symbol}:{commission_type}"
33
+ # NOTE: Symbol not included in key to support comma-separated symbols
34
+ RULE_CACHE_KEY = "commission_rule:{agreement_id}:{commission_type}"
34
35
  AGREEMENT_CACHE_KEY = "ib_agreement:{customer_id}"
35
36
  HIERARCHY_CACHE_KEY = "ib_hierarchy:{customer_id}"
36
37
  CLIENT_MAPPING_CACHE_KEY = "client_mapping:{mt5_login}:{customer_id}"
@@ -166,38 +167,57 @@ class CommissionCacheService:
166
167
  logger.info("Cache disabled, fetching from database")
167
168
  return cls._get_commission_rules_from_db(agreement_id, symbol, commission_type, account_type_id)
168
169
 
170
+ # Build cache key without symbol to support comma-separated symbols
169
171
  cache_key = cls.RULE_CACHE_KEY.format(
170
172
  agreement_id=agreement_id,
171
- symbol=symbol if symbol is not None else "none",
172
173
  commission_type=commission_type
173
174
  )
174
175
 
175
- # Add account type to cache key if provided
176
- if account_type_id:
177
- cache_key += f":at{account_type_id}"
178
-
179
- logger.info(f"Looking for cache key: {cache_key}")
176
+ logger.info(f"Looking for cache key: {cache_key} (will filter for symbol: {symbol})")
180
177
 
181
178
  # Try to get from cache first
182
179
  cached_rules = get_cache().get(cache_key)
183
180
  if cached_rules is not None:
184
181
  logger.info(f"Cache hit for {cache_key}")
185
- # Convert dicts back to objects that support attribute access
182
+ # Convert dicts back to objects that support attribute access and filter
186
183
  rules = []
187
184
  for rule_dict in cached_rules:
188
185
  # Create a simple object with attributes
189
186
  rule_obj = type('CachedRule', (), rule_dict)()
190
- rules.append(rule_obj)
187
+
188
+ # Filter by account type if specified
189
+ if account_type_id:
190
+ # Include rules with matching account type or no account type (wildcard)
191
+ if rule_obj.account_type_id and rule_obj.account_type_id != account_type_id:
192
+ continue
193
+
194
+ # Filter by symbol
195
+ if symbol and symbol != '*':
196
+ if not rule_obj.symbol or rule_obj.symbol == '*':
197
+ # Wildcard rules always match
198
+ rules.append(rule_obj)
199
+ elif ',' in rule_obj.symbol:
200
+ # Check if our symbol is in the comma-separated list
201
+ rule_symbols = [s.strip().upper() for s in rule_obj.symbol.split(',')]
202
+ if symbol.upper() in rule_symbols:
203
+ rules.append(rule_obj)
204
+ elif rule_obj.symbol.upper() == symbol.upper():
205
+ # Exact match
206
+ rules.append(rule_obj)
207
+ else:
208
+ # No symbol filter or wildcard requested
209
+ rules.append(rule_obj)
210
+
191
211
  return rules
192
212
 
193
213
  logger.info(f"Cache miss for {cache_key}")
194
214
 
195
- # If not in cache, get from database
196
- rules = cls._get_commission_rules_from_db(agreement_id, symbol, commission_type, account_type_id)
215
+ # If not in cache, get ALL rules for this agreement/commission_type from database
216
+ all_rules = cls._get_all_commission_rules_from_db(agreement_id, commission_type)
197
217
 
198
- # Convert rules to serializable format for caching
218
+ # Convert ALL rules to serializable format for caching
199
219
  serialized_rules = []
200
- for rule in rules:
220
+ for rule in all_rules:
201
221
  rule_dict = model_to_dict(rule)
202
222
  # Add account_type_id explicitly since model_to_dict uses 'account_type' for FK
203
223
  rule_dict['account_type_id'] = rule.account_type_id
@@ -206,10 +226,52 @@ class CommissionCacheService:
206
226
  rule_dict['account_type_name'] = rule.account_type.name
207
227
  serialized_rules.append(rule_dict)
208
228
 
209
- # Store in cache for future use
210
- logger.info(f"Storing in cache: {cache_key}")
229
+ # Store ALL rules in cache
230
+ logger.info(f"Storing {len(serialized_rules)} rules in cache: {cache_key}")
211
231
  get_cache().set(cache_key, serialized_rules, cls.RULE_CACHE_EXPIRY)
212
232
 
233
+ # Now filter the rules based on the requested criteria
234
+ filtered_rules = []
235
+ for rule in all_rules:
236
+ # Filter by account type if specified
237
+ if account_type_id:
238
+ # Include rules with matching account type or no account type (wildcard)
239
+ if rule.account_type_id and rule.account_type_id != account_type_id:
240
+ continue
241
+
242
+ # Filter by symbol
243
+ if symbol and symbol != '*':
244
+ if not rule.symbol or rule.symbol == '*':
245
+ # Wildcard rules always match
246
+ filtered_rules.append(rule)
247
+ elif ',' in rule.symbol:
248
+ # Check if our symbol is in the comma-separated list
249
+ rule_symbols = [s.strip().upper() for s in rule.symbol.split(',')]
250
+ if symbol.upper() in rule_symbols:
251
+ filtered_rules.append(rule)
252
+ elif rule.symbol.upper() == symbol.upper():
253
+ # Exact match
254
+ filtered_rules.append(rule)
255
+ else:
256
+ # No symbol filter or wildcard requested
257
+ filtered_rules.append(rule)
258
+
259
+ return filtered_rules
260
+
261
+ @classmethod
262
+ def _get_all_commission_rules_from_db(cls, agreement_id, commission_type):
263
+ """Get ALL commission rules for an agreement from database (no filtering)"""
264
+ from shared_models.ib_commission.models import IBCommissionRule
265
+
266
+ logger.info(f"Fetching ALL rules from DB for agreement_id={agreement_id}, commission_type={commission_type}")
267
+
268
+ rules = IBCommissionRule.objects.filter(
269
+ agreement_id=agreement_id,
270
+ commission_type=commission_type
271
+ ).select_related('account_type').order_by('priority')
272
+
273
+ rules = list(rules)
274
+ logger.info(f"Found {len(rules)} total rules in database")
213
275
  return rules
214
276
 
215
277
  @classmethod
@@ -227,9 +289,15 @@ class CommissionCacheService:
227
289
 
228
290
  # Smart filtering based on symbol
229
291
  if symbol and symbol != '*':
230
- rules_query = rules_query.filter(
231
- models.Q(symbol__iexact=symbol) | models.Q(symbol='*') | models.Q(symbol__isnull=True)
232
- )
292
+ # Build Q object for symbol matching (including comma-separated symbols)
293
+ symbol_q = models.Q(symbol__iexact=symbol)
294
+ # Also check if the symbol is contained in comma-separated lists
295
+ symbol_q |= models.Q(symbol__icontains=f"{symbol},") # Symbol at start or middle
296
+ symbol_q |= models.Q(symbol__icontains=f",{symbol}") # Symbol at end or middle
297
+ # Also include wildcards
298
+ symbol_q |= models.Q(symbol='*') | models.Q(symbol__isnull=True)
299
+
300
+ rules_query = rules_query.filter(symbol_q)
233
301
 
234
302
  # Filter by account type if provided
235
303
  if account_type_id:
@@ -239,6 +307,23 @@ class CommissionCacheService:
239
307
 
240
308
  rules = list(rules_query.select_related('account_type').order_by('priority'))
241
309
 
310
+ # Post-process to ensure exact symbol matches for comma-separated values
311
+ if symbol and symbol != '*':
312
+ filtered_rules = []
313
+ for rule in rules:
314
+ if not rule.symbol or rule.symbol == '*':
315
+ # Wildcard rules always match
316
+ filtered_rules.append(rule)
317
+ elif ',' in rule.symbol:
318
+ # Check if our symbol is in the comma-separated list (case-insensitive)
319
+ rule_symbols = [s.strip().upper() for s in rule.symbol.split(',')]
320
+ if symbol.upper() in rule_symbols:
321
+ filtered_rules.append(rule)
322
+ elif rule.symbol.upper() == symbol.upper():
323
+ # Exact match for non-comma-separated symbols
324
+ filtered_rules.append(rule)
325
+ rules = filtered_rules
326
+
242
327
  logger.info(f"Found {len(rules)} rules in database")
243
328
  return rules
244
329
 
@@ -322,8 +407,6 @@ class CommissionCacheService:
322
407
  logger.info("Cache disabled, fetching from database")
323
408
  return cls._get_ib_hierarchy_from_db(customer_id)
324
409
 
325
- from shared_models.ib_commission.models import IBHierarchy
326
-
327
410
  cache_key = cls.HIERARCHY_CACHE_KEY.format(customer_id=customer_id)
328
411
 
329
412
  logger.info(f"Looking for cache key: {cache_key}")
@@ -498,70 +581,17 @@ class CommissionCacheService:
498
581
  return
499
582
 
500
583
  if agreement_id:
501
- # Get all unique symbols and account types for this agreement from the database
502
- from shared_models.ib_commission.models import IBCommissionRule
503
-
504
- # Get all rules for this agreement
505
- rules = IBCommissionRule.objects.filter(
506
- agreement_id=agreement_id
507
- ).values('symbol', 'account_type_id').distinct()
508
-
509
- # Build list of unique symbol/account_type combinations
510
- symbol_account_combos = []
511
- unique_symbols = set()
512
-
513
- for rule in rules:
514
- symbol = rule['symbol']
515
- account_type_id = rule['account_type_id']
516
-
517
- # Handle comma-separated symbols
518
- if symbol and ',' in symbol:
519
- # Split comma-separated symbols and add each individually
520
- for s in symbol.split(','):
521
- s = s.strip()
522
- if s:
523
- unique_symbols.add(s)
524
- symbol_account_combos.append((s, account_type_id))
525
- else:
526
- unique_symbols.add(symbol)
527
- symbol_account_combos.append((symbol, account_type_id))
528
-
529
- # Also add None symbol if not present (for wildcard rules)
530
- if None not in unique_symbols:
531
- unique_symbols.add(None)
532
- # Add combinations for None symbol with all account types
533
- account_types = set(r['account_type_id'] for r in rules if r['account_type_id'])
534
- for at_id in account_types:
535
- symbol_account_combos.append((None, at_id))
536
- # Also add None/None combo
537
- symbol_account_combos.append((None, None))
538
-
539
- # Invalidate all commission types, symbols, and account types for this agreement
584
+ # With the new caching strategy, we only need to invalidate 2 keys per agreement
585
+ # (one for COMMISSION and one for REBATE)
540
586
  invalidated_count = 0
541
587
  for commission_type in ['COMMISSION', 'REBATE']:
542
- # First invalidate base keys (without account type)
543
- for symbol in unique_symbols:
544
- cache_key = cls.RULE_CACHE_KEY.format(
545
- agreement_id=agreement_id,
546
- symbol=symbol if symbol is not None else "none",
547
- commission_type=commission_type
548
- )
549
- logger.debug(f"Invalidating cache key: {cache_key}")
550
- get_cache().delete(cache_key)
551
- invalidated_count += 1
552
-
553
- # Then invalidate keys with account types
554
- for symbol, account_type_id in symbol_account_combos:
555
- cache_key = cls.RULE_CACHE_KEY.format(
556
- agreement_id=agreement_id,
557
- symbol=symbol if symbol is not None else "none",
558
- commission_type=commission_type
559
- )
560
- if account_type_id:
561
- cache_key += f":at{account_type_id}"
562
- logger.debug(f"Invalidating cache key: {cache_key}")
563
- get_cache().delete(cache_key)
564
- invalidated_count += 1
588
+ cache_key = cls.RULE_CACHE_KEY.format(
589
+ agreement_id=agreement_id,
590
+ commission_type=commission_type
591
+ )
592
+ logger.debug(f"Invalidating cache key: {cache_key}")
593
+ get_cache().delete(cache_key)
594
+ invalidated_count += 1
565
595
 
566
596
  logger.info(f"Invalidated {invalidated_count} cache keys for agreement {agreement_id}")
567
597
  else:
@@ -957,7 +957,7 @@ class CommissionCalculatorService:
957
957
  if account_type_id:
958
958
  exact_symbol_account_type_rules = [
959
959
  rule for rule in all_rules
960
- if rule.symbol and rule.symbol.lower() == symbol.lower()
960
+ if rule.symbol and cls._symbol_matches(rule.symbol, symbol)
961
961
  and rule.account_type_id == account_type_id
962
962
  ]
963
963
 
@@ -1209,7 +1209,7 @@ class CommissionCalculatorService:
1209
1209
  # 2. Exact symbol match (any account type)
1210
1210
  exact_symbol_rules = [
1211
1211
  rule for rule in all_rules
1212
- if rule.symbol and rule.symbol.lower() == symbol.lower()
1212
+ if rule.symbol and cls._symbol_matches(rule.symbol, symbol)
1213
1213
  and (rule.account_type_id is None)
1214
1214
  ]
1215
1215
 
@@ -1393,7 +1393,7 @@ class CommissionCalculatorService:
1393
1393
  # 2. Exact symbol match (any account type)
1394
1394
  exact_symbol_rules = [
1395
1395
  rule for rule in all_rules
1396
- if rule.symbol and rule.symbol.lower() == symbol.lower()
1396
+ if rule.symbol and cls._symbol_matches(rule.symbol, symbol)
1397
1397
  and (rule.account_type_id is None)
1398
1398
  ]
1399
1399
 
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.20 on 2025-08-14 12:32
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('referrals', '0002_alter_referralreward_payment_gateway_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='referralsource',
15
+ name='agreement_path',
16
+ field=models.TextField(blank=True, help_text='Agreement IDs for each IB level (dot-separated) at time of code generation', null=True),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='referralsource',
20
+ name='ib_path',
21
+ field=models.TextField(blank=True, help_text='Full IB hierarchy path (dot-separated customer IDs) at time of code generation', null=True),
22
+ ),
23
+ ]