feat(subscriptions): script para activar suscripción manualmente por período
This commit is contained in:
76
apps/api/scripts/activate-subscription.ts
Normal file
76
apps/api/scripts/activate-subscription.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { prisma } from '../src/config/database.js';
|
||||
|
||||
/**
|
||||
* Activa manualmente una suscripción para un tenant por un período dado.
|
||||
* Uso:
|
||||
* pnpm tsx scripts/activate-subscription.ts <tenant-rfc> <amount> <period-start> <period-end>
|
||||
* Ejemplo:
|
||||
* pnpm tsx scripts/activate-subscription.ts ROEM691011EZ4 580 2026-08-29 2026-09-29
|
||||
*/
|
||||
async function main() {
|
||||
const [rfc, amountStr, periodStartStr, periodEndStr] = process.argv.slice(2);
|
||||
|
||||
if (!rfc || !amountStr || !periodStartStr || !periodEndStr) {
|
||||
console.error('Uso: pnpm tsx scripts/activate-subscription.ts <tenant-rfc> <amount> <period-start> <period-end>');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const amount = Number(amountStr);
|
||||
if (!Number.isFinite(amount) || amount <= 0) {
|
||||
console.error('Monto inválido');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const periodStart = new Date(periodStartStr);
|
||||
const periodEnd = new Date(periodEndStr);
|
||||
periodEnd.setHours(23, 59, 59, 999);
|
||||
|
||||
const tenant = await prisma.tenant.findUnique({ where: { rfc } });
|
||||
if (!tenant) {
|
||||
console.error(`Tenant ${rfc} no encontrado`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const subscription = await prisma.subscription.findFirst({
|
||||
where: { tenantId: tenant.id },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
});
|
||||
|
||||
if (!subscription) {
|
||||
console.error(`No hay suscripción para tenant ${rfc}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
await prisma.$transaction(async (tx) => {
|
||||
await tx.subscription.update({
|
||||
where: { id: subscription.id },
|
||||
data: {
|
||||
status: 'authorized',
|
||||
currentPeriodStart: periodStart,
|
||||
currentPeriodEnd: periodEnd,
|
||||
},
|
||||
});
|
||||
|
||||
const payment = await tx.payment.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
subscriptionId: subscription.id,
|
||||
mpPaymentId: `manual-${Date.now()}`,
|
||||
amount,
|
||||
status: 'approved',
|
||||
paymentMethod: 'bank_transfer',
|
||||
paidAt: new Date(),
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`[Activate Subscription] Tenant ${rfc} activado`);
|
||||
console.log(` Plan: ${subscription.plan}`);
|
||||
console.log(` Período: ${periodStart.toISOString()} → ${periodEnd.toISOString()}`);
|
||||
console.log(` Pago: ${amount} (ID: ${payment.id})`);
|
||||
});
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user