feat: Add Stripe payment integration and subscription management

- Add Stripe.net SDK for payment processing
- Implement StripeService with checkout sessions, customer portal, webhooks
- Implement SubscriptionService for quota management
- Add quota enforcement to CVCheckService
- Create Pricing, Billing, Settings pages
- Add checkout success/cancel pages
- Update Check and Dashboard with usage indicators
- Add ResetMonthlyUsageJob for billing cycle resets
- Add database migration for subscription fields

Plan tiers: Free (3 checks), Professional £49/mo (30), Enterprise £199/mo (unlimited)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 12:03:24 +00:00
parent 6f384f8d09
commit 28d7d41b25
27 changed files with 2427 additions and 1 deletions

View File

@@ -351,6 +351,9 @@ namespace TrueCV.Infrastructure.Data.Migrations
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<DateTime?>("CurrentPeriodEnd")
.HasColumnType("datetime2");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
@@ -393,6 +396,14 @@ namespace TrueCV.Infrastructure.Data.Migrations
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("StripeSubscriptionId")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("SubscriptionStatus")
.HasMaxLength(32)
.HasColumnType("nvarchar(32)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
@@ -410,6 +421,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.HasIndex("StripeCustomerId")
.HasDatabaseName("IX_Users_StripeCustomerId");
b.HasIndex("StripeSubscriptionId")
.HasDatabaseName("IX_Users_StripeSubscriptionId");
b.ToTable("AspNetUsers", (string)null);
});