diff --git a/backend/database/core.ts b/backend/database/core.ts index 8fb6f7fc..74c03d4b 100644 --- a/backend/database/core.ts +++ b/backend/database/core.ts @@ -422,12 +422,21 @@ export default class DatabaseCore extends DatabaseBase { this.#applyFiltersToBuilder(builder, filters); - if (options.orderBy) { - builder.orderBy(options.orderBy, options.order); + const { orderBy, groupBy, order } = options; + if (Array.isArray(orderBy)) { + builder.orderBy(orderBy.map((column) => ({ column, order }))); } - if (options.groupBy) { - builder.groupBy(options.groupBy); + if (typeof orderBy === 'string') { + builder.orderBy(orderBy, order); + } + + if (Array.isArray(groupBy)) { + builder.groupBy(...groupBy); + } + + if (typeof groupBy === 'string') { + builder.groupBy(groupBy); } if (options.offset) { diff --git a/backend/database/types.ts b/backend/database/types.ts index 7b0c3e15..8318271d 100644 --- a/backend/database/types.ts +++ b/backend/database/types.ts @@ -5,8 +5,8 @@ import { DatabaseManager } from './manager'; export interface GetQueryBuilderOptions { offset?: number; limit?: number; - groupBy?: string; - orderBy?: string; + groupBy?: string | string[]; + orderBy?: string | string[]; order?: 'desc' | 'asc'; } diff --git a/backend/patches/updateSchemas.ts b/backend/patches/updateSchemas.ts index 250e72b2..12b0e463 100644 --- a/backend/patches/updateSchemas.ts +++ b/backend/patches/updateSchemas.ts @@ -18,7 +18,7 @@ const childTableColumnMap = { const defaultNumberSeriesMap = { [ModelNameEnum.Payment]: 'PAY-', - [ModelNameEnum.JournalEntry]: 'JE-', + [ModelNameEnum.JournalEntry]: 'JV-', [ModelNameEnum.SalesInvoice]: 'SINV-', [ModelNameEnum.PurchaseInvoice]: 'PINV-', } as Record; diff --git a/models/baseModels/Invoice/Invoice.ts b/models/baseModels/Invoice/Invoice.ts index 252d1de5..c854b1bc 100644 --- a/models/baseModels/Invoice/Invoice.ts +++ b/models/baseModels/Invoice/Invoice.ts @@ -2,19 +2,16 @@ import { Fyo } from 'fyo'; import { DocValue, DocValueMap } from 'fyo/core/types'; import { Doc } from 'fyo/model/doc'; import { - Action, CurrenciesMap, DefaultMap, FiltersMap, FormulaMap, - HiddenMap, + HiddenMap } from 'fyo/model/types'; import { DEFAULT_CURRENCY } from 'fyo/utils/consts'; import { ValidationError } from 'fyo/utils/errors'; import { - getExchangeRate, - getInvoiceActions, - getNumberSeries, + getExchangeRate, getNumberSeries } from 'models/helpers'; import { InventorySettings } from 'models/inventory/InventorySettings'; import { StockTransfer } from 'models/inventory/StockTransfer'; diff --git a/reports/AccountReport.ts b/reports/AccountReport.ts index 66d886b9..1e293c39 100644 --- a/reports/AccountReport.ts +++ b/reports/AccountReport.ts @@ -230,7 +230,7 @@ export abstract class AccountReport extends LedgerReport { const toDate = dr.toDate.toMillis(); const fromDate = dr.fromDate.toMillis(); - if (fromDate < entryDate && entryDate <= toDate) { + if (entryDate >= fromDate && entryDate < toDate) { return dr; } } @@ -278,9 +278,9 @@ export abstract class AccountReport extends LedgerReport { let fromDate: string; if (this.basedOn === 'Until Date') { - toDate = this.toDate!; + toDate = DateTime.fromISO(this.toDate!).plus({ days: 1 }).toISODate(); const months = monthsMap[this.periodicity] * Math.max(this.count ?? 1, 1); - fromDate = DateTime.fromISO(toDate).minus({ months }).toISODate(); + fromDate = DateTime.fromISO(this.toDate!).minus({ months }).toISODate(); } else { const fy = await getFiscalEndpoints( this.toYear!, @@ -299,7 +299,7 @@ export abstract class AccountReport extends LedgerReport { const { fromDate, toDate } = await this._getFromAndToDates(); const dateFilter: string[] = []; - dateFilter.push('<=', toDate); + dateFilter.push('<', toDate); dateFilter.push('>=', fromDate); filters.date = dateFilter; @@ -342,17 +342,17 @@ export abstract class AccountReport extends LedgerReport { let dateFilters = [ { fieldtype: 'Int', - fieldname: 'toYear', - placeholder: t`To Year`, - label: t`To Year`, + fieldname: 'fromYear', + placeholder: t`From Year`, + label: t`From Year`, minvalue: 2000, required: true, }, { fieldtype: 'Int', - fieldname: 'fromYear', - placeholder: t`From Year`, - label: t`From Year`, + fieldname: 'toYear', + placeholder: t`To Year`, + label: t`To Year`, minvalue: 2000, required: true, }, @@ -407,16 +407,18 @@ export abstract class AccountReport extends LedgerReport { const dateColumns = this._dateRanges!.sort( (a, b) => b.toDate.toMillis() - a.toDate.toMillis() - ).map( - (d) => - ({ - label: this.fyo.format(d.toDate.toJSDate(), 'Date'), - fieldtype: 'Data', - fieldname: 'toDate', - align: 'right', - width: ACC_BAL_WIDTH, - } as ColumnField) - ); + ).map((d) => { + const toDate = d.toDate.minus({ days: 1 }); + const label = this.fyo.format(toDate.toJSDate(), 'Date'); + + return { + label, + fieldtype: 'Data', + fieldname: 'toDate', + align: 'right', + width: ACC_BAL_WIDTH, + } as ColumnField; + }); return [columns, dateColumns].flat(); } diff --git a/reports/GeneralLedger/GeneralLedger.ts b/reports/GeneralLedger/GeneralLedger.ts index a2f356e2..6c3c8c7c 100644 --- a/reports/GeneralLedger/GeneralLedger.ts +++ b/reports/GeneralLedger/GeneralLedger.ts @@ -299,7 +299,7 @@ export class GeneralLedger extends LedgerReport { }, { fieldtype: 'DynamicLink', - label: t`Ref Name`, + label: t`Ref. Name`, references: 'referenceType', placeholder: t`Ref Name`, emptyMessage: t`Change Ref Type`, diff --git a/reports/LedgerReport.ts b/reports/LedgerReport.ts index ac06dd27..8a7d6231 100644 --- a/reports/LedgerReport.ts +++ b/reports/LedgerReport.ts @@ -95,7 +95,7 @@ export abstract class LedgerReport extends Report { { fields, filters, - orderBy: 'date', + orderBy: ['date', 'created'], order: this.ascending ? 'asc' : 'desc', } )) as RawLedgerEntry[]; diff --git a/reports/inventory/helpers.ts b/reports/inventory/helpers.ts index 41dcdd44..2cd093fb 100644 --- a/reports/inventory/helpers.ts +++ b/reports/inventory/helpers.ts @@ -26,7 +26,7 @@ export async function getRawStockLedgerEntries(fyo: Fyo) { return (await fyo.db.getAllRaw(ModelNameEnum.StockLedgerEntry, { fields: fieldnames, - orderBy: 'date', + orderBy: ['date', 'created', 'name'], order: 'asc', })) as RawStockLedgerEntry[]; } diff --git a/src/components/Controls/Check.vue b/src/components/Controls/Check.vue index c40f13c9..6d5603eb 100644 --- a/src/components/Controls/Check.vue +++ b/src/components/Controls/Check.vue @@ -103,7 +103,7 @@ export default { return this.labelClass; } - return 'text-gray-600 text-sm'; + return 'text-gray-600 text-base'; }, checked() { return this.value; diff --git a/src/components/Modal.vue b/src/components/Modal.vue index 26692cbe..4a30a04a 100644 --- a/src/components/Modal.vue +++ b/src/components/Modal.vue @@ -1,28 +1,38 @@ + diff --git a/src/components/PageHeader.vue b/src/components/PageHeader.vue index 130ffa11..36c14574 100644 --- a/src/components/PageHeader.vue +++ b/src/components/PageHeader.vue @@ -6,6 +6,13 @@ platform !== 'Windows' ? 'window-drag' : '', ]" > + +
+

{{ title }}

@@ -18,10 +25,12 @@
+ diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index a223465a..2ef26155 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -1,6 +1,6 @@ diff --git a/src/pages/Dashboard/Cashflow.vue b/src/pages/Dashboard/Cashflow.vue index 1632d12c..f62f16c6 100644 --- a/src/pages/Dashboard/Cashflow.vue +++ b/src/pages/Dashboard/Cashflow.vue @@ -20,7 +20,7 @@
@@ -51,23 +51,22 @@ import { formatXLabels, getYMax } from 'src/utils/chart'; import { uicolors } from 'src/utils/colors'; import { getDatesAndPeriodList } from 'src/utils/misc'; import { getMapFromList } from 'utils/'; -import PeriodSelector from './PeriodSelector'; +import DashboardChartBase from './BaseDashboardChart.vue'; +import PeriodSelector from './PeriodSelector.vue'; export default { name: 'Cashflow', + extends: DashboardChartBase, components: { PeriodSelector, LineChart, }, data: () => ({ - period: 'This Year', data: [], periodList: [], + periodOptions: ['This Year', 'This Quarter'], hasData: false, }), - watch: { - period: 'setData', - }, async activated() { await this.setData(); if (!this.hasData) { diff --git a/src/pages/Dashboard/Dashboard.vue b/src/pages/Dashboard/Dashboard.vue index 44bae392..0ea5b376 100644 --- a/src/pages/Dashboard/Dashboard.vue +++ b/src/pages/Dashboard/Dashboard.vue @@ -1,19 +1,61 @@ diff --git a/src/pages/Dashboard/Expenses.vue b/src/pages/Dashboard/Expenses.vue index 4f750536..7a4bdb1d 100644 --- a/src/pages/Dashboard/Expenses.vue +++ b/src/pages/Dashboard/Expenses.vue @@ -58,26 +58,22 @@ import { fyo } from 'src/initFyo'; import { uicolors } from 'src/utils/colors'; import { getDatesAndPeriodList } from 'src/utils/misc'; import DonutChart from '../../components/Charts/DonutChart.vue'; -import PeriodSelector from './PeriodSelector'; -import SectionHeader from './SectionHeader'; +import DashboardChartBase from './BaseDashboardChart.vue'; +import PeriodSelector from './PeriodSelector.vue'; +import SectionHeader from './SectionHeader.vue'; export default { name: 'Expenses', + extends: DashboardChartBase, components: { DonutChart, PeriodSelector, SectionHeader, }, data: () => ({ - period: 'This Year', active: null, expenses: [], }), - watch: { - period() { - this.setData(); - }, - }, activated() { this.setData(); }, diff --git a/src/pages/Dashboard/PeriodSelector.vue b/src/pages/Dashboard/PeriodSelector.vue index 3fbcd931..774f1035 100644 --- a/src/pages/Dashboard/PeriodSelector.vue +++ b/src/pages/Dashboard/PeriodSelector.vue @@ -13,7 +13,6 @@ text-sm flex focus:outline-none - text-gray-900 hover:text-gray-800 focus:text-gray-800 items-center @@ -22,6 +21,7 @@ leading-relaxed cursor-pointer " + :class="!value ? 'text-gray-600' : 'text-gray-900'" @click="toggleDropdown()" tabindex="0" @keydown.down="highlightItemDown" @@ -37,7 +37,7 @@ diff --git a/src/pages/Desk.vue b/src/pages/Desk.vue index e232f7fe..fa4dbe41 100644 --- a/src/pages/Desk.vue +++ b/src/pages/Desk.vue @@ -1,9 +1,14 @@ + + diff --git a/src/pages/InvoiceForm.vue b/src/pages/InvoiceForm.vue index 0df1f141..6f6c0d69 100644 --- a/src/pages/InvoiceForm.vue +++ b/src/pages/InvoiceForm.vue @@ -265,27 +265,31 @@
- diff --git a/src/pages/ListView/List.vue b/src/pages/ListView/List.vue index 9c4437bc..2635379b 100644 --- a/src/pages/ListView/List.vue +++ b/src/pages/ListView/List.vue @@ -198,9 +198,10 @@ export default defineComponent({ filters = objectForEach(clone(filters), toRaw); - const orderBy = !!fyo.getField(this.schemaName, 'date') - ? 'date' - : 'created'; + const orderBy = ['created']; + if (fyo.db.fieldMap[this.schemaName]['date']) { + orderBy.unshift('date'); + } this.data = ( await fyo.db.getAll(this.schemaName, { diff --git a/src/pages/PrintView/PrintView.vue b/src/pages/PrintView/PrintView.vue index 778efd42..a3b6b291 100644 --- a/src/pages/PrintView/PrintView.vue +++ b/src/pages/PrintView/PrintView.vue @@ -37,21 +37,23 @@ -
-
-

{{ t`Customise` }}

- + +
+
+

{{ t`Customise` }}

+ +
+
- -
+