diff --git a/app/routes/analyze.ticker.tsx b/app/routes/analyze.ticker.tsx index d4c364d..cf7b6b5 100644 --- a/app/routes/analyze.ticker.tsx +++ b/app/routes/analyze.ticker.tsx @@ -116,6 +116,15 @@ export default function StockDetail() { setDecision(null); try { + // Ensure ticker is saved in DB before analysis + try { + const fd = new FormData(); + fd.append("ticker", ticker); + await fetch("/api/stocks", { method: "POST", body: fd }); + } catch (e) { + console.warn("Failed to ensure ticker saved:", e); + } + const res = await fetch("/api/analyze", { method: "POST", headers: { "Content-Type": "application/json" }, @@ -134,6 +143,18 @@ export default function StockDetail() { setAnalystReports(reports); setDebateRounds(debates); setDecision(data); + + // Save last decision/explanation to DB + try { + const fd2 = new FormData(); + fd2.append("ticker", ticker); + fd2.append("lastDecision", data.action ?? ""); + fd2.append("lastExplanation", data.reasoning ?? ""); + if (data.executionPlan) fd2.append("lastExecutionPlan", JSON.stringify(data.executionPlan)); + await fetch("/api/stocks", { method: "POST", body: fd2 }); + } catch (e) { + console.warn("Failed to save decision to DB:", e); + } // Cache the results sessionStorage.setItem(cacheKey, JSON.stringify({ @@ -375,6 +396,23 @@ export default function StockDetail() {
Note: {decision.executionPlan.note}
)} + + {/* Order suggestion summary */} +
+
Order Suggestion
+
+
+ {decision.action.toUpperCase()} + {decision.executionPlan.amount} shares + {decision.executionPlan.takeProfit != null && ( + — Take profit: ${decision.executionPlan.takeProfit} + )} +
+ {decision.executionPlan.riskManagement?.maxLossPercent != null && ( +
Risk: {decision.executionPlan.riskManagement.maxLossPercent}% max loss
+ )} +
+
)} diff --git a/app/routes/api/stocks/index.ts b/app/routes/api/stocks/index.ts index f2d58e6..b31fac3 100644 --- a/app/routes/api/stocks/index.ts +++ b/app/routes/api/stocks/index.ts @@ -23,8 +23,26 @@ export async function action({ request }: { request: Request }) { return Response.json({ success: true }); } - const stock = await db.stock.create({ - data: { ticker }, + // Optional fields to save/update + const lastDecision = formData.get("lastDecision")?.toString(); + const lastExplanation = formData.get("lastExplanation")?.toString(); + const lastExecutionPlan = formData.get("lastExecutionPlan")?.toString(); + + // Upsert the stock record so ticker is ensured and optional fields are saved + const stock = await db.stock.upsert({ + where: { ticker }, + update: { + lastDecision: lastDecision ?? undefined, + lastExplanation: lastExplanation ?? undefined, + lastExecutionPlan: lastExecutionPlan ?? undefined, + }, + create: { + ticker, + lastDecision: lastDecision ?? undefined, + lastExplanation: lastExplanation ?? undefined, + lastExecutionPlan: lastExecutionPlan ?? undefined, + }, }); + return Response.json(stock); } \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5a0496f..47d80c6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -9,9 +9,12 @@ datasource db { } model Stock { - id String @id @default(cuid()) - ticker String @unique - notes String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(cuid()) + ticker String @unique + notes String? + lastDecision String? + lastExplanation String? + lastExecutionPlan String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt }