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 @@