diff --git a/src/lib/utils.js b/src/lib/utils.js
index 47f8a8f7..b16a8176 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -49,6 +49,51 @@ export const validateData = async (formData, schema) => {
}
+export function sumQuarterlyResultsByYear(quarterlyResults) {
+ const yearlySummaries = {};
+ const quarterCounts = {};
+
+ // Define a Set of keys to exclude
+ const excludeKeys = new Set(['weightedAverageShsOut', 'weightedAverageShsOutDil']);
+
+ // Iterate over each quarterly result
+ quarterlyResults?.forEach(quarter => {
+ // Extract year from the date
+ const year = new Date(quarter?.calendarYear)?.getFullYear();
+
+ // Initialize the year in summaries and quarter counts if not already present
+ if (!yearlySummaries[year]) {
+ yearlySummaries[year] = {
+ calendarYear: `${year}`, // Use end of the year date
+ };
+ quarterCounts[year] = 0;
+ }
+
+ // Increment the quarter count for the year
+ quarterCounts[year]++;
+
+ // Sum up the numeric fields for the year, excluding specific keys
+ Object?.keys(quarter)?.forEach(key => {
+ if (typeof quarter[key] === 'number' && !excludeKeys.has(key)) {
+ yearlySummaries[year][key] = (yearlySummaries[year][key] || 0) + quarter[key];
+ } else if (excludeKeys.has(key)) {
+ // Directly copy the last quarter value for these keys
+ yearlySummaries[year][key] = quarter[key];
+ }
+ });
+ });
+
+ // Filter out years with less than 4 quarters
+ const validYears = Object.keys(quarterCounts).filter(year => quarterCounts[year] === 4);
+ const annualResults = validYears.map(year => yearlySummaries[year]);
+
+ // Sort the results by year in descending order
+ annualResults.sort((a, b) => b?.calendarYear?.localeCompare(a?.calendarYear));
+
+ return annualResults;
+}
+
+
export const sortPostsByDate = (posts) => {
return posts.sort(function(a, b) {
diff --git a/src/routes/stocks/[tickerID]/stats/balance-sheet/+page.svelte b/src/routes/stocks/[tickerID]/stats/balance-sheet/+page.svelte
index 6f5a4d1c..667522c7 100644
--- a/src/routes/stocks/[tickerID]/stats/balance-sheet/+page.svelte
+++ b/src/routes/stocks/[tickerID]/stats/balance-sheet/+page.svelte
@@ -1,7 +1,7 @@
diff --git a/src/routes/stocks/[tickerID]/stats/cash-flow/+page.svelte b/src/routes/stocks/[tickerID]/stats/cash-flow/+page.svelte
index 54001782..e779abd2 100644
--- a/src/routes/stocks/[tickerID]/stats/cash-flow/+page.svelte
+++ b/src/routes/stocks/[tickerID]/stats/cash-flow/+page.svelte
@@ -3,7 +3,7 @@ import Chart from '$lib/components/Chart.svelte'
import { page } from '$app/stores';
import {numberOfUnreadNotification,displayCompanyName, stockTicker} from '$lib/store';
//import {Katex} from '$lib/components';
-import { abbreviateNumber } from '$lib/utils';
+import { abbreviateNumber, sumQuarterlyResultsByYear } from '$lib/utils';
import * as XLSX from 'xlsx';
export let data;
@@ -363,35 +363,6 @@ $: {
-// Function to sum up quarterly results by year
-function sumQuarterlyResultsByYear(quarterlyResults) {
- const yearlySummaries = {};
-
- // Iterate over each quarterly result
- quarterlyResults?.forEach(quarter => {
- // Extract year from the date
- const year = new Date(quarter?.date)?.getFullYear();
-
- // If the year doesn't exist in the summary, initialize it
- if (!yearlySummaries[year]) {
- yearlySummaries[year] = {
- calendarYear: `${year}`, // Use end of the year date
- };
- }
-
- // Sum up the numeric fields for the year
- Object?.keys(quarter)?.forEach(key => {
- if (typeof quarter[key] === 'number') {
- yearlySummaries[year][key] = (yearlySummaries[year][key] || 0) + quarter[key];
- }
- });
- });
-
- // Convert yearly summaries object to an array
- const annualResults = Object?.values(yearlySummaries)?.sort((a, b) => b?.calendarYear?.localeCompare(a?.calendarYear));
-
- return annualResults;
-}
diff --git a/src/routes/stocks/[tickerID]/stats/income/+page.svelte b/src/routes/stocks/[tickerID]/stats/income/+page.svelte
index 582843aa..3833b362 100644
--- a/src/routes/stocks/[tickerID]/stats/income/+page.svelte
+++ b/src/routes/stocks/[tickerID]/stats/income/+page.svelte
@@ -1,7 +1,7 @@
diff --git a/src/routes/stocks/[tickerID]/stats/ratios/+page.svelte b/src/routes/stocks/[tickerID]/stats/ratios/+page.svelte
index 60aeab6e..cb0b2325 100644
--- a/src/routes/stocks/[tickerID]/stats/ratios/+page.svelte
+++ b/src/routes/stocks/[tickerID]/stats/ratios/+page.svelte
@@ -1,6 +1,7 @@