Allow customising comparison period for income statement report

This commit is contained in:
RunasSudo 2025-02-22 23:38:19 +11:00
parent 805d6d7904
commit b03f97da53
Signed by: RunasSudo
GPG Key ID: 7234E476BF21C61A

View File

@ -64,8 +64,15 @@
<span>to</span> <span>to</span>
<input type="date" class="bordered-field" v-model.lazy="dt"> <input type="date" class="bordered-field" v-model.lazy="dt">
<span>Compare</span> <span>Compare</span>
<input type="number" class="bordered-field w-[4em]" v-model.lazy="compareMonths"> <div class="relative flex flex-grow items-stretch shadow-sm">
<span>months</span> <input type="number" class="bordered-field w-[9.5em] pr-[6em]" v-model.lazy="comparePeriods">
<div class="absolute inset-y-0 right-0 flex items-center z-10">
<select class="h-full border-0 bg-transparent py-0 pl-2 pr-8 text-gray-900 focus:ring-2 focus:ring-inset focus:ring-emerald-600" v-model="compareUnit">
<option value="years">years</option>
<option value="months">months</option>
</select>
</div>
</div>
</div> </div>
</div> </div>
</ComparativeDynamicReportComponent> </ComparativeDynamicReportComponent>
@ -86,7 +93,9 @@
const dt = ref(null as string | null); const dt = ref(null as string | null);
const dtStart = ref(null as string | null); const dtStart = ref(null as string | null);
const compareMonths = ref(1);
const comparePeriods = ref(1);
const compareUnit = ref('years');
async function load() { async function load() {
const session = await db.load(); const session = await db.load();
@ -98,7 +107,7 @@
// Update report when dates etc. changed // Update report when dates etc. changed
// We initialise the watcher here only after dt and dtStart are initialised above // We initialise the watcher here only after dt and dtStart are initialised above
watch([dt, dtStart, compareMonths], async () => { watch([dt, dtStart, comparePeriods, compareUnit], async () => {
const session = await db.load(); const session = await db.load();
await updateReport(session); await updateReport(session);
}); });
@ -107,9 +116,20 @@
async function updateReport(session: ExtendedDatabase) { async function updateReport(session: ExtendedDatabase) {
const newReportPromises = []; const newReportPromises = [];
const newReportLabels = []; const newReportLabels = [];
for (let i = 0; i < compareMonths.value; i++) { for (let i = 0; i < comparePeriods.value; i++) {
const thisReportDt = dayjs(dt.value!).subtract(i, 'month').format('YYYY-MM-DD'); let thisReportDt, thisReportDtStart, thisReportLabel;
const thisReportDtStart = dayjs(dtStart.value!).subtract(i, 'month').format('YYYY-MM-DD');
if (compareUnit.value === 'years') {
thisReportDt = dayjs(dt.value!).subtract(i, 'year').format('YYYY-MM-DD');
thisReportDtStart = dayjs(dtStart.value!).subtract(i, 'year').format('YYYY-MM-DD');
thisReportLabel = dayjs(dt.value!).subtract(i, 'year').format('YYYY');
} else if (compareUnit.value === 'months') {
thisReportDt = dayjs(dt.value!).subtract(i, 'month').format('YYYY-MM-DD');
thisReportDtStart = dayjs(dtStart.value!).subtract(i, 'month').format('YYYY-MM-DD');
thisReportLabel = dayjs(dt.value!).subtract(i, 'month').format('YYYY-MM');
} else {
throw new Error('Unexpected compareUnit');
}
// Generate reports asynchronously // Generate reports asynchronously
newReportPromises.push((async () => { newReportPromises.push((async () => {
@ -118,7 +138,12 @@
return reportingWorkflow.getReportAtStage(ReportingStage.InterimIncomeStatement, IncomeStatementReport) as IncomeStatementReport; return reportingWorkflow.getReportAtStage(ReportingStage.InterimIncomeStatement, IncomeStatementReport) as IncomeStatementReport;
})()); })());
newReportLabels.push('$'); if (comparePeriods.value === 1) {
// If only 1 report, the heading is simply "$"
newReportLabels.push(db.metadata.reporting_commodity);
} else {
newReportLabels.push(thisReportLabel);
}
} }
reports.value = await Promise.all(newReportPromises); reports.value = await Promise.all(newReportPromises);