wbportfolio 1.52.2rc0__py2.py3-none-any.whl → 1.52.3__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.

@@ -6,9 +6,7 @@ import pandas as pd
6
6
  from wbportfolio.models import FeeProductPercentage, Fees, Product
7
7
 
8
8
  FIELD_MAP = {
9
- "Transaction_Date": "transaction_date",
10
- "Trade_Date": "book_date",
11
- "Value_Date": "value_date",
9
+ "Transaction_Date": "fee_date",
12
10
  "Quantity": "total_value",
13
11
  "Currency": "currency__key",
14
12
  "Portfolio_Identifier": "product",
@@ -26,20 +24,13 @@ def parse(import_source):
26
24
  if not df.empty:
27
25
  df = df.rename(columns=FIELD_MAP)
28
26
  df["product"] = df["product"].apply(lambda x: Product.objects.filter(identifier=x).first())
29
- df["transaction_date"] = pd.to_datetime(df["transaction_date"], dayfirst=True)
30
- df["book_date"] = pd.to_datetime(df["book_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
31
- df["value_date"] = pd.to_datetime(df["value_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
32
- df["portfolio"] = df["product"].apply(lambda x: x.primary_portfolio if x else None)
27
+ df["fee_date"] = pd.to_datetime(df["fee_date"], dayfirst=True)
33
28
  df["base_management_fees"] = df.apply(
34
- lambda row: float(
35
- row["product"].get_fees_percent(row["transaction_date"], FeeProductPercentage.Type.MANAGEMENT)
36
- ),
29
+ lambda row: float(row["product"].get_fees_percent(row["fee_date"], FeeProductPercentage.Type.MANAGEMENT)),
37
30
  axis=1,
38
31
  )
39
32
  df["base_bank_fees"] = df.apply(
40
- lambda row: float(
41
- row["product"].get_fees_percent(row["transaction_date"], FeeProductPercentage.Type.BANK)
42
- ),
33
+ lambda row: float(row["product"].get_fees_percent(row["fee_date"], FeeProductPercentage.Type.BANK)),
43
34
  axis=1,
44
35
  )
45
36
  df.total_value = -df.total_value
@@ -72,14 +63,15 @@ def parse(import_source):
72
63
  from_date = datetime.strptime(match.group(1), "%d.%m.%Y").date()
73
64
  to_date = datetime.strptime(match.group(2), "%d.%m.%Y").date()
74
65
  else:
75
- from_date = (row["transaction_date"] - pd.tseries.offsets.BDay(1)).date()
76
- to_date = row["transaction_date"]
66
+ from_date = (row["fee_date"] - pd.tseries.offsets.BDay(1)).date()
67
+ to_date = row["fee_date"]
77
68
 
78
69
  dates = pd.date_range(from_date, to_date, freq="B", inclusive="right")
79
70
  for ts in pd.date_range(from_date, to_date, freq="B", inclusive="right"):
80
71
  row_copy = row.copy()
81
- row_copy["transaction_date"] = ts.strftime("%Y-%m-%d")
72
+ row_copy["fee_date"] = ts.strftime("%Y-%m-%d")
82
73
  row_copy["total_value"] = row["total_value"] / len(dates)
74
+ del row_copy["comment"]
83
75
  data.append(row_copy)
84
76
 
85
77
  return {"data": data}
@@ -5,13 +5,11 @@ from wbportfolio.models import Fees
5
5
  from .utils import get_perf_fee_isin
6
6
 
7
7
  FIELD_MAP = {
8
- "LastPriceDate": "transaction_date",
9
- "EndOfDay": "value_date",
8
+ "Transaction_Date": "fee_date",
10
9
  "AccrValueInstrCcy": "total_value",
11
10
  "FxRate": "currency_fx_rate",
12
11
  "TradingCurrency": "currency__key",
13
12
  "#ClientName": "product",
14
- "InstrumentName": "comment",
15
13
  }
16
14
 
17
15
  PERF_FEES_INSTRUMENT_ISIN = "CH0040602242"
@@ -27,8 +25,7 @@ def parse(import_source):
27
25
  df = df.drop(columns=df.columns.difference(FIELD_MAP.values()))
28
26
  df.total_value = -df.total_value
29
27
  df["transaction_subtype"] = Fees.Type.MANAGEMENT
30
- df["transaction_date"] = pd.to_datetime(df["transaction_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
31
- df["value_date"] = pd.to_datetime(df["value_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
28
+ df["fee_date"] = pd.to_datetime(df["fee_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
32
29
  df = df.dropna(subset=["product"])
33
30
  df.product = df["product"].apply(lambda x: {"identifier": x})
34
31
  data = df.to_dict("records")
@@ -652,6 +652,8 @@ class AssetPosition(ImportMixin, models.Model):
652
652
  portfolio_created=self.portfolio_created,
653
653
  )
654
654
  self.initial_shares = previous_pos.initial_shares
655
+ if self.underlying_quote:
656
+ self.exchange = self.underlying_quote.exchange
655
657
 
656
658
  def save(self, *args, create_underlying_quote_price_if_missing: bool = False, **kwargs):
657
659
  self.pre_save(create_underlying_quote_price_if_missing=create_underlying_quote_price_if_missing)
@@ -530,10 +530,6 @@ class Trade(TransactionMixin, ImportMixin, OrderedModel, models.Model):
530
530
  self._set_type()
531
531
 
532
532
  def save(self, *args, **kwargs):
533
- if not self.value_date:
534
- self.value_date = self.transaction_date
535
- if not self.book_date:
536
- self.book_date = self.transaction_date
537
533
  if self.trade_proposal:
538
534
  self.portfolio = self.trade_proposal.portfolio
539
535
  self.transaction_date = self.trade_proposal.trade_date
@@ -556,6 +552,10 @@ class Trade(TransactionMixin, ImportMixin, OrderedModel, models.Model):
556
552
  self.claimed_shares = self.claims.filter(status="APPROVED").aggregate(s=Sum("shares"))["s"] or Decimal(0)
557
553
  if self.internal_trade:
558
554
  self.marked_as_internal = True
555
+ if not self.value_date:
556
+ self.value_date = self.transaction_date
557
+ if not self.book_date:
558
+ self.book_date = self.transaction_date
559
559
  super().save(*args, **kwargs)
560
560
 
561
561
  def _set_type(self):
@@ -27,9 +27,13 @@ class TestAssetPositionModel:
27
27
  asset_position_factory.create(portfolio=portfolio, underlying_instrument=equity)
28
28
  assert AssetPosition.country_group_by(AssetPosition.objects.all()).values("groupby_id").distinct().count() == 1
29
29
 
30
- def test_exchange_group_by(self, asset_position_factory, portfolio, exchange):
31
- asset_position_factory.create(portfolio=portfolio, exchange=exchange)
32
- asset_position_factory.create(portfolio=portfolio, exchange=exchange)
30
+ def test_exchange_group_by(self, asset_position_factory, portfolio, exchange_factory, instrument):
31
+ asset_position_factory.create(
32
+ portfolio=portfolio, exchange=exchange_factory.create(), underlying_quote=instrument
33
+ )
34
+ asset_position_factory.create(
35
+ portfolio=portfolio, exchange=exchange_factory.create(), underlying_quote=instrument
36
+ )
33
37
  assert (
34
38
  AssetPosition.exchange_group_by(AssetPosition.objects.all()).values("groupby_id").distinct().count() == 1
35
39
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.52.2rc0
3
+ Version: 1.52.3
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
6
  Requires-Dist: cryptography==3.4.*
@@ -180,8 +180,8 @@ wbportfolio/import_export/parsers/vontobel/asset_position.py,sha256=IQTvGqp7smZU
180
180
  wbportfolio/import_export/parsers/vontobel/customer_trade.py,sha256=cA88eJrz4lVnmxwS17CqQ458pqCB2gK13vMGUg9bZgE,1953
181
181
  wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py,sha256=Vto6gujUZOUSjBpDl1HDXFKNLbcPLjk7D88RZ9uVVlI,1554
182
182
  wbportfolio/import_export/parsers/vontobel/instrument.py,sha256=P930ukkZfPPTHa17fk7KSm9jvh4A38zGK1wpk6kwqrc,1003
183
- wbportfolio/import_export/parsers/vontobel/management_fees.py,sha256=nshro0tybX9aw7XCxGOFMHDeVX6vQUq8eE1UiV23xao,3702
184
- wbportfolio/import_export/parsers/vontobel/performance_fees.py,sha256=_3Cx7SWE_hst2W2tUv20QzI-O5m2EXISyDqxeshvrY8,1248
183
+ wbportfolio/import_export/parsers/vontobel/management_fees.py,sha256=xt8YdA2k4PYRVnmBQSeGLDz2o3h8a-0UWhNjx0nP63I,3267
184
+ wbportfolio/import_export/parsers/vontobel/performance_fees.py,sha256=K-E7bRs7Lxv7ravk4r9_-GwKwcz6hS-nuf6GetVH8vA,1065
185
185
  wbportfolio/import_export/parsers/vontobel/trade.py,sha256=Xc0ttSkdLm-ZIHtXOyHxHr3FuR89T87I9hXqiTMU1Hk,1566
186
186
  wbportfolio/import_export/parsers/vontobel/utils.py,sha256=3-g2Jep9SxvqqQff8_3FjIeiPxSJCEfXBiBHIk0TiXQ,225
187
187
  wbportfolio/import_export/parsers/vontobel/valuation.py,sha256=iav8_xYpTJchmTa7KOPmFr1gi9xxLwq3e-VcZ9MDiRk,1220
@@ -250,7 +250,7 @@ wbportfolio/migrations/0077_remove_transaction_currency_and_more.py,sha256=Yf4a3
250
250
  wbportfolio/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
251
  wbportfolio/models/__init__.py,sha256=HSpa5xwh_MHQaBpNrq9E0CbdEE5Iq-pDLIsPzZ-TRTg,904
252
252
  wbportfolio/models/adjustments.py,sha256=osXWkJZOiansPWYPyHtl7Z121zDWi7u1YMtrBQtbHVo,10272
253
- wbportfolio/models/asset.py,sha256=wxV8rHogMAKzWE3qEtu9EiFmK_DKHd5cVAUSsGpUKbA,45353
253
+ wbportfolio/models/asset.py,sha256=MgEdE1AZQAxHDQX6iVCr1zD9QbsIn95OQzOHoTKjAEg,45446
254
254
  wbportfolio/models/custodians.py,sha256=owTiS2Vm5CRKzh9M_P9GOVg-s-ndQ9UvRmw3yZP7cw0,3815
255
255
  wbportfolio/models/exceptions.py,sha256=3ix0tWUO-O6jpz8f07XIwycw2x3JFRoWzjwil8FVA2Q,52
256
256
  wbportfolio/models/indexes.py,sha256=gvW4K9U9Bj8BmVCqFYdWiXvDWhjHINRON8XhNsZUiQY,639
@@ -282,7 +282,7 @@ wbportfolio/models/transactions/dividends.py,sha256=mmOdGWR35yndUMoCuG24Y6BdtxDh
282
282
  wbportfolio/models/transactions/fees.py,sha256=wJtlzbBCAq1UHvv0wqWTE2BEjCF5RMtoaSDS3kODFRo,7112
283
283
  wbportfolio/models/transactions/rebalancing.py,sha256=obzgewWKOD4kJbCoF5fhtfDk502QkbrjPKh8T9KDGew,7355
284
284
  wbportfolio/models/transactions/trade_proposals.py,sha256=b1VbgR91-3LFq08iNnafcTjvsDboimU7ZRpf5jtQk7w,32234
285
- wbportfolio/models/transactions/trades.py,sha256=ccEtPxqHUcTizQFd6vpe06mXIgDsLGsZEoeB3SssSdo,31231
285
+ wbportfolio/models/transactions/trades.py,sha256=wTOa0Wu4OejO3CeeJnwvPzoDUVWMsHRbyEA7QllaLRs,31231
286
286
  wbportfolio/models/transactions/transactions.py,sha256=XTcUeMUfkf5XTSZaR2UAyGqCVkOhQYk03_vzHLIgf8Q,3807
287
287
  wbportfolio/pms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
288
288
  wbportfolio/pms/typing.py,sha256=b2pBWYt1E8ok-Kqm0lEFIakSnWJ6Ib57z-VX3C3gkQc,6081
@@ -367,7 +367,7 @@ wbportfolio/tests/signals.py,sha256=9tZczwFAcaUR5epAExCPhdRCE7duRC6WZOPe91r1TAE,
367
367
  wbportfolio/tests/tests.py,sha256=utTcVQI7oA7-Yo-IDM7d7BXwXNMIWpRbZNyEWqxkyL4,1033
368
368
  wbportfolio/tests/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
369
369
  wbportfolio/tests/models/test_account_reconciliation.py,sha256=7IDZh6qbG7-3czbNf5aDRaEDnMBw2Qiqk_h425dFu9w,8569
370
- wbportfolio/tests/models/test_assets.py,sha256=rb9PrPuodVEnN2LcoOqNWfsb064Ar0NF4Wp8qQmJ9qs,10272
370
+ wbportfolio/tests/models/test_assets.py,sha256=N8OP2ZTPdq0lGonFRB0q_ruwF8QYpOGLkPWoucr8u_E,10428
371
371
  wbportfolio/tests/models/test_custodians.py,sha256=WnFA4R-deVL7DSKufGE0mcFUdU05otNfGvmG4psiIh4,340
372
372
  wbportfolio/tests/models/test_customer_trades.py,sha256=50By281j-nJ43jwRWK_KxNQGv6SuimT9e_ejgu6b19o,4942
373
373
  wbportfolio/tests/models/test_dividends.py,sha256=SVkIW3OqN4-9tq1HIvJm8_8rOyNTHbJKFiN075DeGGc,162
@@ -519,7 +519,7 @@ wbportfolio/viewsets/transactions/mixins.py,sha256=WipvJoi5hylkpD0y9VATe30WAcwIH
519
519
  wbportfolio/viewsets/transactions/rebalancing.py,sha256=6rIrdK0rtKL1afJ-tYfAGdQVTN2MH1kG_yCeVkmyK8k,1263
520
520
  wbportfolio/viewsets/transactions/trade_proposals.py,sha256=rCJoJSL11qpjxciX25Q5ZU3ewELyyDBUPXcj4Z88Vdg,6037
521
521
  wbportfolio/viewsets/transactions/trades.py,sha256=wCyTTyVKjYuMRsrFcmwD3_yggWxCNm-mdoYzVnhGP0U,21727
522
- wbportfolio-1.52.2rc0.dist-info/METADATA,sha256=c9XGUoVAg32yWFQCXNEsRK_Dw3unWqWbPRWadXAXRQs,705
523
- wbportfolio-1.52.2rc0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
524
- wbportfolio-1.52.2rc0.dist-info/licenses/LICENSE,sha256=jvfVH0SY8_YMHlsJHKe_OajiscQDz4lpTlqT6x24sVw,172
525
- wbportfolio-1.52.2rc0.dist-info/RECORD,,
522
+ wbportfolio-1.52.3.dist-info/METADATA,sha256=6mg7Gsm0BDTqSd3lTZzbzXaNfhRUcXWL2mM5vfmFhfA,702
523
+ wbportfolio-1.52.3.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
524
+ wbportfolio-1.52.3.dist-info/licenses/LICENSE,sha256=jvfVH0SY8_YMHlsJHKe_OajiscQDz4lpTlqT6x24sVw,172
525
+ wbportfolio-1.52.3.dist-info/RECORD,,