## Summary - Rename `finance` → **`monetization`** Django app (keep `finance_*` tables via `label = "finance"`) - Add `services/stripe.py` + `services/revenuecat.py`; RevenueCat webhook upserts **subscription + Invoice/Payment** (billing history parity with Stripe) - Mount `/api/monetization/` + keep `/api/finance/` alias - Extend `Source`/`Provider` with `revenuecat`; product→plan mapping via `revenuecat_product_id` / `REVENUECAT_PRODUCT_PLAN_MAP` Closes #68. Companion to [chat_web_app#100](ai_ml_operations/chat_web_app#100). ## Test plan - [x] `manage.py test monetization.tests` (54 OK) - [x] Smoke `chat_backend.tests.test_views_documents` + `test_oauth` - [ ] Deploy: set `REVENUECAT_WEBHOOK_SECRET`; point RC webhook at `/api/finance/webhooks/revenuecat/` - [ ] Map store product IDs on `SubscriptionPlan.revenuecat_product_id` (or env JSON map) - [ ] Sandbox INITIAL_PURCHASE → subscription `source=revenuecat` + invoice in `/finance/invoices/`Reviewed-on: #69
23 lines
683 B
Python
23 lines
683 B
Python
from django.apps import AppConfig
|
|
|
|
|
|
class MonetizationConfig(AppConfig):
|
|
"""Paid access: plans, quotas, Stripe, RevenueCat.
|
|
|
|
``label`` stays ``finance`` so existing ``finance_*`` tables and
|
|
``django_migrations`` / contenttypes rows keep working after the package
|
|
rename from ``finance`` → ``monetization``.
|
|
"""
|
|
|
|
default_auto_field = "django.db.models.BigAutoField"
|
|
name = "monetization"
|
|
label = "finance"
|
|
verbose_name = "Monetization"
|
|
|
|
def ready(self):
|
|
from django.db.models.signals import post_migrate
|
|
|
|
from monetization.signals import seed_plans_on_migrate
|
|
|
|
post_migrate.connect(seed_plans_on_migrate, sender=self)
|