File size: 6,932 Bytes
3eebcd0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# 🗂️ Guía de Migración de Base de Datos - Stripe Integration

## 📋 Descripción General

Este proyecto ha sido actualizado con:
- **Integración Stripe**: Pagos, checkout, webhooks
- **Renovación Automática**: Suscripciones recurrentes mensuales
- **Contabilidad Exacta**: Modelo `Earning` para cada pago
- **Cancelación Cliente**: Cancelar suscripciones cuando quieran

Para esto, necesitas ejecutar una **migración de BD** que agregue campos nuevos a las tablas.

---

## ⚙️ Pre-requisitos

✅ Tienes PostgreSQL o SQLite instalado y funcionando  
✅ Tu `.env` tiene `DATABASE_URL` configurado  
✅ Ejecutaste `npm install stripe` (ya hecho)  
✅ Node.js 18+ instalado

---

## 🚀 Paso 1: Ejecutar la Migración

Abre la terminal en la raíz del proyecto:

```bash
cd c:\Users\gemag\sofia-cloud
npx prisma migrate dev --name add_stripe_and_renewals
```

**¿Qué pasa?**
1. Prisma detecta cambios en `prisma/schema.prisma` (campos Stripe nuevos)
2. Genera un archivo de migración en `prisma/migrations/`
3. **Aplica automáticamente** la migración a tu BD local
4. Regenera el cliente Prisma

**Salida esperada:**
```
✓ Created new migration: ./prisma/migrations/202501xx_add_stripe_and_renewals/migration.sql
✓ Database has been updated
✓ Generated Prisma Client
```

**Si hay error:**
```bash
# Revertir si algo sale mal:
npx prisma migrate resolve --rolled-back <nombre-migracion>
```

---

## ✅ Paso 2: Verificar la Migración

Confirma que los campos nuevos existen en la BD:

```bash
# Ver estado de migraciones
npx prisma migrate status

# Ver el contenido de la BD
npx prisma studio
```

En Prisma Studio deberías ver en la tabla `InfluencerSubscription`:
-`stripeSubscriptionId` (string, opcional)
-`stripeCustomerId` (string, opcional)
-`nextRenewalDate` (DateTime)
-`autoRenew` (boolean, default: true)

Y en tabla `Earning`:
-`subscriptionId` (foreign key)
-`stripePaymentIntentId` (string, opcional)
-`isRecurring` (boolean, default: false)
-`paymentStatus` (enum: pending, completed, failed)
-`paymentMethod` (string, opcional)

---

## 🔑 Paso 3: Configurar Variables de Entorno

Edita tu `.env` (o `.env.local`) y agrega:

```env
# ====== STRIPE KEYS ======
# Obtén estos de: https://dashboard.stripe.com/apikeys
STRIPE_SECRET_KEY="sk_test_XXXXX..."    # Para testing
# En producción: sk_live_XXXXX...

STRIPE_WEBHOOK_SECRET="whsec_XXXXX..."  # De https://dashboard.stripe.com/webhooks
```

### 📌 Cómo obtener las keys:

1. **STRIPE_SECRET_KEY**
   - Ve a [dashboard.stripe.com/apikeys](https://dashboard.stripe.com/apikeys)
   - Mira en la sección "Secret Key"
   - Copia la que empiece con `sk_test_` (para desarrollo)

2. **STRIPE_WEBHOOK_SECRET**
   - Ve a [dashboard.stripe.com/webhooks](https://dashboard.stripe.com/webhooks)
   - Haz click en "+ Add endpoint"
   - **Endpoint URL**: `http://localhost:3000/api/payments/webhook` (local)
   - **Eventos**: Selecciona estos:
     - `checkout.session.completed`
     - `customer.subscription.created`
     - `customer.subscription.deleted`
     - `customer.subscription.updated`
     - `invoice.payment_succeeded`
     - `invoice.payment_failed`
   - Click "Add endpoint"
   - Verás el "Signing secret" (empieza con `whsec_`)
   - Cópialo y agrégalo a `.env`

---

## 🧪 Paso 4: Verificar la Instalación (Local)

Inicia el servidor:

```bash
npm run dev
```

Prueba que los endpoints nuevos funcionan:

```bash
# 1. Ver si puedes llegar al checkout
curl http://localhost:3000/api/payments/checkout

# 2. Ver si el webhook está listo
curl http://localhost:3000/api/payments/webhook

# Resultado esperado: 405 Method Not Allowed (porque es POST, no GET)
# ✅ Eso significa que el endpoint existe
```

---

## 📤 Paso 5: Para Producción (VPS/Hosting)

Cuando subes a un VPS o servidor:

```bash
# 1. Subir código (git push)
git add .
git commit -m "Add Stripe integration and auto-renewal"
git push origin main

# 2. En el servidor VPS:
cd /ruta/del/proyecto
npm install stripe        # Instala Stripe
npx prisma migrate deploy # Aplica migraciones sin preguntar

# 3. Actualizar .env en producción:
# - STRIPE_SECRET_KEY: sk_live_XXXXX... (clave VIVA, no test)
# - STRIPE_WEBHOOK_SECRET: del webhook en producción
# - DATABASE_URL: URL de BD producción

npm run build
npm start
```

---

## 📊 Campos Nuevos en la BD

### InfluencerSubscription

| Campo | Tipo | Descripción |
|-------|------|------------|
| `stripeSubscriptionId` | string | ID de suscripción en Stripe (ej: sub_12345) |
| `stripeCustomerId` | string | ID de cliente en Stripe (ej: cus_XXXXX) |
| `nextRenewalDate` | DateTime | Fecha próxima renovación (calculada cada pago) |
| `autoRenew` | boolean | Si es true, se renueva automáticamente |

### Earning

| Campo | Tipo | Descripción |
|-------|------|------------|
| `subscriptionId` | string | FK a InfluencerSubscription |
| `stripePaymentIntentId` | string | ID de pago en Stripe |
| `isRecurring` | boolean | true si viene de renovación automática |
| `paymentStatus` | enum | "pending" \| "completed" \| "failed" |
| `paymentMethod` | string | "stripe" \| "manual" \| etc |

---

## 🔍 Verificación Post-Migración

Ejecuta esto para confirmar todo está bien:

```bash
# 1. Ver migrations aplicadas
npx prisma migrate status

# 2. Ver esquema generado
npx prisma generate

# 3. Compilar proyecto
npm run build

# Si los 3 pasos pasan sin ERROR ✅, estás listo
```

---

## ⚠️ Si Algo Sale Mal

### Error: "Column does not exist"
```bash
# La migración se aplicó solo parcialmente
# Revertir y intentar de novo:
npx prisma migrate resolve --rolled-back add_stripe_and_renewals
npx prisma migrate dev --name add_stripe_and_renewals
```

### Error: "STRIPE_SECRET_KEY not set"
```bash
# Olvidaste agregar la key a .env
# Agrega: STRIPE_SECRET_KEY="sk_test_XXXXX"
# Reinicia el servidor: npm run dev
```

### Error: "Cannot find module 'stripe'"
```bash
# Stripe no está instalado
npm install stripe
npx prisma generate
npm run dev
```

---

## 📞 Resumen de Pasos (Quick Reference)

| # | Paso | Comando | Resultado |
|---|------|---------|-----------|
| 1 | Migrar BD | `npx prisma migrate dev --name add_stripe_and_renewals` | ✅ Campos nuevos en tablas |
| 2 | Verificar | `npx prisma studio` | ✅ Ver nuevos campos |
| 3 | Config env | Editar `.env` | ✅ Keys Stripe agregadas |
| 4 | Webhook Stripe | Agregar endpoint en dashboard | ✅ Webhooks conectados |
| 5 | Compilar | `npm run build` | ✅ Sin errores |
| 6 | Testear | `npm run dev` + curl | ✅ Endpoints funcionan |

---

## ✨ ¡Listo! Ahora puedes:

✅ Crear suscripciones en Stripe  
✅ Procesar pagos automáticos mensuales  
✅ Rastrear earnings por pago exacto  
✅ Cancelar suscripciones cuando el cliente quiera  
✅ Ver reportes con contabilidad exacta  

**¿Preguntas? Ejecuta los pasos en orden y reporta cualquier error.**