We have moved from dd-MMM-yyyy to ISO Date.

This commit is contained in:
2026-09-02 03:38:49 +00:00
parent 6cf42d3641
commit 0a9675f270
45 changed files with 141 additions and 613 deletions
+4
View File
@@ -26,6 +26,7 @@ import { MatTableModule } from '@angular/material/table';
import { MatToolbarModule } from '@angular/material/toolbar';
import { BrowserModule } from '@angular/platform-browser';
import { provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router';
import { Settings } from 'luxon';
import { dateFormat } from './app.environment';
import { routes } from './app.routes';
@@ -37,6 +38,8 @@ import { httpErrorInterceptor } from './core/http-error.interceptor';
import { jwtInterceptor } from './core/jwt.interceptor';
import { refreshInterceptor } from './core/refresh.interceptor';
Settings.defaultLocale = 'en-US';
export const appConfig: ApplicationConfig = {
providers: [
importProvidersFrom(
@@ -76,6 +79,7 @@ export const appConfig: ApplicationConfig = {
withComponentInputBinding(),
),
{ provide: ErrorHandler, useClass: GlobalErrorHandler },
{ provide: MAT_DATE_LOCALE, useValue: 'en-US' },
{ provide: DateAdapter, useClass: LuxonDateAdapter, deps: [MAT_DATE_LOCALE] },
{ provide: MAT_DATE_FORMATS, useValue: dateFormat },
{ provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } },
+2
View File
@@ -7,10 +7,12 @@ export const environment = {
export const dateFormat = {
parse: {
dateInput: 'dd-MMM-yyyy',
dateTimeInput: 'dd-MMM-yyyy HH:mm',
timeInput: 'hh:mm a',
},
display: {
dateInput: 'dd-MMM-yyyy',
dateTimeInput: 'dd-MMM-yyyy HH:mm',
timeInput: 'hh:mm a',
timeOptionLabel: 'hh:mm a',
monthYearLabel: 'MMM yyyy',
@@ -81,8 +81,8 @@ export class BeerSaleReportComponent {
computation: (info): BeerSaleReportFormData => {
if (info) {
return {
startDate: DateTime.fromFormat(info.startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(info.finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(info.startDate),
finishDate: DateTime.fromISO(info.finishDate),
saleCategory: info.saleCategory?.id ?? '',
regular: info.regular,
happy: info.happy,
@@ -131,8 +131,8 @@ export class BeerSaleReportComponent {
const formModel = this.formModel();
return new BeerSaleReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
saleCategory: this.saleCategories().find((sc) => sc.id === formModel.saleCategory),
regular: formModel.regular,
happy: formModel.happy,
@@ -56,8 +56,8 @@ export class BillSettlementReportComponent {
computation: (infoVal): BillSettlementReportFormData => {
if (infoVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
};
}
return {
@@ -86,8 +86,8 @@ export class BillSettlementReportComponent {
const formModel = this.formModel();
return new BillSettlementReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -67,8 +67,8 @@ export class CashierReportComponent {
if (infoVal) {
return {
cashier: this.info().cashier.id ?? '',
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
};
}
return {
@@ -115,8 +115,8 @@ export class CashierReportComponent {
return new CashierReport({
cashier: new User({ id: formModel.cashier ?? undefined }),
cashiers: this.info().cashiers,
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -56,8 +56,8 @@ export class DiscountReportComponent {
computation: (infoVal): DiscountReportFormData => {
if (infoVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
};
}
return {
@@ -86,8 +86,8 @@ export class DiscountReportComponent {
const formModel = this.formModel();
return new DiscountReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -73,8 +73,8 @@ export class GuestBookDetailComponent {
pax: itemVal.pax,
address: itemVal.address ?? '',
notes: itemVal.notes ?? '',
date: dt ? DateTime.fromJSDate(new Date(dt)) : DateTime.now(),
time: dt ? DateTime.fromJSDate(new Date(dt)) : DateTime.now(),
date: dt ? DateTime.fromISO(dt).minus({ minutes: new Date().getTimezoneOffset() }) : DateTime.now(),
time: dt ? DateTime.fromISO(dt).minus({ minutes: new Date().getTimezoneOffset() }) : DateTime.now(),
};
}
return {
@@ -172,16 +172,25 @@ export class GuestBookDetailComponent {
item.pax = formModel.pax ?? 0;
item.address = formModel.address;
item.notes = formModel.notes;
const timeStr = formModel.time ? formModel.time.toFormat('HH:mm') : '00:00';
const time = formModel.time ?? DateTime.now();
const dt = formModel.date.set({ hour: time.hour, minute: time.minute, second: 0, millisecond: 0 });
item.type = item.type || this.t() || 'walk_in';
if (item.type === 'booking') {
item.bookingDate = formModel.date.toFormat('dd-MMM-yyyy') + ' ' + timeStr;
item.bookingDate = dt.toISO() ?? '';
} else {
const existingDate = item.arrivalDate
? (item.arrivalDate as string).substring(0, 12)
: formModel.date.toFormat('dd-MMM-yyyy ');
item.arrivalDate = existingDate + timeStr;
if (item.arrivalDate) {
// preserve existing arrival date but update time
const arrival = DateTime.fromISO(item.arrivalDate as string).set({
hour: time.hour,
minute: time.minute,
second: 0,
millisecond: 0,
});
item.arrivalDate = arrival.toISO() ?? '';
} else {
item.arrivalDate = dt.toISO() ?? '';
}
}
return item;
@@ -45,7 +45,7 @@ export class GuestBookListComponent {
date = input(DateTime.now(), {
transform: (v: string | null | undefined): DateTime => {
if (v) {
const parsed = DateTime.fromFormat(v, 'dd-MMM-yyyy');
const parsed = DateTime.fromISO(v);
if (parsed.isValid) return parsed;
}
return DateTime.now();
@@ -63,7 +63,7 @@ export class GuestBookListComponent {
displayedColumns = ['sno', 'name', 'phone', 'pax', 'date', 'action'];
dateSignal = computed(() => this.formModel().date.toFormat('dd-MMM-yyyy'));
dateSignal = computed(() => this.formModel().date.toISODate() ?? '');
listResource = this.ser.list(this.dateSignal);
dataSource = computed(() => this.listResource.value()?.list ?? []);
@@ -64,8 +64,8 @@ export class MenuEngineeringReportComponent {
computation: (infoVal): MenuEngineeringReportFormData => {
if (infoVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
filter: '',
};
}
@@ -143,8 +143,8 @@ export class MenuEngineeringReportComponent {
const formModel = this.formModel();
return new MenuEngineeringReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -66,8 +66,8 @@ export class ProductSaleReportComponent {
computation: (sectionsVal): ProductSaleReportFormData => {
if (sectionsVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
section: this.info().sectionId || null,
};
}
@@ -102,8 +102,8 @@ export class ProductSaleReportComponent {
const formModel = this.formModel();
const data = new ProductSaleReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
if (formModel.section) {
data.sectionId = formModel.section;
@@ -52,8 +52,8 @@ export class ProductUpdatesReportComponent {
computation: (infoVal): ProductUpdatesReportFormData => {
if (infoVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
};
}
return {
@@ -82,8 +82,8 @@ export class ProductUpdatesReportComponent {
const formModel = this.formModel();
return new ProductUpdatesReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -67,8 +67,8 @@ export class SaleReportComponent {
computation: (sectionsVal): SaleReportFormData => {
if (sectionsVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
section: this.info().sectionId || null,
};
}
@@ -102,8 +102,8 @@ export class SaleReportComponent {
getInfo(): SaleReport {
const formModel = this.formModel();
const data = new SaleReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
if (formModel.section) {
data.sectionId = formModel.section;
-6
View File
@@ -8,13 +8,10 @@ import { VoucherType } from './voucher-type';
export class Bill {
id: string | undefined;
date: string;
dateTip: string;
pax: number;
user: User;
creationDate: string;
creationDateTip: string;
lastEditDate: string;
lastEditDateTip: string;
kotId: string;
billId: string;
table: Table;
@@ -27,13 +24,10 @@ export class Bill {
public constructor(init?: Partial<Bill>) {
this.id = undefined;
this.date = '';
this.dateTip = '';
this.pax = 0;
this.user = new User();
this.creationDate = '';
this.creationDateTip = '';
this.lastEditDate = '';
this.lastEditDateTip = '';
this.billId = '';
this.kotId = '';
this.table = new Table();
@@ -20,10 +20,12 @@
</ng-container>
<ng-container matColumnDef="time-details">
<mat-header-cell *matHeaderCellDef class="deep-purple-100 bold right-align"
><span [matTooltip]="bs.bill().dateTip">{{ bs.bill().date }}</span
>&nbsp;/&nbsp;<span [matTooltip]="bs.bill().creationDateTip">{{ bs.bill().creationDate }}</span
>&nbsp;/&nbsp;<span [matTooltip]="bs.bill().lastEditDateTip">{{
bs.bill().lastEditDate
><span [matTooltip]="bs.bill().date | localTime: 'datetime'">{{ bs.bill().date | localTime: 'time' }}</span
>&nbsp;/&nbsp;<span [matTooltip]="bs.bill().creationDate | localTime: 'datetime'">{{
bs.bill().creationDate | localTime: 'time'
}}</span
>&nbsp;/&nbsp;<span [matTooltip]="bs.bill().lastEditDate | localTime: 'datetime'">{{
bs.bill().lastEditDate | localTime: 'time'
}}</span></mat-header-cell
>
</ng-container>
@@ -16,6 +16,7 @@ import { Customer } from '../../core/customer';
import { Table } from '../../core/table';
import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component';
import { ErrorStateComponent } from '../../shared/error-state/error-state.component';
import { LocalTimePipe } from '../../shared/local-time.pipe';
import { MathService } from '../../shared/math.service';
import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component';
import { TableService } from '../../tables/table.service';
@@ -36,6 +37,7 @@ import { VoucherService } from './voucher.service';
templateUrl: './bills.component.html',
styleUrls: ['./bills.component.sass'],
imports: [
LocalTimePipe,
CommonModule,
CurrencyPipe,
MatButtonModule,
@@ -19,7 +19,7 @@
<span>{{ table.guest }}</span>
<span>{{ table.pax ?? '-' }} / {{ table.seats }} / {{ table.section?.name }}</span>
@if (table.date) {
<span>{{ table.date }}</span>
<span>{{ table.date | localTime: 'time' }}</span>
}
@if (table.amount) {
<span>{{ table.amount | currency: 'INR' }}</span>
@@ -10,6 +10,7 @@ import { map } from 'rxjs/operators';
import { Table } from '../../core/table';
import { RegimeService } from '../../regimes/regime.service';
import { ErrorStateComponent } from '../../shared/error-state/error-state.component';
import { LocalTimePipe } from '../../shared/local-time.pipe';
import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component';
import { TableService } from '../../tables/table.service';
import { BillNumberComponent } from '../bill-number/bill-number.component';
@@ -18,7 +19,7 @@ import { BillNumberComponent } from '../bill-number/bill-number.component';
selector: 'app-running-tables',
templateUrl: './running-tables.component.html',
styleUrls: ['./running-tables.component.sass'],
imports: [CurrencyPipe, MatRippleModule, MatCardModule, ErrorStateComponent, SkeletonLoaderComponent],
imports: [LocalTimePipe, CurrencyPipe, MatRippleModule, MatCardModule, ErrorStateComponent, SkeletonLoaderComponent],
})
export class RunningTablesComponent {
private tableService = inject(TableService);
@@ -68,8 +68,8 @@ export class SettingsComponent {
runMaintenance() {
const formModel = this.formModel();
const startDate = DateTime.fromJSDate(formModel.startDate).toFormat('dd-MMM-yyyy');
const finishDate = DateTime.fromJSDate(formModel.finishDate).toFormat('dd-MMM-yyyy');
const startDate = DateTime.fromJSDate(formModel.startDate).toISODate() ?? '';
const finishDate = DateTime.fromJSDate(formModel.finishDate).toISODate() ?? '';
if (!this.beerFile || !this.saleFile) {
this.snackBar.open('Please choose both files first!', 'Danger');
+13 -7
View File
@@ -6,15 +6,21 @@ import { DateTime } from 'luxon';
standalone: true,
})
export class LocalTimePipe implements PipeTransform {
transform(value: string): string {
if (value === undefined || value === null) {
transform(value: string | undefined | null, format: 'datetime' | 'time' | 'date' = 'datetime'): string {
if (!value) {
return '';
}
if (value.length === 5) {
return DateTime.fromFormat(value, 'HH:mm').minus({ minutes: new Date().getTimezoneOffset() }).toFormat('HH:mm');
const dt =
value.length === 5
? DateTime.fromFormat(value, 'HH:mm').minus({ minutes: new Date().getTimezoneOffset() })
: DateTime.fromISO(value).minus({ minutes: new Date().getTimezoneOffset() });
if (format === 'time') {
return dt.toFormat('HH:mm');
}
return DateTime.fromFormat(value, 'dd-MMM-yyyy HH:mm')
.minus({ minutes: new Date().getTimezoneOffset() })
.toFormat('dd-MMM-yyyy HH:mm');
if (format === 'date') {
return dt.toFormat('dd-MMM-yyyy', { locale: 'en-US' });
}
return dt.toFormat('dd-MMM-yyyy HH:mm', { locale: 'en-US' });
}
}
@@ -55,8 +55,8 @@ export class TaxReportComponent {
computation: (infoVal): TaxReportFormData => {
if (infoVal) {
return {
startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'),
finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'),
startDate: DateTime.fromISO(this.info().startDate),
finishDate: DateTime.fromISO(this.info().finishDate),
};
}
return {
@@ -85,8 +85,8 @@ export class TaxReportComponent {
const formModel = this.formModel();
return new TaxReport({
startDate: formModel.startDate.toFormat('dd-MMM-yyyy'),
finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'),
startDate: formModel.startDate.toISODate() ?? '',
finishDate: formModel.finishDate.toISODate() ?? '',
});
}
@@ -152,11 +152,11 @@ export class TemporalProductDetailComponent {
skuForm = form(this.skuFormModel);
private parseDateOrNull(d: string | null | undefined): DateTime | null {
return !d ? null : DateTime.fromFormat(d, 'dd-MMM-yyyy');
return !d ? null : DateTime.fromISO(d);
}
private formatDateOrNull(d: DateTime | null | undefined): string | null {
return !d ? null : d.toFormat('dd-MMM-yyyy');
return !d ? null : (d.toISODate() ?? '');
}
constructor() {
@@ -64,7 +64,7 @@ export class UpdateProductPricesComponent {
source: () => this.info(),
computation: (info): UpdateProductPricesFormData => {
return {
date: info.date ? DateTime.fromFormat(info.date, 'dd-MMM-yyyy') : DateTime.now(),
date: info.date ? DateTime.fromISO(info.date) : DateTime.now(),
menuCategory: info.menuCategoryId !== undefined ? info.menuCategoryId : '',
prices: info.items.map((x) => ({ newPrice: x.newPrice })),
};
@@ -99,7 +99,7 @@ export class UpdateProductPricesComponent {
});
return {
date: formModel.date.toFormat('dd-MMM-yyyy'),
date: formModel.date.toISODate() ?? '',
menuCategoryId: formModel.menuCategory,
items: [...info.items],
};