FCS-dev
Se migró la configuración de alertas Telegram desde una variable de entorno global () hacia campos propios del modelo en la base de datos. Cada usuario configura su propio bot token, chat ID y activación de alertas desde el panel web.
6112db7 | /** | |
| * Schema de Prisma ORM para base de datos SQLite. | |
| * | |
| * Define 6 modelos: User, Market, AISignal, Position, Watchlist, Alert. | |
| * Relaciones: | |
| * - Market 1:N AISignal, Position, Watchlist, Alert | |
| * - User 1:N Position, Watchlist, Alert | |
| * | |
| * No modificar sin consenso del equipo. Generar migraciones con: | |
| * npx prisma migrate dev | |
| * npx prisma generate | |
| */ | |
| generator client { | |
| provider = "prisma-client-js" | |
| } | |
| datasource db { | |
| provider = "sqlite" | |
| url = env("DATABASE_URL") | |
| } | |
| model User { | |
| id Int | |
| email String | |
| passwordHash String | |
| isActive Boolean | |
| telegramChatId String? | |
| telegramBotToken String? | |
| telegramAlertsEnabled Boolean | |
| createdAt DateTime | |
| updatedAt DateTime | |
| positions Position[] | |
| watchlist Watchlist[] | |
| alerts Alert[] | |
| } | |
| model Market { | |
| id String // ID nativo de Polymarket | |
| question String // Texto de la pregunta del mercado | |
| category String? // politics | crypto | economics | sports | |
| countryCode String? // ISO2 — usado por Leaflet para burbujas | |
| yesPrice Float? // Precio YES: 0.0 a 1.0 | |
| noPrice Float? // Precio NO: 0.0 a 1.0 | |
| volumeEur Float? // Volumen en Eur | |
| liquidityEur Float? // Liquidez en Eur | |
| spread Float? // Bid/ask spread (0-1, ej 0.02 = 2c) | |
| bestBid Float? // Mejor oferta de compra | |
| bestAsk Float? // Mejor oferta de venta | |
| clobTokenId String? // YES outcome CLOB token ID (para prices-history) | |
| analyzable Boolean // Si la IA tiene edge plausible aqui | |
| status String // active | closed | resolved | |
| closesAt DateTime? // Fecha de cierre del mercado | |
| lastSynced DateTime // Ultima sincronizacion de precios | |
| signals AISignal[] | |
| positions Position[] | |
| watchlist Watchlist[] | |
| alerts Alert[] | |
| } | |
| model AISignal { | |
| id Int | |
| marketId String | |
| market Market | |
| signal String // bullish | bearish | neutral | |
| confidence Float // 0.0 a 1.0 | |
| summary String? // 2 frases generadas por Qwen3 | |
| keyRisk String? // 1 frase de riesgo principal | |
| newsCount Int // Titulares relevantes usados | |
| modelVersion String // Modelo LLM que genero la senal | |
| impliedProb Float? // Probabilidad implicita YES al generar (0-1) | |
| fairProb Float? // Probabilidad "justa" segun IA (0-1) | |
| edgePoints Float? // (fairProb - impliedProb) * 100, signo conserva direccion | |
| generatedAt DateTime | |
| @ | |
| } | |
| model Position { | |
| id Int | |
| userId Int | |
| user User | |
| marketId String | |
| market Market | |
| outcome String // YES | NO | |
| amountEur Float // Capital virtual apostado | |
| entryPrice Float // Precio al abrir la posicion | |
| currentPrice Float? // Precio actual (actualizado por scheduler) | |
| pnl Float // Profit and Loss calculado | |
| kellyFraction Float? // Fraccion de Kelly al abrir | |
| status String // open | closed | |
| openedAt DateTime | |
| closedAt DateTime? | |
| @ | |
| @ | |
| } | |
| model Watchlist { | |
| id Int | |
| userId Int | |
| user User | |
| marketId String | |
| market Market | |
| alertThreshold Float? // Umbral de precio para alerta Telegram | |
| createdAt DateTime | |
| @ | |
| @ | |
| } | |
| model Alert { | |
| id Int | |
| userId Int | |
| user User | |
| marketId String | |
| market Market | |
| type String // price_threshold | signal_change | |
| message String // Texto enviado por Telegram | |
| sentAt DateTime | |
| @ | |
| @ | |
| } | |