Skip to content

Commit

Permalink
Schwab Equity Award: support dividends and their taxes.
Browse files Browse the repository at this point in the history
  • Loading branch information
thibwk committed Oct 30, 2024
1 parent c0f2740 commit 703f55b
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 37 deletions.
15 changes: 13 additions & 2 deletions cgt_calc/parsers/schwab_equity_award_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,16 @@ def action_from_str(label: str) -> ActionType:
if label in {"Stock Plan Activity", "Deposit"}:
return ActionType.STOCK_ACTIVITY

if label in ["Qualified Dividend", "Cash Dividend"]:
if label in ["Qualified Dividend", "Cash Dividend", "Dividend"]:
return ActionType.DIVIDEND

if label in ["NRA Tax Adj", "NRA Withholding", "Foreign Tax Paid"]:
if label in [
"NRA Tax Adj",
"NRA Withholding",
"Foreign Tax Paid",
"Tax Reversal",
"Tax Withholding",
]:
return ActionType.TAX

if label == "ADR Mgmt Fee":
Expand Down Expand Up @@ -291,6 +297,11 @@ def __init__(self, row: JsonRowType, file: str, field_names: FieldNames) -> None

quantity = (amount + fees) / price

elif action in [ActionType.DIVIDEND, ActionType.TAX]:
date = datetime.datetime.strptime(row[names.date], "%m/%d/%Y").date()
price = None
amount = _decimal_from_str(row[names.amount])
description = self.raw_action
else:
raise ParsingError(
file, f"Parsing for action {row[names.action]} is not implemented!"
Expand Down
33 changes: 33 additions & 0 deletions tests/test_data/schwab_equity_award_v2.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,39 @@
"FromDate": "01/01/2020",
"ToDate": "12/23/2023",
"Transactions": [
{
"Date": "07/12/2024",
"Action": "Tax Reversal",
"Symbol": "GOOG",
"Quantity": null,
"Description": "Credit",
"FeesAndCommissions": null,
"DisbursementElection": null,
"Amount": "$11.20",
"TransactionDetails": []
},
{
"Date": "06/17/2024",
"Action": "Tax Withholding",
"Symbol": "GOOG",
"Quantity": null,
"Description": "Debit",
"FeesAndCommissions": null,
"DisbursementElection": null,
"Amount": "-$22.39",
"TransactionDetails": []
},
{
"Date": "06/17/2024",
"Action": "Dividend",
"Symbol": "GOOG",
"Quantity": null,
"Description": "Credit",
"FeesAndCommissions": null,
"DisbursementElection": null,
"Amount": "$74.62",
"TransactionDetails": []
},
{
"Date": "09/27/2023",
"Action": "Deposit",
Expand Down
102 changes: 67 additions & 35 deletions tests/test_schwab_equity_award_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,38 +93,70 @@ def test_schwab_transaction_v2() -> None:
"tests/test_data/schwab_equity_award_v2.json"
)

assert transactions[0].date == datetime.date(2023, 4, 25)
assert transactions[0].action == ActionType.STOCK_ACTIVITY
assert transactions[0].quantity == Decimal("4.911")
assert transactions[0].price == Decimal("106.78")
assert transactions[0].fees == Decimal("0")

assert transactions[1].date == datetime.date(2023, 4, 25)
assert transactions[1].action == ActionType.STOCK_ACTIVITY
assert transactions[1].quantity == Decimal("13.6")
assert transactions[1].price == Decimal("106.78")
assert transactions[1].fees == Decimal("0")

assert transactions[2].date == datetime.date(2023, 8, 29)
assert transactions[2].action == ActionType.SELL
assert transactions[2].quantity == Decimal("14.40")
assert transactions[2].price == Decimal("137.90")
assert transactions[2].fees == Decimal("0.02")

assert transactions[3].date == datetime.date(2023, 9, 25)
assert transactions[3].action == ActionType.STOCK_ACTIVITY
assert transactions[3].symbol == "GOOG"
assert transactions[3].quantity == Decimal("4.911")
assert transactions[3].price == Decimal("131.25")
assert transactions[3].fees == Decimal("0")
assert transactions[3].currency == "USD"
assert transactions[3].broker == "Charles Schwab"

assert transactions[4].date == datetime.date(2023, 9, 25)
assert transactions[4].action == ActionType.STOCK_ACTIVITY
assert transactions[4].symbol == "GOOG"
assert transactions[4].quantity == Decimal("13.6")
assert transactions[4].price == Decimal("131.25")
assert transactions[4].fees == Decimal("0")
assert transactions[4].currency == "USD"
assert transactions[4].broker == "Charles Schwab"
i = 0
assert transactions[i].date == datetime.date(2023, 4, 25)
assert transactions[i].action == ActionType.STOCK_ACTIVITY
assert transactions[i].quantity == Decimal("4.911")
assert transactions[i].price == Decimal("106.78")
assert transactions[i].fees == Decimal("0")

i += 1
assert transactions[i].date == datetime.date(2023, 4, 25)
assert transactions[i].action == ActionType.STOCK_ACTIVITY
assert transactions[i].quantity == Decimal("13.6")
assert transactions[i].price == Decimal("106.78")
assert transactions[i].fees == Decimal("0")

i += 1
assert transactions[i].date == datetime.date(2023, 8, 29)
assert transactions[i].action == ActionType.SELL
assert transactions[i].quantity == Decimal("14.40")
assert transactions[i].price == Decimal("137.90")
assert transactions[i].fees == Decimal("0.02")

i += 1
assert transactions[i].date == datetime.date(2023, 9, 25)
assert transactions[i].action == ActionType.STOCK_ACTIVITY
assert transactions[i].symbol == "GOOG"
assert transactions[i].quantity == Decimal("4.911")
assert transactions[i].price == Decimal("131.25")
assert transactions[i].fees == Decimal("0")
assert transactions[i].currency == "USD"
assert transactions[i].broker == "Charles Schwab"

i += 1
assert transactions[i].date == datetime.date(2023, 9, 25)
assert transactions[i].action == ActionType.STOCK_ACTIVITY
assert transactions[i].symbol == "GOOG"
assert transactions[i].quantity == Decimal("13.6")
assert transactions[i].price == Decimal("131.25")
assert transactions[i].fees == Decimal("0")
assert transactions[i].currency == "USD"
assert transactions[i].broker == "Charles Schwab"

i += 1
assert transactions[i].date == datetime.date(2024, 6, 17)
assert transactions[i].action == ActionType.DIVIDEND
assert transactions[i].symbol == "GOOG"
assert transactions[i].amount == Decimal("74.62")
assert transactions[i].fees == Decimal("0")
assert transactions[i].currency == "USD"
assert transactions[i].broker == "Charles Schwab"

i += 1
assert transactions[i].date == datetime.date(2024, 6, 17)
assert transactions[i].action == ActionType.TAX
assert transactions[i].symbol == "GOOG"
assert transactions[i].amount == Decimal("-22.39")
assert transactions[i].fees == Decimal("0")
assert transactions[i].currency == "USD"
assert transactions[i].broker == "Charles Schwab"

i += 1
assert transactions[i].date == datetime.date(2024, 7, 12)
assert transactions[i].action == ActionType.TAX
assert transactions[i].symbol == "GOOG"
assert transactions[i].amount == Decimal("11.20")
assert transactions[i].fees == Decimal("0")
assert transactions[i].currency == "USD"
assert transactions[i].broker == "Charles Schwab"

0 comments on commit 703f55b

Please sign in to comment.