RENAME(promotions): WALLET_PROMOTIONS_TRANSIT -> WALLET_PROMOTIONS_CREDIT
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
d3800584b5
commit
8725cdf699
6 changed files with 18 additions and 18 deletions
|
|
@ -38,7 +38,7 @@ WALLET_USER_BILLBOARD_VISIT_INCOME=
|
|||
# Do not reuse WALLET_RIAL_DEPOSIT or WALLET_USER_BILLBOARD_VISIT_INCOME here — this must
|
||||
# be a distinct, dedicated platform wallet the wallet-service team provisions for promotions.
|
||||
# TODO(you): replace with the real wallet-type UUID from the wallet service.
|
||||
WALLET_PROMOTIONS_TRANSIT=00000000-0000-0000-0000-000000000000
|
||||
WALLET_PROMOTIONS_CREDIT=00000000-0000-0000-0000-000000000000
|
||||
|
||||
# NEW — per-promotion-type wallet routing (2026-08-25). Same wallet-service UUID as
|
||||
# advertising's own WALLET_ADVERTISING_TRANSIT setting — copy that repo's real value here,
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ Non-secret values only — pulled from `main/settings.py` and this checkout's ow
|
|||
| `WALLET_BASE_PUBLIC_URL` | Wallet service REST API (deposit submit/verify). |
|
||||
| `WALLET_RIAL_DEPOSIT` | User-side "real money" wallet type UUID. Not currently read by any code path in this service — kept for parity with the shared naming convention used across the other Gooyal repos that touch the same wallet-service UUIDs (`advertising`, `settlement`, `ipg`). |
|
||||
| `WALLET_USER_BILLBOARD_VISIT_INCOME` | User-side reward-token wallet type UUID (formerly `WALLET_REWARD`). `payee_wallet` when `Recipient.wallet_destination` is `user_reward` (the default) — see `Recipient.get_wallet_category_uuid()`. |
|
||||
| `WALLET_PROMOTIONS_TRANSIT` | Company-side pool payouts are drawn from — the deposit's `payer_wallet` (formerly hardcoded to the same UUID as the payee side; see [`docs/wallet_refactor.md`](docs/wallet_refactor.md)). Needs a real UUID from the wallet-service team before this service can submit a deposit. |
|
||||
| `WALLET_PROMOTIONS_CREDIT` | Company-side pool payouts are drawn from — the deposit's `payer_wallet` (formerly hardcoded to the same UUID as the payee side; see [`docs/wallet_refactor.md`](docs/wallet_refactor.md)). Needs a real UUID from the wallet-service team before this service can submit a deposit. |
|
||||
| `WALLET_ADVERTISING_TRANSIT` | Same wallet-service UUID as advertising's own setting of the same name. `payee_wallet` when `Recipient.wallet_destination` is `advertising_transit` — billboard/ad credit rather than a user reward — see `Recipient.get_wallet_category_uuid()`. |
|
||||
| `NOTIFICATIONS_BASE_PUBLIC_URL` | Notifications service REST API. |
|
||||
| `OAUTH2_CLIENT_ID` / `_SECRET` / `_SCOPES` | This service's own client-credentials identity, used for every outbound call above via `login_as_client_credentials()` (token cached under the key `promotions_access_token`). |
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ class Promotion(BaseModel):
|
|||
}
|
||||
|
||||
try:
|
||||
submit_response = deposit_to_user_wallet_submit(settings.WALLET_PROMOTIONS_TRANSIT, data)
|
||||
submit_response = deposit_to_user_wallet_submit(settings.WALLET_PROMOTIONS_CREDIT, data)
|
||||
if not submit_response.uuid:
|
||||
raise Exception('Failed to submit promotion. 1')
|
||||
|
||||
|
|
@ -531,7 +531,7 @@ class Promotion(BaseModel):
|
|||
raise Exception('Failed to submit promotion. 2')
|
||||
|
||||
try:
|
||||
verify_response = deposit_to_user_wallet_verify(settings.WALLET_PROMOTIONS_TRANSIT, submit_response.uuid)
|
||||
verify_response = deposit_to_user_wallet_verify(settings.WALLET_PROMOTIONS_CREDIT, submit_response.uuid)
|
||||
if not verify_response.uuid:
|
||||
raise Exception('Failed to verify promotion. 1')
|
||||
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@ class ApplicationApiFlowsTests(APITestCase):
|
|||
from django.conf import settings
|
||||
submit_mock.assert_called_once()
|
||||
call_payer_wallet, call_data = submit_mock.call_args.args
|
||||
self.assertEqual(call_payer_wallet, settings.WALLET_PROMOTIONS_TRANSIT)
|
||||
self.assertEqual(call_payer_wallet, settings.WALLET_PROMOTIONS_CREDIT)
|
||||
self.assertEqual(call_data['payee_wallet'], settings.WALLET_ADVERTISING_TRANSIT)
|
||||
|
||||
response = self.client.get(
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ The two user-side wallet-type UUIDs are the same wallet-service UUIDs referenced
|
|||
|---|---|
|
||||
| `WALLET_RIAL` | `WALLET_RIAL_DEPOSIT` |
|
||||
| `WALLET_REWARD` | `WALLET_USER_BILLBOARD_VISIT_INCOME` |
|
||||
| *(did not exist)* | `WALLET_PROMOTIONS_TRANSIT` — new |
|
||||
| *(did not exist)* | `WALLET_PROMOTIONS_CREDIT` — new |
|
||||
|
||||
`WALLET_RIAL_DEPOSIT` isn't read by any code path in promotions today (it wasn't before
|
||||
either, under its old name) — it's renamed for consistency and in case a future feature
|
||||
|
|
@ -67,7 +67,7 @@ here needs to read a user's rial balance via `get_user_wallets()`.
|
|||
|
||||
### 2.2 A dedicated company-side wallet for payouts
|
||||
|
||||
`WALLET_PROMOTIONS_TRANSIT` is new: the company pool promotion payouts are drawn from,
|
||||
`WALLET_PROMOTIONS_CREDIT` is new: the company pool promotion payouts are drawn from,
|
||||
used only as `payer_wallet` (the deposit call-target). It is never the same UUID as any
|
||||
user-side wallet type. This is the promotions equivalent of `WALLET_SETTLEMENT_TRANSIT`
|
||||
(settlement) / `WALLET_ADVERTISING_TRANSIT` (advertising).
|
||||
|
|
@ -114,7 +114,7 @@ connected to anything.
|
|||
+WALLET_USER_BILLBOARD_VISIT_INCOME = config('WALLET_USER_BILLBOARD_VISIT_INCOME', cast=str)
|
||||
+# Company-side pool promotion payouts are drawn from; must be distinct from the user-side
|
||||
+# wallet above. TODO(you): replace with the real wallet-type UUID from the wallet service.
|
||||
+WALLET_PROMOTIONS_TRANSIT = config('WALLET_PROMOTIONS_TRANSIT', cast=str)
|
||||
+WALLET_PROMOTIONS_CREDIT = config('WALLET_PROMOTIONS_CREDIT', cast=str)
|
||||
```
|
||||
|
||||
### `apps/promotions/models.py` — `Recipient.get_wallet_category_uuid()`
|
||||
|
|
@ -148,18 +148,18 @@ connected to anything.
|
|||
|
||||
try:
|
||||
- submit_response = deposit_to_user_wallet_submit(settings.WALLET_REWARD, data)
|
||||
+ submit_response = deposit_to_user_wallet_submit(settings.WALLET_PROMOTIONS_TRANSIT, data)
|
||||
+ submit_response = deposit_to_user_wallet_submit(settings.WALLET_PROMOTIONS_CREDIT, data)
|
||||
...
|
||||
try:
|
||||
- verify_response = deposit_to_user_wallet_verify(settings.WALLET_REWARD, submit_response.uuid)
|
||||
+ verify_response = deposit_to_user_wallet_verify(settings.WALLET_PROMOTIONS_TRANSIT, submit_response.uuid)
|
||||
+ verify_response = deposit_to_user_wallet_verify(settings.WALLET_PROMOTIONS_CREDIT, submit_response.uuid)
|
||||
```
|
||||
|
||||
### What the deposit call looks like now, end to end
|
||||
|
||||
| | Before | After |
|
||||
|---|---|---|
|
||||
| `payer_wallet` (call-target, company money source) | `WALLET_REWARD` | `WALLET_PROMOTIONS_TRANSIT` |
|
||||
| `payer_wallet` (call-target, company money source) | `WALLET_REWARD` | `WALLET_PROMOTIONS_CREDIT` |
|
||||
| `payee_wallet` (body, user-side credit type) | `WALLET_REWARD` (same UUID as source) | `Recipient.wallet_uuid`, falling back to `WALLET_USER_BILLBOARD_VISIT_INCOME` |
|
||||
| Per-recipient routing | Not possible — one hardcoded constant | Possible — set `Recipient.wallet_uuid` |
|
||||
|
||||
|
|
@ -169,8 +169,8 @@ connected to anything.
|
|||
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `main/settings.py` | Renamed `WALLET_RIAL`→`WALLET_RIAL_DEPOSIT`, `WALLET_REWARD`→`WALLET_USER_BILLBOARD_VISIT_INCOME`; added `WALLET_PROMOTIONS_TRANSIT`. |
|
||||
| `apps/promotions/models.py` | `Recipient.get_wallet_category_uuid()` fallback fixed to point at a setting that actually exists; `Promotion.promote()` now uses `WALLET_PROMOTIONS_TRANSIT` as `payer_wallet` and `recipient.get_wallet_category_uuid()` as `payee_wallet`. |
|
||||
| `main/settings.py` | Renamed `WALLET_RIAL`→`WALLET_RIAL_DEPOSIT`, `WALLET_REWARD`→`WALLET_USER_BILLBOARD_VISIT_INCOME`; added `WALLET_PROMOTIONS_CREDIT`. |
|
||||
| `apps/promotions/models.py` | `Recipient.get_wallet_category_uuid()` fallback fixed to point at a setting that actually exists; `Promotion.promote()` now uses `WALLET_PROMOTIONS_CREDIT` as `payer_wallet` and `recipient.get_wallet_category_uuid()` as `payee_wallet`. |
|
||||
| `.env.example` | New — didn't exist before. Documents every `config()` var read by `main/settings.py`, including the new wallet keys as placeholders. |
|
||||
| `README.md` | Config reference table updated to the renamed/new settings. |
|
||||
|
||||
|
|
@ -185,13 +185,13 @@ scaffolding noted in the README's watch list) — unrelated, left as-is.
|
|||
|
||||
## 5. What you need to do before this runs anywhere
|
||||
|
||||
1. Get a real wallet-type UUID for `WALLET_PROMOTIONS_TRANSIT` from the wallet-service
|
||||
1. Get a real wallet-type UUID for `WALLET_PROMOTIONS_CREDIT` from the wallet-service
|
||||
team — it must be a genuine, dedicated pool, not a reused existing UUID (that's the
|
||||
exact bug this change fixes).
|
||||
2. In every environment's `.env` (local, staging, prod — none are checked into this repo):
|
||||
- Rename `WALLET_RIAL` → `WALLET_RIAL_DEPOSIT` (same value, key renamed).
|
||||
- Rename `WALLET_REWARD` → `WALLET_USER_BILLBOARD_VISIT_INCOME` (same value, key renamed).
|
||||
- Add `WALLET_PROMOTIONS_TRANSIT` with the real UUID from step 1.
|
||||
- Add `WALLET_PROMOTIONS_CREDIT` with the real UUID from step 1.
|
||||
3. Until step 2 is done in a given environment, `main/settings.py` will fail to import
|
||||
with `decouple.UndefinedValueError: WALLET_RIAL_DEPOSIT not found` — the service won't
|
||||
start at all, not just fail at payout time. Treat this as a deploy-blocking config
|
||||
|
|
@ -261,7 +261,7 @@ not part of this decision.
|
|||
- `apps/promotions/tests.py` — the `first-ad-create` fixture now sets
|
||||
`wallet_destination=WalletDestinationChoices.ADVERTISING_TRANSIT`;
|
||||
`test_first_ad_create_event_status_processed` asserts the deposit call actually receives
|
||||
`WALLET_PROMOTIONS_TRANSIT` as `payer_wallet` and `WALLET_ADVERTISING_TRANSIT` as
|
||||
`WALLET_PROMOTIONS_CREDIT` as `payer_wallet` and `WALLET_ADVERTISING_TRANSIT` as
|
||||
`payee_wallet`; `test_get_wallet_category_uuid_routing` unit-tests all four routing cases
|
||||
directly against `Recipient.get_wallet_category_uuid()`.
|
||||
- `README.md` — config reference table and the playbook's step 3 example updated to show
|
||||
|
|
@ -275,7 +275,7 @@ not part of this decision.
|
|||
on their `Recipient` rows (via admin or a follow-up data migration) for those specific
|
||||
payouts to actually route to the advertising transit wallet.
|
||||
- `WALLET_ADVERTISING_TRANSIT` is a second **required** env var on top of
|
||||
`WALLET_PROMOTIONS_TRANSIT` — same deploy-blocking caveat as §5: missing it fails
|
||||
`WALLET_PROMOTIONS_CREDIT` — same deploy-blocking caveat as §5: missing it fails
|
||||
`main/settings.py` import, not just a payout at runtime.
|
||||
- This migration hasn't been run against a real database in this environment (no local
|
||||
`.env`/DB configured here) — run `manage.py migrate` and confirm `0010` applies cleanly
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ WALLET_RIAL_DEPOSIT = config('WALLET_RIAL_DEPOSIT', cast=str)
|
|||
WALLET_USER_BILLBOARD_VISIT_INCOME = config('WALLET_USER_BILLBOARD_VISIT_INCOME', cast=str)
|
||||
# Company-side pool promotion payouts are drawn from; must be distinct from the user-side
|
||||
# wallet above. TODO(you): replace with the real wallet-type UUID from the wallet service.
|
||||
WALLET_PROMOTIONS_TRANSIT = config('WALLET_PROMOTIONS_TRANSIT', cast=str)
|
||||
WALLET_PROMOTIONS_CREDIT = config('WALLET_PROMOTIONS_CREDIT', cast=str)
|
||||
# Same wallet-service UUID as the advertising repo's own WALLET_ADVERTISING_TRANSIT setting.
|
||||
# Destination for a Recipient whose wallet_destination is advertising_transit — billboard/ad
|
||||
# credit rather than a cash-like user reward — see Recipient.get_wallet_category_uuid().
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue