1249 lines
30 KiB
Markdown
1249 lines
30 KiB
Markdown
# ORIGIN_BUSINESS_LOGIC.md
|
|
|
|
## 📋 RÉSUMÉ EXÉCUTIF
|
|
|
|
Ce document définit toutes les règles métier (business logic) de la plateforme Veza. Il couvre les prix, commissions, workflows utilisateurs, machines à états, règles de validation, calculs complexes, notifications, limites, quotas, et SLAs. Ces règles sont alignées avec les principes éthiques fondateurs du projet et garantissent la cohérence des comportements métier.
|
|
|
|
**Dernière révision**: 2026-03-04 (révision éthique — suppression crypto, AI, publicité)
|
|
|
|
## 🎯 OBJECTIFS
|
|
|
|
### Objectif Principal
|
|
Centraliser et définir de manière exhaustive toutes les règles métier de la plateforme Veza pour garantir la cohérence, la traçabilité, et la maintenabilité pendant 24 mois.
|
|
|
|
### Objectifs Secondaires
|
|
- Standardiser les calculs financiers (prix, commissions, taxes)
|
|
- Définir les workflows utilisateurs de bout en bout
|
|
- Spécifier les transitions d'état valides
|
|
- Documenter les règles de validation
|
|
- Établir les limites et quotas par rôle
|
|
|
|
## 📖 TABLE DES MATIÈRES
|
|
|
|
0. [Principes Éthiques et Modèle Économique](#0-principes-éthiques-et-modèle-économique)
|
|
1. [Pricing Models](#1-pricing-models)
|
|
2. [Commission Structure](#2-commission-structure)
|
|
3. [User Workflows](#3-user-workflows)
|
|
4. [State Machines](#4-state-machines)
|
|
5. [Business Rules Engine](#5-business-rules-engine)
|
|
6. [Validation Rules](#6-validation-rules)
|
|
7. [Complex Calculations](#7-complex-calculations)
|
|
8. [Notification Rules](#8-notification-rules)
|
|
9. [Limits & Quotas](#9-limits--quotas)
|
|
10. [SLA Definitions](#10-sla-definitions)
|
|
11. [Exclusions et Raisons Éthiques](#11-exclusions-et-raisons-éthiques)
|
|
12. [Gouvernance](#12-gouvernance)
|
|
|
|
## 🔒 RÈGLES IMMUABLES
|
|
|
|
1. **Prix TOUJOURS en centimes** (éviter erreurs d'arrondi)
|
|
2. **Commissions CALCULÉES avant taxes**
|
|
3. **Remboursements MAX 30 jours** après achat
|
|
4. **State transitions VALIDÉES** (pas de transitions invalides)
|
|
5. **Limites APPLIQUÉES** côté serveur (never trust client)
|
|
6. **Notifications ASYNCHRONES** (via queue, pas bloquant)
|
|
7. **Calculs financiers AUDITÉS** (log toutes les transactions)
|
|
8. **Quotas PAR RÔLE** (user < creator < premium < admin)
|
|
9. **SLAs MESURABLES** (métriques, alerting)
|
|
10. **Règles VERSIONÉES** (changements documentés)
|
|
|
|
## 0. PRINCIPES ÉTHIQUES ET MODÈLE ÉCONOMIQUE
|
|
|
|
L'éthique de Veza n'est pas un argument marketing. C'est l'architecture de valeurs qui détermine chaque décision économique. Aucune règle métier ne peut contredire ces principes.
|
|
|
|
### Modèle open source / open core
|
|
|
|
**Gratuit (open core)** :
|
|
- Upload (quotas raisonnables)
|
|
- Streaming illimité
|
|
- Profil artiste complet
|
|
- Chat et collaboration
|
|
- Marketplace (commission sur transactions)
|
|
|
|
**Premium individuel** :
|
|
- Stockage cloud étendu
|
|
- Analytics avancés (détaillés, exportables)
|
|
- Distribution (upload vers plateformes tierces)
|
|
- Priorité dans les files de transcoding
|
|
|
|
**Pro / Label** :
|
|
- API complète (rate limits étendus)
|
|
- White label partiel
|
|
- Analytics équipe
|
|
- Support prioritaire
|
|
|
|
**Commission marketplace** :
|
|
- Pourcentage sur les ventes de licences et beats
|
|
- Transparente, documentée, sans surprise
|
|
|
|
### Ce qui ne sera JAMAIS monétisé
|
|
|
|
- **Publicité** : zéro régie publicitaire, zéro pixel de tracking tiers
|
|
- **Données utilisateurs** : les données ne sont pas un produit
|
|
- **Freemium agressif** : pas de features artificiellement bridées pour forcer l'upgrade
|
|
- **Algorithmes de rétention** : pas d'optimisation pour maximiser le temps passé
|
|
|
|
## 1. PRICING MODELS
|
|
|
|
### 1.1 Product Pricing
|
|
|
|
**Fixed Price**:
|
|
```
|
|
Product price: $29.99
|
|
No variation
|
|
```
|
|
|
|
**Pay What You Want (PWYW)**:
|
|
```
|
|
Minimum price: $5.00 (set by seller)
|
|
Suggested price: $15.00
|
|
Buyer chooses: $10.00 - $100.00+
|
|
```
|
|
|
|
**Tiered Licensing**:
|
|
```
|
|
Basic License: $29.99 (personal use)
|
|
Standard License: $49.99 (commercial use, 10k streams)
|
|
Premium License: $99.99 (unlimited commercial use)
|
|
Exclusive License: $499.99 (buyer gets exclusive rights)
|
|
```
|
|
|
|
**Subscription Plans**:
|
|
```
|
|
Free: $0/month
|
|
- Upload limit: 5 tracks/month
|
|
- Download: No
|
|
- Analytics: Basic
|
|
- Storage: 1 GB
|
|
|
|
Creator: $9.99/month ($99.99/year, 17% savings)
|
|
- Upload limit: Unlimited
|
|
- Download: Yes
|
|
- Analytics: Advanced
|
|
- Storage: 50 GB
|
|
- Sell products: Yes (15% commission)
|
|
|
|
Premium: $19.99/month ($199.99/year, 17% savings)
|
|
- All Creator features
|
|
- Priority support
|
|
- Storage: 200 GB
|
|
- Sell products: Yes (10% commission)
|
|
- Collaboration tools
|
|
- Distribution vers plateformes tierces
|
|
|
|
Note: Aucun plan ne contient de publicité. Veza est 100% sans publicité.
|
|
```
|
|
|
|
### 1.2 Dynamic Pricing
|
|
|
|
**Early Bird Discounts**:
|
|
```
|
|
First 100 buyers: 20% off
|
|
Next 400 buyers: 10% off
|
|
After 500 buyers: Regular price
|
|
```
|
|
|
|
**Bundle Pricing**:
|
|
```
|
|
Single product: $29.99
|
|
3-product bundle: $79.99 (11% savings)
|
|
5-product bundle: $119.99 (20% savings)
|
|
```
|
|
|
|
**Volume Discounts** (for API/enterprise):
|
|
```
|
|
0-1,000 requests: $0.01/request
|
|
1,001-10,000: $0.008/request
|
|
10,001-100,000: $0.006/request
|
|
100,001+: $0.004/request
|
|
```
|
|
|
|
### 1.3 Currency Support
|
|
|
|
**Supported Currencies**:
|
|
```
|
|
USD (default)
|
|
EUR
|
|
GBP
|
|
CAD
|
|
AUD
|
|
```
|
|
|
|
**Exchange Rates**:
|
|
```
|
|
Source: European Central Bank (ECB) API
|
|
Update frequency: Daily at 00:00 UTC
|
|
Cache: 24 hours
|
|
Fallback: Manual rates (updated weekly)
|
|
```
|
|
|
|
**Conversion Formula**:
|
|
```
|
|
Price_Target = Price_USD * Exchange_Rate
|
|
Rounded to 2 decimals (0.01 precision)
|
|
|
|
Example:
|
|
$29.99 USD * 0.92 EUR/USD = 27.59 EUR
|
|
```
|
|
|
|
## 2. COMMISSION STRUCTURE
|
|
|
|
### 2.1 Platform Commission
|
|
|
|
**Marketplace Sales**:
|
|
```
|
|
User: N/A (cannot sell)
|
|
Creator: 15% commission
|
|
Premium: 10% commission
|
|
Admin: N/A (no commission on own sales)
|
|
|
|
Example (Creator selling $100 product):
|
|
Product price: $100.00
|
|
Platform commission: -$15.00 (15%)
|
|
Payment processing: -$3.20 (Stripe 2.9% + $0.30)
|
|
Seller receives: $81.80
|
|
```
|
|
|
|
**Subscription Revenue Share**:
|
|
```
|
|
Streaming plays:
|
|
- Creator receives $0.004 per play (avg)
|
|
- Revenus issus des abonnements Premium uniquement (pas de publicité)
|
|
|
|
Example (10,000 plays):
|
|
Creator revenue: 10,000 * $0.004 = $40.00
|
|
```
|
|
|
|
### 2.2 Payment Processing Fees
|
|
|
|
**Stripe** (default):
|
|
```
|
|
Card payments: 2.9% + $0.30
|
|
ACH (US): 0.8% (max $5.00)
|
|
SEPA (EU): 0.8% (max €5.00)
|
|
International: +1.5% currency conversion
|
|
```
|
|
|
|
**PayPal** (alternative):
|
|
```
|
|
Domestic: 2.99% + $0.49
|
|
International: 4.49% + $0.49
|
|
```
|
|
|
|
> **Note** : Le paiement via Hyperswitch (open source, multi-provider) est le standard. Stripe et PayPal sont des providers configurés. Les cryptomonnaies sont exclues définitivement (voir [§11 Exclusions](#11-exclusions-et-raisons-éthiques)).
|
|
|
|
### 2.3 Payout Schedule
|
|
|
|
**Minimum Payout**:
|
|
```
|
|
$50.00 minimum balance required
|
|
```
|
|
|
|
**Payout Frequency**:
|
|
```
|
|
Weekly: Every Monday (for balances ≥ $50)
|
|
Manual: Anytime (for balances ≥ $100)
|
|
```
|
|
|
|
**Payout Methods**:
|
|
```
|
|
Stripe Connect: 1-3 business days
|
|
PayPal: Instant
|
|
Bank Transfer: 3-5 business days
|
|
```
|
|
|
|
### 2.4 Refund Policy
|
|
|
|
**Timeframe**:
|
|
```
|
|
Digital products: 14 days
|
|
Subscription: Pro-rated to end of billing cycle
|
|
Services: 30 days (or as agreed)
|
|
```
|
|
|
|
**Refund Amount**:
|
|
```
|
|
Full refund: 100% (within 7 days, no downloads)
|
|
Partial refund: 50% (7-14 days, or after downloads)
|
|
No refund: After 30 days
|
|
```
|
|
|
|
**Commission on Refunds**:
|
|
```
|
|
Platform commission: Refunded to buyer
|
|
Payment processing: NOT refunded (non-recoverable)
|
|
|
|
Example (refund of $100 sale):
|
|
Buyer paid: $100.00
|
|
Seller received: $81.80
|
|
Refund to buyer: $100.00
|
|
Platform loses: $15.00 (commission)
|
|
Seller loses: $18.20 (commission + processing fees)
|
|
```
|
|
|
|
## 3. USER WORKFLOWS
|
|
|
|
### 3.1 User Onboarding
|
|
|
|
**Flow**:
|
|
```mermaid
|
|
graph TD
|
|
A[Visit Homepage] --> B{Has Account?}
|
|
B -->|No| C[Click Sign Up]
|
|
B -->|Yes| D[Click Log In]
|
|
C --> E[Enter Email/Password]
|
|
E --> F[Receive Verification Email]
|
|
F --> G[Click Verification Link]
|
|
G --> H[Email Verified]
|
|
H --> I[Complete Profile]
|
|
I --> J[Choose Role: Listener/Creator]
|
|
J --> K{Creator?}
|
|
K -->|Yes| L[Upload First Track]
|
|
K -->|No| M[Browse Feed]
|
|
L --> N[Onboarding Complete]
|
|
M --> N
|
|
D --> O[Enter Credentials]
|
|
O --> P[Dashboard]
|
|
```
|
|
|
|
**Steps**:
|
|
1. **Registration** (< 2 minutes)
|
|
- Email, username, password
|
|
- Captcha (after 3 failed attempts)
|
|
- Terms acceptance
|
|
|
|
2. **Email Verification** (< 5 minutes)
|
|
- Send verification email
|
|
- Link expires in 24 hours
|
|
- Resend option (max 3 times)
|
|
|
|
3. **Profile Setup** (< 5 minutes)
|
|
- Display name, bio, avatar
|
|
- Location (optional)
|
|
- Social links (optional)
|
|
|
|
4. **Role Selection**
|
|
- Listener (default)
|
|
- Creator (requires verification for monetization)
|
|
|
|
5. **First Interaction**
|
|
- Creator: Upload first track
|
|
- Listener: Follow 3 suggested users
|
|
|
|
### 3.2 Track Upload Workflow
|
|
|
|
**Flow**:
|
|
```
|
|
1. Click "Upload Track"
|
|
2. Select audio file (drag & drop or browse)
|
|
3. File validation (format, size, duration)
|
|
4. Upload to S3 (resumable, chunked)
|
|
5. Extract metadata (ID3 tags)
|
|
6. Generate waveform (background job)
|
|
7. Fill metadata form:
|
|
- Title, artist, genre
|
|
- BPM, key (optional)
|
|
- Description
|
|
- Cover art
|
|
- Visibility (public, unlisted, private)
|
|
- Downloadable (yes/no)
|
|
8. Preview track
|
|
9. Publish
|
|
10. Track processing (transcode to multiple bitrates)
|
|
11. Track live (appears in feed)
|
|
```
|
|
|
|
**Processing Time**:
|
|
```
|
|
Upload: ~1-5 min (depends on file size)
|
|
Metadata extract: ~5-10 sec
|
|
Waveform: ~10-30 sec
|
|
Transcode: ~1-3 min
|
|
Total: ~2-9 min
|
|
```
|
|
|
|
### 3.3 Purchase Workflow
|
|
|
|
**Flow**:
|
|
```
|
|
1. Browse marketplace
|
|
2. Click product → View details
|
|
3. Listen to preview (30-60 sec)
|
|
4. Click "Add to Cart"
|
|
5. Continue shopping OR Checkout
|
|
6. Cart review:
|
|
- Item list
|
|
- Subtotal
|
|
- Discount code (optional)
|
|
- Tax calculation
|
|
- Total
|
|
7. Click "Proceed to Checkout"
|
|
8. Select payment method:
|
|
- Credit card (via Hyperswitch)
|
|
- PayPal (via Hyperswitch)
|
|
9. Enter billing info
|
|
10. Review order
|
|
11. Click "Place Order"
|
|
12. Payment processing (Stripe/PayPal)
|
|
13. Payment successful:
|
|
- Order confirmation email
|
|
- Download links available
|
|
- Invoice generated
|
|
14. Download files
|
|
```
|
|
|
|
**Panier** :
|
|
```
|
|
Le panier est conservé 30 jours.
|
|
Pas de relance email agressive pour paniers abandonnés.
|
|
Un seul email de rappel optionnel après 7 jours (si l'utilisateur a activé les notifications marketing).
|
|
Pas de discount de pression temporelle (pas de FOMO).
|
|
```
|
|
|
|
### 3.4 Subscription Workflow
|
|
|
|
**Flow**:
|
|
```
|
|
1. Click "Upgrade to Premium"
|
|
2. View plan comparison
|
|
3. Select plan (monthly/annual)
|
|
4. Enter payment info (saved for recurring)
|
|
5. Review subscription terms
|
|
6. Click "Subscribe"
|
|
7. Payment processed
|
|
8. Subscription active
|
|
9. Invoice sent monthly/annually
|
|
10. Auto-renewal (7 days before expiry)
|
|
11. Cancellation:
|
|
- Access until end of billing period
|
|
- No auto-renewal
|
|
- Option to re-subscribe anytime
|
|
```
|
|
|
|
**Trial Period**:
|
|
```
|
|
Premium plan: 14-day free trial
|
|
- Full access
|
|
- No payment required upfront
|
|
- Reminder 3 days before trial ends
|
|
- Auto-convert to paid (if card on file)
|
|
- Cancel anytime during trial (no charge)
|
|
```
|
|
|
|
## 4. STATE MACHINES
|
|
|
|
### 4.1 Order State Machine
|
|
|
|
**States**:
|
|
```
|
|
pending → Initial state after order created
|
|
paid → Payment successful
|
|
processing → Order being fulfilled (digital delivery)
|
|
completed → Order fulfilled, files delivered
|
|
cancelled → Order cancelled (before payment)
|
|
refunded → Order refunded (after payment)
|
|
failed → Payment failed
|
|
```
|
|
|
|
**Transitions**:
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> pending
|
|
pending --> paid: Payment successful
|
|
pending --> cancelled: User cancels
|
|
pending --> failed: Payment failed
|
|
paid --> processing: Start fulfillment
|
|
processing --> completed: Delivery successful
|
|
paid --> refunded: Refund requested (<14 days)
|
|
completed --> refunded: Refund requested (<14 days)
|
|
cancelled --> [*]
|
|
failed --> [*]
|
|
completed --> [*]
|
|
refunded --> [*]
|
|
```
|
|
|
|
**Business Rules**:
|
|
```
|
|
- pending → paid: Stripe webhook confirms payment
|
|
- paid → processing: Triggered immediately (async job)
|
|
- processing → completed: Files delivered to buyer's library
|
|
- * → refunded: Only if within refund window (14 days)
|
|
- * → cancelled: Only if order not yet paid
|
|
```
|
|
|
|
### 4.2 Moderation State Machine
|
|
|
|
**States**:
|
|
```
|
|
submitted → Content submitted by user
|
|
pending → Awaiting moderation
|
|
approved → Approved by moderator
|
|
rejected → Rejected by moderator
|
|
flagged → Flagged by users/auto-detection
|
|
banned → Permanently banned
|
|
```
|
|
|
|
**Transitions**:
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> submitted
|
|
submitted --> pending: Auto-check complete
|
|
pending --> approved: Moderator approves
|
|
pending --> rejected: Moderator rejects
|
|
approved --> flagged: User reports
|
|
flagged --> approved: False positive
|
|
flagged --> rejected: Violates policy
|
|
rejected --> banned: Repeat offender (3 strikes)
|
|
banned --> [*]
|
|
```
|
|
|
|
**Auto-Moderation Rules**:
|
|
```
|
|
1. Détection par règles (pas d'IA) :
|
|
- Mots-clés bloqués → flagged
|
|
- Patterns de contenu explicite → flagged (règles déterministes)
|
|
|
|
2. Spam Detection :
|
|
- Identical title/description → flagged
|
|
- Excessive links → flagged
|
|
- Bot patterns (rate, timing) → flagged
|
|
|
|
3. Copyright Detection :
|
|
- Audio fingerprinting (ACRCloud)
|
|
- Matches known tracks → flagged
|
|
|
|
4. Modération humaine :
|
|
- Tout contenu flaggé est revu par un modérateur humain
|
|
- La décision finale est toujours humaine
|
|
|
|
If flagged → pending modération humaine
|
|
If auto-approved → approved (contenu conforme aux règles)
|
|
```
|
|
|
|
### 4.3 User Account State Machine
|
|
|
|
**States**:
|
|
```
|
|
registered → Account created
|
|
verified → Email verified
|
|
active → Account active, can use platform
|
|
inactive → Account inactive (user choice)
|
|
suspended → Temporarily suspended (violation)
|
|
banned → Permanently banned
|
|
deleted → Account deleted (GDPR)
|
|
```
|
|
|
|
**Transitions**:
|
|
```
|
|
registered → verified: Email verification
|
|
verified → active: Profile completed
|
|
active → inactive: User deactivates
|
|
inactive → active: User reactivates
|
|
active → suspended: Policy violation (1-30 days)
|
|
suspended → active: Suspension period ends
|
|
suspended → banned: Multiple violations (3 strikes)
|
|
active → banned: Severe violation (illegal content)
|
|
* → deleted: User requests deletion (GDPR right)
|
|
```
|
|
|
|
## 5. BUSINESS RULES ENGINE
|
|
|
|
### 5.1 Track Publication Rules
|
|
|
|
**Rule 1: Minimum Track Duration**
|
|
```
|
|
IF track.duration < 30 seconds THEN
|
|
REJECT with error "Track too short (min 30 seconds)"
|
|
END IF
|
|
```
|
|
|
|
**Rule 2: Maximum Track Duration**
|
|
```
|
|
IF track.duration > 3600 seconds (1 hour) THEN
|
|
REJECT with error "Track too long (max 1 hour)"
|
|
END IF
|
|
```
|
|
|
|
**Rule 3: File Size Limits**
|
|
```
|
|
IF user.role == "user" AND file.size > 100MB THEN
|
|
REJECT with error "File too large (max 100MB for free users)"
|
|
ELSE IF user.role IN ["creator", "premium"] AND file.size > 500MB THEN
|
|
REJECT with error "File too large (max 500MB)"
|
|
END IF
|
|
```
|
|
|
|
**Rule 4: Upload Limits**
|
|
```
|
|
IF user.role == "user" AND user.tracks_this_month >= 5 THEN
|
|
REJECT with error "Upload limit reached (5/month for free users)"
|
|
ELSE IF user.role == "creator" AND user.tracks_this_day >= 50 THEN
|
|
REJECT with error "Upload limit reached (50/day for creators)"
|
|
END IF
|
|
```
|
|
|
|
### 5.2 Pricing Rules
|
|
|
|
**Rule 1: Minimum Product Price**
|
|
```
|
|
IF product.price < 1.00 THEN
|
|
REJECT with error "Minimum price is $1.00"
|
|
END IF
|
|
```
|
|
|
|
**Rule 2: Maximum Product Price**
|
|
```
|
|
IF product.price > 10000.00 THEN
|
|
REJECT with error "Maximum price is $10,000"
|
|
END IF
|
|
```
|
|
|
|
**Rule 3: PWYW Minimum**
|
|
```
|
|
IF product.pricing_model == "pwyw" AND product.minimum_price < 1.00 THEN
|
|
REJECT with error "PWYW minimum must be at least $1.00"
|
|
END IF
|
|
```
|
|
|
|
### 5.3 Discount Rules
|
|
|
|
**Rule 1: Discount Code Validity**
|
|
```
|
|
IF discount_code.valid_from > NOW() THEN
|
|
REJECT with error "Discount code not yet valid"
|
|
ELSE IF discount_code.valid_until < NOW() THEN
|
|
REJECT with error "Discount code expired"
|
|
ELSE IF discount_code.usage_count >= discount_code.usage_limit THEN
|
|
REJECT with error "Discount code usage limit reached"
|
|
END IF
|
|
```
|
|
|
|
**Rule 2: Minimum Purchase Amount**
|
|
```
|
|
IF discount_code.minimum_purchase_amount IS NOT NULL
|
|
AND cart.subtotal < discount_code.minimum_purchase_amount THEN
|
|
REJECT with error "Minimum purchase amount not met"
|
|
END IF
|
|
```
|
|
|
|
**Rule 3: Maximum Discount Amount**
|
|
```
|
|
IF discount_code.discount_type == "percentage" THEN
|
|
discount_amount = cart.subtotal * (discount_code.discount_value / 100)
|
|
IF discount_code.maximum_discount_amount IS NOT NULL
|
|
AND discount_amount > discount_code.maximum_discount_amount THEN
|
|
discount_amount = discount_code.maximum_discount_amount
|
|
END IF
|
|
END IF
|
|
```
|
|
|
|
## 6. VALIDATION RULES
|
|
|
|
### 6.1 User Input Validation
|
|
|
|
**Email**:
|
|
```
|
|
Pattern: ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
|
|
Max length: 255 characters
|
|
Unique: Must not already exist (case-insensitive)
|
|
```
|
|
|
|
**Username**:
|
|
```
|
|
Pattern: ^[a-zA-Z0-9_]{3,30}$
|
|
Min length: 3 characters
|
|
Max length: 30 characters
|
|
Unique: Must not already exist (case-insensitive)
|
|
Reserved: admin, root, system, veza, api, www (blocked)
|
|
```
|
|
|
|
**Password**:
|
|
```
|
|
Min length: 12 characters
|
|
Max length: 128 characters
|
|
Must contain:
|
|
- At least 1 uppercase letter
|
|
- At least 1 lowercase letter
|
|
- At least 1 digit
|
|
- At least 1 special character (!@#$%^&*)
|
|
Cannot contain:
|
|
- Email or username
|
|
- Common passwords (check against Have I Been Pwned API)
|
|
- Sequential characters (abc, 123)
|
|
```
|
|
|
|
**Bio**:
|
|
```
|
|
Max length: 500 characters
|
|
Allowed characters: Any UTF-8
|
|
Blocked patterns: Excessive links (max 3), mots-clés bloqués (liste de modération)
|
|
```
|
|
|
|
### 6.2 Track Metadata Validation
|
|
|
|
**Title**:
|
|
```
|
|
Min length: 1 character
|
|
Max length: 255 characters
|
|
Required: Yes
|
|
```
|
|
|
|
**Artist**:
|
|
```
|
|
Max length: 255 characters
|
|
Required: No (defaults to creator's name)
|
|
```
|
|
|
|
**Genre**:
|
|
```
|
|
Enum: electronic, house, techno, trance, dubstep, drum-and-bass, ...
|
|
Required: Yes
|
|
```
|
|
|
|
**BPM**:
|
|
```
|
|
Min: 60
|
|
Max: 200
|
|
Required: No
|
|
```
|
|
|
|
**Duration**:
|
|
```
|
|
Min: 30 seconds
|
|
Max: 3600 seconds (1 hour)
|
|
Required: Yes (auto-extracted from file)
|
|
```
|
|
|
|
### 6.3 Financial Validation
|
|
|
|
**Product Price**:
|
|
```
|
|
Min: $1.00
|
|
Max: $10,000.00
|
|
Precision: 2 decimals
|
|
Currency: USD, EUR, GBP, CAD, AUD
|
|
```
|
|
|
|
**Discount Percentage**:
|
|
```
|
|
Min: 1%
|
|
Max: 99%
|
|
Integer: Yes (no fractional percentages)
|
|
```
|
|
|
|
**Discount Fixed Amount**:
|
|
```
|
|
Min: $0.01
|
|
Max: $1,000.00
|
|
Precision: 2 decimals
|
|
```
|
|
|
|
## 7. COMPLEX CALCULATIONS
|
|
|
|
### 7.1 Order Total Calculation
|
|
|
|
**Formula**:
|
|
```
|
|
subtotal = SUM(item.price for item in cart.items)
|
|
|
|
discount_amount = 0
|
|
IF discount_code IS NOT NULL THEN
|
|
IF discount_code.discount_type == "percentage" THEN
|
|
discount_amount = subtotal * (discount_code.discount_value / 100)
|
|
IF discount_code.maximum_discount_amount IS NOT NULL THEN
|
|
discount_amount = MIN(discount_amount, discount_code.maximum_discount_amount)
|
|
END IF
|
|
ELSE IF discount_code.discount_type == "fixed_amount" THEN
|
|
discount_amount = discount_code.discount_value
|
|
END IF
|
|
END IF
|
|
|
|
taxable_amount = subtotal - discount_amount
|
|
|
|
tax_rate = get_tax_rate(user.country, user.state)
|
|
tax_amount = taxable_amount * tax_rate
|
|
|
|
total = subtotal - discount_amount + tax_amount
|
|
|
|
ROUND(total, 2) // Round to 2 decimals
|
|
```
|
|
|
|
**Example**:
|
|
```
|
|
Item 1: $29.99
|
|
Item 2: $49.99
|
|
Subtotal: $79.98
|
|
|
|
Discount (20%): -$16.00
|
|
Taxable: $63.98
|
|
|
|
Tax (10%): +$6.40
|
|
Total: $70.38
|
|
```
|
|
|
|
### 7.2 Seller Payout Calculation
|
|
|
|
**Formula**:
|
|
```
|
|
order_total = $100.00
|
|
|
|
platform_commission_rate = 0.15 // 15% for creators
|
|
platform_commission = order_total * platform_commission_rate
|
|
= $100.00 * 0.15 = $15.00
|
|
|
|
payment_processing_fee = (order_total * 0.029) + 0.30
|
|
= ($100.00 * 0.029) + $0.30 = $3.20
|
|
|
|
seller_payout = order_total - platform_commission - payment_processing_fee
|
|
= $100.00 - $15.00 - $3.20 = $81.80
|
|
```
|
|
|
|
**Example**:
|
|
```
|
|
Order total: $100.00
|
|
Platform commission (15%): -$15.00
|
|
Payment processing (2.9% + $0.30): -$3.20
|
|
Seller receives: $81.80
|
|
```
|
|
|
|
### 7.3 Streaming Royalty Calculation
|
|
|
|
**Formula**:
|
|
```
|
|
monthly_subscription_revenue = $100,000
|
|
total_plays_this_month = 10,000,000
|
|
|
|
per_play_rate = monthly_subscription_revenue / total_plays_this_month
|
|
= $100,000 / 10,000,000 = $0.01 per play
|
|
|
|
track_plays = 50,000
|
|
track_royalty = track_plays * per_play_rate
|
|
= 50,000 * $0.01 = $500.00
|
|
|
|
creator_share = 0.70 // 70% to creator, 30% platform
|
|
creator_payout = track_royalty * creator_share
|
|
= $500.00 * 0.70 = $350.00
|
|
```
|
|
|
|
**Minimum Payout**:
|
|
```
|
|
IF creator_balance >= $50.00 THEN
|
|
process_payout(creator_id, creator_balance)
|
|
ELSE
|
|
hold_until_minimum_reached()
|
|
END IF
|
|
```
|
|
|
|
### 7.4 Tax Calculation
|
|
|
|
**US Sales Tax** (varies by state):
|
|
```
|
|
state_tax_rates = {
|
|
"CA": 0.0725, // California: 7.25%
|
|
"TX": 0.0625, // Texas: 6.25%
|
|
"NY": 0.04, // New York: 4%
|
|
"FL": 0.06, // Florida: 6%
|
|
// ... other states
|
|
}
|
|
|
|
tax_amount = subtotal * state_tax_rates[buyer.state]
|
|
```
|
|
|
|
**EU VAT** (value-added tax):
|
|
```
|
|
country_vat_rates = {
|
|
"DE": 0.19, // Germany: 19%
|
|
"FR": 0.20, // France: 20%
|
|
"UK": 0.20, // UK: 20%
|
|
"ES": 0.21, // Spain: 21%
|
|
// ... other countries
|
|
}
|
|
|
|
IF buyer.has_valid_vat_number THEN
|
|
// Reverse charge (B2B)
|
|
vat_amount = 0
|
|
ELSE
|
|
// Standard VAT (B2C)
|
|
vat_amount = subtotal * country_vat_rates[buyer.country]
|
|
END IF
|
|
```
|
|
|
|
## 8. NOTIFICATION RULES
|
|
|
|
### 8.1 Email Notifications
|
|
|
|
**Transactional Emails** (always sent):
|
|
```
|
|
- Account verification
|
|
- Password reset
|
|
- Order confirmation
|
|
- Order shipped (physical goods)
|
|
- Refund processed
|
|
- Subscription activated
|
|
- Subscription expiring (7 days before)
|
|
- Payment failed
|
|
```
|
|
|
|
**Marketing Emails** (opt-in, jamais agressif):
|
|
```
|
|
- New features announcement
|
|
- Weekly digest (new tracks from followed users)
|
|
- Monthly summary (stats personnels du créateur)
|
|
Note: Pas de recommandations produit basées sur le comportement.
|
|
Pas de notifications de type FOMO.
|
|
```
|
|
|
|
**Cadence Limits**:
|
|
```
|
|
Transactional: No limit
|
|
Marketing: Max 2/week (user can opt out)
|
|
```
|
|
|
|
### 8.2 Push Notifications
|
|
|
|
**Real-time Notifications**:
|
|
```
|
|
- New message received
|
|
- New follower
|
|
- Track liked
|
|
- Track commented
|
|
- Mention in comment/post
|
|
- Order placed (for sellers)
|
|
- Payout processed
|
|
```
|
|
|
|
**Batched Notifications** (hourly):
|
|
```
|
|
- Multiple comments (3+ comments → "Your track has 3 new comments")
|
|
- Regroupées pour éviter la surcharge
|
|
Note: Pas de compteurs de likes en notification push (anti social validation loop)
|
|
```
|
|
|
|
**Quiet Hours & Respect du DND**:
|
|
```
|
|
Default: 22:00 - 08:00 (user's timezone)
|
|
User can configure in settings
|
|
Respect du mode "Do Not Disturb" OS
|
|
Contrôle total utilisateur sur chaque type de notification
|
|
```
|
|
|
|
### 8.3 In-App Notifications
|
|
|
|
**Notification Types**:
|
|
```
|
|
- Follow: "John Doe started following you"
|
|
- Like: "Jane Smith liked your track 'Summer Vibes'"
|
|
- Comment: "User123 commented on your track"
|
|
- Mention: "You were mentioned in a post"
|
|
- Order: "New order #12345 from BuyerName"
|
|
- System: "Your track 'Track Name' has been approved"
|
|
```
|
|
|
|
**Notification Grouping**:
|
|
```
|
|
IF same_type AND same_resource AND time_diff < 1 hour THEN
|
|
group_notifications()
|
|
// "John and 5 others liked your track"
|
|
END IF
|
|
```
|
|
|
|
**Notification Expiry**:
|
|
```
|
|
Mark as read: User clicks notification
|
|
Auto-expire: 30 days (unread notifications)
|
|
Delete: 90 days (all notifications)
|
|
```
|
|
|
|
## 9. LIMITS & QUOTAS
|
|
|
|
### 9.1 Upload Limits
|
|
|
|
**Free User**:
|
|
```
|
|
Tracks: 5/month
|
|
File size: 100 MB/file
|
|
Storage: 1 GB total
|
|
Playlist: 10 playlists
|
|
```
|
|
|
|
**Creator**:
|
|
```
|
|
Tracks: Unlimited (50/day rate limit)
|
|
File size: 500 MB/file
|
|
Storage: 50 GB total
|
|
Playlist: Unlimited
|
|
Products: Unlimited
|
|
```
|
|
|
|
**Premium**:
|
|
```
|
|
Tracks: Unlimited (100/day rate limit)
|
|
File size: 500 MB/file
|
|
Storage: 200 GB total
|
|
Playlist: Unlimited
|
|
Products: Unlimited
|
|
Collaboration: Yes
|
|
```
|
|
|
|
### 9.2 API Rate Limits
|
|
|
|
**Public API** (unauthenticated):
|
|
```
|
|
100 requests/hour per IP
|
|
```
|
|
|
|
**Authenticated API**:
|
|
```
|
|
Free: 1,000 requests/hour
|
|
Creator: 5,000 requests/hour
|
|
Premium: 10,000 requests/hour
|
|
Enterprise: Custom
|
|
```
|
|
|
|
**WebSocket Connections**:
|
|
```
|
|
Max connections per user: 5
|
|
Max rooms per user: 50
|
|
Max messages per minute: 60
|
|
```
|
|
|
|
### 9.3 Social Limits
|
|
|
|
**Follows**:
|
|
```
|
|
Free: Follow up to 500 users
|
|
Creator: Follow up to 2,000 users
|
|
Premium: Follow up to 5,000 users
|
|
```
|
|
|
|
**Messages**:
|
|
```
|
|
Free: 50 DMs/day
|
|
Creator: 200 DMs/day
|
|
Premium: Unlimited
|
|
```
|
|
|
|
**Comments**:
|
|
```
|
|
All users: 100 comments/day
|
|
Rate limit: 1 comment/second
|
|
```
|
|
|
|
## 10. SLA DEFINITIONS
|
|
|
|
### 10.1 Uptime SLA
|
|
|
|
**Target**: 99.95% uptime
|
|
```
|
|
Allowed downtime per month: 21.6 minutes
|
|
Allowed downtime per year: 4.38 hours
|
|
```
|
|
|
|
**Credits** (for Premium/Enterprise):
|
|
```
|
|
Uptime 99.95% - 99.99%: No credit
|
|
Uptime 99.00% - 99.95%: 10% monthly fee credit
|
|
Uptime 95.00% - 99.00%: 25% monthly fee credit
|
|
Uptime < 95.00%: 50% monthly fee credit
|
|
```
|
|
|
|
**Exclusions**:
|
|
```
|
|
- Scheduled maintenance (announced 7 days in advance)
|
|
- Force majeure (natural disasters, wars, etc.)
|
|
- Third-party failures (AWS, Stripe, etc.)
|
|
- User-caused issues (DDoS from user's network)
|
|
```
|
|
|
|
### 10.2 Performance SLA
|
|
|
|
**API Response Time**:
|
|
```
|
|
p50 (median): < 50ms
|
|
p95: < 100ms
|
|
p99: < 500ms
|
|
```
|
|
|
|
**Page Load Time**:
|
|
```
|
|
Time to First Byte (TTFB): < 200ms
|
|
First Contentful Paint: < 1.5s
|
|
Time to Interactive: < 3.5s
|
|
```
|
|
|
|
**Audio Streaming**:
|
|
```
|
|
Buffering: < 1 second initial
|
|
Rebuffering rate: < 0.5%
|
|
Audio start time: < 2 seconds
|
|
```
|
|
|
|
### 10.3 Support SLA
|
|
|
|
**Response Time**:
|
|
```
|
|
Critical (platform down): < 15 minutes
|
|
High (feature broken): < 2 hours
|
|
Medium (minor issue): < 8 hours
|
|
Low (question/enhancement): < 24 hours
|
|
```
|
|
|
|
**Resolution Time**:
|
|
```
|
|
Critical: < 4 hours
|
|
High: < 24 hours
|
|
Medium: < 3 days
|
|
Low: < 7 days
|
|
```
|
|
|
|
**Support Channels**:
|
|
```
|
|
Free users: Email, Help Center
|
|
Premium users: Email, Chat, Priority support
|
|
Enterprise: Phone, Dedicated account manager
|
|
```
|
|
|
|
### 10.4 Payout SLA
|
|
|
|
**Processing Time**:
|
|
```
|
|
Stripe Connect: 1-3 business days
|
|
PayPal: Instant (< 1 hour)
|
|
Bank Transfer: 3-5 business days
|
|
```
|
|
|
|
**Failure Handling**:
|
|
```
|
|
IF payout_failed THEN
|
|
retry_after_24_hours()
|
|
IF retry_failed THEN
|
|
notify_user_email()
|
|
manual_review_by_finance_team()
|
|
END IF
|
|
END IF
|
|
```
|
|
|
|
## 11. EXCLUSIONS ET RAISONS ÉTHIQUES
|
|
|
|
Les éléments suivants sont **définitivement exclus** de la logique métier de Veza.
|
|
|
|
### Cryptomonnaies
|
|
- Aucun paiement en Bitcoin, Ethereum, ou autre cryptomonnaie
|
|
- **Raison** : impact environnemental disproportionné, spéculation, fraude documentée dans le domaine musical
|
|
|
|
### Publicité
|
|
- Zéro régie publicitaire, zéro pixel de tracking tiers, zéro retargeting
|
|
- **Raison** : la publicité transforme les utilisateurs en produit. Incompatible avec le principe « l'humain d'abord »
|
|
|
|
### Vente de données
|
|
- Aucune monétisation des données comportementales
|
|
- **Raison** : les données des utilisateurs ne sont pas un produit
|
|
|
|
### Recommandations ML
|
|
- Pas de collaborative filtering, content-based filtering, ou analyse prédictive du comportement
|
|
- **Raison** : optimise pour la rétention, pas pour la découverte authentique. La découverte musicale est basée sur les genres/tags déclarés par les artistes, la curation éditoriale humaine, et les connexions sociales
|
|
|
|
### Gamification addictive
|
|
- Pas de systèmes XP, niveaux, streaks, leaderboards de popularité
|
|
- **Raison** : transforme l'expression artistique en compétition et normalise les métriques de performance comme mesure de la valeur artistique
|
|
|
|
### Freemium agressif
|
|
- Pas de features artificiellement bridées, pas de dark patterns dans les flows d'upgrade
|
|
- **Raison** : les modèles de tarification sont simples et honnêtes
|
|
|
|
## 12. GOUVERNANCE
|
|
|
|
### Roadmap publique
|
|
- La roadmap produit est publique et commentable
|
|
- Les utilisateurs peuvent voter sur les features planifiées
|
|
- Les décisions produit majeures sont documentées avec leur justification
|
|
|
|
### Contribution open source
|
|
- Le cœur de la plateforme est open source
|
|
- Processus de contribution documenté (CONTRIBUTING.md)
|
|
- Code review systématique par les mainteneurs
|
|
|
|
### Transparence économique
|
|
- Les commissions sont documentées et visibles avant chaque transaction
|
|
- Les conditions d'utilisation sont rédigées en langage humain
|
|
- Les changements tarifaires sont annoncés 90 jours à l'avance
|
|
|
|
## ✅ CHECKLIST DE VALIDATION
|
|
|
|
### Pricing
|
|
- [ ] All prices in centimes (avoid rounding errors)
|
|
- [ ] Currency conversion rates updated daily
|
|
- [ ] Commission structure documented
|
|
- [ ] Refund policy defined
|
|
|
|
### Workflows
|
|
- [ ] All user workflows documented
|
|
- [ ] State machines defined
|
|
- [ ] Valid state transitions specified
|
|
- [ ] Business rules engine implemented
|
|
|
|
### Calculations
|
|
- [ ] Financial calculations audited
|
|
- [ ] Tax calculations compliant
|
|
- [ ] Royalty calculations transparent
|
|
- [ ] Rounding handled correctly
|
|
|
|
### Limits & Quotas
|
|
- [ ] Per-role limits enforced
|
|
- [ ] Rate limiting implemented
|
|
- [ ] Quota monitoring enabled
|
|
- [ ] Graceful degradation
|
|
|
|
### SLAs
|
|
- [ ] Uptime targets defined
|
|
- [ ] Performance targets measurable
|
|
- [ ] Support SLAs documented
|
|
- [ ] Monitoring & alerting configured
|
|
|
|
## 📊 MÉTRIQUES DE SUCCÈS
|
|
|
|
### Business Metrics
|
|
- **Conversion Rate**: > 3% (visitors → purchases)
|
|
- **Average Order Value**: > $50
|
|
- **Customer Lifetime Value**: > $500
|
|
- **Churn Rate**: < 5%/month
|
|
|
|
### Operational Metrics
|
|
- **Uptime**: 99.95%
|
|
- **API Response Time p95**: < 100ms
|
|
- **Support Response Time**: < 2 hours (high priority)
|
|
- **Payout Success Rate**: > 99%
|
|
|
|
## 🔄 HISTORIQUE DES VERSIONS
|
|
|
|
| Version | Date | Changements |
|
|
|---------|------|-------------|
|
|
| 1.0.0 | 2025-11-02 | Version initiale - Règles métier complètes |
|
|
| 2.0.0 | 2026-03-04 | Révision éthique : suppression crypto/AI/publicité, ajout principes éthiques, modèle open core, gouvernance |
|
|
|
|
---
|
|
|
|
## ⚠️ AVERTISSEMENT
|
|
|
|
**CES RÈGLES MÉTIER SONT ALIGNÉES AVEC L'ÉTHIQUE DU PROJET**
|
|
|
|
Toute modification nécessite :
|
|
|
|
1. **RFC Business Logic Change** avec impact analysis et vérification d'alignement éthique
|
|
2. **Approbation Product Owner** + Legal (si implications légales)
|
|
3. **Migration plan** pour données existantes
|
|
4. **Communication** aux utilisateurs (si impact visible)
|
|
|
|
**Les changements de règles financières nécessitent validation CFO.**
|
|
**Aucune modification ne peut contredire les principes éthiques fondateurs (§0).**
|
|
|
|
---
|
|
|
|
**Document créé par**: Product Team + Business Analysts
|
|
**Date de création**: 2025-11-02
|
|
**Dernière révision**: 2026-03-04 (révision éthique)
|
|
**Prochaine révision**: Trimestrielle
|
|
**Propriétaire**: Chief Product Officer
|
|
|
|
**Statut**: ✅ **APPROUVÉ — v2.0.0**
|
|
|