update plot

This commit is contained in:
MuslemRahimi 2025-04-03 12:20:47 +02:00
parent d6db0850f2
commit e3cb01ac04
2 changed files with 51 additions and 68 deletions

View File

@ -9,6 +9,13 @@
let config = null; let config = null;
let modalLabel;
let highestValue;
let highestValueDate;
let lowestValueDate;
let lowestValue;
let fiveYearsGrowth;
const marginKeys = new Set([ const marginKeys = new Set([
/* /*
"pretaxProfitMargin", "pretaxProfitMargin",
@ -48,11 +55,28 @@
const valueList = rawData?.map((item) => item[key]); const valueList = rawData?.map((item) => item[key]);
// Calculate highest and lowest value
highestValue = Math.max(...valueList);
lowestValue = Math.min(...valueList);
let highestValueIndex = valueList.indexOf(highestValue);
let lowestValueIndex = valueList.indexOf(lowestValue);
highestValueDate = dateList[highestValueIndex] || null;
lowestValueDate = dateList[lowestValueIndex] || null;
// Calculate last 5 years growth
fiveYearsGrowth = null;
if (valueList?.length >= 5) {
let firstValue = valueList[valueList.length - 5];
let lastValue = valueList[valueList.length - 1];
fiveYearsGrowth = ((lastValue - firstValue) / Math.abs(firstValue)) * 100;
}
const options = { const options = {
chart: { chart: {
type: "column", type: "column",
backgroundColor: $mode === "light" ? "#fff" : "#09090B", backgroundColor: $mode === "light" ? "#fff" : "#2A2E39",
plotBackgroundColor: $mode === "light" ? "#fff" : "#09090B", plotBackgroundColor: $mode === "light" ? "#fff" : "#2A2E39",
height: 360, height: 360,
animation: false, animation: false,
}, },
@ -98,7 +122,7 @@
}, },
yAxis: { yAxis: {
gridLineWidth: 1, gridLineWidth: 1,
gridLineColor: $mode === "light" ? "#e5e7eb" : "#111827", gridLineColor: $mode === "light" ? "#e5e7eb" : "#404657",
labels: { labels: {
style: { color: $mode === "light" ? "black" : "white" }, style: { color: $mode === "light" ? "black" : "white" },
formatter: function () { formatter: function () {
@ -125,7 +149,7 @@
this.points.forEach((point) => { this.points.forEach((point) => {
tooltipContent += `<span class="text-white font-semibold text-sm">${point.series.name}:</span> tooltipContent += `<span class="text-white font-semibold text-sm">${point.series.name}:</span>
<span class="text-white font-normal text-sm">${abbreviateNumber( <span class="text-white font-normal text-sm">${abbreviateNumber(
point.y, point.y?.toFixed(2),
)}</span><br>`; )}</span><br>`;
}); });
return tooltipContent; return tooltipContent;
@ -146,6 +170,7 @@
} }
async function handleChart(label, key) { async function handleChart(label, key) {
modalLabel = label;
config = plotData(label, key); config = plotData(label, key);
} }
</script> </script>
@ -157,7 +182,7 @@
<td <td
class="text-start min-w-[220px] sm:min-w-[320px] border-r border-gray-300 dark:border-gray-700 text-sm sm:text-[1rem] w-full flex flex-row items-center justify-between" class="text-start min-w-[220px] sm:min-w-[320px] border-r border-gray-300 dark:border-gray-700 text-sm sm:text-[1rem] w-full flex flex-row items-center justify-between"
> >
<span class="truncate w-fit max-w-40 sm:max-w-fit">{label}</span> <span class="truncate w-fit max-w-40 sm:max-w-64">{label}</span>
<label <label
for="financialPlotModal" for="financialPlotModal"
on:click={() => handleChart(label, key)} on:click={() => handleChart(label, key)}
@ -200,24 +225,27 @@
<label for="financialPlotModal" class="cursor-pointer modal-backdrop"></label> <label for="financialPlotModal" class="cursor-pointer modal-backdrop"></label>
<div <div
class="modal-box bg-white relative dark:bg-default w-full max-w-3xl rounded-md border-t sm:border border-gray-300 dark:border-gray-700 min-h-48 h-auto" class="modal-box w-full p-6 rounded shadow-lg border
bg-white dark:bg-secondary border border-gray-600 dark:border-gray-800"
> >
<label
for="financialPlotModal"
class="cursor-pointer text-[1.8rem] focus:outline-hidden absolute top-2 right-3"
>
<svg
class="w-8 h-8 text-muted dark:text-white"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
fill="currentColor"
d="m6.4 18.308l-.708-.708l5.6-5.6l-5.6-5.6l.708-.708l5.6 5.6l5.6-5.6l.708.708l-5.6 5.6l5.6 5.6l-.708.708l-5.6-5.6z"
/>
</svg>
</label>
{#if config} {#if config}
<div class="mt-2" use:highcharts={config}></div> <div class="mt-2" use:highcharts={config}></div>
{/if} {/if}
<p class="text-sm mb-6">
Revenue peaked at {abbreviateNumber(highestValue?.toFixed(2))} in {highestValueDate}
and hit its lowest at {abbreviateNumber(lowestValue?.toFixed(2))} in {lowestValueDate}.
Over the past five years, it has {fiveYearsGrowth >= 0
? "grown"
: "declined"} by {fiveYearsGrowth?.toFixed(2)}%.
</p>
<div class="border-t border-gray-300 dark:border-gray-600 mt-2 w-full">
<label
for="financialPlotModal"
class="mt-4 font-semibold text-xl m-auto flex justify-center cursor-pointer"
>
Close
</label>
</div>
</div> </div>
</dialog> </dialog>

View File

@ -22,7 +22,6 @@
let financialData = []; let financialData = [];
let fullStatement = []; let fullStatement = [];
let filterRule = "annual"; let filterRule = "annual";
let displayStatement = "revenue";
let activeIdx = 0; let activeIdx = 0;
@ -38,135 +37,92 @@
const statementConfig = [ const statementConfig = [
{ {
propertyName: "revenue", propertyName: "revenue",
growthPropertyName: "growthRevenue",
label: "Revenue", label: "Revenue",
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
}, },
{ {
propertyName: "costOfRevenue", propertyName: "costOfRevenue",
growthPropertyName: "growthCostOfRevenue",
label: "Cost of Revenue", label: "Cost of Revenue",
text: "Cost of revenue is also called cost of goods sold (COGS). It is the variable cost related to the company's production of products and services.",
}, },
{ {
propertyName: "grossProfit", propertyName: "grossProfit",
growthPropertyName: "growthGrossProfit",
label: "Gross Profit", label: "Gross Profit",
text: "Gross profit is a companys profit after subtracting the costs directly linked to making and delivering its products and services.",
}, },
{ {
propertyName: "operatingIncome", propertyName: "operatingIncome",
growthPropertyName: "growthOperatingIncome",
label: "Operating Income", label: "Operating Income",
text: "Gross profit is a companys profit after subtracting the costs directly linked to making and delivering its products and services.",
}, },
{ {
propertyName: "interestIncome", propertyName: "interestIncome",
growthPropertyName: "growthInterestIncome",
label: "Interest Income", label: "Interest Income",
text: "Gross profit is a companys profit after subtracting the costs directly linked to making and delivering its products and services.",
}, },
{ {
propertyName: "incomeBeforeTax", propertyName: "incomeBeforeTax",
growthPropertyName: "growthIncomeBeforeTax",
label: "Pretax Income", label: "Pretax Income",
text: "Pretax income is a company's profits before accounting for income taxes.",
}, },
{ {
propertyName: "netIncome", propertyName: "netIncome",
growthPropertyName: "growthNetIncome",
label: "Net Income", label: "Net Income",
text: `Net income is a company's accounting profits after subtracting all costs and expenses from the revenue. It is also called earnings, profits or "the bottom line."`,
}, },
{ {
propertyName: "sellingGeneralAndAdministrativeExpenses", propertyName: "sellingGeneralAndAdministrativeExpenses",
growthPropertyName: "growthSellingGeneralAndAdministrativeExpenses",
label: "Selling & General & Admin", label: "Selling & General & Admin",
text: "Selling, general and administrative (SG&A) is an operating expense. It involves various company expenses that are not related to production.",
}, },
{ {
propertyName: "researchAndDevelopmentExpenses", propertyName: "researchAndDevelopmentExpenses",
growthPropertyName: "growthResearchAndDevelopmentExpenses",
label: "Research & Development", label: "Research & Development",
text: "Research and development (R&D) is an operating expense. It is the amount of money a company spends on researching and developing new products and services, or improving existing ones.",
}, },
{ {
propertyName: "otherExpenses", propertyName: "otherExpenses",
growthPropertyName: "growthOtherExpenses",
label: "Other Expenses", label: "Other Expenses",
text: "Other expenses typically refer to costs that are not directly related to the primary operations of the business. These can include a wide variety of things, such as interest expense, taxes, depreciation and amortization, losses from investments, legal fees and restructuring costs.",
}, },
{ {
propertyName: "operatingExpenses", propertyName: "operatingExpenses",
growthPropertyName: "growthOperatingExpenses",
label: "Operating Expenses", label: "Operating Expenses",
text: "Operating expenses are a company's fixed costs that a company incurs during its ongoing business operations. It can include SG&A, R&D and other expenses.",
}, },
{ {
propertyName: "interestExpense", propertyName: "interestExpense",
growthPropertyName: "growthInterestExpense",
label: "Interest Expense", label: "Interest Expense",
text: "Interest expense is the amount that the company paid or received in interest. A positive number indicates a net expense, while a negative number implies that the company had more interest income from its cash reserves than it paid for interest on debt.",
}, },
{ {
propertyName: "sellingAndMarketingExpenses", propertyName: "sellingAndMarketingExpenses",
growthPropertyName: "growthSellingAndMarketingExpenses",
label: "Selling & Marketing Expenses", label: "Selling & Marketing Expenses",
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
}, },
{ {
propertyName: "costAndExpenses", propertyName: "costAndExpenses",
growthPropertyName: "growthCostAndExpensess",
label: "Cost & Expenses", label: "Cost & Expenses",
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
}, },
{ {
propertyName: "incomeTaxExpense", propertyName: "incomeTaxExpense",
growthPropertyName: "growthIncomeTaxExpense",
label: "Income Tax", label: "Income Tax",
text: "Income tax is the amount of corporate income tax that the company has incurred during the fiscal period.",
}, },
{ {
propertyName: "weightedAverageShsOut", propertyName: "weightedAverageShsOut",
growthPropertyName: "growthWeightedAverageShsOut",
label: "Shares Outstanding (Basic)", label: "Shares Outstanding (Basic)",
text: "Basic shares outstanding is the total amount of common stock held by all of a company's shareholders.",
}, },
{ {
propertyName: "weightedAverageShsOutDil", propertyName: "weightedAverageShsOutDil",
growthPropertyName: "growthWeightedAverageShsOutDil",
label: "Shares Outstanding (Diluted)", label: "Shares Outstanding (Diluted)",
text: "Diluted shares outstanding is the total amount of common stock that will be outstanding if all stock options, warrants and convertible securities are exercised.",
}, },
{ {
propertyName: "eps", propertyName: "eps",
growthPropertyName: "growthEPS", growthPropertyName: "growthEPS",
label: "EPS (Basic)", label: "EPS (Basic)",
text: "Earnings per share is the portion of a company's profit that is allocated to each individual stock. EPS is calculated by dividing net income by shares outstanding.",
}, },
{ {
propertyName: "epsDiluted", propertyName: "epsDiluted",
growthPropertyName: "growthEPSDiluted",
label: "EPS (Diluted)", label: "EPS (Diluted)",
text: `Earnings per share is the portion of a company's profit that is allocated to each individual stock. Diluted EPS is calculated by dividing net income by "diluted" shares outstanding.`,
}, },
{ {
propertyName: "ebitda", propertyName: "ebitda",
growthPropertyName: "growthEBITDA",
label: "EBITDA", label: "EBITDA",
text: `EBITDA stands for "Earnings Before Interest, Taxes, Depreciation and Amortization." It is a commonly used measure of profitability.`,
}, },
{ {
propertyName: "ebit", propertyName: "ebit",
growthPropertyName: "growthEBIT",
label: "EBIT", label: "EBIT",
text: ``,
}, },
{ {
propertyName: "depreciationAndAmortization", propertyName: "depreciationAndAmortization",
growthPropertyName: "growthDepreciationAndAmortization",
label: "Depreciation & Amortization", label: "Depreciation & Amortization",
text: "Depreciation and amortization are accounting methods for calculating how the value of a business's assets change over time. Depreciation refers to physical assets, while amortization refers to intangible assets.",
}, },
]; ];
@ -198,7 +154,6 @@
}; };
fullStatement = data?.getData; fullStatement = data?.getData;
displayStatement = "revenue";
const exportFundamentalData = (format = "csv") => { const exportFundamentalData = (format = "csv") => {
if (["Pro", "Plus"]?.includes(data?.user?.tier)) { if (["Pro", "Plus"]?.includes(data?.user?.tier)) {
@ -326,7 +281,7 @@
<SEO <SEO
title={`${$displayCompanyName} (${$stockTicker}) Financials - Income Statement`} title={`${$displayCompanyName} (${$stockTicker}) Financials - Income Statement`}
description={`Detailed annual and timeFramely income statement for ${$displayCompanyName} (${$stockTicker}). See many years of revenue, expenses and profits or losses.`} description={`Detailed annual and quarter income statement for ${$displayCompanyName} (${$stockTicker}). See many years of revenue, expenses and profits or losses.`}
/> />
<section class=" w-full overflow-hidden h-full"> <section class=" w-full overflow-hidden h-full">
@ -506,10 +461,10 @@
</div> </div>
{:else} {:else}
<div <div
class="flex flex-col sm:flex-row items-start sm:items-center sm:justify-between" class="flex flex-col sm:flex-row items-start sm:items-end sm:justify-between"
> >
<span <span
class="text-sm order-1 sm:order-0 mt-5 sm:mt-0 text-gray-600 dark:text-gray-400 w-full" class="text-xs sm:text-sm order-1 sm:order-0 mt-5 sm:mt-0 text-gray-600 dark:text-gray-400 w-full"
> >
Financials in {data?.getProfileData?.currency}. Fiscal year Financials in {data?.getProfileData?.currency}. Fiscal year
is is