From 214a6ddaec15a21189d361c56546c238ef3fc744 Mon Sep 17 00:00:00 2001 From: josh Date: Sun, 24 May 2026 18:55:38 -0400 Subject: [PATCH] Fix avg/ct and consumption rate for discrete products (edibles) Both metrics multiplied countOriginal by unitWeight, producing weight-based values labeled as per-count. For edibles where unitWeight is in mg, this yielded $0.02/ct and 18.18 ct/day. Co-Authored-By: Claude Opus 4.6 --- web/src/components/SkuDetail.tsx | 6 +++--- web/src/views/SkusView.tsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/src/components/SkuDetail.tsx b/web/src/components/SkuDetail.tsx index 96909e6..2b331a5 100644 --- a/web/src/components/SkuDetail.tsx +++ b/web/src/components/SkuDetail.tsx @@ -43,8 +43,8 @@ export function SkuDetail({ const totalGrams = items.reduce((s, i) => s + i.weight, 0); if (totalGrams > 0) avgCostPerGram = totalSpend / totalGrams; } else { - const totalGrams = items.reduce((s, i) => s + i.countOriginal * i.unitWeight, 0); - if (totalGrams > 0) avgCostPerGram = totalSpend / totalGrams; + const totalCount = items.reduce((s, i) => s + i.countOriginal, 0); + if (totalCount > 0) avgCostPerGram = totalSpend / totalCount; } const rated = items.filter((i) => i.rating != null); @@ -62,7 +62,7 @@ export function SkuDetail({ const totalGramsConsumed = consumed.reduce((s, i) => { if (i.kind === "bulk") return s + i.weight; - return s + i.countOriginal * i.unitWeight; + return s + i.countOriginal; }, 0); const totalDaysConsumed = lifespans.reduce((a, b) => a + b, 0); const consumptionRate = totalDaysConsumed > 0 ? totalGramsConsumed / totalDaysConsumed : null; diff --git a/web/src/views/SkusView.tsx b/web/src/views/SkusView.tsx index 6ff5f18..c637877 100644 --- a/web/src/views/SkusView.tsx +++ b/web/src/views/SkusView.tsx @@ -41,8 +41,8 @@ function buildSkuRows(data: Bootstrap): SkuRow[] { const totalGrams = items.reduce((s, i) => s + i.weight, 0); if (totalGrams > 0) avgCostPerGram = totalSpend / totalGrams; } else if (cfg && p.kind === "discrete") { - const totalGrams = items.reduce((s, i) => s + i.countOriginal * i.unitWeight, 0); - if (totalGrams > 0) avgCostPerGram = totalSpend / totalGrams; + const totalCount = items.reduce((s, i) => s + i.countOriginal, 0); + if (totalCount > 0) avgCostPerGram = totalSpend / totalCount; } const dates = items.map((i) => i.purchaseDate).sort();