@harbortouch/skytab-analytics-report-utils 0.19.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,56 @@
1
+ import { R as ReportType, A as AnalyticsField } from '../report-BOL9p86o.cjs';
2
+ import { E as ExportTable, a as ExportFilter } from '../types-BzLsgnfc.cjs';
3
+
4
+ interface ReportDocumentSection {
5
+ sheetName: string;
6
+ table?: ExportTable;
7
+ filters?: ExportFilter[];
8
+ }
9
+ interface ReportLocation {
10
+ id: number;
11
+ name: string;
12
+ timezone: string;
13
+ language: string;
14
+ currency: string;
15
+ countryCode: string;
16
+ merchantId: string;
17
+ }
18
+ interface ReportParameters {
19
+ compareToLastWeek?: boolean;
20
+ compareToLastYear?: boolean;
21
+ cols?: string[];
22
+ secondGroupBy?: AnalyticsField;
23
+ startDate: string | Date;
24
+ endDate: string | Date;
25
+ groupBy?: AnalyticsField;
26
+ order?: string;
27
+ }
28
+ type ReportData = SingleReportData | Record<string, SingleReportData>;
29
+ type SingleReportData = Record<string, unknown>[];
30
+ declare class ExportBuilder {
31
+ private readonly reportType;
32
+ private readonly locations;
33
+ private readonly locale;
34
+ constructor(reportType: ReportType, locations: ReportLocation[], locale: string);
35
+ private getFormattingConfig;
36
+ private getConfig;
37
+ private getConfigSectionName;
38
+ private translate;
39
+ private buildColumnPrefix;
40
+ private sortAndPrependPrefix;
41
+ private resolveColumns;
42
+ private getColumnHeader;
43
+ private resolveColumnsAndHeaders;
44
+ private formatField;
45
+ private formatRow;
46
+ private resolveLabelField;
47
+ private buildTotalsRow;
48
+ private getExtraFooterRows;
49
+ private renderTableContent;
50
+ private getDataForConfig;
51
+ private formatMaybeDate;
52
+ private buildMetadata;
53
+ getContent(reportData: ReportData, parameters: ReportParameters, name: string): ReportDocumentSection[];
54
+ }
55
+
56
+ export { ExportBuilder, type ReportData, type ReportDocumentSection, type ReportLocation, type ReportParameters, type SingleReportData };
@@ -0,0 +1,56 @@
1
+ import { R as ReportType, A as AnalyticsField } from '../report-BOL9p86o.js';
2
+ import { E as ExportTable, a as ExportFilter } from '../types-BzLsgnfc.js';
3
+
4
+ interface ReportDocumentSection {
5
+ sheetName: string;
6
+ table?: ExportTable;
7
+ filters?: ExportFilter[];
8
+ }
9
+ interface ReportLocation {
10
+ id: number;
11
+ name: string;
12
+ timezone: string;
13
+ language: string;
14
+ currency: string;
15
+ countryCode: string;
16
+ merchantId: string;
17
+ }
18
+ interface ReportParameters {
19
+ compareToLastWeek?: boolean;
20
+ compareToLastYear?: boolean;
21
+ cols?: string[];
22
+ secondGroupBy?: AnalyticsField;
23
+ startDate: string | Date;
24
+ endDate: string | Date;
25
+ groupBy?: AnalyticsField;
26
+ order?: string;
27
+ }
28
+ type ReportData = SingleReportData | Record<string, SingleReportData>;
29
+ type SingleReportData = Record<string, unknown>[];
30
+ declare class ExportBuilder {
31
+ private readonly reportType;
32
+ private readonly locations;
33
+ private readonly locale;
34
+ constructor(reportType: ReportType, locations: ReportLocation[], locale: string);
35
+ private getFormattingConfig;
36
+ private getConfig;
37
+ private getConfigSectionName;
38
+ private translate;
39
+ private buildColumnPrefix;
40
+ private sortAndPrependPrefix;
41
+ private resolveColumns;
42
+ private getColumnHeader;
43
+ private resolveColumnsAndHeaders;
44
+ private formatField;
45
+ private formatRow;
46
+ private resolveLabelField;
47
+ private buildTotalsRow;
48
+ private getExtraFooterRows;
49
+ private renderTableContent;
50
+ private getDataForConfig;
51
+ private formatMaybeDate;
52
+ private buildMetadata;
53
+ getContent(reportData: ReportData, parameters: ReportParameters, name: string): ReportDocumentSection[];
54
+ }
55
+
56
+ export { ExportBuilder, type ReportData, type ReportDocumentSection, type ReportLocation, type ReportParameters, type SingleReportData };
@@ -0,0 +1,246 @@
1
+ import {
2
+ calculateReportTotals,
3
+ en_US_default,
4
+ formatFieldValue,
5
+ getColumnExportHeaderLabel,
6
+ getColumnMetadata,
7
+ getReportConfig,
8
+ getReportFormattingLocaleOptions,
9
+ resolveTranslate
10
+ } from "../chunk-7NXZJEGU.js";
11
+
12
+ // src/exporters/exportBuilder.ts
13
+ import { format, isValid, parseISO } from "date-fns";
14
+ var ExportBuilder = class {
15
+ constructor(reportType, locations, locale) {
16
+ this.reportType = reportType;
17
+ this.locations = locations;
18
+ this.locale = locale;
19
+ }
20
+ getFormattingConfig() {
21
+ const configs = getReportFormattingLocaleOptions(this.locations);
22
+ return configs[0];
23
+ }
24
+ getConfig() {
25
+ return getReportConfig(this.reportType);
26
+ }
27
+ getConfigSectionName(config) {
28
+ return config.sectionName ? this.translate(config.sectionName) : "Unknown section";
29
+ }
30
+ translate(messageKey) {
31
+ return resolveTranslate(messageKey, this.locale);
32
+ }
33
+ buildColumnPrefix(config, parameters) {
34
+ const prefix = [];
35
+ if ("groupByName" in config.fields) {
36
+ prefix.push("groupByName");
37
+ }
38
+ if (parameters.secondGroupBy && "groupByName2" in config.fields) {
39
+ prefix.push("groupByName2");
40
+ }
41
+ return prefix;
42
+ }
43
+ sortAndPrependPrefix(config, parameters, collected) {
44
+ const orderMap = new Map(config.availableColumns.map((col, i) => [col, i]));
45
+ const sorted = [...collected].sort((a, b) => (orderMap.get(a) ?? Infinity) - (orderMap.get(b) ?? Infinity));
46
+ return [...this.buildColumnPrefix(config, parameters), ...sorted];
47
+ }
48
+ resolveColumns(config, parameters) {
49
+ const selectedGroupIds = Array.isArray(parameters.cols) ? parameters.cols : null;
50
+ const compareToLastWeek = parameters.compareToLastWeek === true;
51
+ const compareToLastYear = parameters.compareToLastYear === true;
52
+ if (selectedGroupIds !== null && selectedGroupIds.length === 0) {
53
+ return this.buildColumnPrefix(config, parameters);
54
+ }
55
+ if (selectedGroupIds?.length && config.columnGroups?.length) {
56
+ const collected = [];
57
+ for (const groupId of selectedGroupIds) {
58
+ const group = config.columnGroups.find((g) => g.id === groupId);
59
+ if (!group) {
60
+ continue;
61
+ }
62
+ collected.push(...group.baseFields);
63
+ if (compareToLastWeek && group.lastWeekFields) {
64
+ collected.push(...group.lastWeekFields);
65
+ }
66
+ if (compareToLastYear && group.lastYearFields) {
67
+ collected.push(...group.lastYearFields);
68
+ }
69
+ }
70
+ return this.sortAndPrependPrefix(config, parameters, collected);
71
+ }
72
+ if (!selectedGroupIds && config.columnGroups?.length && (compareToLastWeek || compareToLastYear)) {
73
+ const collected = [];
74
+ for (const col of config.defaultVisibleColumns) {
75
+ collected.push(col);
76
+ const group = config.columnGroups.find((g) => g.baseFields.includes(col));
77
+ if (group) {
78
+ if (compareToLastWeek && group.lastWeekFields) {
79
+ collected.push(...group.lastWeekFields);
80
+ }
81
+ if (compareToLastYear && group.lastYearFields) {
82
+ collected.push(...group.lastYearFields);
83
+ }
84
+ }
85
+ }
86
+ return this.sortAndPrependPrefix(config, parameters, collected);
87
+ }
88
+ const metricCols = selectedGroupIds?.length ? config.availableColumns.filter((c) => selectedGroupIds.includes(c)) : config.defaultVisibleColumns;
89
+ return [...this.buildColumnPrefix(config, parameters), ...metricCols];
90
+ }
91
+ getColumnHeader(fieldName, config) {
92
+ const columnKey = config.fields[fieldName]?.columnKey;
93
+ const titleKey = columnKey ? getColumnMetadata(columnKey)?.shortTitleKey : void 0;
94
+ const colHeader = titleKey ? this.translate(titleKey) : fieldName.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).trim();
95
+ const group = config.columnGroups?.find(
96
+ (g) => g.baseFields.includes(fieldName) || (g.lastWeekFields?.includes(fieldName) ?? false) || (g.lastYearFields?.includes(fieldName) ?? false)
97
+ );
98
+ return group ? getColumnExportHeaderLabel(colHeader, this.translate(group.headerTranslationKey)) : colHeader;
99
+ }
100
+ resolveColumnsAndHeaders(parameters, config) {
101
+ const columns = this.resolveColumns(config, parameters);
102
+ const headers = columns.map((col) => {
103
+ if (col === "groupByName2" && parameters.secondGroupBy) {
104
+ return this.translate(`analytics.field.${parameters.secondGroupBy}`);
105
+ }
106
+ return this.getColumnHeader(col, config);
107
+ });
108
+ const columnTypes = columns.map((col) => config.fields[col]);
109
+ return { columns, headers, columnTypes };
110
+ }
111
+ formatField(value, config, localeOption, fullRecord) {
112
+ if (!config || value === void 0 || value === null) {
113
+ return "";
114
+ }
115
+ const formatted = formatFieldValue(value, config.type, localeOption, fullRecord, config);
116
+ return typeof formatted === "string" && formatted in en_US_default ? this.translate(formatted) : formatted;
117
+ }
118
+ formatRow(raw, columns, columnTypes, localeConfig, fullRecord) {
119
+ const formatted = {};
120
+ columns.forEach((col, i) => {
121
+ formatted[col] = this.formatField(raw[col], columnTypes[i], localeConfig, fullRecord);
122
+ });
123
+ return formatted;
124
+ }
125
+ resolveLabelField(config, columns) {
126
+ if ("groupByName" in config.fields) {
127
+ return "groupByName";
128
+ }
129
+ const firstStringCol = columns.find((col) => {
130
+ const field = config.fields[col];
131
+ return field?.type === "string" && !field.footerCalculation;
132
+ });
133
+ return firstStringCol ?? columns[0] ?? "groupByName";
134
+ }
135
+ buildTotalsRow(data, config, columns) {
136
+ if (data.length === 0) {
137
+ return null;
138
+ }
139
+ const labelField = this.resolveLabelField(config, columns);
140
+ const label = config.totalsLabel ? this.translate(config.totalsLabel) : this.translate("table.total");
141
+ return calculateReportTotals(data, config.fields, { labelField, label });
142
+ }
143
+ getExtraFooterRows(data, config, sectionData, columns) {
144
+ if (config.extraFooterRowsKey) {
145
+ if (!Array.isArray(data)) {
146
+ const rows = data[config.extraFooterRowsKey];
147
+ if (Array.isArray(rows)) {
148
+ return rows;
149
+ }
150
+ }
151
+ }
152
+ if (config.extraFooterFields?.length && sectionData.length > 0) {
153
+ const labelField = this.resolveLabelField(config, columns);
154
+ const totals = calculateReportTotals(sectionData, config.fields, {
155
+ labelField,
156
+ label: this.translate("table.total")
157
+ });
158
+ const row = { [labelField]: totals[labelField] };
159
+ for (const field of config.extraFooterFields) {
160
+ row[field] = totals[field];
161
+ }
162
+ return [row];
163
+ }
164
+ return [];
165
+ }
166
+ renderTableContent(config, reportData, parameters) {
167
+ const localeConfig = this.getFormattingConfig();
168
+ const data = this.getDataForConfig(reportData, config);
169
+ const { columns, headers, columnTypes } = this.resolveColumnsAndHeaders(parameters, config);
170
+ const tableColumns = columns.map((col, i) => ({ header: headers[i], key: col }));
171
+ const rows = data.filter((row) => typeof row === "object" && row !== null).map((row) => this.formatRow(row, columns, columnTypes, localeConfig, row));
172
+ if (config.hasFooter) {
173
+ const totalsRow = this.buildTotalsRow(data, config, columns);
174
+ if (totalsRow) {
175
+ rows.push(this.formatRow(totalsRow, columns, columnTypes, localeConfig, null));
176
+ }
177
+ }
178
+ for (const extraRow of this.getExtraFooterRows(reportData, config, data, columns)) {
179
+ rows.push(this.formatRow(extraRow, columns, columnTypes, localeConfig, extraRow));
180
+ }
181
+ return { table: { columns: tableColumns, rows } };
182
+ }
183
+ getDataForConfig(data, config) {
184
+ if (Array.isArray(data)) {
185
+ return data;
186
+ }
187
+ return config.dataAccessKey ? data[config.dataAccessKey] ?? [] : [];
188
+ }
189
+ formatMaybeDate(value) {
190
+ const date = typeof value === "string" ? parseISO(value) : value;
191
+ if (!isValid(date)) {
192
+ return "";
193
+ }
194
+ return format(date, "yyyy-MM-dd");
195
+ }
196
+ buildMetadata(parameters) {
197
+ const rows = [];
198
+ rows.push([
199
+ this.translate("scheduled-reports.period"),
200
+ `${this.formatMaybeDate(parameters.startDate)} - ${this.formatMaybeDate(parameters.endDate)}`
201
+ ]);
202
+ if (parameters.groupBy) {
203
+ rows.push([
204
+ this.translate("components.form.field.group-by"),
205
+ this.translate(`analytics.field.${parameters.groupBy}`)
206
+ ]);
207
+ }
208
+ const locationNames = this.locations.map((l) => l.name);
209
+ if (locationNames.length > 0) {
210
+ rows.push([this.translate("common.labels.locations"), locationNames.join(", ")]);
211
+ }
212
+ if (parameters.compareToLastWeek === true) {
213
+ rows.push([this.translate("components.form.field.last-week"), this.translate("common.labels.yes")]);
214
+ }
215
+ if (parameters.compareToLastYear === true) {
216
+ rows.push([this.translate("components.form.field.last-year"), this.translate("common.labels.yes")]);
217
+ }
218
+ return rows;
219
+ }
220
+ getContent(reportData, parameters, name) {
221
+ const rawConfig = this.getConfig();
222
+ if (!rawConfig) {
223
+ throw new Error("Missing report config");
224
+ }
225
+ let sections;
226
+ if (Array.isArray(rawConfig)) {
227
+ sections = rawConfig.map((config) => ({
228
+ sheetName: this.getConfigSectionName(config),
229
+ ...this.renderTableContent(config, reportData, parameters)
230
+ }));
231
+ } else {
232
+ const metadata = this.buildMetadata(parameters);
233
+ sections = [
234
+ {
235
+ sheetName: name,
236
+ filters: metadata.map(([label, value]) => ({ label, value })),
237
+ ...this.renderTableContent(rawConfig, reportData, parameters)
238
+ }
239
+ ];
240
+ }
241
+ return sections;
242
+ }
243
+ };
244
+ export {
245
+ ExportBuilder
246
+ };
package/dist/index.cjs CHANGED
@@ -901,8 +901,7 @@ var Report = {
901
901
  EMPLOYEE_TIP: "employee-tip",
902
902
  SALES_BY_ITEM: "sales-by-item",
903
903
  DAILY_SALES: "daily-sales",
904
- DAILY_SALES_LIVE: "daily-sales-live",
905
- DAILY_SALES_TRENDS: "daily-sales-trends"
904
+ DAILY_SALES_LIVE: "daily-sales-live"
906
905
  };
907
906
  var DAILY_SALES_SECTION_CONFIGS = [
908
907
  dailySalesConfig,
@@ -925,8 +924,7 @@ var REPORT_CONFIG_MAP = {
925
924
  "employee-tip": employeeTipConfig,
926
925
  "sales-by-item": salesByItemDetailConfig,
927
926
  "daily-sales": DAILY_SALES_SECTION_CONFIGS,
928
- "daily-sales-live": DAILY_SALES_SECTION_CONFIGS,
929
- "daily-sales-trends": null
927
+ "daily-sales-live": DAILY_SALES_SECTION_CONFIGS
930
928
  };
931
929
  var REPORT_DEFAULT_NAME_MAP = {
932
930
  "sales-summary": "Sales",
@@ -939,8 +937,7 @@ var REPORT_DEFAULT_NAME_MAP = {
939
937
  "employee-tip": "Employee Tip",
940
938
  "sales-by-item": "Sales by Item",
941
939
  "daily-sales": "Daily Sales",
942
- "daily-sales-live": "Daily Sales Live",
943
- "daily-sales-trends": "Daily Sales Trends"
940
+ "daily-sales-live": "Daily Sales Live"
944
941
  };
945
942
  var getReportConfig = (reportType) => REPORT_CONFIG_MAP[reportType];
946
943
  var getReportExportFileName = ({
@@ -2333,7 +2330,53 @@ var enUS = {
2333
2330
  "common.report-col.gross-credit-card-tips.info": false,
2334
2331
  "common.report-col.type": false,
2335
2332
  "common.report-col.type.short": false,
2336
- "common.report-col.type.info": false
2333
+ "common.report-col.type.info": false,
2334
+ "common.report-section.revenue-class": false,
2335
+ "common.report-section.payments": false,
2336
+ "common.report-section.cash": false,
2337
+ "common.report-section.taxes": false,
2338
+ "common.report-section.refunds-voids": false,
2339
+ "common.report-section.discounts": false,
2340
+ "common.report-section.sales-by-day-part": false,
2341
+ "common.report-section.sales-by-order-type": false,
2342
+ "common.report-section.cash-row.cash-payments": false,
2343
+ "common.report-section.cash-row.paid-in-outs": false,
2344
+ "common.report-section.cash-row.gratuities-paid-out": false,
2345
+ "common.report-section.cash-row.cc-tips-paid-out": false,
2346
+ "common.report-section.trends-footer.total-sales": false,
2347
+ "common.report-section.rev-class-footer.tax-total": false,
2348
+ "common.report-section.rev-class-footer.gratuities": false,
2349
+ "common.report-section.rev-class-footer.balance-payments": false,
2350
+ "common.report-section.rev-class-footer.gift-card-sales": false,
2351
+ "common.report-section.rev-class-footer.non-sales-revenue": false,
2352
+ "common.report-section.rev-class-footer.total-accountable": false,
2353
+ "scheduled-reports.period": false,
2354
+ "components.form.field.group-by": false,
2355
+ "components.form.field.last-week": false,
2356
+ "components.form.field.last-year": false,
2357
+ "common.labels.locations": false,
2358
+ "common.labels.yes": false,
2359
+ // Analytic fields
2360
+ "analytics.field.location_id": false,
2361
+ "analytics.field.order_type_id": false,
2362
+ "analytics.field.revenue_center_id": false,
2363
+ "analytics.field.revenue_center_id.all": false,
2364
+ "analytics.field.hour_id": false,
2365
+ "analytics.field.daypart_id": false,
2366
+ "analytics.field.timeslot_id": false,
2367
+ "analytics.field.employee_id": false,
2368
+ "analytics.field.payroll_id": false,
2369
+ "analytics.field.intraday_period_group": false,
2370
+ "analytics.field.item_id": false,
2371
+ "analytics.field.department_id": false,
2372
+ "analytics.field.revenue_class_id": false,
2373
+ "analytics.field.modifier_id": false,
2374
+ // Common labels
2375
+ "table.total": false,
2376
+ "table.groups.sales": false,
2377
+ "table.groups.net-sales": false,
2378
+ "table.groups.guests": false,
2379
+ "table.groups.sales-per-guest": false
2337
2380
  };
2338
2381
  var en_GB_default = enUS;
2339
2382
 
@@ -2773,7 +2816,53 @@ var enUS2 = {
2773
2816
  "common.report-col.gross-credit-card-tips.info": false,
2774
2817
  "common.report-col.type": false,
2775
2818
  "common.report-col.type.short": false,
2776
- "common.report-col.type.info": false
2819
+ "common.report-col.type.info": false,
2820
+ "common.report-section.revenue-class": false,
2821
+ "common.report-section.payments": false,
2822
+ "common.report-section.cash": false,
2823
+ "common.report-section.taxes": false,
2824
+ "common.report-section.refunds-voids": false,
2825
+ "common.report-section.discounts": false,
2826
+ "common.report-section.sales-by-day-part": false,
2827
+ "common.report-section.sales-by-order-type": false,
2828
+ "common.report-section.cash-row.cash-payments": false,
2829
+ "common.report-section.cash-row.paid-in-outs": false,
2830
+ "common.report-section.cash-row.gratuities-paid-out": false,
2831
+ "common.report-section.cash-row.cc-tips-paid-out": false,
2832
+ "common.report-section.trends-footer.total-sales": false,
2833
+ "common.report-section.rev-class-footer.tax-total": false,
2834
+ "common.report-section.rev-class-footer.gratuities": false,
2835
+ "common.report-section.rev-class-footer.balance-payments": false,
2836
+ "common.report-section.rev-class-footer.gift-card-sales": false,
2837
+ "common.report-section.rev-class-footer.non-sales-revenue": false,
2838
+ "common.report-section.rev-class-footer.total-accountable": false,
2839
+ "scheduled-reports.period": false,
2840
+ "components.form.field.group-by": false,
2841
+ "components.form.field.last-week": false,
2842
+ "components.form.field.last-year": false,
2843
+ "common.labels.locations": false,
2844
+ "common.labels.yes": false,
2845
+ // Analytic fields
2846
+ "analytics.field.location_id": false,
2847
+ "analytics.field.order_type_id": false,
2848
+ "analytics.field.revenue_center_id": false,
2849
+ "analytics.field.revenue_center_id.all": false,
2850
+ "analytics.field.hour_id": false,
2851
+ "analytics.field.daypart_id": false,
2852
+ "analytics.field.timeslot_id": false,
2853
+ "analytics.field.employee_id": false,
2854
+ "analytics.field.payroll_id": false,
2855
+ "analytics.field.intraday_period_group": false,
2856
+ "analytics.field.item_id": false,
2857
+ "analytics.field.department_id": false,
2858
+ "analytics.field.revenue_class_id": false,
2859
+ "analytics.field.modifier_id": false,
2860
+ // Common labels
2861
+ "table.total": false,
2862
+ "table.groups.sales": false,
2863
+ "table.groups.net-sales": false,
2864
+ "table.groups.guests": false,
2865
+ "table.groups.sales-per-guest": false
2777
2866
  };
2778
2867
  var es_ES_default = enUS2;
2779
2868
 
@@ -3213,7 +3302,53 @@ var enUS3 = {
3213
3302
  "common.report-col.gross-credit-card-tips.info": "Gross credit card tips before any deductions or redistribution",
3214
3303
  "common.report-col.type": "Type",
3215
3304
  "common.report-col.type.short": "Type",
3216
- "common.report-col.type.info": " "
3305
+ "common.report-col.type.info": " ",
3306
+ "common.report-section.revenue-class": "Revenue Class",
3307
+ "common.report-section.payments": "Payments",
3308
+ "common.report-section.cash": "Expected Closeout Cash",
3309
+ "common.report-section.taxes": "Taxes",
3310
+ "common.report-section.refunds-voids": "Refunds & Voids",
3311
+ "common.report-section.discounts": "Discounts",
3312
+ "common.report-section.sales-by-day-part": "Sales by Day Part",
3313
+ "common.report-section.sales-by-order-type": "Sales by Order Type",
3314
+ "common.report-section.cash-row.cash-payments": "Cash Payments",
3315
+ "common.report-section.cash-row.paid-in-outs": "Paid-In/Outs",
3316
+ "common.report-section.cash-row.gratuities-paid-out": "Gratuities Paid Out",
3317
+ "common.report-section.cash-row.cc-tips-paid-out": "CC Tips Paid Out",
3318
+ "common.report-section.trends-footer.total-sales": "Total Sales",
3319
+ "common.report-section.rev-class-footer.tax-total": "Tax Total",
3320
+ "common.report-section.rev-class-footer.gratuities": "Gratuities",
3321
+ "common.report-section.rev-class-footer.balance-payments": "Balance Payments",
3322
+ "common.report-section.rev-class-footer.gift-card-sales": "Gift Card Sales",
3323
+ "common.report-section.rev-class-footer.non-sales-revenue": "Non-Sales Revenue",
3324
+ "common.report-section.rev-class-footer.total-accountable": "Total Accountable",
3325
+ "scheduled-reports.period": "Period",
3326
+ "components.form.field.group-by": "Group By",
3327
+ "components.form.field.last-week": "Compare to Last Week",
3328
+ "components.form.field.last-year": "Compare to Last Year",
3329
+ "common.labels.locations": "Locations",
3330
+ "common.labels.yes": "Yes",
3331
+ // Analytic fields
3332
+ "analytics.field.location_id": "Location",
3333
+ "analytics.field.order_type_id": "Order Types",
3334
+ "analytics.field.revenue_center_id": "Revenue Centers",
3335
+ "analytics.field.revenue_center_id.all": "All Revenue Centers",
3336
+ "analytics.field.hour_id": "Hours",
3337
+ "analytics.field.daypart_id": "Day Parts",
3338
+ "analytics.field.timeslot_id": "15 Mins",
3339
+ "analytics.field.employee_id": "Employees",
3340
+ "analytics.field.payroll_id": "Payroll IDs",
3341
+ "analytics.field.intraday_period_group": "Day Parts",
3342
+ "analytics.field.item_id": "Item",
3343
+ "analytics.field.department_id": "Department",
3344
+ "analytics.field.revenue_class_id": "Revenue Class",
3345
+ "analytics.field.modifier_id": "Modifier",
3346
+ // Common labels
3347
+ "table.total": "Total",
3348
+ "table.groups.sales": "Sales",
3349
+ "table.groups.net-sales": "Net Sales",
3350
+ "table.groups.guests": "Guests",
3351
+ "table.groups.sales-per-guest": "Sales / Guest"
3217
3352
  };
3218
3353
  var en_US_default = enUS3;
3219
3354