feat(internal-admin): expired/cancelled kullanıcı için yeni abonelik başlatma ucu #266

Merged
root merged 1 commits from feat/admin-start-subscription into main 2026-09-19 01:37:19 +03:00
Owner

Ne

POST /internal/admin/users/:id/subscriptions — Süper Panel'deki yeni "Yeni abonelik başlat" butonu için (expired / cancelled / aboneliği olmayan kullanıcı).

manuallyActivate expired/cancelled aboneliği "yeni subscription başlatın" diyerek reddediyordu ama bunu yapan bir uç yoktu; manuel paket tanımları DB'den elle yapılıyordu (son örnek: 2026-09-18, 3 yıllık Full Paket).

Davranış

  • Kullanıcının active veya trial aboneliği varsa 409 (activate / plan değiştir / uzat kullanılmalı).
  • Plan yoksa 404, pasifse 409.
  • Full plan (brandCount=0) → tüm aktif markalar user_brands'e yazılır; marka-limitli plan → brandIds tam sayıda + aktif marka doğrulaması.
  • days verilirse bitiş = şimdi + days (1..3650); verilmezse billingPeriod default'u (aylık +1 ay, yıllık +1 yıl).
  • Yeni satır doğrudan active açılır (startDate=now).
  • Gelir eventi yok (PostHog subscription_activated / Meta CAPI Purchase tetiklenmez), referral kredisi tüketilmez — para hareketi olmayan founder tanımı. Ödeme alınmış EFT senaryosu için mevcut checkout→activate akışı kullanılmalı.

Body

{ "planId": "...", "billingPeriod": "monthly|yearly", "days": 1095, "brandIds": ["..."], "reason": "...", "founderId": "..." }

Test

  • billing.service.spec.ts — 7 test (Full plan + days, period default, marka-limitli plan, hatalı marka, 409 canlı abonelik, 404/pasif plan, girdi doğrulama). vitest run yeşil.
  • biome check değişen dosyalarda temiz (controller'daki founderId! uyarıları mevcut koddan).
  • Not: tsc --noEmit main'de zaten corgi.service.ts:40 hatası veriyor, bu PR'dan bağımsız.

Panel tarafı (SDK + route + buton) ayrı commit'le sp repo'sunda.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ww3tfpuxBcettz81dDvyYt

## Ne `POST /internal/admin/users/:id/subscriptions` — Süper Panel'deki yeni **"Yeni abonelik başlat"** butonu için (expired / cancelled / aboneliği olmayan kullanıcı). `manuallyActivate` expired/cancelled aboneliği "yeni subscription başlatın" diyerek reddediyordu ama bunu yapan bir uç yoktu; manuel paket tanımları DB'den elle yapılıyordu (son örnek: 2026-09-18, 3 yıllık Full Paket). ## Davranış - Kullanıcının `active` veya `trial` aboneliği varsa **409** (activate / plan değiştir / uzat kullanılmalı). - Plan yoksa 404, pasifse 409. - Full plan (`brandCount=0`) → tüm aktif markalar `user_brands`'e yazılır; marka-limitli plan → `brandIds` tam sayıda + aktif marka doğrulaması. - `days` verilirse bitiş = şimdi + days (1..3650); verilmezse `billingPeriod` default'u (aylık +1 ay, yıllık +1 yıl). - Yeni satır doğrudan `active` açılır (`startDate=now`). - **Gelir eventi yok** (PostHog `subscription_activated` / Meta CAPI Purchase tetiklenmez), referral kredisi tüketilmez — para hareketi olmayan founder tanımı. Ödeme alınmış EFT senaryosu için mevcut checkout→activate akışı kullanılmalı. ## Body ```json { "planId": "...", "billingPeriod": "monthly|yearly", "days": 1095, "brandIds": ["..."], "reason": "...", "founderId": "..." } ``` ## Test - `billing.service.spec.ts` — 7 test (Full plan + days, period default, marka-limitli plan, hatalı marka, 409 canlı abonelik, 404/pasif plan, girdi doğrulama). `vitest run` yeşil. - `biome check` değişen dosyalarda temiz (controller'daki `founderId!` uyarıları mevcut koddan). - Not: `tsc --noEmit` main'de zaten `corgi.service.ts:40` hatası veriyor, bu PR'dan bağımsız. Panel tarafı (SDK + route + buton) ayrı commit'le sp repo'sunda. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Ww3tfpuxBcettz81dDvyYt
root added 1 commit 2026-09-19 00:45:14 +03:00
feat(internal-admin): expired/cancelled kullanıcı için yeni abonelik başlatma ucu
Some checks are pending
QA Gate (P0/P1) / Test affected app (pull_request) Waiting to run
854ccbbe12
POST /internal/admin/users/:id/subscriptions — panelin "Yeni abonelik başlat"
butonu için. manuallyActivate expired/cancelled'ı "yeni subscription
başlatın" diye reddediyordu ama bunu yapacak uç yoktu; manuel tanımlar
DB'den elle yapılıyordu.

- BillingService.startSubscription: active/trial varsa 409, plan aktif değilse
  409, Full plan → tüm aktif markalar, marka-limitli plan → brandIds tam sayı +
  aktif marka doğrulaması. days verilirse bitiş = şimdi + days (1..3650), yoksa
  billingPeriod default'u (aylık/yıllık). Gelir eventi (PostHog/Meta) ve
  referral kredisi tüketimi YOK — para hareketi olmayan founder tanımı.
- UserBillingController (internal/admin/users) + module kaydı.
- billing.service.spec.ts: 7 test.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ww3tfpuxBcettz81dDvyYt
root merged commit 58ba612707 into main 2026-09-19 01:37:19 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: root/sase.tr#266