- Ranking de rentabilidad: add 3 columns (C. Cristales / C. Ore / C. Fee)
alongside the existing Costo column. Update rankingFiltrado() to include
the 3 sub-costs in its map output.
- Totales Presupuesto (3 sub-vistas: simple/maximizado/mezcla): add
Distribución del costo block with bar + legend under existing 3 cards.
- Totales Objetivo: extend objetivoTotales() to aggregate sub-costs, then
add the same distribution block.
- Totales Plan cristales: same distribution block (planTotalesCristales
already aggregated sub-costs).
- Add 3 generic helpers pctCOf/pctOOf/pctFOf that take a totals object
(handles both 'costoTotal' and 'costo' field names).
- Fix x-show condition for Presupuesto distribution: use .costo (the field
actually returned by planTotalesPresupuesto) instead of .costoTotal.
Verified in browser across all 5 distribution points; percentages sum to
100% and math matches per-row calculations.
- Add costoCristales/costoOre/costoDwarven fields to calc.js results and
RunItem/RunIn/RunSummary/HistoryStats records (no DB migration needed —
items stored as JSON in TEXT column).
- Show 4 explicit columns (C. Cristales / C. Ore / C. Fee / Costo total)
in all calculator tables: Cristales mode, Presupuesto (simple/maximizado/
mezcla), and Objetivo. Totales globales now includes a 3-segment
distribution bar with %.
- Historial: 3 new stats cards + global distribution bar; per-run modal
shows breakdown + bar; per-item table has 3 sub-columns; CSV export
extended. CSS: cost-split-bar, cost-split-segment-{cristales,ore,fee},
cost-legend-dot.
- New 'Plan por cristales' mode (4th): single-grade + quantity input with
greedy max-ROI/cristal algorithm and shared cost split columns.
Verificado end-to-end en navegador.
- New /personajes page with CRUD for characters (name, class, level)
- Level editable inline, deletable (blocked if has active sales)
- ventas.html now loads characters list as datalist suggestions
- Fix timer: add reactive 'now' property so countdown updates
- Fix script loading: add defaults.js + app.js to ventas/personajes
- Fix table auto-reload: use loadCharacters()/loadSales() after mutations
- Timer now uses setTimeout recursion + visibilitychange handler
- New page /ventas to track characters selling items
- Default 12h duration per character sale
- Real-time countdown with color-coded badges (green/yellow/red/gray)
- Sound alert toggle when sales expire
- CRUD API: GET/POST/DELETE /api/sales
- Flyway migration V2 for character_sales table
- Private per-user (same user sees only their own characters)
- Expired sales remain visible with 'Expirado' badge until manually deleted
- Add filteredSnapshotCristales/Ores/Venta getters that filter based on modalDetails.items
- Cristales: only show grados that appear in items
- Ores: only show Soul/Spirit Ore based on item tipos
- Venta: only show tipo-grado combos in items
- Backward compatible: old runs with 15 items show full snapshot