RENAME(promotions): WALLET_PROMOTIONS_TRANSIT -> WALLET_PROMOTIONS_CREDIT #8
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
|
# 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.
|
# 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.
|
# 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
|
# 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,
|
# 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_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_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_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()`. |
|
| `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. |
|
| `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`). |
|
| `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:
|
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:
|
if not submit_response.uuid:
|
||||||
raise Exception('Failed to submit promotion. 1')
|
raise Exception('Failed to submit promotion. 1')
|
||||||
|
|
||||||
|
|
@ -531,7 +531,7 @@ class Promotion(BaseModel):
|
||||||
raise Exception('Failed to submit promotion. 2')
|
raise Exception('Failed to submit promotion. 2')
|
||||||
|
|
||||||
try:
|
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:
|
if not verify_response.uuid:
|
||||||
raise Exception('Failed to verify promotion. 1')
|
raise Exception('Failed to verify promotion. 1')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -839,7 +839,7 @@ class ApplicationApiFlowsTests(APITestCase):
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
submit_mock.assert_called_once()
|
submit_mock.assert_called_once()
|
||||||
call_payer_wallet, call_data = submit_mock.call_args.args
|
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)
|
self.assertEqual(call_data['payee_wallet'], settings.WALLET_ADVERTISING_TRANSIT)
|
||||||
|
|
||||||
response = self.client.get(
|
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_RIAL` | `WALLET_RIAL_DEPOSIT` |
|
||||||
| `WALLET_REWARD` | `WALLET_USER_BILLBOARD_VISIT_INCOME` |
|
| `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
|
`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
|
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
|
### 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
|
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`
|
user-side wallet type. This is the promotions equivalent of `WALLET_SETTLEMENT_TRANSIT`
|
||||||
(settlement) / `WALLET_ADVERTISING_TRANSIT` (advertising).
|
(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)
|
+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
|
+# 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 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()`
|
### `apps/promotions/models.py` — `Recipient.get_wallet_category_uuid()`
|
||||||
|
|
@ -148,18 +148,18 @@ connected to anything.
|
||||||
|
|
||||||
try:
|
try:
|
||||||
- submit_response = deposit_to_user_wallet_submit(settings.WALLET_REWARD, data)
|
- 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:
|
try:
|
||||||
- verify_response = deposit_to_user_wallet_verify(settings.WALLET_REWARD, submit_response.uuid)
|
- 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
|
### What the deposit call looks like now, end to end
|
||||||
|
|
||||||
| | Before | After |
|
| | 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` |
|
| `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` |
|
| Per-recipient routing | Not possible — one hardcoded constant | Possible — set `Recipient.wallet_uuid` |
|
||||||
|
|
||||||
|
|
@ -169,8 +169,8 @@ connected to anything.
|
||||||
|
|
||||||
| File | Change |
|
| File | Change |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `main/settings.py` | Renamed `WALLET_RIAL`→`WALLET_RIAL_DEPOSIT`, `WALLET_REWARD`→`WALLET_USER_BILLBOARD_VISIT_INCOME`; added `WALLET_PROMOTIONS_TRANSIT`. |
|
| `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_TRANSIT` as `payer_wallet` and `recipient.get_wallet_category_uuid()` as `payee_wallet`. |
|
| `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. |
|
| `.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. |
|
| `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
|
## 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
|
team — it must be a genuine, dedicated pool, not a reused existing UUID (that's the
|
||||||
exact bug this change fixes).
|
exact bug this change fixes).
|
||||||
2. In every environment's `.env` (local, staging, prod — none are checked into this repo):
|
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_RIAL` → `WALLET_RIAL_DEPOSIT` (same value, key renamed).
|
||||||
- Rename `WALLET_REWARD` → `WALLET_USER_BILLBOARD_VISIT_INCOME` (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
|
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
|
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
|
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
|
- `apps/promotions/tests.py` — the `first-ad-create` fixture now sets
|
||||||
`wallet_destination=WalletDestinationChoices.ADVERTISING_TRANSIT`;
|
`wallet_destination=WalletDestinationChoices.ADVERTISING_TRANSIT`;
|
||||||
`test_first_ad_create_event_status_processed` asserts the deposit call actually receives
|
`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
|
`payee_wallet`; `test_get_wallet_category_uuid_routing` unit-tests all four routing cases
|
||||||
directly against `Recipient.get_wallet_category_uuid()`.
|
directly against `Recipient.get_wallet_category_uuid()`.
|
||||||
- `README.md` — config reference table and the playbook's step 3 example updated to show
|
- `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
|
on their `Recipient` rows (via admin or a follow-up data migration) for those specific
|
||||||
payouts to actually route to the advertising transit wallet.
|
payouts to actually route to the advertising transit wallet.
|
||||||
- `WALLET_ADVERTISING_TRANSIT` is a second **required** env var on top of
|
- `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.
|
`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
|
- 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
|
`.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)
|
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
|
# 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 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.
|
# 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
|
# 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().
|
# credit rather than a cash-like user reward — see Recipient.get_wallet_category_uuid().
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue