From 8725cdf6990e322886595952a8d83cf4bc65136f Mon Sep 17 00:00:00 2001 From: Ali Asadi Date: Mon, 31 Aug 2026 18:27:16 +0330 Subject: [PATCH] RENAME(promotions): WALLET_PROMOTIONS_TRANSIT -> WALLET_PROMOTIONS_CREDIT Co-Authored-By: Claude Sonnet 5 --- .env.example | 2 +- README.md | 2 +- apps/promotions/models.py | 4 ++-- apps/promotions/tests.py | 2 +- docs/wallet_refactor.md | 24 ++++++++++++------------ main/settings.py | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.env.example b/.env.example index 1278b35..7479b39 100644 --- a/.env.example +++ b/.env.example @@ -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, diff --git a/README.md b/README.md index ad7e483..1ff6142 100644 --- a/README.md +++ b/README.md @@ -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`). | diff --git a/apps/promotions/models.py b/apps/promotions/models.py index 98b984b..b93dba0 100644 --- a/apps/promotions/models.py +++ b/apps/promotions/models.py @@ -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') diff --git a/apps/promotions/tests.py b/apps/promotions/tests.py index cbdd984..629e122 100644 --- a/apps/promotions/tests.py +++ b/apps/promotions/tests.py @@ -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( diff --git a/docs/wallet_refactor.md b/docs/wallet_refactor.md index 8285ea8..3055a61 100644 --- a/docs/wallet_refactor.md +++ b/docs/wallet_refactor.md @@ -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 diff --git a/main/settings.py b/main/settings.py index db0b1be..9fe5aec 100644 --- a/main/settings.py +++ b/main/settings.py @@ -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(). -- 2.45.3