fix: handle multi-component investment recommendations (CD ladders)
When adding a multi-stage investment strategy (e.g. CD ladder) from AI recommendations to a board planning scenario, all component investments are now created as separate rows instead of collapsing into a single investment. The AI prompt now instructs inclusion of a components array, the backend loops through components to create individual scenario investments, and the frontend passes and displays component details. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -106,6 +106,37 @@ export class BoardPlanningService {
|
||||
|
||||
async addInvestmentFromRecommendation(scenarioId: string, dto: any) {
|
||||
await this.getScenarioRow(scenarioId);
|
||||
|
||||
// If the recommendation has components (e.g. CD ladder with multiple CDs), create one row per component
|
||||
const components = dto.components as any[] | undefined;
|
||||
if (components && Array.isArray(components) && components.length > 0) {
|
||||
const results: any[] = [];
|
||||
for (let i = 0; i < components.length; i++) {
|
||||
const comp = components[i];
|
||||
const rows = await this.tenant.query(
|
||||
`INSERT INTO scenario_investments
|
||||
(scenario_id, source_recommendation_id, label, investment_type, fund_type,
|
||||
principal, interest_rate, term_months, institution, notes, sort_order)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
||||
RETURNING *`,
|
||||
[
|
||||
scenarioId, dto.sourceRecommendationId || null,
|
||||
comp.label || `${dto.title || 'AI Recommendation'} - Part ${i + 1}`,
|
||||
comp.investment_type || dto.investmentType || null,
|
||||
dto.fundType || 'reserve',
|
||||
comp.amount || 0, comp.rate || null,
|
||||
comp.term_months || null, comp.bank_name || dto.bankName || null,
|
||||
dto.rationale || dto.notes || null,
|
||||
i,
|
||||
],
|
||||
);
|
||||
results.push(rows[0]);
|
||||
}
|
||||
await this.invalidateProjectionCache(scenarioId);
|
||||
return results;
|
||||
}
|
||||
|
||||
// Single investment (no components)
|
||||
const rows = await this.tenant.query(
|
||||
`INSERT INTO scenario_investments
|
||||
(scenario_id, source_recommendation_id, label, investment_type, fund_type,
|
||||
|
||||
Reference in New Issue
Block a user