diff --git a/README.md b/README.md index 39ee6776..142bbcae 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ This project is the UI layer of HIH, built with modern web technologies: - [Ant Design for Angular (NG-ZORRO)](https://ng.ant.design/) — UI component library - [ECharts](https://echarts.apache.org/) — Data visualization - [ngx-echarts](https://github.com/xieziyu/ngx-echarts/) — ECharts integration for Angular -- [Moment.js](https://momentjs.com/) — Date handling +- [date-fns](https://date-fns.org/) — Date handling ## Development diff --git a/angular.json b/angular.json index 56e1b455..11d11012 100644 --- a/angular.json +++ b/angular.json @@ -27,9 +27,6 @@ ], "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "less", - "allowedCommonJsDependencies": [ - "moment" - ], "assets": [ "src/assets", { diff --git a/package-lock.json b/package-lock.json index 48cb8128..4d666af0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,10 +19,10 @@ "@jsverse/transloco": "^8.3.0", "actslib": "^0.5.66", "angular-auth-oidc-client": "^21.0.2", + "date-fns": "^4.4.0", "echarts": "^6.0.0", "katex": "^0.16.21", "marked": "^18.0.0", - "moment": "^2.30.1", "monaco-editor": "^0.52.2", "ng-zorro-antd": "^21.2.2", "ngx-echarts": "^21.0.0", @@ -9151,14 +9151,13 @@ } }, "node_modules/date-fns": { - "version": "2.28.0", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", "license": "MIT", - "engines": { - "node": ">=0.11" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/date-format": { @@ -12417,15 +12416,6 @@ "node": ">= 18" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", @@ -12595,6 +12585,22 @@ "@angular/router": "^21.0.0" } }, + "node_modules/ng-zorro-antd/node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/ngx-echarts": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-21.0.0.tgz", @@ -22277,7 +22283,9 @@ } }, "date-fns": { - "version": "2.28.0" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==" }, "date-format": { "version": "4.0.11", @@ -24408,11 +24416,6 @@ "minipass": "^7.1.2" } }, - "moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" - }, "monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", @@ -24523,6 +24526,16 @@ "@ctrl/tinycolor": "^3.6.0", "date-fns": "^2.16.1", "tslib": "^2.3.0" + }, + "dependencies": { + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } + } } }, "ngx-echarts": { diff --git a/package.json b/package.json index 44fa49e7..811f6e68 100644 --- a/package.json +++ b/package.json @@ -35,10 +35,10 @@ "@jsverse/transloco": "^8.3.0", "actslib": "^0.5.66", "angular-auth-oidc-client": "^21.0.2", + "date-fns": "^4.4.0", "echarts": "^6.0.0", "katex": "^0.16.21", "marked": "^18.0.0", - "moment": "^2.30.1", "monaco-editor": "^0.52.2", "ng-zorro-antd": "^21.2.2", "ngx-echarts": "^21.0.0", diff --git a/src/app/model/blogmodel.ts b/src/app/model/blogmodel.ts index 1342b9d6..83e20dd1 100644 --- a/src/app/model/blogmodel.ts +++ b/src/app/model/blogmodel.ts @@ -1,6 +1,6 @@ -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { SafeAny } from '@common/any'; -import { momentDateFormat } from './common'; +import { dateFormat } from './common'; /* eslint-disable @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ export const BlogPostStatus_Draft = 1; @@ -142,8 +142,8 @@ export class BlogPost { public brief?: string; public content?: string; public status?: number; - public createdAt?: moment.Moment; - public updatedAt?: moment.Moment; + public createdAt?: Date; + public updatedAt?: Date; public BlogPostCollections: BlogPostCollection[]; public BlogPostTags: BlogPostTag[]; @@ -154,7 +154,7 @@ export class BlogPost { get createdAtString(): string { if (this.createdAt) { - return this.createdAt.format(momentDateFormat); + return format(this.createdAt, dateFormat); } return ''; } @@ -172,10 +172,10 @@ export class BlogPost { this.BlogPostTags = data.BlogPostTags; if (data.CreatedAt) { - this.createdAt = moment(data.CreatedAt); + this.createdAt = parse(data.CreatedAt as string, dateFormat, new Date()); } if (data.UpdatedAt) { - this.updatedAt = moment(data.UpdatedAt); + this.updatedAt = parse(data.UpdatedAt as string, dateFormat, new Date()); } } } @@ -192,10 +192,10 @@ export class BlogPost { BlogPostTags: this.BlogPostTags, }; if (this.createdAt) { - rtnjson.CreatedAt = this.createdAt ? this.createdAt.format(momentDateFormat) : ''; + rtnjson.CreatedAt = this.createdAt ? format(this.createdAt, dateFormat) : ''; } if (this.updatedAt) { - rtnjson.UpdatedAt = this.updatedAt ? this.updatedAt.format(momentDateFormat) : ''; + rtnjson.UpdatedAt = this.updatedAt ? format(this.updatedAt, dateFormat) : ''; } return rtnjson; diff --git a/src/app/model/common.spec.ts b/src/app/model/common.spec.ts index 80d6bcc4..d3c7eb8b 100644 --- a/src/app/model/common.spec.ts +++ b/src/app/model/common.spec.ts @@ -13,12 +13,12 @@ import { TagTypeEnum, TagCount, } from './common'; -import moment from 'moment'; +import { getDate, getMonth } from 'date-fns'; describe('isOverviewDateInScope', () => { - let dt: moment.Moment; + let dt: Date; beforeEach(() => { - dt = moment(); // Now + dt = new Date(); // Now }); it('shall work', () => { @@ -150,20 +150,20 @@ describe('getOverviewScopeRange', () => { it('CurrentMonth', () => { const rst = getOverviewScopeRange(OverviewScopeEnum.CurrentMonth); - expect(rst.BeginDate.date()).toEqual(1); - expect(rst.BeginDate.month()).toEqual(rst.EndDate.month()); + expect(getDate(rst.BeginDate)).toEqual(1); + expect(getMonth(rst.BeginDate)).toEqual(getMonth(rst.EndDate)); }); it('CurrentYear', () => { const rst = getOverviewScopeRange(OverviewScopeEnum.CurrentYear); - expect(rst.BeginDate.date()).toEqual(1); + expect(getDate(rst.BeginDate)).toEqual(1); }); it('PreviousMonth', () => { const rst = getOverviewScopeRange(OverviewScopeEnum.PreviousMonth); - expect(rst.BeginDate.date()).toEqual(1); + expect(getDate(rst.BeginDate)).toEqual(1); }); it('PreviousYear', () => { const rst = getOverviewScopeRange(OverviewScopeEnum.PreviousYear); - expect(rst.BeginDate.date()).toEqual(1); + expect(getDate(rst.BeginDate)).toEqual(1); }); it('CurrentWeek', () => { const rst = getOverviewScopeRange(OverviewScopeEnum.CurrentWeek); diff --git a/src/app/model/common.ts b/src/app/model/common.ts index 23541ad8..eace74fd 100644 --- a/src/app/model/common.ts +++ b/src/app/model/common.ts @@ -1,4 +1,30 @@ -import moment from 'moment'; +import { + format, + parse, + startOfDay, + startOfMonth, + startOfYear, + startOfQuarter, + startOfWeek, + endOfDay, + endOfMonth, + endOfYear, + endOfQuarter, + endOfWeek, + addMonths, + addYears, + addWeeks, + addDays, + subMonths, + subYears, + subQuarters, + subWeeks, + isBefore, + isAfter, + isWithinInterval, + isValid as isValidDate, + getDate, +} from 'date-fns'; import { UIMode } from 'actslib'; import { SafeAny } from '@common/any'; @@ -14,7 +40,7 @@ export const languageEn: string = 'en'; export const languageZh: string = 'zh'; export const languageZhCN: string = 'zh-cn'; -export const momentDateFormat: string = 'YYYY-MM-DD'; +export const dateFormat: string = 'yyyy-MM-dd'; export enum AuthorizeScope { All = 1, @@ -140,11 +166,11 @@ export enum LogLevel { */ export class InfoMessage { private _msgType: MessageType = MessageType.Info; - private _msgTime: moment.Moment = moment(); + private _msgTime: Date = new Date(); private _msgTitle: string | null = null; private _msgContent: string | null = null; constructor(msgtype?: MessageType, msgtitle?: string, msgcontent?: string) { - this.MsgTime = moment(); + this.MsgTime = new Date(); if (msgtype) { this.MsgType = msgtype; } @@ -162,10 +188,10 @@ export class InfoMessage { set MsgType(mt: MessageType) { this._msgType = mt; } - get MsgTime(): moment.Moment { + get MsgTime(): Date { return this._msgTime; } - set MsgTime(mt: moment.Moment) { + set MsgTime(mt: Date) { this._msgTime = mt; } get MsgTitle(): string | null { @@ -206,8 +232,8 @@ export interface BaseModelJson { * Base model */ export class BaseModel { - protected _createdAt: moment.Moment; - protected _updatedAt: moment.Moment; + protected _createdAt: Date; + protected _updatedAt: Date; protected _createdBy: string | null = null; protected _updatedBy: string | null = null; protected _verifiedMsgs: InfoMessage[]; @@ -231,22 +257,22 @@ export class BaseModel { this._verifiedMsgs = msgs; } - get Createdat(): moment.Moment { + get Createdat(): Date { return this._createdAt; } - set Createdat(ca: moment.Moment) { + set Createdat(ca: Date) { this._createdAt = ca; } - get Updatedat(): moment.Moment { + get Updatedat(): Date { return this._updatedAt; } - set Updatedat(ua: moment.Moment) { + set Updatedat(ua: Date) { this._updatedAt = ua; } constructor() { - this._createdAt = moment(); - this._updatedAt = moment(); + this._createdAt = new Date(); + this._updatedAt = new Date(); this._verifiedMsgs = []; } @@ -272,13 +298,13 @@ export class BaseModel { const rstobj: SafeAny = {}; if (this._createdAt) { - rstobj.CreatedAt = this._createdAt.format(momentDateFormat); + rstobj.CreatedAt = format(this._createdAt, dateFormat); } if (this.Createdby && this.Createdby.length > 0) { rstobj.CreatedBy = this.Createdby; } if (this._updatedAt) { - rstobj.UpdatedAt = this._updatedAt.format(momentDateFormat); + rstobj.UpdatedAt = format(this._updatedAt, dateFormat); } if (this.Updatedby && this.Updatedby.length > 0) { rstobj.UpdatedBy = this.Updatedby; @@ -300,13 +326,13 @@ export class BaseModel { this.Createdby = data.Createdby; } if (data && data.createdAt) { - this.Createdat = moment(data.Createdat, momentDateFormat); + this.Createdat = parse(data.Createdat, dateFormat, new Date()); } if (data && data.updatedBy) { this.Updatedby = data.Updatedby; } if (data && data.updatedAt) { - this.Updatedat = moment(data.Updatedat, momentDateFormat); + this.Updatedat = parse(data.Updatedat, dateFormat, new Date()); } } @@ -315,7 +341,7 @@ export class BaseModel { msg.MsgType = msgtype; msg.MsgTitle = msgtitle; msg.MsgContent = msgcontent; - msg.MsgTime = moment(); + msg.MsgTime = new Date(); this._verifiedMsgs.push(msg); } } @@ -583,62 +609,50 @@ export class MultipleNamesObject extends BaseModel { * Scope range */ export interface IOverviewScopeRange { - BeginDate: moment.Moment; - EndDate: moment.Moment; + BeginDate: Date; + EndDate: Date; } export function getOverviewScopeRange(scope: OverviewScopeEnum): IOverviewScopeRange { - let bgn: moment.Moment = moment(); - let end: moment.Moment = moment(); + let bgn: Date = new Date(); + let end: Date = new Date(); if (scope === OverviewScopeEnum.CurrentMonth) { - bgn.startOf('month'); - end.endOf('month'); + bgn = startOfMonth(bgn); + end = endOfMonth(end); } else if (scope === OverviewScopeEnum.CurrentYear) { - bgn.startOf('year'); - end.endOf('year'); + bgn = startOfYear(bgn); + end = endOfYear(end); } else if (scope === OverviewScopeEnum.PreviousMonth) { - bgn.subtract(1, 'M'); - bgn.startOf('month'); - - end = bgn.clone(); - end.endOf('month'); + bgn = startOfMonth(subMonths(bgn, 1)); + end = endOfMonth(subMonths(end, 1)); } else if (scope === OverviewScopeEnum.PreviousYear) { - bgn.subtract(1, 'y'); - bgn.startOf('year'); - - end = bgn.clone(); - end.endOf('year'); + bgn = startOfYear(subYears(bgn, 1)); + end = endOfYear(subYears(end, 1)); } else if (scope === OverviewScopeEnum.CurrentQuarter) { - bgn.startOf('quarter'); - end.endOf('quarter'); + bgn = startOfQuarter(bgn); + end = endOfQuarter(end); } else if (scope === OverviewScopeEnum.PreviousQuarter) { - bgn.startOf('quarter'); - bgn.subtract(1, 'Q'); - - end = bgn.clone(); - end.endOf('quarter'); + bgn = startOfQuarter(subQuarters(bgn, 1)); + end = endOfQuarter(subQuarters(end, 1)); } else if (scope === OverviewScopeEnum.CurrentWeek) { - bgn.startOf('week'); - end.endOf('week'); + bgn = startOfWeek(bgn); + end = endOfWeek(end); } else if (scope === OverviewScopeEnum.PreviousWeek) { - bgn.startOf('week'); - bgn.subtract(1, 'w'); - - end = bgn.clone(); - end.endOf('week'); + bgn = startOfWeek(subWeeks(bgn, 1)); + end = endOfWeek(subWeeks(end, 1)); } else if (scope === OverviewScopeEnum.All) { - bgn = moment('19710101'); - end = moment('99991231'); + bgn = new Date(1971, 0, 1); + end = new Date(9999, 11, 31); } return { BeginDate: bgn, EndDate: end }; } -export function isOverviewDateInScope(dt: moment.Moment, scope: OverviewScopeEnum): boolean { +export function isOverviewDateInScope(dt: Date, scope: OverviewScopeEnum): boolean { const { BeginDate: bgn, EndDate: end } = getOverviewScopeRange(scope); - if (dt.isBefore(end) && dt.isAfter(bgn)) { + if (isBefore(dt, end) && isAfter(dt, bgn)) { return true; } @@ -649,8 +663,8 @@ export function isOverviewDateInScope(dt: moment.Moment, scope: OverviewScopeEnu * Repeat dates - input */ export interface RepeatedDatesAPIInput { - StartDate: moment.Moment; - EndDate: moment.Moment; + StartDate: Date; + EndDate: Date; RepeatType: RepeatFrequencyEnum; } @@ -658,8 +672,8 @@ export interface RepeatedDatesAPIInput { * Repeat dates */ export interface RepeatedDatesAPIOutput { - StartDate: moment.Moment; - EndDate: moment.Moment; + StartDate: Date; + EndDate: Date; } /** @@ -674,7 +688,7 @@ export interface RepeatedDatesWithAmountAPIInput extends RepeatedDatesAPIInput { * Repeated dates with Amount */ export interface RepeatedDatesWithAmountAPIOutput { - TranDate: moment.Moment; + TranDate: Date; TranAmount: number; Desp: string; } @@ -686,11 +700,11 @@ export interface RepeatDatesWithAmountAndInterestAPIInput { TotalAmount: number; TotalMonths: number; InterestRate: number; - StartDate: moment.Moment; - EndDate?: moment.Moment; + StartDate: Date; + EndDate?: Date; InterestFreeLoan: boolean; RepaymentMethod: number; - FirstRepayDate?: moment.Moment; + FirstRepayDate?: Date; RepayDayInMonth?: number; } @@ -698,7 +712,7 @@ export interface RepeatDatesWithAmountAndInterestAPIInput { * Finance loan calculator - API output */ export interface RepeatDatesWithAmountAndInterestAPIOutput { - TranDate: moment.Moment; + TranDate: Date; TranAmount: number; InterestAmount: number; } diff --git a/src/app/model/eventmodel.spec.ts b/src/app/model/eventmodel.spec.ts index 0a26e736..4cd551aa 100644 --- a/src/app/model/eventmodel.spec.ts +++ b/src/app/model/eventmodel.spec.ts @@ -3,7 +3,6 @@ // import { GeneralEvent, RecurEvent, EventHabit, EventHabitDetail } from './eventmodel'; -import moment from 'moment'; describe('GeneralEvent', () => { let instance: GeneralEvent; @@ -39,7 +38,7 @@ describe('GeneralEvent', () => { instance.IsPublic = false; instance.ID = 1; instance.HID = 1; - instance.StartDate = moment(); + instance.StartDate = new Date(); instance.Assignee = 'test'; instance.Content = 'test_content'; diff --git a/src/app/model/eventmodel.ts b/src/app/model/eventmodel.ts index 864e166d..e6a744eb 100644 --- a/src/app/model/eventmodel.ts +++ b/src/app/model/eventmodel.ts @@ -1,5 +1,5 @@ import * as hih from './common'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { SafeAny } from '@common/any'; /** @@ -12,9 +12,9 @@ export class GeneralEvent extends hih.BaseModel { private _assignee?: string; private _name?: string; private _content?: string; - private _startTime?: moment.Moment; - private _endTime?: moment.Moment; - private _completeTime?: moment.Moment; + private _startTime?: Date; + private _endTime?: Date; + private _completeTime?: Date; private _ispublic?: boolean; private _refRecurID?: number; @@ -48,41 +48,41 @@ export class GeneralEvent extends hih.BaseModel { set Content(cont: string | undefined) { this._content = cont; } - get StartDate(): moment.Moment | undefined { + get StartDate(): Date | undefined { return this._startTime; } - set StartDate(st: moment.Moment | undefined) { + set StartDate(st: Date | undefined) { this._startTime = st; } get StartDateDisplayString(): string | undefined { if (this._startTime) { - return this._startTime.format(hih.momentDateFormat); + return format(this._startTime, hih.dateFormat); } return ''; } - get EndDate(): moment.Moment | undefined { + get EndDate(): Date | undefined { return this._endTime; } - set EndDate(et: moment.Moment | undefined) { + set EndDate(et: Date | undefined) { this._endTime = et; } get EndDateDisplayString(): string { if (this._endTime) { - return this._endTime.format(hih.momentDateFormat); + return format(this._endTime, hih.dateFormat); } return ''; } - get CompleteDate(): moment.Moment | undefined { + get CompleteDate(): Date | undefined { return this._completeTime; } - set CompleteDate(ct: moment.Moment | undefined) { + set CompleteDate(ct: Date | undefined) { this._completeTime = ct; } get CompleteDateDisplayString(): string { if (this._completeTime) { - return this._completeTime.format(hih.momentDateFormat); + return format(this._completeTime, hih.dateFormat); } return ''; @@ -106,7 +106,7 @@ export class GeneralEvent extends hih.BaseModel { constructor() { super(); - this._startTime = moment(); + this._startTime = new Date(); this._endTime = undefined; this._completeTime = undefined; this._ispublic = false; @@ -139,13 +139,13 @@ export class GeneralEvent extends hih.BaseModel { this._content = data.Content; } if (data && data.StartDate) { - this._startTime = moment(data.StartDate, hih.momentDateFormat); + this._startTime = parse(data.StartDate, hih.dateFormat, new Date()); } if (data && data.EndDate) { - this._endTime = moment(data.EndDate, hih.momentDateFormat); + this._endTime = parse(data.EndDate, hih.dateFormat, new Date()); } if (data && data.CompleteDate) { - this._completeTime = moment(data.CompleteDate, hih.momentDateFormat); + this._completeTime = parse(data.CompleteDate, hih.dateFormat, new Date()); } if (data && data.IsPublic) { this._ispublic = data.IsPublic; @@ -164,12 +164,12 @@ export class GeneralEvent extends hih.BaseModel { robj.Assignee = this._assignee; } robj.Content = this._content; - robj.StartDate = this._startTime?.format(hih.momentDateFormat); + robj.StartDate = this._startTime ? format(this._startTime, hih.dateFormat) : undefined; if (this._endTime) { - robj.EndDate = this._endTime.format(hih.momentDateFormat); + robj.EndDate = format(this._endTime, hih.dateFormat); } if (this._completeTime) { - robj.CompleteDate = this._completeTime.format(hih.momentDateFormat); + robj.CompleteDate = format(this._completeTime, hih.dateFormat); } robj.IsPublic = this._ispublic; if (this._refRecurID) { @@ -188,8 +188,8 @@ export class RecurEvent extends hih.BaseModel { private _assignee?: string; private _name?: string; private _content?: string; - private _startTime?: moment.Moment; - private _endTime?: moment.Moment; + private _startTime?: Date; + private _endTime?: Date; private _ispublic?: boolean; private _listEvents: GeneralEvent[] = []; @@ -224,28 +224,28 @@ export class RecurEvent extends hih.BaseModel { set Content(content: string | undefined) { this._content = content; } - get StartDate(): moment.Moment | undefined { + get StartDate(): Date | undefined { return this._startTime; } - set StartDate(st: moment.Moment | undefined) { + set StartDate(st: Date | undefined) { this._startTime = st; } get StartDateDisplayString(): string { if (this._startTime) { - return this._startTime.format(hih.momentDateFormat); + return format(this._startTime, hih.dateFormat); } return ''; } - get EndDate(): moment.Moment | undefined { + get EndDate(): Date | undefined { return this._endTime; } - set EndDate(et: moment.Moment | undefined) { + set EndDate(et: Date | undefined) { this._endTime = et; } get EndDateDisplayString(): string { if (this._endTime) { - return this._endTime.format(hih.momentDateFormat); + return format(this._endTime, hih.dateFormat); } return ''; @@ -263,7 +263,7 @@ export class RecurEvent extends hih.BaseModel { constructor() { super(); - this._startTime = moment(); + this._startTime = new Date(); this._endTime = undefined; this._ispublic = false; } @@ -287,10 +287,10 @@ export class RecurEvent extends hih.BaseModel { this._content = data.Content; } if (data && data.StartDate) { - this._startTime = moment(data.StartDate, hih.momentDateFormat); + this._startTime = parse(data.StartDate, hih.dateFormat, new Date()); } if (data && data.EndDate) { - this._endTime = moment(data.EndDate, hih.momentDateFormat); + this._endTime = parse(data.EndDate, hih.dateFormat, new Date()); } if (data && data.IsPublic) { this._ispublic = data.IsPublic; @@ -319,9 +319,9 @@ export class RecurEvent extends hih.BaseModel { robj.Assignee = this._assignee; } robj.Content = this._content; - robj.StartDate = this._startTime?.format(hih.momentDateFormat); + robj.StartDate = this._startTime ? format(this._startTime, hih.dateFormat) : undefined; if (this._endTime) { - robj.EndDate = this._endTime.format(hih.momentDateFormat); + robj.EndDate = format(this._endTime, hih.dateFormat); } robj.IsPublic = this._ispublic; robj.RecurType = hih.RepeatFrequencyEnum[+this.repeatType]; @@ -336,8 +336,8 @@ export class EventHabit extends hih.BaseModel { private _id?: number; private _hid?: number; private _name?: string; - private _startDate?: moment.Moment; - private _endDate?: moment.Moment; + private _startDate?: Date; + private _endDate?: Date; public repeatType: hih.RepeatFrequencyEnum = hih.RepeatFrequencyEnum.Day; public content?: string; public count?: number; @@ -364,27 +364,27 @@ export class EventHabit extends hih.BaseModel { set Name(name: string | undefined) { this._name = name; } - get StartDate(): moment.Moment | undefined { + get StartDate(): Date | undefined { return this._startDate; } - set StartDate(sd: moment.Moment | undefined) { + set StartDate(sd: Date | undefined) { this._startDate = sd; } get StartDateFormatString(): string { if (this._startDate !== undefined) { - return this._startDate.format(hih.momentDateFormat); + return format(this._startDate, hih.dateFormat); } return ''; } - get EndDate(): moment.Moment | undefined { + get EndDate(): Date | undefined { return this._endDate; } - set EndDate(ed: moment.Moment | undefined) { + set EndDate(ed: Date | undefined) { this._endDate = ed; } get EndDateFormatString(): string { if (this._endDate !== undefined) { - return this._endDate.format(hih.momentDateFormat); + return format(this._endDate, hih.dateFormat); } return ''; } @@ -395,8 +395,8 @@ export class EventHabit extends hih.BaseModel { constructor() { super(); - this._startDate = moment(); - this._endDate = moment(); + this._startDate = new Date(); + this._endDate = new Date(); } override onSetData(data: SafeAny): void { @@ -421,10 +421,10 @@ export class EventHabit extends hih.BaseModel { this.count = data.count; } if (data && data.startDate) { - this._startDate = moment(data.startDate, hih.momentDateFormat); + this._startDate = parse(data.startDate, hih.dateFormat, new Date()); } if (data && data.endDate) { - this._endDate = moment(data.endDate, hih.momentDateFormat); + this._endDate = parse(data.endDate, hih.dateFormat, new Date()); } if (data && data.isPublic) { this.isPublic = data.isPublic; @@ -481,8 +481,8 @@ export class EventHabit extends hih.BaseModel { export class EventHabitDetail { private _id?: number; private _habitID?: number; - private _startDate?: moment.Moment; - private _endDate?: moment.Moment; + private _startDate?: Date; + private _endDate?: Date; private _name?: string; get ID(): number | undefined { @@ -497,27 +497,27 @@ export class EventHabitDetail { set HabitID(hid: number | undefined) { this._habitID = hid; } - get StartDate(): moment.Moment | undefined { + get StartDate(): Date | undefined { return this._startDate; } - set StartDate(sd: moment.Moment | undefined) { + set StartDate(sd: Date | undefined) { this._startDate = sd; } get StartDateFormatString(): string { if (this._startDate) { - return this._startDate.format(hih.momentDateFormat); + return format(this._startDate, hih.dateFormat); } return ''; } - get EndDate(): moment.Moment | undefined { + get EndDate(): Date | undefined { return this._endDate; } - set EndDate(ed: moment.Moment | undefined) { + set EndDate(ed: Date | undefined) { this._endDate = ed; } get EndDateFormatString(): string { if (this._endDate) { - return this._endDate.format(hih.momentDateFormat); + return format(this._endDate, hih.dateFormat); } return ''; } @@ -539,10 +539,10 @@ export class EventHabitDetail { this._name = data.name; } if (data && data.startDate) { - this._startDate = moment(data.startDate, hih.momentDateFormat); + this._startDate = parse(data.startDate, hih.dateFormat, new Date()); } if (data && data.endDate) { - this._endDate = moment(data.endDate, hih.momentDateFormat); + this._endDate = parse(data.endDate, hih.dateFormat, new Date()); } } } @@ -553,13 +553,13 @@ export class EventHabitDetail { export class EventHabitCheckin { public id?: number; public hid?: number; - public tranDate?: moment.Moment; + public tranDate?: Date; public habitID?: number; public score?: number; public comment?: string; get tranDateFormatString(): string { if (this.tranDate) { - return this.tranDate.format(hih.momentDateFormat); + return format(this.tranDate, hih.dateFormat); } return ''; } @@ -569,7 +569,7 @@ export class EventHabitCheckin { this.id = data.id; } if (data && data.tranDate) { - this.tranDate = moment(data.tranDate, hih.momentDateFormat); + this.tranDate = parse(data.tranDate, hih.dateFormat, new Date()); } if (data && data.hid) { this.hid = data.hid; @@ -592,7 +592,7 @@ export class EventHabitCheckin { } robj.hid = this.hid; robj.habitID = this.habitID; - robj.tranDate = this.tranDate?.format(hih.momentDateFormat); + robj.tranDate = this.tranDate ? format(this.tranDate, hih.dateFormat) : undefined; if (this.comment) { robj.comment = this.comment; } @@ -608,22 +608,22 @@ export class HabitEventDetailWithCheckInStatistics { public expectAmount?: number; public checkInAmount?: number; public averageScore?: number; - public startDate?: moment.Moment; - public endDate?: moment.Moment; + public startDate?: Date; + public endDate?: Date; public name?: string; public assignee?: string; public isPublic?: boolean; get StartDateFormatString(): string { if (this.startDate) { - return this.startDate.format(hih.momentDateFormat); + return format(this.startDate, hih.dateFormat); } return ''; } get EndDateFormatString(): string { if (this.endDate) { - return this.endDate.format(hih.momentDateFormat); + return format(this.endDate, hih.dateFormat); } return ''; @@ -646,10 +646,10 @@ export class HabitEventDetailWithCheckInStatistics { this.averageScore = data.averageScore; } if (data && data.startDate) { - this.startDate = moment(data.startDate, hih.momentDateFormat); + this.startDate = parse(data.startDate, hih.dateFormat, new Date()); } if (data && data.endDate) { - this.endDate = moment(data.endDate, hih.momentDateFormat); + this.endDate = parse(data.endDate, hih.dateFormat, new Date()); } if (data && data.name) { this.name = data.name; diff --git a/src/app/model/financemodel.spec.ts b/src/app/model/financemodel.spec.ts index 565f6943..fbdce33d 100644 --- a/src/app/model/financemodel.spec.ts +++ b/src/app/model/financemodel.spec.ts @@ -48,7 +48,7 @@ import { FinanceReportByAccount, BalanceSheetReport, } from './financemodel'; -import moment from 'moment'; +import { parse, format, addMonths, addYears, subMonths, startOfDay, isBefore } from 'date-fns'; import * as hih from './common'; import { FakeDataHelper } from '../../testing'; @@ -304,7 +304,7 @@ describe('AccountExtraAdvancePayment', () => { it('#1. default values', () => { expect(instance.StartDate).toBeTruthy(); expect(instance.EndDate).toBeTruthy(); - expect(instance.StartDate.isBefore(instance.EndDate)).toEqual(true); + expect(isBefore(instance.StartDate, instance.EndDate)).toEqual(true); expect(instance.Comment).toBeFalsy(); }); @@ -313,7 +313,7 @@ describe('AccountExtraAdvancePayment', () => { expect(instance.StartDate).toBeTruthy(); expect(instance.EndDate).toBeTruthy(); - expect(instance.StartDate.isBefore(instance.EndDate)).toEqual(true); + expect(isBefore(instance.StartDate, instance.EndDate)).toEqual(true); expect(instance.Comment).toBeFalsy(); }); @@ -336,7 +336,7 @@ describe('AccountExtraAdvancePayment', () => { instance.RepeatType = hih.RepeatFrequencyEnum.Month; instance.Comment = 'test'; - instance.StartDate = instance.EndDate.add(1, 'y'); + instance.StartDate = addYears(instance.EndDate, 1); expect(instance.isValid).toEqual(false); }); @@ -362,7 +362,7 @@ describe('AccountExtraAdvancePayment', () => { TranAmount: 100, ControlCenterId: 1, Desp: 'Test', - TranDate: moment(), + TranDate: new Date(), } as TemplateDocADP); expect(instance.isValid).toEqual(true); @@ -377,8 +377,8 @@ describe('AccountExtraAdvancePayment', () => { const instance2: AccountExtraAdvancePayment = instance.clone(); expect(instance2.Comment).toEqual(instance.Comment); expect(instance2.RepeatType).toEqual(instance.RepeatType); - expect(instance.StartDate.isSame(instance2.StartDate)).toBeTruthy(); - expect(instance.EndDate.isSame(instance2.EndDate)).toBeTruthy(); + expect(startOfDay(instance.StartDate).getTime()).toEqual(startOfDay(instance2.StartDate).getTime()); + expect(startOfDay(instance.EndDate).getTime()).toEqual(startOfDay(instance2.EndDate).getTime()); }); it('#9. onSetData and writeObject shall work', () => { @@ -393,8 +393,8 @@ describe('AccountExtraAdvancePayment', () => { instance2.onSetData(jdata); expect(instance2.Comment).toEqual(instance.Comment); expect(instance2.RepeatType).toEqual(instance.RepeatType); - expect(instance.StartDate.startOf('day').isSame(instance2.StartDate.startOf('day'))).toBeTruthy(); - expect(instance.EndDate.startOf('day').isSame(instance2.EndDate.startOf('day'))).toBeTruthy(); + expect(startOfDay(instance.StartDate).getTime()).toEqual(startOfDay(instance2.StartDate).getTime()); + expect(startOfDay(instance.EndDate).getTime()).toEqual(startOfDay(instance2.EndDate).getTime()); }); }); @@ -474,10 +474,10 @@ describe('AccountExtraLoan', () => { it.skip('#5. isAccountValid', () => { expect(instance.isAccountValid).toBeFalsy(); instance.InterestFree = true; - instance.startDate = moment(); - instance.endDate = moment().subtract(1, 'd'); + instance.startDate = new Date(); + instance.endDate = subMonths(new Date(), 1); expect(instance.isAccountValid).toBeFalsy(); - instance.endDate = moment().add(1, 'y'); + instance.endDate = addYears(new Date(), 1); expect(instance.isAccountValid).toBeFalsy(); instance.RepayMethod = RepaymentMethodEnum.EqualPrincipal; expect(instance.isAccountValid).toBeFalsy(); @@ -600,7 +600,7 @@ describe('Order', () => { }); it('#7. onVerify: valid from must earlier than valid to', () => { instance.Name = 'test'; - instance.ValidTo = instance.ValidFrom?.subtract(1, 'M'); + instance.ValidTo = subMonths(instance.ValidFrom ?? new Date(), 1); instance.SRules.push(new SettlementRule()); const rst: boolean = instance.onVerify(); @@ -732,7 +732,7 @@ describe('Document', () => { instance.Id = 1; // instance.DocType = fakeData.finDocTypes[0].Id; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -755,7 +755,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = 233; // Invalid one instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -778,7 +778,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -801,7 +801,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); // instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -824,7 +824,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'testttttttttttttttttttttttttttttttttttttttttttttttttt'; const rst: boolean = instance.onVerify({ @@ -847,7 +847,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; // instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -870,7 +870,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = 'DEM'; // Invalid currency - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -893,7 +893,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; const rst: boolean = instance.onVerify({ @@ -917,7 +917,7 @@ describe('Document', () => { instance.Id = 1; instance.DocType = fakeData.finDocTypes[0].Id ?? 0; instance.TranCurr = fakeData.chosedHome.BaseCurrency; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; let di: DocumentItem = new DocumentItem(); di.ItemId = 1; @@ -959,7 +959,7 @@ describe('Document', () => { instance.TranCurr2 = 'USD'; instance.ExgRate2 = 673.11; instance.ExgRate_Plan2 = false; - instance.TranDate = moment(); + instance.TranDate = new Date(); instance.Desp = 'test'; let di: DocumentItem = new DocumentItem(); di.ItemId = 1; diff --git a/src/app/model/financemodel.ts b/src/app/model/financemodel.ts index 477aa74c..9f07ad2a 100644 --- a/src/app/model/financemodel.ts +++ b/src/app/model/financemodel.ts @@ -1,5 +1,25 @@ import * as hih from './common'; -import moment from 'moment'; +import { + format, + parse, + startOfDay, + startOfMonth, + startOfYear, + startOfQuarter, + endOfDay, + endOfMonth, + endOfYear, + endOfQuarter, + addMonths, + addYears, + addDays, + subMonths, + isBefore, + isAfter, + isWithinInterval, + getDate, + isValid as isValidDate, +} from 'date-fns'; import { SafeAny } from '@common/any'; /* eslint-disable @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ @@ -762,8 +782,8 @@ export interface AccountExtraAdvancePaymentJSON extends AccountExtraBaseJson { * Extra info: Advance payment */ export class AccountExtraAdvancePayment extends AccountExtra { - private _startDate: moment.Moment; - private _endDate: moment.Moment; + private _startDate: Date; + private _endDate: Date; private _refDocId: number | null = null; private _comment = ''; public Direct = false; @@ -771,16 +791,16 @@ export class AccountExtraAdvancePayment extends AccountExtra { public DeferredDays: number | null = null; public dpTmpDocs: TemplateDocADP[] = []; - get StartDate(): moment.Moment { + get StartDate(): Date { return this._startDate; } - set StartDate(sd: moment.Moment) { + set StartDate(sd: Date) { this._startDate = sd; } - get EndDate(): moment.Moment { + get EndDate(): Date { return this._endDate; } - set EndDate(ed: moment.Moment) { + set EndDate(ed: Date) { this._endDate = ed; } get RefDocId(): number | null { @@ -799,15 +819,15 @@ export class AccountExtraAdvancePayment extends AccountExtra { constructor() { super(); - this._startDate = moment(); - this._endDate = moment().add(1, 'y'); + this._startDate = new Date(); + this._endDate = addYears(new Date(), 1); } public override onInit(): void { super.onInit(); - this._startDate = moment(); - this._endDate = moment().add(1, 'y'); + this._startDate = new Date(); + this._endDate = addYears(new Date(), 1); this._comment = ''; this.RepeatType = null; this.dpTmpDocs = []; @@ -816,10 +836,10 @@ export class AccountExtraAdvancePayment extends AccountExtra { } get isAccountValid(): boolean { - if (!this.StartDate || !this.EndDate || !this.StartDate.isValid || !this.EndDate.isValid) { + if (!this.StartDate || !this.EndDate || !isValidDate(this.StartDate) || !isValidDate(this.EndDate)) { return false; } - if (this.StartDate.isSameOrAfter(this.EndDate)) { + if (!isBefore(this.StartDate, this.EndDate)) { return false; } if (this.RepeatType === null || this.RepeatType === undefined) { @@ -845,8 +865,8 @@ export class AccountExtraAdvancePayment extends AccountExtra { public clone(): AccountExtraAdvancePayment { const aobj: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); aobj.Direct = this.Direct; - aobj.StartDate = this.StartDate.clone(); - aobj.EndDate = this.EndDate.clone(); + aobj.StartDate = new Date(this.StartDate.getTime()); + aobj.EndDate = new Date(this.EndDate.getTime()); aobj.RepeatType = this.RepeatType; aobj.RefDocId = this.RefDocId; aobj.DeferredDays = this.DeferredDays; @@ -858,8 +878,8 @@ export class AccountExtraAdvancePayment extends AccountExtra { public override writeJSONObject(): SafeAny { const rstobj: SafeAny = super.writeJSONObject(); rstobj.Direct = this.Direct; - rstobj.StartDate = this._startDate.format(hih.momentDateFormat); - rstobj.EndDate = this._endDate.format(hih.momentDateFormat); + rstobj.StartDate = format(this._startDate, hih.dateFormat); + rstobj.EndDate = format(this._endDate, hih.dateFormat); rstobj.RepeatType = this.RepeatType; rstobj.ReferenceDocumentID = this.RefDocId; rstobj.DefrrDays = this.DeferredDays; @@ -882,10 +902,10 @@ export class AccountExtraAdvancePayment extends AccountExtra { this.Direct = false; } if (data && data.StartDate) { - this._startDate = moment(data.StartDate, hih.momentDateFormat); + this._startDate = parse(data.StartDate, hih.dateFormat, new Date()); } if (data && data.EndDate) { - this._endDate = moment(data.EndDate, hih.momentDateFormat); + this._endDate = parse(data.EndDate, hih.dateFormat, new Date()); } if (data && data.RepeatType) { this.RepeatType = data.RepeatType; @@ -933,8 +953,8 @@ export class AccountExtraAsset extends AccountExtra { private _name = ''; private _comment = ''; public CategoryID: number | null = null; - public BoughtDate: moment.Moment | null = null; - public ExpiredDate: moment.Moment | null = null; + public BoughtDate: Date | null = null; + public ExpiredDate: Date | null = null; public ResidualValue: number | null = null; public RefDocForBuy: number | null = null; public RefDocForSold: number | null = null; @@ -987,10 +1007,10 @@ export class AccountExtraAsset extends AccountExtra { rstobj.Name = this.Name; rstobj.Comment = this.Comment; if (this.BoughtDate) { - rstobj.BoughtDate = this.BoughtDate.format(hih.momentDateFormat); + rstobj.BoughtDate = format(this.BoughtDate, hih.dateFormat); } if (this.ExpiredDate) { - rstobj.ExpiredDate = this.ExpiredDate.format(hih.momentDateFormat); + rstobj.ExpiredDate = format(this.ExpiredDate, hih.dateFormat); } if (this.ResidualValue) { rstobj.ResidualValue = this.ResidualValue; @@ -1018,10 +1038,10 @@ export class AccountExtraAsset extends AccountExtra { this.Comment = data.Comment; } if (data && data.BoughtDate) { - this.BoughtDate = moment(data.BoughtDate); + this.BoughtDate = parse(data.BoughtDate, hih.dateFormat, new Date()); } if (data && data.ExpiredDate) { - this.ExpiredDate = moment(data.ExpiredDate); + this.ExpiredDate = parse(data.ExpiredDate, hih.dateFormat, new Date()); } if (data && data.ResidualValue) { this.ResidualValue = data.ResidualValue; @@ -1057,41 +1077,41 @@ export interface AccountExtraLoanJson extends AccountExtraBaseJson { * Extra info: Loan */ export class AccountExtraLoan extends AccountExtra { - private _startDate: moment.Moment | null = null; - private _endDate: moment.Moment | null = null; + private _startDate: Date | null = null; + private _endDate: Date | null = null; private _annualRate: number | null = null; private _payingAccount: number | null = null; private _partner: string | null = null; private _interestFree: boolean | null = null; private _totalMonths: number | null = null; private _comment = ''; - private _firstRepayDate: moment.Moment | null = null; + private _firstRepayDate: Date | null = null; private _repayDayInMonth: number | null = null; public RepayMethod: RepaymentMethodEnum = RepaymentMethodEnum.DueRepayment; public RefDocId: number | null = null; public loanTmpDocs: TemplateDocLoan[] = []; - get startDate(): moment.Moment | null { + get startDate(): Date | null { return this._startDate; } - set startDate(sd: moment.Moment | null) { + set startDate(sd: Date | null) { this._startDate = sd; } get StartDateFormatString(): string | null { if (this._startDate !== null) { - return this._startDate.format(hih.momentDateFormat); + return format(this._startDate, hih.dateFormat); } return null; } - get endDate(): moment.Moment | null { + get endDate(): Date | null { return this._endDate; } - set endDate(ed: moment.Moment | null) { + set endDate(ed: Date | null) { this._endDate = ed; } get EndDateFormatString(): string | null { if (this._endDate !== null) { - return this._endDate.format(hih.momentDateFormat); + return format(this._endDate, hih.dateFormat); } return null; } @@ -1131,10 +1151,10 @@ export class AccountExtraLoan extends AccountExtra { set Comment(cmt: string) { this._comment = cmt; } - get FirstRepayDate(): moment.Moment | null { + get FirstRepayDate(): Date | null { return this._firstRepayDate; } - set FirstRepayDate(firstdate: moment.Moment | null) { + set FirstRepayDate(firstdate: Date | null) { this._firstRepayDate = firstdate; } get RepayDayInMonth(): number | null { @@ -1148,7 +1168,7 @@ export class AccountExtraLoan extends AccountExtra { if (this.startDate === undefined || this.startDate === null) { return false; } - if (this.endDate && this.endDate.isSameOrBefore(this.startDate)) { + if (this.endDate && !isAfter(this.endDate, this.startDate)) { return false; } @@ -1177,7 +1197,7 @@ export class AccountExtraLoan extends AccountExtra { return false; } if (this.FirstRepayDate && this.RepayDayInMonth) { - if (this.FirstRepayDate.date() !== this.RepayDayInMonth) { + if (this.FirstRepayDate && getDate(this.FirstRepayDate) !== this.RepayDayInMonth) { return false; } } @@ -1187,9 +1207,9 @@ export class AccountExtraLoan extends AccountExtra { } } if (this.FirstRepayDate) { - const bgndate = this.startDate.add(30, 'days'); - const enddate = this.startDate.add(60, 'days'); - if (!this.FirstRepayDate.isBetween(bgndate, enddate)) { + const bgndate = addDays(this.startDate, 30); + const enddate = addDays(this.startDate, 60); + if (!isWithinInterval(this.FirstRepayDate, { start: bgndate, end: enddate })) { return false; } } @@ -1217,7 +1237,7 @@ export class AccountExtraLoan extends AccountExtra { public override onInit(): void { super.onInit(); - this._startDate = moment(); + this._startDate = new Date(); this._firstRepayDate = null; this._repayDayInMonth = null; } @@ -1242,9 +1262,9 @@ export class AccountExtraLoan extends AccountExtra { public override writeJSONObject(): AccountExtraLoanJson { const rstobj: AccountExtraLoanJson = super.writeJSONObject() as AccountExtraLoanJson; - rstobj.StartDate = this._startDate?.format(hih.momentDateFormat) ?? ''; + rstobj.StartDate = this._startDate ? format(this._startDate, hih.dateFormat) : ''; if (this._endDate) { - rstobj.EndDate = this._endDate.format(hih.momentDateFormat); + rstobj.EndDate = format(this._endDate, hih.dateFormat); } if (this.annualRate) { rstobj.AnnualRate = this.annualRate; @@ -1272,7 +1292,7 @@ export class AccountExtraLoan extends AccountExtra { rstobj.LoanTmpDocs.push(tdocjson); } // if (this._firstRepayDate) { - // rstobj. = this._firstRepayDate.format(hih.momentDateFormat); + // rstobj. = format(this._firstRepayDate, hih.dateFormat); // } // if (this._repayDayInMonth) { // rstobj.R = this._repayDayInMonth; @@ -1285,10 +1305,10 @@ export class AccountExtraLoan extends AccountExtra { super.onSetData(data); if (data && data.StartDate) { - this._startDate = moment(data.StartDate, hih.momentDateFormat); + this._startDate = parse(data.StartDate, hih.dateFormat, new Date()); } if (data && data.EndDate) { - this._endDate = moment(data.EndDate, hih.momentDateFormat); + this._endDate = parse(data.EndDate, hih.dateFormat, new Date()); } if (data && data.AnnualRate) { this.annualRate = +data.AnnualRate; @@ -1323,7 +1343,7 @@ export class AccountExtraLoan extends AccountExtra { } } // if (data && data.firstRepayDate) { - // this._firstRepayDate = moment(data.firstRepayDate, hih.momentDateFormat); + // this._firstRepayDate = parse(data.firstRepayDate, hih.dateFormat, new Date()); // } // if (data && data.repayDayInMonth) { // this._repayDayInMonth = data.repayDayInMonth; @@ -1335,7 +1355,7 @@ export class AccountExtraLoan extends AccountExtra { export class AccountReconcileExpect { currentMonth: Date; get currentMonthStr(): string { - return moment(this.currentMonth).format(hih.momentDateFormat); + return format(this.currentMonth, hih.dateFormat); } expectedAmount: number; @@ -1539,8 +1559,8 @@ export class Order extends hih.BaseModel { private _hid?: number; private _name = ''; private _cmt = ''; - private _validFrom?: moment.Moment; - private _validTo?: moment.Moment; + private _validFrom?: Date; + private _validTo?: Date; get Id(): number | undefined { return this._id; @@ -1566,23 +1586,23 @@ export class Order extends hih.BaseModel { set Comment(cmt: string) { this._cmt = cmt; } - get ValidFrom(): moment.Moment | undefined { + get ValidFrom(): Date | undefined { return this._validFrom; } - set ValidFrom(vf: moment.Moment | undefined) { + set ValidFrom(vf: Date | undefined) { this._validFrom = vf; } - get ValidTo(): moment.Moment | undefined { + get ValidTo(): Date | undefined { return this._validTo; } - set ValidTo(vt: moment.Moment | undefined) { + set ValidTo(vt: Date | undefined) { this._validTo = vt; } get ValidFromFormatString(): string { - return this._validFrom ? this._validFrom.format(hih.momentDateFormat) : ''; + return this._validFrom ? format(this._validFrom, hih.dateFormat) : ''; } get ValidToFormatString(): string { - return this._validTo ? this._validTo.format(hih.momentDateFormat) : ''; + return this._validTo ? format(this._validTo, hih.dateFormat) : ''; } public SRules: SettlementRule[] = []; @@ -1599,8 +1619,8 @@ export class Order extends hih.BaseModel { this._name = ''; this._cmt = ''; - this._validFrom = moment(); - this._validTo = this._validFrom.clone().add(1, 'M'); + this._validFrom = new Date(); + this._validTo = addMonths(this._validFrom, 1); this.SRules = []; } @@ -1637,7 +1657,7 @@ export class Order extends hih.BaseModel { chkrst = false; } // Valid to > valid from - if (this.ValidTo && this.ValidFrom && this.ValidTo.startOf('day').isAfter(this.ValidFrom.startOf('day'))) { + if (this.ValidTo && this.ValidFrom && isAfter(startOfDay(this.ValidTo), startOfDay(this.ValidFrom))) { // Allowed } else { this._addMessage(hih.MessageType.Error, 'Common.InvalidValidRange', 'Common.ValidToMustLaterThanValidFrom'); @@ -1705,8 +1725,8 @@ export class Order extends hih.BaseModel { rstObj.ID = this.Id; rstObj.HomeID = this.HID; rstObj.Name = this.Name; - rstObj.ValidFrom = this._validFrom?.format(hih.momentDateFormat); - rstObj.ValidTo = this._validTo?.format(hih.momentDateFormat); + rstObj.ValidFrom = this._validFrom ? format(this._validFrom, hih.dateFormat) : undefined; + rstObj.ValidTo = this._validTo ? format(this._validTo, hih.dateFormat) : undefined; rstObj.Comment = this.Comment; rstObj.SRule = []; @@ -1735,10 +1755,10 @@ export class Order extends hih.BaseModel { this.Comment = data.Comment; } if (data && data.ValidFrom) { - this.ValidFrom = moment(data.ValidFrom, hih.momentDateFormat); + this.ValidFrom = parse(data.ValidFrom, hih.dateFormat, new Date()); } if (data && data.ValidTo) { - this.ValidTo = moment(data.ValidTo, hih.momentDateFormat); + this.ValidTo = parse(data.ValidTo, hih.dateFormat, new Date()); } this.SRules = []; @@ -2053,7 +2073,7 @@ export interface DocumentJson { */ export class Document extends hih.BaseModel { private _id?: number; - private _tranDate: moment.Moment = moment(); + private _tranDate: Date = new Date(); private _hid?: number; private _doctype?: number; private _trancurr = ''; @@ -2124,23 +2144,23 @@ export class Document extends hih.BaseModel { set ExgRate_Plan2(pl: boolean | undefined) { this._exgrate2Plan = pl; } - get TranDate(): moment.Moment { + get TranDate(): Date { return this._tranDate; } - set TranDate(td: moment.Moment) { + set TranDate(td: Date) { this._tranDate = td; } public Items: DocumentItem[] = []; get TranDateFormatString(): string { - return this._tranDate.format(hih.momentDateFormat); + return format(this._tranDate, hih.dateFormat); } constructor() { super(); - this.TranDate = moment(); + this.TranDate = new Date(); } public override onInit(): void { @@ -2321,7 +2341,7 @@ export class Document extends hih.BaseModel { if (fit.OrderId && fit.OrderId > 0 && context && context.Orders.length > 0) { const vordidx: number = context.Orders.findIndex((ord: Order) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return +fit.OrderId! === +ord!.Id! && this.TranDate.isBetween(ord.ValidFrom, ord.ValidTo); + return +fit.OrderId! === +ord!.Id! && ord.ValidFrom && ord.ValidTo && isWithinInterval(this.TranDate, { start: ord.ValidFrom, end: ord.ValidTo }); }); if (vordidx === -1) { @@ -2356,7 +2376,7 @@ export class Document extends hih.BaseModel { rstObj.ID = this.Id; rstObj.HomeID = this.HID; rstObj.DocType = this.DocType; - rstObj.TranDate = this._tranDate.format(hih.momentDateFormat); + rstObj.TranDate = format(this._tranDate, hih.dateFormat); rstObj.TranCurr = this.TranCurr; if (this.TranCurr2) { rstObj.TranCurr2 = this.TranCurr2; @@ -2397,7 +2417,7 @@ export class Document extends hih.BaseModel { this.DocType = +data.DocType; } if (data && data.TranDate) { - this.TranDate = moment(data.TranDate, hih.momentDateFormat); + this.TranDate = parse(data.TranDate, hih.dateFormat, new Date()); } if (data && data.TranCurr) { this.TranCurr = data.TranCurr; @@ -2785,7 +2805,7 @@ export class DocumentItem { * Tempalte docs base class */ export abstract class TemplateDocBase extends hih.BaseModel { - protected _tranDate?: moment.Moment; + protected _tranDate?: Date; protected _totalAmount = 0; protected _tranAmount = 0; protected _tranType?: number; @@ -2846,15 +2866,15 @@ export abstract class TemplateDocBase extends hih.BaseModel { set Desp(dsp: string) { this._desp = dsp; } - get TranDate(): moment.Moment | undefined { + get TranDate(): Date | undefined { return this._tranDate; } - set TranDate(td: moment.Moment | undefined) { + set TranDate(td: Date | undefined) { this._tranDate = td; } get TranDateFormatString(): string | null { if (this._tranDate) { - return this._tranDate.format(hih.momentDateFormat); + return format(this._tranDate, hih.dateFormat); } return null; } @@ -2868,13 +2888,13 @@ export abstract class TemplateDocBase extends hih.BaseModel { constructor() { super(); - this.TranDate = moment(); + this.TranDate = new Date(); } public override onInit(): void { super.onInit(); - this.TranDate = moment(); + this.TranDate = new Date(); } public override onVerify(context?: SafeAny): boolean { @@ -2894,7 +2914,7 @@ export abstract class TemplateDocBase extends hih.BaseModel { rstObj.HomeID = this.HID; rstObj.ReferenceDocumentID = this.RefDocId; rstObj.AccountID = this.AccountId; - rstObj.TransactionDate = this._tranDate?.format(hih.momentDateFormat) ?? ''; + rstObj.TransactionDate = this._tranDate ? format(this._tranDate, hih.dateFormat) : ''; rstObj.TransactionType = this.TranType; rstObj.TransactionAmount = this.TranAmount; rstObj.TranAmount = this.TranAmount; @@ -2925,7 +2945,7 @@ export abstract class TemplateDocBase extends hih.BaseModel { this.AccountId = +data.AccountID; } if (data && data.TransactionDate) { - this.TranDate = moment(data.TransactionDate, hih.momentDateFormat); + this.TranDate = parse(data.TransactionDate, hih.dateFormat, new Date()); } if (data && data.TransactionType) { this.TranType = +data.TransactionType; @@ -3016,8 +3036,8 @@ export class Plan extends hih.BaseModel { private _accountCtgyID?: number; private _ccID?: number; private _tranTypeID?: number; - private _startDate?: moment.Moment; - private _targetDate?: moment.Moment; + private _startDate?: Date; + private _targetDate?: Date; private _tagetBalance = 0; private _tranCurr = ''; private _description = ''; @@ -3064,23 +3084,23 @@ export class Plan extends hih.BaseModel { set TranTypeID(ttid: number | undefined) { this._tranTypeID = ttid; } - get StartDate(): moment.Moment | undefined { + get StartDate(): Date | undefined { return this._startDate; } - set StartDate(sd: moment.Moment | undefined) { + set StartDate(sd: Date | undefined) { this._startDate = sd; } get StartDateString(): string { - return this._startDate ? this._startDate.format(hih.momentDateFormat) : ''; + return this._startDate ? format(this._startDate, hih.dateFormat) : ''; } - get TargetDate(): moment.Moment | undefined { + get TargetDate(): Date | undefined { return this._targetDate; } - set TargetDate(td: moment.Moment | undefined) { + set TargetDate(td: Date | undefined) { this._targetDate = td; } get TargetDateString(): string { - return this._targetDate ? this._targetDate.format(hih.momentDateFormat) : ''; + return this._targetDate ? format(this._targetDate, hih.dateFormat) : ''; } get TargetBalance(): number { return this._tagetBalance; @@ -3108,19 +3128,19 @@ export class Plan extends hih.BaseModel { public override onInit(): void { super.onInit(); - this._startDate = moment().startOf('day'); - this._targetDate = moment().add(1, 'y').startOf('day'); + this._startDate = startOfDay(new Date()); + this._targetDate = startOfDay(addYears(new Date(), 1)); } public override onVerify(context?: SafeAny): boolean { let bsuccess = super.onVerify(context); if (bsuccess) { // Check dates - const today: moment.Moment = moment(); - if (today.isAfter(this.TargetDate)) { + const today: Date = new Date(); + if (this.TargetDate && isAfter(today, this.TargetDate)) { this._addMessage(hih.MessageType.Error, 'Common.InvalidDate', 'Common.InvalidDate'); bsuccess = false; } - if (this.StartDate && this.StartDate.isSameOrAfter(this.TargetDate)) { + if (this.StartDate && this.TargetDate && !isBefore(this.StartDate, this.TargetDate)) { this._addMessage(hih.MessageType.Error, 'Common.InvalidDate', 'Common.InvalidDate'); bsuccess = false; } @@ -3151,8 +3171,8 @@ export class Plan extends hih.BaseModel { default: break; } - rstObj.StartDate = this.StartDate?.format(hih.momentDateFormat); - rstObj.TargetDate = this.TargetDate?.format(hih.momentDateFormat); + rstObj.StartDate = this.StartDate ? format(this.StartDate, hih.dateFormat) : undefined; + rstObj.TargetDate = this.TargetDate ? format(this.TargetDate, hih.dateFormat) : undefined; rstObj.TargetBalance = this.TargetBalance; rstObj.TranCurr = this.TranCurrency; rstObj.Description = this.Description; @@ -3186,10 +3206,10 @@ export class Plan extends hih.BaseModel { this.ControlCenterID = data.ControlCenterID; } if (data && data.StartDate) { - this.StartDate = moment(data.StartDate, hih.momentDateFormat); + this.StartDate = parse(data.StartDate, hih.dateFormat, new Date()); } if (data && data.TargetDate) { - this.TargetDate = moment(data.TargetDate, hih.momentDateFormat); + this.TargetDate = parse(data.TargetDate, hih.dateFormat, new Date()); } if (data && data.TargetBalance) { this.TargetBalance = data.TargetBalance; @@ -3454,7 +3474,7 @@ export class TranTypeReport { this._tranAmount = tamt; } - public TranDate?: moment.Moment; + public TranDate?: Date; public onSetData(data: SafeAny): void { if (data && data.tranType) { @@ -3467,7 +3487,7 @@ export class TranTypeReport { this.ExpenseFlag = data.expenseFlag; } if (data && data.tranDate) { - this.TranDate = moment(data.tranDate, hih.momentDateFormat); + this.TranDate = parse(data.tranDate, hih.dateFormat, new Date()); } if (data && data.tranAmount) { this.TranAmount = +data.tranAmount; @@ -3507,7 +3527,7 @@ export enum ReportTrendExTypeEnum { } export class ReportTrendExData { - tranDate?: moment.Moment; + tranDate?: Date; tranWeek?: number; tranMonth?: number; tranYear?: number; @@ -3516,7 +3536,7 @@ export class ReportTrendExData { public onSetData(data: SafeAny): void { if (data && data.tranDate) { - this.tranDate = moment(data.tranDate, hih.momentDateFormat); + this.tranDate = parse(data.tranDate, hih.dateFormat, new Date()); } if (data && data.tranWeek) { this.tranWeek = data.tranWeek; @@ -3540,7 +3560,7 @@ export class ReportTrendExData { * Document item with balance */ export class DocumentItemWithBalance { - private _tranDate: moment.Moment = moment(); + private _tranDate: Date = new Date(); public TranType_Exp = false; public TranCurr = ''; public TranAmount = 0; @@ -3561,14 +3581,14 @@ export class DocumentItemWithBalance { public TranTypeName = ''; public ControlCenterName = ''; public OrderName = ''; - get TranDate(): moment.Moment { + get TranDate(): Date { return this._tranDate; } - set TranDate(td: moment.Moment) { + set TranDate(td: Date) { this._tranDate = td; } get TranDateFormatString(): string { - return this._tranDate.format(hih.momentDateFormat); + return format(this._tranDate, hih.dateFormat); } public onSetData(data: SafeAny): void { @@ -3604,7 +3624,7 @@ export class DocumentItemWithBalance { this.OrderName = data.orderName; } if (data && data.tranDate) { - this.TranDate = moment(data.tranDate, hih.momentDateFormat); + this.TranDate = parse(data.tranDate, hih.dateFormat, new Date()); } if (data && data.docDesp) { this.DocDesp = data.docDesp; @@ -3643,9 +3663,9 @@ export class DocumentWithPlanExgRate { public HID?: number; public DocID?: number; public DocType?: number; - public TranDate: moment.Moment = moment(); + public TranDate: Date = new Date(); get TranDateDisplayString(): string { - return this.TranDate.format(hih.momentDateFormat); + return format(this.TranDate, hih.dateFormat); } public Desp = ''; public TranCurr = ''; @@ -3667,7 +3687,7 @@ export class DocumentWithPlanExgRate { this.DocType = +jdata.docType; } if (jdata && jdata.tranDate) { - this.TranDate = moment(jdata.tranDate, hih.momentDateFormat); + this.TranDate = parse(jdata.tranDate, hih.dateFormat, new Date()); } if (jdata && jdata.desp) { this.Desp = jdata.desp; @@ -3816,7 +3836,7 @@ export class FinanceAssetValChgDocumentAPI extends FinanceAssetDocumentAPIBase { // Normal document Mass Create export class FinanceNormalDocItemMassCreate { - public tranDate: moment.Moment = moment(); + public tranDate: Date = new Date(); public accountID = 0; public tranType = 0; public tranAmount = 0; @@ -3923,11 +3943,11 @@ export class FinanceReportEntryMoM extends FinanceReportEntry { } export class FinanceReportEntryPerDate extends FinanceReportEntry { - public transactionDate: moment.Moment = moment(); + public transactionDate: Date = new Date(); public override onSetData(val: SafeAny): void { super.onSetData(val); if (val && val.TransactionDate) { - this.transactionDate = moment(val.TransactionDate, hih.momentDateFormat); + this.transactionDate = parse(val.TransactionDate, hih.dateFormat, new Date()); } } } @@ -4039,8 +4059,8 @@ export class FinanceOverviewKeyfigure { // Filter for Tmp Doc. export interface FinanceTmpDPDocFilter { - TransactionDateBegin?: moment.Moment; - TransactionDateEnd?: moment.Moment; + TransactionDateBegin?: Date; + TransactionDateEnd?: Date; ReferenceDocumentID?: number; IsPosted?: boolean; AccountID?: number; @@ -4048,8 +4068,8 @@ export interface FinanceTmpDPDocFilter { // Filter for Loan Doc. export interface FinanceTmpLoanDocFilter { - TransactionDateBegin?: moment.Moment; - TransactionDateEnd?: moment.Moment; + TransactionDateBegin?: Date; + TransactionDateEnd?: Date; ReferenceDocumentID?: number; IsPosted?: boolean; AccountID?: number; @@ -4061,7 +4081,7 @@ export interface FinanceTmpLoanDocFilter { export interface FinanceAssetDepreicationResult { HID: number; AssetAccountID: number; - TranDate?: moment.Moment; + TranDate?: Date; TranAmount?: number; TranCurr?: string; } diff --git a/src/app/model/homedef.ts b/src/app/model/homedef.ts index 8cdec57c..66fba3ce 100644 --- a/src/app/model/homedef.ts +++ b/src/app/model/homedef.ts @@ -1,4 +1,4 @@ -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { SafeAny } from '@common/any'; import * as hih from './common'; @@ -292,13 +292,13 @@ export class HomeMsg { private _usrtoDisplayAs = ''; private _usrfrom = ''; private _usrfromDisplayAs = ''; - private _senddate: moment.Moment; + private _senddate: Date; private _readflag = false; private _title = ''; private _content = ''; constructor() { - this._senddate = moment(); + this._senddate = new Date(); } get HID(): number { @@ -337,14 +337,14 @@ export class HomeMsg { set UserFromDisplayAs(uds: string) { this._usrfromDisplayAs = uds; } - get SendDate(): moment.Moment { + get SendDate(): Date { return this._senddate; } - set SendDate(sd: moment.Moment) { + set SendDate(sd: Date) { this._senddate = sd; } get SendDateFormatString(): string { - return this._senddate.format(hih.momentDateFormat); + return format(this._senddate, hih.dateFormat); } get Title(): string { return this._title; @@ -385,7 +385,7 @@ export class HomeMsg { this._usrfromDisplayAs = data.userFrom_DisplayAs; } if (data && data.sendDate) { - this._senddate = moment(data.sendDate, hih.momentDateFormat); + this._senddate = parse(data.sendDate, hih.dateFormat, new Date()); } if (data && data.title) { this._title = data.title; @@ -403,7 +403,7 @@ export class HomeMsg { hid: this._hid, userFrom: this._usrfrom, userTo: this._usrto, - sendDate: this._senddate.format(hih.momentDateFormat), + sendDate: format(this._senddate, hih.dateFormat), title: this._title, content: this._content, readFlag: this._readflag, diff --git a/src/app/model/librarymodel.spec.ts b/src/app/model/librarymodel.spec.ts index 8a71b09e..b77ffb17 100644 --- a/src/app/model/librarymodel.spec.ts +++ b/src/app/model/librarymodel.spec.ts @@ -2,7 +2,7 @@ // Unit test for librarymodel.ts // -import moment from 'moment'; +import { addMonths } from 'date-fns'; import { Location, BookCategory, @@ -688,8 +688,8 @@ describe('BookBorrowRecord', () => { objtbt.HID = 2; objtbt.User = 'test'; objtbt.BorrowFrom = 1; - objtbt.FromDate = moment(); - objtbt.ToDate = moment().add(1, 'month'); + objtbt.FromDate = new Date(); + objtbt.ToDate = addMonths(new Date(), 1); objtbt.onInit(); expect(objtbt.ID).toEqual(0); expect(objtbt.HID).toBeFalsy(); @@ -719,13 +719,13 @@ describe('BookBorrowRecord', () => { expect(vrst).toBe(true); expect(objtbt.VerifiedMsgs.length).toEqual(0); - objtbt.FromDate = moment(); - objtbt.ToDate = moment().add(-2, 'month'); + objtbt.FromDate = new Date(); + objtbt.ToDate = addMonths(new Date(), -2); vrst = objtbt.onVerify(); expect(vrst).toBe(false); expect(objtbt.VerifiedMsgs.length).toBeGreaterThan(0); - objtbt.ToDate = moment().add(1, 'days'); + objtbt.ToDate = new Date(Date.now() + 1 * 24 * 60 * 60 * 1000); // add 1 day vrst = objtbt.onVerify(); expect(vrst).toBe(true); expect(objtbt.VerifiedMsgs.length).toEqual(0); @@ -736,8 +736,8 @@ describe('BookBorrowRecord', () => { objtbt.HID = 2; objtbt.User = 'test'; objtbt.BorrowFrom = 1; - objtbt.FromDate = moment(); - objtbt.ToDate = moment().add(1, 'month'); + objtbt.FromDate = new Date(); + objtbt.ToDate = addMonths(new Date(), 1); objtbt.Comment = 'test'; objtbt.HasReturned = true; const jsonobj = objtbt.writeJSONObject(); diff --git a/src/app/model/librarymodel.ts b/src/app/model/librarymodel.ts index b7e68144..967fcf9f 100644 --- a/src/app/model/librarymodel.ts +++ b/src/app/model/librarymodel.ts @@ -1,5 +1,5 @@ import { Dictionary } from 'actslib'; -import moment from 'moment'; +import { format, parse, isAfter } from 'date-fns'; import { SafeAny } from '@common/any'; import * as hih from './common'; @@ -907,8 +907,8 @@ export class BookBorrowRecord extends hih.BaseModel { private _bookid?: number; private _user = ''; private _from_org: number | null = null; - private _from_date: moment.Moment | null = null; - private _to_date: moment.Moment | null = null; + private _from_date: Date | null = null; + private _to_date: Date | null = null; private _has_return = false; private _cmt = ''; @@ -942,16 +942,16 @@ export class BookBorrowRecord extends hih.BaseModel { set BorrowFrom(bwf: number | null) { this._from_org = bwf; } - get FromDate(): moment.Moment | null { + get FromDate(): Date | null { return this._from_date; } - set FromDate(fdt: moment.Moment | null) { + set FromDate(fdt: Date | null) { this._from_date = fdt; } - get ToDate(): moment.Moment | null { + get ToDate(): Date | null { return this._to_date; } - set ToDate(fdt: moment.Moment | null) { + set ToDate(fdt: Date | null) { this._to_date = fdt; } get HasReturned(): boolean { @@ -975,13 +975,13 @@ export class BookBorrowRecord extends hih.BaseModel { get FromDateString(): string { if (this._from_date) { - return this._from_date.format(hih.momentDateFormat); + return format(this._from_date, hih.dateFormat); } return ''; } get ToDateString(): string { if (this._to_date) { - return this._to_date.format(hih.momentDateFormat); + return format(this._to_date, hih.dateFormat); } return ''; } @@ -1022,7 +1022,7 @@ export class BookBorrowRecord extends hih.BaseModel { } if (this._from_date !== null && this._to_date !== null) { - if (this._from_date.isAfter(this._to_date)) { + if (isAfter(this._from_date, this._to_date)) { vrst = false; const msg = new hih.InfoMessage(hih.MessageType.Error, 'ToDate is must', 'ToDate is must'); this.VerifiedMsgs.push(msg); @@ -1050,10 +1050,10 @@ export class BookBorrowRecord extends hih.BaseModel { rstobj.FromOrganization = this._from_org; } if (this._from_date) { - rstobj.FromDate = this._from_date.format(hih.momentDateFormat); + rstobj.FromDate = format(this._from_date, hih.dateFormat); } if (this._to_date) { - rstobj.ToDate = this._to_date.format(hih.momentDateFormat); + rstobj.ToDate = format(this._to_date, hih.dateFormat); } rstobj.IsReturned = this._has_return; if (this._cmt) { @@ -1080,10 +1080,10 @@ export class BookBorrowRecord extends hih.BaseModel { this.BorrowFrom = data.FromOrganization; } if (data && data.FromDate) { - this.FromDate = moment(data.FromDate); + this.FromDate = parse(data.FromDate, hih.dateFormat, new Date()); } if (data && data.ToDate) { - this.ToDate = moment(data.ToDate); + this.ToDate = parse(data.ToDate, hih.dateFormat, new Date()); } if (data && data.IsReturned) { this.HasReturned = true; diff --git a/src/app/model/uicommon.spec.ts b/src/app/model/uicommon.spec.ts index f77d3972..c01bf713 100644 --- a/src/app/model/uicommon.spec.ts +++ b/src/app/model/uicommon.spec.ts @@ -2,8 +2,9 @@ // Unit test for utility.ts // -import moment from 'moment'; +import { parse } from 'date-fns'; import { Order } from './financemodel'; +import { dateFormat } from './common'; import { UIDisplayStringUtil, UIDisplayString, @@ -403,26 +404,26 @@ describe('BuildupOrderForSelectionEx', () => { let ord = new Order(); ord.Name = 'Test1'; ord.Id = 1; - ord.ValidFrom = moment('20210101'); - ord.ValidTo = moment('20211231'); + ord.ValidFrom = parse('2021-01-01', dateFormat, new Date()); + ord.ValidTo = parse('2021-12-31', dateFormat, new Date()); arorders.push(ord); ord = new Order(); ord.Name = 'Test2'; ord.Id = 2; - ord.ValidFrom = moment('20220101'); - ord.ValidTo = moment('20221231'); + ord.ValidFrom = parse('2022-01-01', dateFormat, new Date()); + ord.ValidTo = parse('2022-12-31', dateFormat, new Date()); arorders.push(ord); }); it('Order in 2021', () => { - let uiords = BuildupOrderForSelectionEx(arorders, moment('20210601')); + let uiords = BuildupOrderForSelectionEx(arorders, parse('2021-06-01', dateFormat, new Date())); expect(uiords.length).toEqual(1); expect(uiords[0].Id).toEqual(1); }); it('Order in 2022', () => { - let uiords = BuildupOrderForSelectionEx(arorders, moment('20220601')); + let uiords = BuildupOrderForSelectionEx(arorders, parse('2022-06-01', dateFormat, new Date())); expect(uiords.length).toEqual(1); expect(uiords[0].Id).toEqual(2); }); diff --git a/src/app/model/uicommon.ts b/src/app/model/uicommon.ts index 7646299a..18b7ffd7 100644 --- a/src/app/model/uicommon.ts +++ b/src/app/model/uicommon.ts @@ -15,7 +15,7 @@ import { financeAccountCategoryLendTo, } from './financemodel'; import { HomeMemberRelationEnum } from './homedef'; -import moment from 'moment'; +import { isBefore } from 'date-fns'; import { LocationTypeEnum } from './librarymodel'; import { SafeAny } from '@common/any'; @@ -988,8 +988,8 @@ export function BuildupAccountForSelection( export class UIOrderForSelection { public Id = 0; public Name = ''; - public _validFrom: moment.Moment = moment(); - public _validTo: moment.Moment = moment(); + public _validFrom: Date = new Date(); + public _validTo: Date = new Date(); } /** @@ -999,6 +999,7 @@ export class UIOrderForSelection { */ export function BuildupOrderForSelection(orders: Order[], skipinv?: boolean): UIOrderForSelection[] { const arrst: UIOrderForSelection[] = []; + const now = new Date(); if (orders && orders.length > 0) { for (const ord of orders) { @@ -1007,12 +1008,12 @@ export function BuildupOrderForSelection(orders: Order[], skipinv?: boolean): UI rst.Id = ord.Id; } rst.Name = ord.Name; - rst._validFrom = ord.ValidFrom?.clone() ?? moment(); - rst._validTo = ord.ValidTo?.clone() ?? moment(); + rst._validFrom = ord.ValidFrom ?? new Date(); + rst._validTo = ord.ValidTo ?? new Date(); // Skip some categories if (skipinv) { - if (rst._validFrom > moment() || rst._validTo < moment()) { + if (rst._validFrom > now || rst._validTo < now) { continue; } } @@ -1027,9 +1028,9 @@ export function BuildupOrderForSelection(orders: Order[], skipinv?: boolean): UI /** * Buildup orders for select * @param orders Orders - * @param momentCreation moment of creation + * @param dateCreation date of creation */ -export function BuildupOrderForSelectionEx(orders: Order[], momentCreation: moment.Moment): UIOrderForSelection[] { +export function BuildupOrderForSelectionEx(orders: Order[], dateCreation: Date): UIOrderForSelection[] { const arrst: UIOrderForSelection[] = []; if (orders && orders.length > 0) { @@ -1039,11 +1040,11 @@ export function BuildupOrderForSelectionEx(orders: Order[], momentCreation: mome rst.Id = ord.Id; } rst.Name = ord.Name; - rst._validFrom = ord.ValidFrom?.clone() ?? moment(); - rst._validTo = ord.ValidTo?.clone() ?? moment(); + rst._validFrom = ord.ValidFrom ?? new Date(); + rst._validTo = ord.ValidTo ?? new Date(); // Skip some orders - if (rst._validFrom.isSameOrAfter(momentCreation) || rst._validTo.isBefore(momentCreation)) { + if (!isBefore(rst._validFrom, dateCreation) || isBefore(rst._validTo, dateCreation)) { continue; } diff --git a/src/app/model/utility.spec.ts b/src/app/model/utility.spec.ts index e6355ca9..d02187aa 100644 --- a/src/app/model/utility.spec.ts +++ b/src/app/model/utility.spec.ts @@ -2,7 +2,6 @@ // Unit test for utility.ts // -import moment from 'moment'; import { DocumentItem } from './financemodel'; import { ModelUtility } from './utility'; @@ -76,11 +75,11 @@ describe('Unit test for ModelUtility in Model', () => { }); it('#11. Utility.getDateDisplayString', () => { - let curdate: moment.Moment | undefined; + let curdate: Date | undefined; let tgtstr = ModelUtility.getDateDisplayString(curdate); expect(tgtstr).toEqual(''); - curdate = moment(); + curdate = new Date(); tgtstr = ModelUtility.getDateDisplayString(curdate); expect(tgtstr).not.toEqual(''); }); diff --git a/src/app/model/utility.ts b/src/app/model/utility.ts index 2feffb90..ccb74c29 100644 --- a/src/app/model/utility.ts +++ b/src/app/model/utility.ts @@ -1,4 +1,5 @@ -import { dateSplitChar, LogLevel, momentDateFormat } from './common'; +import { dateSplitChar, LogLevel, dateFormat } from './common'; +import { format } from 'date-fns'; import { DocumentItem } from './financemodel'; import { environment } from '../../environments/environment'; @@ -157,8 +158,8 @@ export class ModelUtility { * Get a display string for a date * @param dateInput: Inputted date */ - public static getDateDisplayString(dateInput?: moment.Moment): string { - return dateInput ? dateInput.format(momentDateFormat) : ''; + public static getDateDisplayString(dateInput?: Date): string { + return dateInput ? format(dateInput, dateFormat) : ''; } /** diff --git a/src/app/pages/credits/credits.component.ts b/src/app/pages/credits/credits.component.ts index f3a1cb62..2897fd6d 100644 --- a/src/app/pages/credits/credits.component.ts +++ b/src/app/pages/credits/credits.component.ts @@ -42,9 +42,9 @@ export class CreditsComponent { desp: 'The internationalization (i18n) library for Angular.', }, { - name: 'Moment.js', - url: 'https://momentjs.com/', - desp: 'Parse, validate, manipulate, and display dates and times in JavaScript', + name: 'date-fns', + url: 'https://date-fns.org/', + desp: 'Modern JavaScript date utility library', }, { name: '.NET', diff --git a/src/app/pages/event/normal-event-detail/normal-event-detail.component.ts b/src/app/pages/event/normal-event-detail/normal-event-detail.component.ts index f99733b6..ab36c6f0 100644 --- a/src/app/pages/event/normal-event-detail/normal-event-detail.component.ts +++ b/src/app/pages/event/normal-event-detail/normal-event-detail.component.ts @@ -6,7 +6,8 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NzModalService } from 'ng-zorro-antd/modal'; import { UIMode, isUIEditable } from 'actslib'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '../../../model'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzSpinModule } from 'ng-zorro-antd/spin'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; @@ -117,7 +118,7 @@ export class NormalEventDetailComponent implements OnInit, OnDestroy { this.detailFormGroup.get('idControl')?.setValue(e.ID); this.detailFormGroup.get('nameControl')?.setValue(e.Name); - this.detailFormGroup.get('dateControl')?.setValue([e.StartDate?.toDate(), e.EndDate?.toDate()]); + this.detailFormGroup.get('dateControl')?.setValue([e.StartDate, e.EndDate]); this.detailFormGroup.get('contentControl')?.setValue(e.Content); if (this.uiMode === UIMode.Display) { @@ -177,10 +178,10 @@ export class NormalEventDetailComponent implements OnInit, OnDestroy { // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateControl')?.value; if (startdt) { - objtbo.StartDate = moment(startdt); + objtbo.StartDate = new Date(startdt); } if (enddt) { - objtbo.EndDate = moment(enddt); + objtbo.EndDate = new Date(enddt); } objtbo.HID = this.homeService.ChosedHome?.ID ?? 0; objtbo.Content = this.detailFormGroup.get('contentControl')?.value; diff --git a/src/app/pages/event/normal-event/normal-event-detail/normal-event-detail.component.ts b/src/app/pages/event/normal-event/normal-event-detail/normal-event-detail.component.ts index b247a4ae..c17232df 100644 --- a/src/app/pages/event/normal-event/normal-event-detail/normal-event-detail.component.ts +++ b/src/app/pages/event/normal-event/normal-event-detail/normal-event-detail.component.ts @@ -6,7 +6,8 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NzModalService, NzModalModule } from 'ng-zorro-antd/modal'; import { UIMode, isUIEditable } from 'actslib'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '../../../../model'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzFormModule } from 'ng-zorro-antd/form'; @@ -116,7 +117,7 @@ export class NormalEventDetailComponent implements OnInit, OnDestroy { this.detailFormGroup.get('idControl')?.setValue(e.ID); this.detailFormGroup.get('nameControl')?.setValue(e.Name); - this.detailFormGroup.get('dateControl')?.setValue([e.StartDate?.toDate(), e.EndDate?.toDate()]); + this.detailFormGroup.get('dateControl')?.setValue([e.StartDate, e.EndDate]); this.detailFormGroup.get('contentControl')?.setValue(e.Content); if (this.uiMode === UIMode.Display) { @@ -176,10 +177,10 @@ export class NormalEventDetailComponent implements OnInit, OnDestroy { // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateControl')?.value; if (startdt) { - objtbo.StartDate = moment(startdt); + objtbo.StartDate = new Date(startdt); } if (enddt) { - objtbo.EndDate = moment(enddt); + objtbo.EndDate = new Date(enddt); } objtbo.HID = this.homeService.ChosedHome?.ID ?? 0; objtbo.Content = this.detailFormGroup.get('contentControl')?.value; diff --git a/src/app/pages/event/recur-event-detail/recur-event-detail.component.ts b/src/app/pages/event/recur-event-detail/recur-event-detail.component.ts index 74a1b1ce..7a72a510 100644 --- a/src/app/pages/event/recur-event-detail/recur-event-detail.component.ts +++ b/src/app/pages/event/recur-event-detail/recur-event-detail.component.ts @@ -6,7 +6,8 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NzModalService } from 'ng-zorro-antd/modal'; import { UIMode, isUIEditable } from 'actslib'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '../../../model'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzButtonModule } from 'ng-zorro-antd/button'; @@ -134,7 +135,7 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { this.detailFormGroup.get('idControl')?.setValue(e.ID); this.detailFormGroup.get('nameControl')?.setValue(e.Name); - this.detailFormGroup.get('dateControl')?.setValue([e.StartDate?.toDate(), e.EndDate?.toDate()]); + this.detailFormGroup.get('dateControl')?.setValue([e.StartDate, e.EndDate]); this.detailFormGroup.get('contentControl')?.setValue(e.Content); if (this.uiMode === UIMode.Display) { @@ -185,8 +186,8 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { const dtrange = this.detailFormGroup.get('dateControl')?.value as SafeAny[]; const datinput: RepeatedDatesAPIInput = { - StartDate: moment(dtrange[0] as Date), - EndDate: moment(dtrange[1] as Date), + StartDate: new Date(dtrange[0] as Date), + EndDate: new Date(dtrange[1] as Date), RepeatType: this.detailFormGroup.get('frqControl')?.value as RepeatFrequencyEnum, }; this.financeService.getRepeatedDates(datinput).subscribe({ @@ -230,10 +231,10 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateControl')?.value; if (startdt) { - objtbo.StartDate = moment(startdt); + objtbo.StartDate = new Date(startdt); } if (enddt) { - objtbo.EndDate = moment(enddt); + objtbo.EndDate = new Date(enddt); } objtbo.HID = this.homeService.ChosedHome?.ID ?? 0; objtbo.Content = this.detailFormGroup.get('contentControl')?.value; diff --git a/src/app/pages/event/recur-event/recur-event-detail/recur-event-detail.component.ts b/src/app/pages/event/recur-event/recur-event-detail/recur-event-detail.component.ts index 132cd078..87a0d270 100644 --- a/src/app/pages/event/recur-event/recur-event-detail/recur-event-detail.component.ts +++ b/src/app/pages/event/recur-event/recur-event-detail/recur-event-detail.component.ts @@ -7,7 +7,8 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NzModalService, NzModalModule } from 'ng-zorro-antd/modal'; import { UIMode, isUIEditable } from 'actslib'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '../../../../model'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzFormModule } from 'ng-zorro-antd/form'; @@ -140,7 +141,7 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { this.detailFormGroup.get('idControl')?.setValue(e.ID); this.detailFormGroup.get('nameControl')?.setValue(e.Name); - this.detailFormGroup.get('dateControl')?.setValue([e.StartDate?.toDate(), e.EndDate?.toDate()]); + this.detailFormGroup.get('dateControl')?.setValue([e.StartDate, e.EndDate]); this.detailFormGroup.get('contentControl')?.setValue(e.Content); if (this.uiMode === UIMode.Display) { @@ -191,8 +192,8 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { const dtrange = this.detailFormGroup.get('dateControl')?.value as SafeAny[]; const datinput: RepeatedDatesAPIInput = { - StartDate: moment(dtrange[0] as Date), - EndDate: moment(dtrange[1] as Date), + StartDate: new Date(dtrange[0] as Date), + EndDate: new Date(dtrange[1] as Date), RepeatType: this.detailFormGroup.get('frqControl')?.value as RepeatFrequencyEnum, }; this.financeService.getRepeatedDates(datinput).subscribe({ @@ -236,10 +237,10 @@ export class RecurEventDetailComponent implements OnInit, OnDestroy { // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateControl')?.value; if (startdt) { - objtbo.StartDate = moment(startdt); + objtbo.StartDate = new Date(startdt); } if (enddt) { - objtbo.EndDate = moment(enddt); + objtbo.EndDate = new Date(enddt); } objtbo.HID = this.homeService.ChosedHome?.ID ?? 0; objtbo.Content = this.detailFormGroup.get('contentControl')?.value; diff --git a/src/app/pages/finance/account-reconcile/reconcile-by-month/reconcile-by-month.component.ts b/src/app/pages/finance/account-reconcile/reconcile-by-month/reconcile-by-month.component.ts index c2a0ef34..c0cb1ff6 100644 --- a/src/app/pages/finance/account-reconcile/reconcile-by-month/reconcile-by-month.component.ts +++ b/src/app/pages/finance/account-reconcile/reconcile-by-month/reconcile-by-month.component.ts @@ -3,7 +3,8 @@ import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { endOfMonth, parse } from 'date-fns'; +import { dateFormat } from '@model/index'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzDividerModule } from 'ng-zorro-antd/divider'; @@ -180,9 +181,7 @@ export class ReconcileByMonthComponent implements OnInit, AfterViewInit, OnDestr if (results) { const results2: AccountReconcileExpect[] = results.map((origin) => { const rst = new AccountReconcileExpect(); - rst.currentMonth = moment(origin.Month + '-01') - .endOf('M') - .toDate(); + rst.currentMonth = endOfMonth(parse(origin.Month + '-01', dateFormat, new Date())); rst.expectedAmount = origin.Amount; return rst; }); @@ -232,7 +231,7 @@ export class ReconcileByMonthComponent implements OnInit, AfterViewInit, OnDestr this.listExpectResult.forEach((rst) => { const cmprst = new AccountReconcileCompare(); - cmprst.currentMonth = moment(rst.currentMonthStr).toDate(); + cmprst.currentMonth = parse(rst.currentMonthStr, dateFormat, new Date()); cmprst.expectedAmount = rst.expectedAmount; cmprst.actualAmount = 0; @@ -241,7 +240,7 @@ export class ReconcileByMonthComponent implements OnInit, AfterViewInit, OnDestr this.compareResult.push(cmprst); const newexprst = new AccountReconcileExpect(); - newexprst.currentMonth = moment(rst.currentMonthStr).toDate(); + newexprst.currentMonth = parse(rst.currentMonthStr, dateFormat, new Date()); newexprst.expectedAmount = rst.expectedAmount; this.prvSentInfo?.inputtedExpectResult.push(newexprst); }); diff --git a/src/app/pages/finance/account/account-detail/account-detail.component.ts b/src/app/pages/finance/account/account-detail/account-detail.component.ts index cdcb9fd0..1acb871b 100644 --- a/src/app/pages/finance/account/account-detail/account-detail.component.ts +++ b/src/app/pages/finance/account/account-detail/account-detail.component.ts @@ -6,7 +6,7 @@ import { takeUntil } from 'rxjs/operators'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { UIMode, isUIEditable } from 'actslib'; -import moment from 'moment'; +import { format } from 'date-fns'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzSpinModule } from 'ng-zorro-antd/spin'; import { NzButtonModule } from 'ng-zorro-antd/button'; @@ -54,6 +54,7 @@ import { BuildupOrderForSelection, financeTranTypeOpeningAsset, financeTranTypeOpeningLiability, + dateFormat, } from '@model/index'; import { HomeDefOdataService, FinanceOdataService } from '@services/index'; import { costObjectValidator } from '@uimodel/index'; @@ -489,7 +490,7 @@ export class AccountDetailComponent implements OnInit, AfterViewInit, OnDestroy doc.DocType = financeDocTypeNormal; doc.HID = this.homeSevice.ChosedHome?.ID; doc.TranCurr = this.homeSevice.ChosedHome?.BaseCurrency ?? ''; - doc.TranDate = moment(this.amountFormGroup.get('dateControl')?.value as Date); + doc.TranDate = new Date(this.amountFormGroup.get('dateControl')?.value as Date); const docitem: DocumentItem = new DocumentItem(); docitem.AccountId = nacntid; docitem.Desp = doc.Desp; diff --git a/src/app/pages/finance/account/account-extra-asset/account-extra-asset.component.ts b/src/app/pages/finance/account/account-extra-asset/account-extra-asset.component.ts index bf4fd77d..00e63d73 100644 --- a/src/app/pages/finance/account/account-extra-asset/account-extra-asset.component.ts +++ b/src/app/pages/finance/account/account-extra-asset/account-extra-asset.component.ts @@ -13,7 +13,7 @@ import { ReactiveFormsModule, } from '@angular/forms'; import { Router, RouterModule } from '@angular/router'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { SafeAny } from '@common/any'; import { AssetCategory, ConsoleLogTypeEnum, ModelUtility, AccountExtraAsset } from '@model/index'; @@ -91,11 +91,11 @@ export class AccountExtraAssetComponent implements OnInit, ControlValueAccessor, } controlVal = this.assetInfoFormGroup.get('boughtDateControl')?.value; if (controlVal) { - insobj.BoughtDate = moment(controlVal); + insobj.BoughtDate = new Date(controlVal); } controlVal = this.assetInfoFormGroup.get('expiredDateControl')?.value; if (controlVal) { - insobj.ExpiredDate = moment(controlVal); + insobj.ExpiredDate = new Date(controlVal); } controlVal = this.assetInfoFormGroup.get('residualValueControl')?.value; if (controlVal) { @@ -192,10 +192,10 @@ export class AccountExtraAssetComponent implements OnInit, ControlValueAccessor, this.assetInfoFormGroup.get('nameControl')?.setValue(val.Name); this.assetInfoFormGroup.get('commentControl')?.setValue(val.Comment); if (val.BoughtDate) { - this.assetInfoFormGroup.get('boughtDateControl')?.setValue(val.BoughtDate.toDate()); + this.assetInfoFormGroup.get('boughtDateControl')?.setValue(val.BoughtDate); } if (val.ExpiredDate) { - this.assetInfoFormGroup.get('expiredDateControl')?.setValue(val.ExpiredDate.toDate()); + this.assetInfoFormGroup.get('expiredDateControl')?.setValue(val.ExpiredDate); } if (val.ResidualValue) { this.assetInfoFormGroup.get('residualValueControl')?.setValue(val.ResidualValue); diff --git a/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.spec.ts b/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.spec.ts index 3acc8fb1..8a8cdf3b 100644 --- a/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.spec.ts +++ b/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.spec.ts @@ -10,7 +10,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { OverlayContainer } from '@angular/cdk/overlay'; import { BehaviorSubject, of } from 'rxjs'; import { ViewChild, Component } from '@angular/core'; -import moment from 'moment'; +import { addMonths } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { AccountExtraDownpaymentComponent } from './account-extra-downpayment.component'; @@ -116,7 +116,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; testcomponent.formGroup.get('extraControl')?.setValue(dp1); await new Promise(r => setTimeout(r, 0)); @@ -128,7 +128,7 @@ describe('AccountExtraDownpaymentComponent', () => { const dpval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraAdvancePayment; expect(dpval2.StartDate).toBeTruthy(); - expect(dpval2.StartDate.isSame(startdt)).toBeTruthy(); + expect(dpval2.StartDate.getTime()).toEqual(startdt.getTime()); expect(dpval2.RepeatType).toBeFalsy(); expect(dpval2.Comment).toBeFalsy(); expect(dpval2.RefDocId).toBeFalsy(); @@ -145,7 +145,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; testcomponent.formGroup.get('extraControl')?.setValue(dp1); @@ -159,7 +159,7 @@ describe('AccountExtraDownpaymentComponent', () => { const dpval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraAdvancePayment; expect(dpval2.StartDate).toBeTruthy(); - expect(dpval2.StartDate.isSame(startdt)).toBeTruthy(); + expect(dpval2.StartDate.getTime()).toEqual(startdt.getTime()); expect(dpval2.RepeatType).toEqual(dp1.RepeatType); expect(dpval2.Comment).toBeFalsy(); expect(dpval2.RefDocId).toBeFalsy(); @@ -176,7 +176,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; @@ -191,7 +191,7 @@ describe('AccountExtraDownpaymentComponent', () => { const dpval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraAdvancePayment; expect(dpval2.StartDate).toBeTruthy(); - expect(dpval2.StartDate.isSame(startdt)).toBeTruthy(); + expect(dpval2.StartDate.getTime()).toEqual(startdt.getTime()); expect(dpval2.RepeatType).toEqual(dp1.RepeatType); expect(dpval2.Comment).toEqual(dp1.Comment); expect(dpval2.RefDocId).toBeFalsy(); @@ -208,7 +208,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; @@ -232,7 +232,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; @@ -256,12 +256,12 @@ describe('AccountExtraDownpaymentComponent', () => { testcomponent.arTranTypes = fakeData.finTranTypes; const aroutput: RepeatedDatesWithAmountAPIOutput[] = []; aroutput.push({ - TranDate: moment(), + TranDate: new Date(), TranAmount: 10, Desp: '1', } as RepeatedDatesWithAmountAPIOutput); aroutput.push({ - TranDate: moment().add(1, 'M'), + TranDate: addMonths(new Date(), 1), TranAmount: 10, Desp: '2', } as RepeatedDatesWithAmountAPIOutput); @@ -272,7 +272,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; @@ -350,7 +350,7 @@ describe('AccountExtraDownpaymentComponent', () => { fixture.detectChanges(); const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; diff --git a/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.ts b/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.ts index deb6f987..8bdd1f8d 100644 --- a/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.ts +++ b/src/app/pages/finance/account/account-extra-downpayment/account-extra-downpayment.component.ts @@ -15,7 +15,7 @@ import { import { Router, RouterModule } from '@angular/router'; import { ReplaySubject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import moment from 'moment'; +import { addYears, startOfDay } from 'date-fns'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -93,11 +93,11 @@ export class AccountExtraDownpaymentComponent implements OnInit, ControlValueAcc let controlVal = this.adpInfoFormGroup.get('startDateControl')?.value; if (controlVal !== undefined) { - inst.StartDate = moment(controlVal as Date); + inst.StartDate = new Date(controlVal as Date); } controlVal = this.adpInfoFormGroup.get('endDateControl')?.value; if (controlVal !== undefined) { - inst.EndDate = moment(controlVal as Date); + inst.EndDate = new Date(controlVal as Date); } controlVal = this.adpInfoFormGroup.get('frqControl')?.value; if (controlVal !== undefined) { @@ -144,8 +144,8 @@ export class AccountExtraDownpaymentComponent implements OnInit, ControlValueAcc ); this.adpInfoFormGroup = new UntypedFormGroup({ - startDateControl: new UntypedFormControl(moment().toDate(), [Validators.required]), - endDateControl: new UntypedFormControl(moment().add(1, 'y').toDate()), + startDateControl: new UntypedFormControl(new Date(), [Validators.required]), + endDateControl: new UntypedFormControl(addYears(new Date(), 1)), frqControl: new UntypedFormControl(undefined, Validators.required), cmtControl: new UntypedFormControl('', Validators.maxLength(30)), }); @@ -197,8 +197,8 @@ export class AccountExtraDownpaymentComponent implements OnInit, ControlValueAcc const objval: AccountExtraAdvancePayment = this.value; const datInput: RepeatedDatesWithAmountAPIInput = { - StartDate: objval.StartDate.clone(), - EndDate: objval.EndDate.clone(), + StartDate: new Date(objval.StartDate), + EndDate: new Date(objval.EndDate), RepeatType: objval.RepeatType ?? RepeatFrequencyEnum.Day, Desp: objval.Comment, TotalAmount: this.tranAmount, @@ -268,8 +268,8 @@ export class AccountExtraDownpaymentComponent implements OnInit, ControlValueAcc ); if (val) { - this.adpInfoFormGroup.get('startDateControl')?.setValue(val.StartDate.toDate()); - this.adpInfoFormGroup.get('endDateControl')?.setValue(val.EndDate.toDate()); + this.adpInfoFormGroup.get('startDateControl')?.setValue(val.StartDate); + this.adpInfoFormGroup.get('endDateControl')?.setValue(val.EndDate); if (val.RepeatType !== null && val.RepeatType !== undefined) { this.adpInfoFormGroup.get('frqControl')?.setValue(val.RepeatType); } diff --git a/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.spec.ts b/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.spec.ts index d5f0d5e4..1451277f 100644 --- a/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.spec.ts +++ b/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.spec.ts @@ -11,7 +11,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; import { BehaviorSubject, of } from 'rxjs'; -import moment from 'moment'; +import { addMonths, addYears } from 'date-fns'; import { AccountExtraLoanComponent } from './account-extra-loan.component'; import {createSpyObj, getTranslocoModule, FakeDataHelper, asyncData, asyncError} from '../../../../../testing'; @@ -134,7 +134,7 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); loan1.startDate = startdt; testcomponent.formGroup.get('extraControl')?.setValue(loan1); await new Promise(r => setTimeout(r, 0)); @@ -146,7 +146,7 @@ describe('AccountExtraLoanComponent', () => { const loanval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraLoan; expect(loanval2.startDate).toBeTruthy(); - expect(loanval2.startDate?.isSame(startdt)).toBeTruthy(); + expect(loanval2.startDate?.getTime()).toEqual(startdt.getTime()); expect(testcomponent.extraComponent?.listTmpDocs.length).toEqual(0); await new Promise(r => setTimeout(r, 0)); @@ -158,7 +158,7 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); loan1.startDate = startdt; loan1.TotalMonths = 24; testcomponent.formGroup.get('extraControl')?.setValue(loan1); @@ -171,7 +171,7 @@ describe('AccountExtraLoanComponent', () => { const loanval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraLoan; expect(loanval2.startDate).toBeTruthy(); - expect(loanval2.startDate?.isSame(startdt)).toBeTruthy(); + expect(loanval2.startDate?.getTime()).toEqual(startdt.getTime()); expect(testcomponent.extraComponent?.listTmpDocs.length).toEqual(0); await new Promise(r => setTimeout(r, 0)); @@ -183,7 +183,7 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); loan1.startDate = startdt; loan1.TotalMonths = 24; loan1.RepayMethod = RepaymentMethodEnum.EqualPrincipal; @@ -197,7 +197,7 @@ describe('AccountExtraLoanComponent', () => { const loanval2 = testcomponent.formGroup.get('extraControl')?.value as AccountExtraLoan; expect(loanval2.startDate).toBeTruthy(); - expect(loanval2.startDate?.isSame(startdt)).toBeTruthy(); + expect(loanval2.startDate?.getTime()).toEqual(startdt.getTime()); expect(testcomponent.extraComponent?.listTmpDocs.length).toEqual(0); await new Promise(r => setTimeout(r, 0)); @@ -211,7 +211,7 @@ describe('AccountExtraLoanComponent', () => { tmpdoc.TranAmount = 8333.34; tmpdoc.Desp = `test${i + 1}`; tmpdoc.TranType = 28; - tmpdoc.TranDate = moment().add(i + 1, 'M'); + tmpdoc.TranDate = addMonths(new Date(), i + 1); tmpdoc.ControlCenterId = 1; tmpdoc.AccountId = 22; tmpdocs.push(tmpdoc); @@ -223,8 +223,8 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - loan1.startDate = moment().add(1, 'M'); - loan1.endDate = moment().add(2, 'years'); + loan1.startDate = addMonths(new Date(), 1); + loan1.endDate = addYears(new Date(), 2); loan1.TotalMonths = 24; loan1.RepayMethod = RepaymentMethodEnum.DueRepayment; loan1.InterestFree = true; @@ -262,7 +262,7 @@ describe('AccountExtraLoanComponent', () => { tmpdoc.InterestAmount = 362.5; tmpdoc.Desp = `test${i + 1}`; tmpdoc.TranType = 28; - tmpdoc.TranDate = moment().add(i + 1, 'M'); + tmpdoc.TranDate = addMonths(new Date(), i + 1); tmpdoc.ControlCenterId = 1; tmpdoc.AccountId = 22; tmpdocs.push(tmpdoc); @@ -274,8 +274,8 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - loan1.startDate = moment().add(1, 'M'); - loan1.endDate = moment().add(2, 'years'); + loan1.startDate = addMonths(new Date(), 1); + loan1.endDate = addYears(new Date(), 2); loan1.TotalMonths = 24; loan1.RepayMethod = RepaymentMethodEnum.EqualPrincipalAndInterset; loan1.InterestFree = false; @@ -328,8 +328,8 @@ describe('AccountExtraLoanComponent', () => { fixture.detectChanges(); const loan1: AccountExtraLoan = new AccountExtraLoan(); - loan1.startDate = moment().add(1, 'M'); - loan1.endDate = moment().add(2, 'years'); + loan1.startDate = addMonths(new Date(), 1); + loan1.endDate = addYears(new Date(), 2); loan1.TotalMonths = 24; loan1.RepayMethod = RepaymentMethodEnum.EqualPrincipalAndInterset; loan1.InterestFree = false; diff --git a/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.ts b/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.ts index a78db58b..57187431 100644 --- a/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.ts +++ b/src/app/pages/finance/account/account-extra-loan/account-extra-loan.component.ts @@ -14,7 +14,8 @@ import { import { Router, RouterModule } from '@angular/router'; import { ReplaySubject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import moment from 'moment'; +import { addYears, format, parse } from 'date-fns'; +import { dateFormat } from '@model/index'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -101,8 +102,8 @@ export class AccountExtraLoanComponent implements OnInit, ControlValueAccessor, const objrst = new AccountExtraLoan(); let controlVal = this.loanInfoForm.get('dateRangeControl')?.value; if (controlVal) { - objrst.startDate = moment((controlVal as SafeAny[])[0]); - objrst.endDate = moment((controlVal as SafeAny[])[1]); + objrst.startDate = new Date((controlVal as SafeAny[])[0]); + objrst.endDate = new Date((controlVal as SafeAny[])[1]); } controlVal = this.loanInfoForm.get('totalMonthControl')?.value; if (controlVal) { @@ -114,7 +115,7 @@ export class AccountExtraLoanComponent implements OnInit, ControlValueAccessor, } controlVal = this.loanInfoForm.get('firstRepayDateControl')?.value; if (controlVal) { - objrst.FirstRepayDate = moment(controlVal as Date); + objrst.FirstRepayDate = new Date(controlVal as Date); } controlVal = this.loanInfoForm.get('interestFreeControl')?.value; if (controlVal) { @@ -393,15 +394,15 @@ export class AccountExtraLoanComponent implements OnInit, ControlValueAccessor, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion InterestRate: val.annualRate! / 100, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - StartDate: val.startDate!.clone(), + StartDate: new Date(val.startDate!.getTime()), InterestFreeLoan: val.InterestFree ? true : false, RepaymentMethod: val.RepayMethod, }; if (val.endDate) { - di.EndDate = val.endDate.clone(); + di.EndDate = new Date(val.endDate.getTime()); } if (val.FirstRepayDate) { - di.FirstRepayDate = val.FirstRepayDate.clone(); + di.FirstRepayDate = new Date(val.FirstRepayDate.getTime()); } if (val.RepayDayInMonth) { di.RepayDayInMonth = val.RepayDayInMonth; @@ -460,14 +461,14 @@ export class AccountExtraLoanComponent implements OnInit, ControlValueAccessor, if (val) { const dtrange = [ - val.startDate ? val.startDate.toDate() : undefined, - val.endDate ? val.endDate.toDate() : undefined, + val.startDate ? val.startDate : undefined, + val.endDate ? val.endDate : undefined, ]; this.loanInfoForm.get('dateRangeControl')?.setValue(dtrange); this.loanInfoForm.get('totalMonthControl')?.setValue(val.TotalMonths); this.loanInfoForm.get('repayDayControl')?.setValue(val.RepayDayInMonth); if (val.FirstRepayDate) { - this.loanInfoForm.get('firstRepayDateControl')?.setValue(val.FirstRepayDate.toDate()); + this.loanInfoForm.get('firstRepayDateControl')?.setValue(val.FirstRepayDate); } else { this.loanInfoForm.get('firstRepayDateControl')?.setValue(undefined); } diff --git a/src/app/pages/finance/account/account-hierarchy/account-hierarchy.component.ts b/src/app/pages/finance/account/account-hierarchy/account-hierarchy.component.ts index e710f1c1..32a4aaa7 100644 --- a/src/app/pages/finance/account/account-hierarchy/account-hierarchy.component.ts +++ b/src/app/pages/finance/account/account-hierarchy/account-hierarchy.component.ts @@ -22,10 +22,10 @@ import { GeneralFilterValueType, OverviewScopeEnum, getOverviewScopeRange, - momentDateFormat, ControlCenter, } from '@model/index'; -import moment from 'moment'; +import { parse, format } from 'date-fns'; +import { dateFormat } from '@model/index'; import { AccountChangeNameDialogComponent } from '../account-change-name-dialog'; import { SafeAny } from '@common/any'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; @@ -343,7 +343,7 @@ export class AccountHierarchyComponent implements OnInit, OnDestroy { this.odataService .settleAccount( this.selectedAccountForSettle.AccountID, - moment(this.selectedAccountForSettle.SettleDate), + new Date(this.selectedAccountForSettle.SettleDate), this.selectedAccountForSettle.Amount, this.selectedAccountForSettle.ControlCenterID ?? 0 ) @@ -541,8 +541,8 @@ export class AccountHierarchyComponent implements OnInit, OnDestroy { arFilters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: dats.BeginDate.format(momentDateFormat), - highValue: dats.EndDate.format(momentDateFormat), + lowValue: format(dats.BeginDate, dateFormat), + highValue: format(dats.EndDate, dateFormat), valueType: GeneralFilterValueType.date, }); this.filterDocItem = arFilters; diff --git a/src/app/pages/finance/document-item-insight/document-item-insight.component.spec.ts b/src/app/pages/finance/document-item-insight/document-item-insight.component.spec.ts index 9f5c0b87..95dfe0ef 100644 --- a/src/app/pages/finance/document-item-insight/document-item-insight.component.spec.ts +++ b/src/app/pages/finance/document-item-insight/document-item-insight.component.spec.ts @@ -11,12 +11,13 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { FinanceUIModule } from '../finance-ui.module'; import {createSpyObj, getTranslocoModule, FakeDataHelper, asyncData} from '../../../../testing'; import { AuthService, UIStatusService, FinanceOdataService, HomeDefOdataService } from '../../../services'; -import { UserAuthInfo, momentDateFormat } from '../../../model'; +import { UserAuthInfo } from '../../../model'; import { DocumentItemInsightComponent } from './document-item-insight.component'; import { SafeAny } from '@common/index'; import { NzTransferModule } from 'ng-zorro-antd/transfer'; import { NzTooltipModule } from 'ng-zorro-antd/tooltip'; -import moment from 'moment'; +import { format, addMonths, subYears } from 'date-fns'; +import { dateFormat } from '../../../model'; describe('DocumentItemInsightComponent', () => { let component: DocumentItemInsightComponent; @@ -106,7 +107,7 @@ describe('DocumentItemInsightComponent', () => { let uisrv = TestBed.inject(UIStatusService); uisrv.docInsightOption = { - SelectedDataRange: [moment(), moment().add(1, 'M')], + SelectedDataRange: [new Date(), addMonths(new Date(), 1)], TransactionDirection: true }; }); @@ -144,7 +145,7 @@ describe('DocumentItemInsightComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: subYears(new Date(), 1), DocumentDesp: 'test', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -158,7 +159,7 @@ describe('DocumentItemInsightComponent', () => { DocumentID: 2, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: subYears(new Date(), 1), DocumentDesp: 'test', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -173,7 +174,7 @@ describe('DocumentItemInsightComponent', () => { let uisrv = TestBed.inject(UIStatusService); uisrv.docInsightOption = { - SelectedDataRange: [moment(), moment().add(1, 'M')], + SelectedDataRange: [new Date(), addMonths(new Date(), 1)], TransactionDirection: true }; }); diff --git a/src/app/pages/finance/document-item-insight/document-item-insight.component.ts b/src/app/pages/finance/document-item-insight/document-item-insight.component.ts index f1cbe809..53623b9e 100644 --- a/src/app/pages/finance/document-item-insight/document-item-insight.component.ts +++ b/src/app/pages/finance/document-item-insight/document-item-insight.component.ts @@ -4,6 +4,7 @@ import { translate, TranslocoModule } from '@jsverse/transloco'; import { NzModalService } from 'ng-zorro-antd/modal'; import { TransferItem } from 'ng-zorro-antd/transfer'; import { finalize, forkJoin } from 'rxjs'; +import { format } from 'date-fns'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzTransferModule } from 'ng-zorro-antd/transfer'; @@ -14,7 +15,7 @@ import { NzTooltipModule } from 'ng-zorro-antd/tooltip'; import { Account, ConsoleLogTypeEnum, DocumentItemView, GeneralFilterItem, GeneralFilterOperatorEnum, GeneralFilterValueType, ModelUtility, TranType, financeTranTypeAdvancePaymentOut, financeTranTypeAdvanceReceiveIn, financeTranTypeAssetValueDecrease, financeTranTypeAssetValueIncrease, - financeTranTypeOpeningAsset, financeTranTypeOpeningLiability, financeTranTypeTransferIn, financeTranTypeTransferOut, momentDateFormat } from '@model/index'; + financeTranTypeOpeningAsset, financeTranTypeOpeningLiability, financeTranTypeTransferIn, financeTranTypeTransferOut, dateFormat } from '@model/index'; import { DocInsightOption, FinanceOdataService, HomeDefOdataService, UIStatusService } from '@services/index'; interface InsightRecord { @@ -113,7 +114,7 @@ export class DocumentItemInsightComponent implements OnInit { } get insideDateRangeString(): string { if (this.insightOption !== null) { - return this.insightOption.SelectedDataRange[0].format(momentDateFormat) + ' - ' + this.insightOption.SelectedDataRange[1].format(momentDateFormat); + return format(this.insightOption.SelectedDataRange[0], dateFormat) + ' - ' + format(this.insightOption.SelectedDataRange[1], dateFormat); } return ''; } @@ -177,8 +178,8 @@ export class DocumentItemInsightComponent implements OnInit { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: this.insightOption.SelectedDataRange[0].format(momentDateFormat), - highValue: this.insightOption.SelectedDataRange[1].format(momentDateFormat), + lowValue: format(this.insightOption.SelectedDataRange[0], dateFormat), + highValue: format(this.insightOption.SelectedDataRange[1], dateFormat), valueType: GeneralFilterValueType.date, }); @@ -318,7 +319,11 @@ export class DocumentItemInsightComponent implements OnInit { this.listDisplayData.sort((item1, item2) => { let ndatecmp = 0; if (needdate) { - ndatecmp = item1.TransactionDate!.localeCompare(item2.TransactionDate ?? ''); + const t1 = item1.TransactionDate as unknown; + const t2 = item2.TransactionDate as unknown; + const d1 = t1 instanceof Date ? format(t1, dateFormat) : (item1.TransactionDate ?? ''); + const d2 = t2 instanceof Date ? format(t2, dateFormat) : (item2.TransactionDate ?? ''); + ndatecmp = d1.localeCompare(d2); } if (ndatecmp === 0) { diff --git a/src/app/pages/finance/document-item-search/document-item-search.component.ts b/src/app/pages/finance/document-item-search/document-item-search.component.ts index f2281588..fb251e96 100644 --- a/src/app/pages/finance/document-item-search/document-item-search.component.ts +++ b/src/app/pages/finance/document-item-search/document-item-search.component.ts @@ -3,7 +3,7 @@ import { NgFor, NgIf } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ReplaySubject } from 'rxjs'; import { NzModalService } from 'ng-zorro-antd/modal'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzResultModule } from 'ng-zorro-antd/result'; @@ -30,7 +30,7 @@ import { DocumentItemView, ModelUtility, ConsoleLogTypeEnum, - momentDateFormat, + dateFormat, } from '../../../model'; import { UITableColumnItem } from '../../../uimodel'; import { HomeDefOdataService } from '@services/index'; @@ -168,9 +168,9 @@ export class DocumentItemSearchComponent implements OnInit, OnDestroy { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion a // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .TransactionDate! //!.format(moment.HTML5_FMT.DATE) + .TransactionDate! // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .localeCompare(b.TransactionDate! ), // .format(moment.HTML5_FMT.DATE)), + .localeCompare(b.TransactionDate!), }, { name: 'Finance.TransactionType', @@ -311,9 +311,9 @@ export class DocumentItemSearchComponent implements OnInit, OnDestroy { case GeneralFilterValueType.date: { val.fieldName = value.fieldName; val.operator = +value.operator; - val.lowValue = moment(value.lowValue).format(momentDateFormat); + val.lowValue = format(parse(value.lowValue, dateFormat, new Date()), dateFormat); if (value.operator === GeneralFilterOperatorEnum.Between) { - val.highValue = moment(value.highValue).format(momentDateFormat); + val.highValue = format(parse(value.highValue, dateFormat, new Date()), dateFormat); } else { val.highValue = ''; } diff --git a/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.spec.ts b/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.spec.ts index a09c81d5..75a3dda8 100644 --- a/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.spec.ts +++ b/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.spec.ts @@ -8,7 +8,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { addMonths, subYears } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { AccountExtraAssetComponent } from '../../account/account-extra-asset'; @@ -204,7 +204,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; // dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -239,7 +239,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -289,7 +289,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -339,7 +339,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -389,7 +389,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -443,7 +443,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -499,7 +499,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -571,7 +571,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -638,7 +638,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -708,7 +708,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -809,7 +809,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -889,7 +889,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -970,7 +970,7 @@ describe('DocumentAssetBuyCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment().subtract(1, 'y'); + dochead.TranDate = subYears(new Date(), 1); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); diff --git a/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.ts b/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.ts index c2735fa1..848369fc 100644 --- a/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.ts +++ b/src/app/pages/finance/document/document-asset-buy-create/document-asset-buy-create.component.ts @@ -12,7 +12,7 @@ import { } from '@angular/forms'; import { forkJoin, ReplaySubject } from 'rxjs'; import { takeUntil, finalize } from 'rxjs/operators'; -import moment from 'moment'; +import { format, startOfDay, isBefore } from 'date-fns'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { UIMode } from 'actslib'; @@ -86,7 +86,7 @@ import { NzResultModule } from 'ng-zorro-antd/result'; export class DocumentAssetBuyCreateComponent implements OnInit, OnDestroy { /* eslint-disable @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ private _destroyed$: ReplaySubject | null = null; - private _docDate: moment.Moment; + private _docDate: Date; // Step: Generic info public firstFormGroup: UntypedFormGroup; @@ -118,7 +118,7 @@ export class DocumentAssetBuyCreateComponent implements OnInit, OnDestroy { arAccounts: Account[] = []; arDocTypes: DocumentType[] = []; arCurrencies: Currency[] = []; - get curDocDate(): moment.Moment { + get curDocDate(): Date { return this._docDate; } @@ -141,7 +141,7 @@ export class DocumentAssetBuyCreateComponent implements OnInit, OnDestroy { ConsoleLogTypeEnum.debug ); - this._docDate = moment(); + this._docDate = new Date(); this.baseCurrency = this.homeService.ChosedHome?.BaseCurrency ?? ''; // this.assetAccount = new AccountExtraAsset(); this.arMembers = this.homeService.ChosedHome?.Members.slice() ?? []; @@ -409,7 +409,7 @@ export class DocumentAssetBuyCreateComponent implements OnInit, OnDestroy { if (!datBuy) { return { dateisinvalid: true }; } - if (datBuy.startOf('day').isSameOrAfter(moment().startOf('day'))) { + if (!isBefore(startOfDay(datBuy), startOfDay(new Date()))) { return { dateisinvalid: true }; } } diff --git a/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.spec.ts b/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.spec.ts index 9c2562e3..634deab3 100644 --- a/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.spec.ts +++ b/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.spec.ts @@ -8,7 +8,6 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; import { By } from '@angular/platform-browser'; import { UIAccountCtgyFilterExPipe, UIAccountStatusFilterPipe } from '../../pipes'; @@ -179,7 +178,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; // dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -225,7 +224,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -271,7 +270,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -317,7 +316,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -366,7 +365,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -430,7 +429,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -494,7 +493,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -556,7 +555,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -650,7 +649,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -728,7 +727,7 @@ describe('DocumentAssetSoldCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); diff --git a/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.ts b/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.ts index a63628a4..acac31cb 100644 --- a/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.ts +++ b/src/app/pages/finance/document/document-asset-sold-create/document-asset-sold-create.component.ts @@ -12,7 +12,7 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { UIMode } from 'actslib'; @@ -27,7 +27,7 @@ import { BuildupOrderForSelection, UIOrderForSelection, IAccountCategoryFilterEx, - momentDateFormat, + dateFormat, ModelUtility, financeDocTypeAssetSoldOut, FinanceAssetSoldoutDocumentAPI, @@ -83,7 +83,7 @@ import { UIAccountCtgyFilterExPipe } from '../../pipes'; export class DocumentAssetSoldCreateComponent implements OnInit, OnDestroy { /* eslint-disable @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ private _destroyed$: ReplaySubject | null = null; - private _docDate: moment.Moment; + private _docDate: Date; public baseCurrency: string; public detailObject: FinanceAssetSoldoutDocumentAPI | null = null; @@ -115,7 +115,7 @@ export class DocumentAssetSoldCreateComponent implements OnInit, OnDestroy { arAccounts: Account[] = []; arDocTypes: DocumentType[] = []; arCurrencies: Currency[] = []; - get curDocDate(): moment.Moment { + get curDocDate(): Date { return this._docDate; } @@ -132,7 +132,7 @@ export class DocumentAssetSoldCreateComponent implements OnInit, OnDestroy { ); this.arMembersInChosedHome = this.homeService.ChosedHome?.Members.slice() ?? []; - this._docDate = moment(); + this._docDate = new Date(); this.baseCurrency = this.homeService.ChosedHome?.BaseCurrency ?? ''; this.firstFormGroup = new UntypedFormGroup( @@ -310,7 +310,7 @@ export class DocumentAssetSoldCreateComponent implements OnInit, OnDestroy { // Do the real submit. this.detailObject = new FinanceAssetSoldoutDocumentAPI(); this.detailObject.HID = this.homeService.ChosedHome?.ID ?? 0; - this.detailObject.TranDate = docobj.TranDate.format(momentDateFormat); + this.detailObject.TranDate = format(docobj.TranDate, dateFormat); this.detailObject.TranCurr = docobj.TranCurr; this.detailObject.TranAmount = this.firstFormGroup.get('amountControl')?.value; this.detailObject.Desp = docobj.Desp; diff --git a/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.spec.ts b/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.spec.ts index 009d398e..1a885790 100644 --- a/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.spec.ts +++ b/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.spec.ts @@ -8,7 +8,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { format, parse, subYears, addMonths } from 'date-fns'; import { By } from '@angular/platform-browser'; import { UIAccountCtgyFilterExPipe, UIAccountStatusFilterPipe } from '../../pipes'; @@ -16,7 +16,7 @@ import { DocumentHeaderComponent } from '../document-header'; import { DocumentAssetValueChangeCreateComponent } from './document-asset-value-change-create.component'; import {createSpyObj, getTranslocoModule, FakeDataHelper, asyncData, asyncError} from '../../../../../testing'; import { HomeDefOdataService, AuthService, UIStatusService, FinanceOdataService } from '@services/index'; -import { UserAuthInfo, Document, DocumentItemView, Account, financeAccountCategoryAsset, momentDateFormat } from '@model/index'; +import { UserAuthInfo, Document, DocumentItemView, Account, financeAccountCategoryAsset, dateFormat } from '@model/index'; import { MessageDialogComponent } from '../../../message-dialog'; import { SafeAny } from '@common/any'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; @@ -194,7 +194,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; // dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -226,7 +226,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -269,7 +269,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -314,7 +314,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -364,7 +364,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -414,7 +414,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'buy', AccountID: assetAccount.Id, TransactionType: 1, @@ -439,7 +439,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -485,7 +485,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'buy', AccountID: assetAccount.Id, TransactionType: 1, @@ -510,7 +510,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -558,7 +558,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'buy', AccountID: assetAccount.Id, TransactionType: 1, @@ -583,7 +583,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -656,7 +656,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'buy', AccountID: assetAccount.Id, TransactionType: 1, @@ -681,7 +681,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -711,6 +711,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Setp 1 expect(component.currentStep).toBe(1); await new Promise(r => setTimeout(r, 0)); + await new Promise(r => setTimeout(r, 0)); fixture.detectChanges(); nextButtonNativeEl.click(); @@ -718,6 +719,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 2 await new Promise(r => setTimeout(r, 0)); + await new Promise(r => setTimeout(r, 0)); fixture.detectChanges(); expect(createAssetValChgDocumentSpy).toHaveBeenCalled(); expect(component.currentStep).toBe(2); @@ -737,7 +739,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'buy', AccountID: assetAccount.Id, TransactionType: 1, @@ -763,7 +765,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -793,6 +795,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Setp 1 expect(component.currentStep).toBe(1); await new Promise(r => setTimeout(r, 0)); + await new Promise(r => setTimeout(r, 0)); fixture.detectChanges(); nextButtonNativeEl.click(); @@ -800,6 +803,7 @@ describe('DocumentAssetValueChangeCreateComponent', () => { // Step 2 await new Promise(r => setTimeout(r, 0)); + await new Promise(r => setTimeout(r, 0)); fixture.detectChanges(); expect(createAssetValChgDocumentSpy).toHaveBeenCalled(); expect(component.currentStep).toBe(2); diff --git a/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.ts b/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.ts index 0617f8b7..3301bcb4 100644 --- a/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.ts +++ b/src/app/pages/finance/document/document-asset-value-change-create/document-asset-value-change-create.component.ts @@ -12,7 +12,7 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms'; -import moment from 'moment'; +import { format, parse, isBefore, isAfter } from 'date-fns'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { UIMode } from 'actslib'; @@ -41,6 +41,7 @@ import { ModelUtility, ConsoleLogTypeEnum, DocumentItemView, + dateFormat, } from '../../../../model'; import { costObjectValidator } from '../../../../uimodel'; import { HomeDefOdataService, FinanceOdataService } from '../../../../services'; @@ -412,12 +413,12 @@ export class DocumentAssetValueChangeCreateComponent implements OnInit, OnDestro docitems.push(di); }); docitems = docitems.sort((a, b) => { - let amoment = moment(a.TransactionDate); - let bmoment = moment(b.TransactionDate); - if (amoment.isBefore(bmoment)) { + let adate = parse(typeof a.TransactionDate === 'string' ? a.TransactionDate : '', dateFormat, new Date()); + let bdate = parse(typeof b.TransactionDate === 'string' ? b.TransactionDate : '', dateFormat, new Date()); + if (isBefore(adate, bdate)) { return -1; } - if (moment(amoment).isAfter(bmoment)) { + if (isAfter(adate, bdate)) { return 1; } return 0; @@ -446,7 +447,9 @@ export class DocumentAssetValueChangeCreateComponent implements OnInit, OnDestro // Sorting this.existingDocItems = this.existingDocItems.sort((a: SafeAny, b: SafeAny) => { - return a.tranDate.localeCompare(b.tranDate); + const dateA = typeof a.tranDate === 'string' ? a.tranDate : (a.tranDate instanceof Date ? format(a.tranDate, dateFormat) : ''); + const dateB = typeof b.tranDate === 'string' ? b.tranDate : (b.tranDate instanceof Date ? format(b.tranDate, dateFormat) : ''); + return dateA.localeCompare(dateB); }); let curbal = 0; diff --git a/src/app/pages/finance/document/document-change-date-dialog/document-change-date-dialog.component.ts b/src/app/pages/finance/document/document-change-date-dialog/document-change-date-dialog.component.ts index 76e01e53..01d5a1fe 100644 --- a/src/app/pages/finance/document/document-change-date-dialog/document-change-date-dialog.component.ts +++ b/src/app/pages/finance/document/document-change-date-dialog/document-change-date-dialog.component.ts @@ -1,7 +1,7 @@ import { Component, inject, Input, NgZone, OnInit } from '@angular/core'; import { FormsModule, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format } from 'date-fns'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzDatePickerModule } from 'ng-zorro-antd/date-picker'; import { NzFormModule } from 'ng-zorro-antd/form'; @@ -66,7 +66,7 @@ export class DocumentChangeDateDialogComponent implements OnInit { this.isSubmitting = true; this.odataService - .changeDocumentDateViaPatch(this.documentid ?? 0, moment(this.headerFormGroup.get('dateControl')?.value)) + .changeDocumentDateViaPatch(this.documentid ?? 0, this.headerFormGroup.get('dateControl')?.value) .subscribe({ next: () => { this.modal.destroy(); diff --git a/src/app/pages/finance/document/document-detail/document-detail.component.spec.ts b/src/app/pages/finance/document/document-detail/document-detail.component.spec.ts index 65527cfa..3d476a4a 100644 --- a/src/app/pages/finance/document/document-detail/document-detail.component.spec.ts +++ b/src/app/pages/finance/document/document-detail/document-detail.component.spec.ts @@ -14,7 +14,7 @@ import { DocumentDetailComponent } from './document-detail.component'; import {createSpyObj, getTranslocoModule, FakeDataHelper, ActivatedRouteUrlStub, asyncData} from '../../../../../testing'; import { AuthService, UIStatusService, HomeDefOdataService, FinanceOdataService } from '../../../../services'; import { UserAuthInfo, financeDocTypeNormal, Document, DocumentItem } from '../../../../model'; -import moment from 'moment'; +import { subMonths, endOfMonth } from 'date-fns'; import { SafeAny } from '@common/any'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; @@ -145,7 +145,7 @@ describe('DocumentDetailComponent', () => { docobj.Desp = 'test'; docobj.TranCurr = 'CNY'; docobj.DocType = financeDocTypeNormal; - docobj.TranDate = moment(); + docobj.TranDate = new Date(); docobj.Items = []; const item1 = new DocumentItem(); item1.ItemId = 1; diff --git a/src/app/pages/finance/document/document-downpayment-create/document-downpayment-create.component.spec.ts b/src/app/pages/finance/document/document-downpayment-create/document-downpayment-create.component.spec.ts index d0cf9fb3..7684d0d3 100644 --- a/src/app/pages/finance/document/document-downpayment-create/document-downpayment-create.component.spec.ts +++ b/src/app/pages/finance/document/document-downpayment-create/document-downpayment-create.component.spec.ts @@ -8,7 +8,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { addMonths, addDays } from 'date-fns'; import { By } from '@angular/platform-browser'; import { NzModalService } from 'ng-zorro-antd/modal'; @@ -186,7 +186,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; // dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -218,7 +218,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -266,7 +266,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -314,7 +314,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -362,7 +362,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -418,7 +418,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -474,7 +474,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -513,13 +513,13 @@ describe('DocumentDownpaymentCreateComponent', () => { // Add extra info. const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; dp1.dpTmpDocs.push({ TranType: fakeData.finTranTypes[0].Id, - TranDate: moment(), + TranDate: new Date(), TranAmount: 100, Desp: 'test', } as TemplateDocADP); @@ -541,7 +541,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -580,13 +580,13 @@ describe('DocumentDownpaymentCreateComponent', () => { // Add extra info. const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; dp1.dpTmpDocs.push({ TranType: fakeData.finTranTypes[0].Id, - TranDate: moment(), + TranDate: new Date(), TranAmount: 100, Desp: 'test', } as TemplateDocADP); @@ -613,7 +613,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -652,13 +652,13 @@ describe('DocumentDownpaymentCreateComponent', () => { // Add extra info. const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; dp1.dpTmpDocs.push({ TranType: fakeData.finTranTypes[0].Id, - TranDate: moment(), + TranDate: new Date(), TranAmount: 100, Desp: 'test', } as TemplateDocADP); @@ -721,7 +721,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -760,13 +760,13 @@ describe('DocumentDownpaymentCreateComponent', () => { // Add extra info. const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; dp1.dpTmpDocs.push({ TranType: fakeData.finTranTypes[0].Id, - TranDate: moment(), + TranDate: new Date(), TranAmount: 100, Desp: 'test', } as TemplateDocADP); @@ -806,7 +806,7 @@ describe('DocumentDownpaymentCreateComponent', () => { // Update a valid document header const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.headerFormGroup.get('headerControl')?.setValue(dochead); @@ -845,13 +845,13 @@ describe('DocumentDownpaymentCreateComponent', () => { // Add extra info. const dp1: AccountExtraAdvancePayment = new AccountExtraAdvancePayment(); - const startdt = moment().add(1, 'M'); + const startdt = addMonths(new Date(), 1); dp1.StartDate = startdt; dp1.RepeatType = RepeatFrequencyEnum.Month; dp1.Comment = 'test'; dp1.dpTmpDocs.push({ TranType: fakeData.finTranTypes[0].Id, - TranDate: moment(), + TranDate: new Date(), TranAmount: 100, Desp: 'test', } as TemplateDocADP); diff --git a/src/app/pages/finance/document/document-header/document-header.component.spec.ts b/src/app/pages/finance/document/document-header/document-header.component.spec.ts index 04f02b1c..ee2dc9c0 100644 --- a/src/app/pages/finance/document/document-header/document-header.component.spec.ts +++ b/src/app/pages/finance/document/document-header/document-header.component.spec.ts @@ -246,9 +246,9 @@ describe('DocumentHeaderComponent', () => { expect(curDocument.Desp).toEqual('test'); expect(curDocument.TranCurr).toEqual(fakeData.chosedHome.BaseCurrency); expect(curDocument.TranDate).toBeTruthy(); - expect(curDocument.TranDate.year()).toEqual(2020); - expect(curDocument.TranDate.month()).toEqual(2); - expect(curDocument.TranDate.date()).toEqual(2); + expect(curDocument.TranDate.getFullYear()).toEqual(2020); + expect(curDocument.TranDate.getMonth()).toEqual(2); + expect(curDocument.TranDate.getDate()).toEqual(2); }); it('it shall return correct Document object with foreign currency', async () => { @@ -270,9 +270,9 @@ describe('DocumentHeaderComponent', () => { expect(curDocument.Desp).toEqual('Test'); expect(curDocument.TranCurr).toEqual('USD'); expect(curDocument.TranDate).toBeTruthy(); - expect(curDocument.TranDate.year()).toEqual(2020); - expect(curDocument.TranDate.month()).toEqual(2); - expect(curDocument.TranDate.date()).toEqual(2); + expect(curDocument.TranDate.getFullYear()).toEqual(2020); + expect(curDocument.TranDate.getMonth()).toEqual(2); + expect(curDocument.TranDate.getDate()).toEqual(2); expect(curDocument.ExgRate).toEqual(624.22); expect(curDocument.ExgRate_Plan).toBeFalsy(); }); @@ -494,9 +494,9 @@ describe('DocumentHeaderComponent', () => { expect(curDocument.Desp).toEqual('test'); expect(curDocument.TranCurr).toEqual(fakeData.chosedHome.BaseCurrency); expect(curDocument.TranDate).toBeTruthy(); - expect(curDocument.TranDate.year()).toEqual(2020); - expect(curDocument.TranDate.month()).toEqual(2); - expect(curDocument.TranDate.date()).toEqual(2); + expect(curDocument.TranDate.getFullYear()).toEqual(2020); + expect(curDocument.TranDate.getMonth()).toEqual(2); + expect(curDocument.TranDate.getDate()).toEqual(2); expect(curDocument.TranCurr2).toEqual('USD'); expect(curDocument.ExgRate2).toEqual(634.56); }); @@ -523,9 +523,9 @@ describe('DocumentHeaderComponent', () => { expect(curDocument.Desp).toEqual('Test'); expect(curDocument.TranCurr).toEqual('USD'); expect(curDocument.TranDate).toBeTruthy(); - expect(curDocument.TranDate.year()).toEqual(2020); - expect(curDocument.TranDate.month()).toEqual(2); - expect(curDocument.TranDate.date()).toEqual(2); + expect(curDocument.TranDate.getFullYear()).toEqual(2020); + expect(curDocument.TranDate.getMonth()).toEqual(2); + expect(curDocument.TranDate.getDate()).toEqual(2); expect(curDocument.ExgRate).toEqual(624.22); expect(curDocument.ExgRate_Plan).toBeFalsy(); expect(curDocument.TranCurr2).toEqual('EUR'); diff --git a/src/app/pages/finance/document/document-header/document-header.component.ts b/src/app/pages/finance/document/document-header/document-header.component.ts index f7d6315e..301dca74 100644 --- a/src/app/pages/finance/document/document-header/document-header.component.ts +++ b/src/app/pages/finance/document/document-header/document-header.component.ts @@ -13,7 +13,7 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { UIMode } from 'actslib'; import { @@ -24,6 +24,7 @@ import { ModelUtility, ConsoleLogTypeEnum, DocumentType, + dateFormat, } from '../../../../model'; import { SafeAny } from '@common/any'; import { NzFormModule } from 'ng-zorro-antd/form'; @@ -183,9 +184,8 @@ export class DocumentHeaderComponent implements ControlValueAccessor, Validator insobj.DocType = this.docType; } insobj.TranCurr = this.headerForm.get('currControl')?.value; - // let dateobj: Date = this.headerForm.get('dateControl').value as Date; - // insobj.TranDate = moment(`${dateobj.getFullYear()}-${dateobj.getMonth()}-${dateobj.getDay()}`, momentDateFormat); - insobj.TranDate = moment(this.headerForm.get('dateControl')?.value as Date); + // insobj.TranDate = parse(format(dateobj, dateFormat), dateFormat, new Date()); + insobj.TranDate = parse(format(this.headerForm.get('dateControl')?.value as Date, dateFormat), dateFormat, new Date()); insobj.Desp = this.headerForm.get('despControl')?.value; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion insobj.DocType = this.docType!; @@ -308,7 +308,7 @@ export class DocumentHeaderComponent implements ControlValueAccessor, Validator if (val) { this.headerForm.get('docTypeControl')?.setValue(val.DocType ? val.DocType : this.docType); - this.headerForm.get('dateControl')?.setValue(val.TranDate ? val.TranDate.toDate() : ''); + this.headerForm.get('dateControl')?.setValue(val.TranDate ? val.TranDate : ''); this.headerForm.get('despControl')?.setValue(val.Desp); this.headerForm.get('currControl')?.setValue(val.TranCurr); this.headerForm.get('exgControl')?.setValue(val.ExgRate); diff --git a/src/app/pages/finance/document/document-item-insight/document-item-insight.component.spec.ts b/src/app/pages/finance/document/document-item-insight/document-item-insight.component.spec.ts index 8cb0102a..4328fff1 100644 --- a/src/app/pages/finance/document/document-item-insight/document-item-insight.component.spec.ts +++ b/src/app/pages/finance/document/document-item-insight/document-item-insight.component.spec.ts @@ -10,13 +10,14 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import {createSpyObj, getTranslocoModule, FakeDataHelper, asyncData} from '../../../../../testing'; import { AuthService, UIStatusService, FinanceOdataService, HomeDefOdataService } from '../../../../services'; -import { UserAuthInfo, momentDateFormat } from '../../../../model'; +import { UserAuthInfo } from '../../../../model'; import { DocumentItemInsightComponent } from './document-item-insight.component'; import { FinanceUIModule } from '../../finance-ui.module'; import { SafeAny } from '@common/any'; import { NzTransferModule } from 'ng-zorro-antd/transfer'; import { NzTooltipModule } from 'ng-zorro-antd/tooltip'; -import moment from 'moment'; +import { format, addMonths, subYears } from 'date-fns'; +import { dateFormat } from '@model/index'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; describe('DocumentItemInsightComponent', () => { @@ -107,7 +108,7 @@ describe('DocumentItemInsightComponent', () => { let uisrv = TestBed.inject(UIStatusService); uisrv.docInsightOption = { - SelectedDataRange: [moment(), moment().add(1, 'M')], + SelectedDataRange: [new Date(), addMonths(new Date(), 1)], TransactionDirection: true }; }); @@ -145,7 +146,7 @@ describe('DocumentItemInsightComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'test', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -159,7 +160,7 @@ describe('DocumentItemInsightComponent', () => { DocumentID: 2, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().subtract(1, 'y').format(momentDateFormat), + TransactionDate: format(subYears(new Date(), 1), dateFormat), DocumentDesp: 'test', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -174,7 +175,7 @@ describe('DocumentItemInsightComponent', () => { let uisrv = TestBed.inject(UIStatusService); uisrv.docInsightOption = { - SelectedDataRange: [moment(), moment().add(1, 'M')], + SelectedDataRange: [new Date(), addMonths(new Date(), 1)], TransactionDirection: true }; }); diff --git a/src/app/pages/finance/document/document-item-insight/document-item-insight.component.ts b/src/app/pages/finance/document/document-item-insight/document-item-insight.component.ts index 3ff455ee..8319b1c6 100644 --- a/src/app/pages/finance/document/document-item-insight/document-item-insight.component.ts +++ b/src/app/pages/finance/document/document-item-insight/document-item-insight.component.ts @@ -9,11 +9,13 @@ import { NzTableModule } from 'ng-zorro-antd/table'; import { NzTooltipModule } from 'ng-zorro-antd/tooltip'; import { NzTransferModule, TransferItem } from 'ng-zorro-antd/transfer'; import { finalize, forkJoin } from 'rxjs'; +import { format } from 'date-fns'; +import { dateFormat } from '@model/index'; import { Account, ConsoleLogTypeEnum, DocumentItemView, GeneralFilterItem, GeneralFilterOperatorEnum, GeneralFilterValueType, ModelUtility, TranType, financeTranTypeAdvancePaymentOut, financeTranTypeAdvanceReceiveIn, financeTranTypeAssetValueDecrease, financeTranTypeAssetValueIncrease, - financeTranTypeOpeningAsset, financeTranTypeOpeningLiability, financeTranTypeTransferIn, financeTranTypeTransferOut, momentDateFormat + financeTranTypeOpeningAsset, financeTranTypeOpeningLiability, financeTranTypeTransferIn, financeTranTypeTransferOut } from '@model/index'; import { DocInsightOption, FinanceOdataService, HomeDefOdataService, UIStatusService } from '@services/index'; import { RouterModule } from '@angular/router'; @@ -115,7 +117,7 @@ export class DocumentItemInsightComponent implements OnInit { } get insideDateRangeString(): string { if (this.insightOption !== null) { - return this.insightOption.SelectedDataRange[0].format(momentDateFormat) + ' - ' + this.insightOption.SelectedDataRange[1].format(momentDateFormat); + return format(this.insightOption.SelectedDataRange[0], dateFormat) + ' - ' + format(this.insightOption.SelectedDataRange[1], dateFormat); } return ''; } @@ -179,8 +181,8 @@ export class DocumentItemInsightComponent implements OnInit { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: this.insightOption.SelectedDataRange[0].format(momentDateFormat), - highValue: this.insightOption.SelectedDataRange[1].format(momentDateFormat), + lowValue: format(this.insightOption.SelectedDataRange[0], dateFormat), + highValue: format(this.insightOption.SelectedDataRange[1], dateFormat), valueType: GeneralFilterValueType.date, }); @@ -320,7 +322,9 @@ export class DocumentItemInsightComponent implements OnInit { this.listDisplayData.sort((item1, item2) => { let ndatecmp = 0; if (needdate) { - ndatecmp = item1.TransactionDate!.localeCompare(item2.TransactionDate ?? ''); + const date1 = typeof item1.TransactionDate === 'string' ? item1.TransactionDate : ''; + const date2 = typeof item2.TransactionDate === 'string' ? item2.TransactionDate : ''; + ndatecmp = date1.localeCompare(date2); } if (ndatecmp === 0) { diff --git a/src/app/pages/finance/document/document-item-search/document-item-search.component.ts b/src/app/pages/finance/document/document-item-search/document-item-search.component.ts index 6537c016..93859d82 100644 --- a/src/app/pages/finance/document/document-item-search/document-item-search.component.ts +++ b/src/app/pages/finance/document/document-item-search/document-item-search.component.ts @@ -2,7 +2,7 @@ import { NgIf } from '@angular/common'; import { Component, OnInit, OnDestroy, inject } from '@angular/core'; import { ReplaySubject } from 'rxjs'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { GeneralFilterOperatorEnum, @@ -17,7 +17,7 @@ import { DocumentItemView, ModelUtility, ConsoleLogTypeEnum, - momentDateFormat, + dateFormat, } from '../../../../model'; import { UITableColumnItem } from '../../../../uimodel'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -166,11 +166,7 @@ export class DocumentItemSearchComponent implements OnInit, OnDestroy { filterMultiple: false, sortFn: (a: DocumentItemView, b: DocumentItemView) => // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - a - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .TransactionDate! //!.format(moment.HTML5_FMT.DATE) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .localeCompare(b.TransactionDate! ), // .format(moment.HTML5_FMT.DATE)), + (a.TransactionDate || '').localeCompare(b.TransactionDate || ''), }, { name: 'Finance.TransactionType', @@ -311,9 +307,9 @@ export class DocumentItemSearchComponent implements OnInit, OnDestroy { case GeneralFilterValueType.date: { val.fieldName = value.fieldName; val.operator = +value.operator; - val.lowValue = moment(value.lowValue).format(momentDateFormat); + val.lowValue = format(parse(value.lowValue, dateFormat, new Date()), dateFormat); if (value.operator === GeneralFilterOperatorEnum.Between) { - val.highValue = moment(value.highValue).format(momentDateFormat); + val.highValue = format(parse(value.highValue, dateFormat, new Date()), dateFormat); } else { val.highValue = ''; } diff --git a/src/app/pages/finance/document/document-items/document-items.component.ts b/src/app/pages/finance/document/document-items/document-items.component.ts index bf661fd8..033cea19 100644 --- a/src/app/pages/finance/document/document-items/document-items.component.ts +++ b/src/app/pages/finance/document/document-items/document-items.component.ts @@ -9,7 +9,7 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms'; -import moment from 'moment'; +import { format } from 'date-fns'; import { UIMode } from 'actslib'; import { @@ -22,6 +22,7 @@ import { financeDocTypeNormal, UIAccountForSelection, UIOrderForSelection, + dateFormat, } from '../../../../model'; import { SafeAny } from '@common/any'; import { TranslocoModule } from '@jsverse/transloco'; @@ -71,7 +72,7 @@ export class DocumentItemsComponent implements ControlValueAccessor, Validator { private _onTouched?: () => void = undefined; private _onChange?: (val: SafeAny) => void = undefined; private _uiMode: UIMode = UIMode.Invalid; - private _docDate: moment.Moment = moment(); + private _docDate: Date = new Date(); public uiAccountStatusFilter: string | undefined; // public uiAccountCtgyFilter: IAccountCategoryFilter | undefined; @@ -182,10 +183,10 @@ export class DocumentItemsComponent implements ControlValueAccessor, Validator { return this._docType; } @Input() - set docDate(docdate: moment.Moment) { + set docDate(docdate: Date) { this._docDate = docdate; } - get docDate(): moment.Moment { + get docDate(): Date { return this._docDate; } get documentItems(): DocumentItem[] { diff --git a/src/app/pages/finance/document/document-list/document-list.component.spec.ts b/src/app/pages/finance/document/document-list/document-list.component.spec.ts index fe2d79b0..ba064d75 100644 --- a/src/app/pages/finance/document/document-list/document-list.component.spec.ts +++ b/src/app/pages/finance/document/document-list/document-list.component.spec.ts @@ -9,7 +9,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { subYears } from 'date-fns'; import { DocumentListComponent } from './document-list.component'; import {createSpyObj, getTranslocoModule, @@ -139,7 +139,7 @@ describe('DocumentListComponent', () => { DocType: financeDocTypeNormal, TranCurr: fakeData.chosedHome.BaseCurrency, Desp: 'test', - TranDate: moment(), + TranDate: new Date(), Items: [ { DocId: 1, @@ -163,7 +163,7 @@ describe('DocumentListComponent', () => { DocType: financeDocTypeNormal, TranCurr: fakeData.chosedHome.BaseCurrency, Desp: 'test', - TranDate: moment(), + TranDate: new Date(), Items: [ { DocId: 2, diff --git a/src/app/pages/finance/document/document-list/document-list.component.ts b/src/app/pages/finance/document/document-list/document-list.component.ts index dff8d324..a5415f7c 100644 --- a/src/app/pages/finance/document/document-list/document-list.component.ts +++ b/src/app/pages/finance/document/document-list/document-list.component.ts @@ -6,7 +6,7 @@ import { NzModalModule, NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzMessageService } from 'ng-zorro-antd/message'; import { NzTableModule, NzTableQueryParams } from 'ng-zorro-antd/table'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format, parse, startOfMonth, endOfMonth } from 'date-fns'; import { FinanceOdataService, HomeDefOdataService, UIStatusService } from '../../../../services'; import { @@ -29,7 +29,7 @@ import { GeneralFilterItem, GeneralFilterOperatorEnum, GeneralFilterValueType, - momentDateFormat, + dateFormat, } from '../../../../model'; import { DocumentChangeDateDialogComponent } from '../document-change-date-dialog'; import { DocumentChangeDespDialogComponent } from '../document-change-desp-dialog'; @@ -125,7 +125,7 @@ export class DocumentListComponent implements OnInit, OnDestroy { this._destroyed$ = new ReplaySubject(1); this._isInitialized = true; - this.selectedRange = [moment().startOf('month').toDate(), moment().endOf('month').toDate()]; + this.selectedRange = [startOfMonth(new Date()), endOfMonth(new Date())]; this.isLoadingResults = true; const arseqs = [ @@ -309,15 +309,15 @@ export class DocumentListComponent implements OnInit, OnDestroy { ); this.isLoadingResults = true; - const bgn = this.selectedRange.length > 0 ? moment(this.selectedRange[0] as Date) : moment(); - const end = this.selectedRange.length > 1 ? moment(this.selectedRange[1] as Date) : moment(); + const bgn = this.selectedRange.length > 0 ? startOfMonth(this.selectedRange[0] as Date) : startOfMonth(new Date()); + const end = this.selectedRange.length > 1 ? endOfMonth(this.selectedRange[1] as Date) : endOfMonth(new Date()); this._filterDocItem = []; this._filterDocItem.push({ fieldName: 'TranDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: bgn.format(momentDateFormat), - highValue: end.format(momentDateFormat), + lowValue: format(bgn, dateFormat), + highValue: format(end, dateFormat), valueType: GeneralFilterValueType.number, }); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -457,7 +457,7 @@ export class DocumentListComponent implements OnInit, OnDestroy { }, }); } - public onChangeDate(docid: number, docdate: moment.Moment): void { + public onChangeDate(docid: number, docdate: Date): void { // Change the account name const modal = this.modalService.create({ nzTitle: translate('Finance.ChangeDate'), @@ -465,7 +465,7 @@ export class DocumentListComponent implements OnInit, OnDestroy { nzViewContainerRef: this.viewContainerRef, nzData: { documentid: docid, - documentdate: docdate.toDate(), + documentdate: docdate, }, // nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000)), }); diff --git a/src/app/pages/finance/document/document-loan-create/document-loan-create.component.spec.ts b/src/app/pages/finance/document/document-loan-create/document-loan-create.component.spec.ts index 4a65546f..1457094f 100644 --- a/src/app/pages/finance/document/document-loan-create/document-loan-create.component.spec.ts +++ b/src/app/pages/finance/document/document-loan-create/document-loan-create.component.spec.ts @@ -9,7 +9,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { addMonths, addYears, addDays } from 'date-fns'; import { By } from '@angular/platform-browser'; import { DocumentHeaderComponent } from '../document-header'; @@ -195,7 +195,7 @@ describe('DocumentLoanCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; // dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -227,7 +227,7 @@ describe('DocumentLoanCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -271,7 +271,7 @@ describe('DocumentLoanCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -315,7 +315,7 @@ describe('DocumentLoanCreateComponent', () => { // Update document header - missed desp const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -368,7 +368,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -414,7 +414,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -443,8 +443,8 @@ describe('DocumentLoanCreateComponent', () => { // Update the correct extra info const extraLoan: AccountExtraLoan = new AccountExtraLoan(); - extraLoan.startDate = moment(); - extraLoan.endDate = moment().add(1, 'y'); + extraLoan.startDate = new Date(); + extraLoan.endDate = addYears(new Date(), 1); extraLoan.InterestFree = true; extraLoan.RepayMethod = RepaymentMethodEnum.EqualPrincipal; extraLoan.TotalMonths = 12; @@ -457,7 +457,7 @@ describe('DocumentLoanCreateComponent', () => { TranAmount: 100, ControlCenterId: fakeData.finControlCenters[0].Id, Desp: 'test', - TranDate: moment().add(1, 'd'), + TranDate: addDays(new Date(), 1), } as TemplateDocLoan); expect(extraLoan.isValid).toBeTruthy(); component.extraFormGroup.get('loanAccountControl')?.setValue(extraLoan); @@ -479,7 +479,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -504,8 +504,8 @@ describe('DocumentLoanCreateComponent', () => { // Step 1. const extraLoan: AccountExtraLoan = new AccountExtraLoan(); - extraLoan.startDate = moment(); - extraLoan.endDate = moment().add(1, 'y'); + extraLoan.startDate = new Date(); + extraLoan.endDate = addYears(new Date(), 1); extraLoan.InterestFree = true; extraLoan.RepayMethod = RepaymentMethodEnum.EqualPrincipal; extraLoan.TotalMonths = 12; @@ -518,7 +518,7 @@ describe('DocumentLoanCreateComponent', () => { TranAmount: 100, ControlCenterId: fakeData.finControlCenters[0].Id, Desp: 'test', - TranDate: moment().add(1, 'd'), + TranDate: addDays(new Date(), 1), } as TemplateDocLoan); expect(extraLoan.isValid).toBeTruthy(); component.extraFormGroup.get('loanAccountControl')?.setValue(extraLoan); @@ -549,7 +549,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -574,8 +574,8 @@ describe('DocumentLoanCreateComponent', () => { // Step 1. const extraLoan: AccountExtraLoan = new AccountExtraLoan(); - extraLoan.startDate = moment(); - extraLoan.endDate = moment().add(1, 'y'); + extraLoan.startDate = new Date(); + extraLoan.endDate = addYears(new Date(), 1); extraLoan.InterestFree = true; extraLoan.RepayMethod = RepaymentMethodEnum.EqualPrincipal; extraLoan.TotalMonths = 12; @@ -588,7 +588,7 @@ describe('DocumentLoanCreateComponent', () => { TranAmount: 100, ControlCenterId: fakeData.finControlCenters[0].Id, Desp: 'test', - TranDate: moment().add(1, 'd'), + TranDate: addDays(new Date(), 1), } as TemplateDocLoan); expect(extraLoan.isValid).toBeTruthy(); component.extraFormGroup.get('loanAccountControl')?.setValue(extraLoan); @@ -649,7 +649,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -674,8 +674,8 @@ describe('DocumentLoanCreateComponent', () => { // Step 1. const extraLoan: AccountExtraLoan = new AccountExtraLoan(); - extraLoan.startDate = moment(); - extraLoan.endDate = moment().add(1, 'y'); + extraLoan.startDate = new Date(); + extraLoan.endDate = addYears(new Date(), 1); extraLoan.InterestFree = true; extraLoan.RepayMethod = RepaymentMethodEnum.EqualPrincipal; extraLoan.TotalMonths = 12; @@ -688,7 +688,7 @@ describe('DocumentLoanCreateComponent', () => { TranAmount: 100, ControlCenterId: fakeData.finControlCenters[0].Id, Desp: 'test', - TranDate: moment().add(1, 'd'), + TranDate: addDays(new Date(), 1), } as TemplateDocLoan); expect(extraLoan.isValid).toBeTruthy(); component.extraFormGroup.get('loanAccountControl')?.setValue(extraLoan); @@ -726,7 +726,7 @@ describe('DocumentLoanCreateComponent', () => { // Step 0 const dochead: Document = new Document(); - dochead.TranDate = moment(); + dochead.TranDate = new Date(); dochead.TranCurr = fakeData.chosedHome.BaseCurrency; dochead.Desp = 'test'; component.firstFormGroup.get('headerControl')?.setValue(dochead); @@ -751,8 +751,8 @@ describe('DocumentLoanCreateComponent', () => { // Step 1. const extraLoan: AccountExtraLoan = new AccountExtraLoan(); - extraLoan.startDate = moment(); - extraLoan.endDate = moment().add(1, 'y'); + extraLoan.startDate = new Date(); + extraLoan.endDate = addYears(new Date(), 1); extraLoan.InterestFree = true; extraLoan.RepayMethod = RepaymentMethodEnum.EqualPrincipal; extraLoan.TotalMonths = 12; @@ -765,7 +765,7 @@ describe('DocumentLoanCreateComponent', () => { TranAmount: 100, ControlCenterId: fakeData.finControlCenters[0].Id, Desp: 'test', - TranDate: moment().add(1, 'd'), + TranDate: addDays(new Date(), 1), } as TemplateDocLoan); expect(extraLoan.isValid).toBeTruthy(); component.extraFormGroup.get('loanAccountControl')?.setValue(extraLoan); diff --git a/src/app/pages/finance/document/document-loan-create/document-loan-create.component.ts b/src/app/pages/finance/document/document-loan-create/document-loan-create.component.ts index b34e0195..5bde8277 100644 --- a/src/app/pages/finance/document/document-loan-create/document-loan-create.component.ts +++ b/src/app/pages/finance/document/document-loan-create/document-loan-create.component.ts @@ -45,7 +45,7 @@ import { import { costObjectValidator } from '../../../../uimodel'; import { HomeDefOdataService, FinanceOdataService, UIStatusService, AuthService } from '../../../../services'; import { popupDialog } from '../../../message-dialog'; -import moment from 'moment'; +import { format, startOfDay, isBefore } from 'date-fns'; import { AccountExtraLoanComponent } from '../../account/account-extra-loan'; import { SafeAny } from '@common/any'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; @@ -314,7 +314,7 @@ export class DocumentLoanCreateComponent implements OnInit, OnDestroy { if (!datBuy) { return { dateisinvalid: true }; } - if (datBuy.startOf('day').isSameOrAfter(moment().startOf('day'))) { + if (!isBefore(startOfDay(datBuy), startOfDay(new Date()))) { return { dateisinvalid: true }; } } diff --git a/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.spec.ts b/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.spec.ts index d2800e79..03b14afb 100644 --- a/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.spec.ts +++ b/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.spec.ts @@ -8,7 +8,7 @@ import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/t import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { addMonths } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import {createSpyObj, getTranslocoModule, @@ -184,7 +184,7 @@ describe('DocumentLoanRepayCreateComponent', () => { loanTmpDoc = new TemplateDocLoan(); loanTmpDoc.HID = fakeData.chosedHome.ID; loanTmpDoc.Desp = 'Loan 1'; - loanTmpDoc.TranDate = moment(); + loanTmpDoc.TranDate = new Date(); loanTmpDoc.DocId = 3; loanTmpDoc.AccountId = 1; loanTmpDoc.TranAmount = 300; @@ -380,7 +380,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); @@ -421,7 +421,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); @@ -463,7 +463,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); @@ -512,7 +512,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Step 0. Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); // Now search for loan tmplate doc. @@ -557,7 +557,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Step 0. Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); // Now search for loan tmplate doc. @@ -608,7 +608,7 @@ describe('DocumentLoanRepayCreateComponent', () => { // Step 0. Search filter component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().toDate(), moment().add(1, 'month').toDate()]); + ?.setValue([new Date(), addMonths(new Date(), 1)]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.updateValueAndValidity(); // Now search for loan tmplate doc. @@ -677,7 +677,7 @@ describe('DocumentLoanRepayCreateComponent', () => { loanTmpDoc = new TemplateDocLoan(); loanTmpDoc.HID = fakeData.chosedHome.ID; loanTmpDoc.Desp = 'Loan 1'; - loanTmpDoc.TranDate = moment(); + loanTmpDoc.TranDate = new Date(); loanTmpDoc.DocId = 3; loanTmpDoc.AccountId = 1; loanTmpDoc.TranAmount = 300; diff --git a/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.ts b/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.ts index 0944726d..869ada7a 100644 --- a/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.ts +++ b/src/app/pages/finance/document/document-loan-repay-create/document-loan-repay-create.component.ts @@ -4,7 +4,8 @@ import { UntypedFormGroup, Validators, UntypedFormControl, FormsModule, Reactive import { Router, ActivatedRoute } from '@angular/router'; import { forkJoin, ReplaySubject, of } from 'rxjs'; import { takeUntil, finalize } from 'rxjs/operators'; -import moment from 'moment'; +import { format, parse, startOfDay, isBefore } from 'date-fns'; +import { dateFormat } from '@model/index'; import { NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -222,9 +223,9 @@ export class DocumentLoanRepayCreateComponent implements OnInit, OnDestroy { this.searchFormGroup.get('docIDControl')?.setValue(tmpdocid); this.searchFormGroup.get('dateRangeControl')?.setValue([ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.uiService.SelectedLoanTmp ? this.uiService.SelectedLoanTmp.TranDate!.toDate() : undefined, + this.uiService.SelectedLoanTmp ? this.uiService.SelectedLoanTmp.TranDate! : undefined, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.uiService.SelectedLoanTmp ? this.uiService.SelectedLoanTmp.TranDate!.toDate() : undefined, + this.uiService.SelectedLoanTmp ? this.uiService.SelectedLoanTmp.TranDate! : undefined, ]); this.searchFormGroup .get('accountControl') @@ -343,8 +344,8 @@ export class DocumentLoanRepayCreateComponent implements OnInit, OnDestroy { const docid = this.searchFormGroup.get('docIDControl')?.value; const ccid = this.searchFormGroup.get('ccControl')?.value; const orderid = this.searchFormGroup.get('orderControl')?.value; - const dtbgn: moment.Moment = moment(dtranges[0]); - const dtend: moment.Moment = moment(dtranges[1]); + const dtbgn: Date = new Date(dtranges[0]); + const dtend: Date = new Date(dtranges[1]); this.listOfLoanTmpDoc = []; this.selectedLoanTmpDoc = []; @@ -566,7 +567,7 @@ export class DocumentLoanRepayCreateComponent implements OnInit, OnDestroy { // Header this.confirmInfo.HID = this.homeService.ChosedHome?.ID ?? 0; this.confirmInfo.DocType = financeDocTypeRepay; - this.confirmInfo.TranDate = moment(this.headerFormGroup.get('dateControl')?.value as Date); + this.confirmInfo.TranDate = new Date(this.headerFormGroup.get('dateControl')?.value as Date); this.confirmInfo.TranCurr = this.homeService.ChosedHome?.BaseCurrency ?? ''; if (this.legacyLoan) { this.confirmInfo.Desp = 'Repay'; diff --git a/src/app/pages/finance/document/document-normal-create/document-normal-create.component.spec.ts b/src/app/pages/finance/document/document-normal-create/document-normal-create.component.spec.ts index cd003d38..8999c594 100644 --- a/src/app/pages/finance/document/document-normal-create/document-normal-create.component.spec.ts +++ b/src/app/pages/finance/document/document-normal-create/document-normal-create.component.spec.ts @@ -8,7 +8,8 @@ import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; import { By } from '@angular/platform-browser'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; -import moment from 'moment'; +import { parse } from 'date-fns'; +import { dateFormat } from '../../../../model'; import { NzModalService } from 'ng-zorro-antd/modal'; import { DocumentHeaderComponent } from '../document-header'; @@ -16,7 +17,7 @@ import { DocumentItemsComponent } from '../document-items'; import { DocumentNormalCreateComponent } from './document-normal-create.component'; import {createSpyObj, getTranslocoModule, FakeDataHelper, asyncData, asyncError} from '../../../../../testing'; import { AuthService, UIStatusService, HomeDefOdataService, FinanceOdataService } from '../../../../services'; -import { UserAuthInfo, Document, DocumentItem, momentDateFormat } from '../../../../model'; +import { UserAuthInfo, Document, DocumentItem } from '../../../../model'; import { MessageDialogComponent } from '../../../message-dialog'; import { SafeAny } from '@common/any'; import { NzFormModule } from 'ng-zorro-antd/form'; @@ -201,7 +202,7 @@ describe('DocumentNormalCreateComponent', () => { expect(component.nextButtonEnabled).toBe(false); const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -225,7 +226,7 @@ describe('DocumentNormalCreateComponent', () => { expect(component.nextButtonEnabled).toBe(false); const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = 'USD'; component.headerForm.get('headerControl')?.setValue(docheader); @@ -254,7 +255,7 @@ describe('DocumentNormalCreateComponent', () => { expect(component.nextButtonEnabled).toBe(false); const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -278,7 +279,7 @@ describe('DocumentNormalCreateComponent', () => { // Step 0. const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -317,7 +318,7 @@ describe('DocumentNormalCreateComponent', () => { // Step 0. const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -388,7 +389,7 @@ describe('DocumentNormalCreateComponent', () => { // Header const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -444,7 +445,7 @@ describe('DocumentNormalCreateComponent', () => { // Header const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = fakeData.chosedHome.BaseCurrency; component.headerForm.get('headerControl')?.setValue(docheader); @@ -491,7 +492,7 @@ describe('DocumentNormalCreateComponent', () => { // Header const docheader = new Document(); - docheader.TranDate = moment('2020-02-02', momentDateFormat); + docheader.TranDate = parse('2020-02-02', dateFormat, new Date()); docheader.Desp = 'Test on 2nd May, 2020'; docheader.TranCurr = 'USD'; component.headerForm.get('headerControl')?.setValue(docheader); diff --git a/src/app/pages/finance/document/document-normal-create/document-normal-create.component.ts b/src/app/pages/finance/document/document-normal-create/document-normal-create.component.ts index 0f00854f..12cc205e 100644 --- a/src/app/pages/finance/document/document-normal-create/document-normal-create.component.ts +++ b/src/app/pages/finance/document/document-normal-create/document-normal-create.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { UntypedFormGroup, UntypedFormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Router, RouterModule } from '@angular/router'; import { ReplaySubject, forkJoin } from 'rxjs'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -27,7 +27,7 @@ import { GeneralFilterItem, GeneralFilterOperatorEnum, GeneralFilterValueType, - momentDateFormat, + dateFormat, DocumentItemView, } from '../../../../model'; import { HomeDefOdataService, FinanceOdataService } from '../../../../services'; @@ -124,8 +124,8 @@ export class DocumentNormalCreateComponent implements OnInit, OnDestroy { }); } - get curDocDate(): moment.Moment { - return moment(); + get curDocDate(): Date { + return new Date(); } ngOnInit() { @@ -318,7 +318,7 @@ export class DocumentNormalCreateComponent implements OnInit, OnDestroy { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Equal, - lowValue: doc.TranDate.format(momentDateFormat), + lowValue: format(doc.TranDate, dateFormat), valueType: GeneralFilterValueType.date, } as GeneralFilterItem); diff --git a/src/app/pages/finance/document/document-normal-mass-create/document-normal-mass-create.component.ts b/src/app/pages/finance/document/document-normal-mass-create/document-normal-mass-create.component.ts index 924a3cfd..7384337f 100644 --- a/src/app/pages/finance/document/document-normal-mass-create/document-normal-mass-create.component.ts +++ b/src/app/pages/finance/document/document-normal-mass-create/document-normal-mass-create.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, UntypedFormArray, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Router, RouterModule } from '@angular/router'; import { ReplaySubject, forkJoin } from 'rxjs'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -25,7 +25,7 @@ import { BuildupAccountForSelection, BuildupOrderForSelection, FinanceNormalDocItemMassCreate, - momentDateFormat, + dateFormat, } from '../../../../model'; import { costObjectValidator } from '../../../../uimodel'; import { HomeDefOdataService, UIStatusService, FinanceOdataService } from '../../../../services'; @@ -319,7 +319,7 @@ export class DocumentNormalMassCreateComponent implements OnInit, OnDestroy { const docitem = new FinanceNormalDocItemMassCreate(); if (control.dateControl) { - docitem.tranDate = moment(control.dateControl); + docitem.tranDate = new Date(control.dateControl); } if (control.accountControl) { docitem.accountID = control.accountControl; @@ -349,7 +349,7 @@ export class DocumentNormalMassCreateComponent implements OnInit, OnDestroy { this.arItems.forEach((item: FinanceNormalDocItemMassCreate) => { let docObj = this.confirmInfo.find((val) => { - return val.TranDateFormatString === item.tranDate.format(momentDateFormat); + return val.TranDateFormatString === format(item.tranDate, dateFormat); }); if (docObj !== undefined) { @@ -371,11 +371,11 @@ export class DocumentNormalMassCreateComponent implements OnInit, OnDestroy { docObj.Items.push(docitem); } else { docObj = new Document(); - docObj.Desp = item.tranDate.format(momentDateFormat); + docObj.Desp = format(item.tranDate, dateFormat); docObj.DocType = financeDocTypeNormal; docObj.HID = this.homeService.ChosedHome?.ID ?? 0; docObj.TranCurr = this.baseCurrency; - docObj.TranDate = moment(item.tranDate); + docObj.TranDate = item.tranDate; const docitem = new DocumentItem(); docitem.ItemId = 1; docitem.AccountId = item.accountID; diff --git a/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.spec.ts b/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.spec.ts index 7e2ea90f..c3548846 100644 --- a/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.spec.ts +++ b/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.spec.ts @@ -8,7 +8,8 @@ import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; -import moment from 'moment'; +import { startOfMonth, endOfMonth, addMonths, addDays, addWeeks, format } from 'date-fns'; +import { dateFormat } from '../../../../model'; import {createSpyObj, getTranslocoModule, FakeDataHelper, @@ -17,7 +18,7 @@ import {createSpyObj, getTranslocoModule, ElementClass_DialogContent, ElementClass_DialogCloseButton,} from '../../../../../testing'; import { AuthService, UIStatusService, HomeDefOdataService, FinanceOdataService } from '../../../../services'; -import { UserAuthInfo, RepeatedDatesAPIOutput, DocumentItemView, momentDateFormat } from '../../../../model'; +import { UserAuthInfo, RepeatedDatesAPIOutput, DocumentItemView } from '../../../../model'; import { MessageDialogComponent } from '../../../message-dialog'; import { DocumentRecurredMassCreateComponent } from './document-recurred-mass-create.component'; import { DocumentNormalMassCreateItemComponent } from '../document-normal-mass-create-item'; @@ -171,16 +172,16 @@ describe('DocumentRecurredMassCreateComponent', () => { // Repeated docs ardates = []; ardates.push({ - StartDate: moment().startOf('month'), - EndDate: moment().endOf('month'), + StartDate: startOfMonth(new Date()), + EndDate: endOfMonth(new Date()), }); ardates.push({ - StartDate: moment().add(1, 'months').startOf('month'), - EndDate: moment().add(1, 'months').endOf('month'), + StartDate: startOfMonth(addMonths(new Date(), 1)), + EndDate: endOfMonth(addMonths(new Date(), 1)), }); ardates.push({ - StartDate: moment().add(2, 'months').startOf('month'), - EndDate: moment().add(2, 'months').endOf('month'), + StartDate: startOfMonth(addMonths(new Date(), 2)), + EndDate: endOfMonth(addMonths(new Date(), 2)), }); getRepeatedDatesSpy.and.returnValue(asyncData(ardates)); @@ -190,7 +191,7 @@ describe('DocumentRecurredMassCreateComponent', () => { DocumentID: 1, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().add(1, 'days').format(momentDateFormat), + TransactionDate: format(addDays(new Date(), 1), dateFormat), DocumentDesp: 'doc 1', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -206,7 +207,7 @@ describe('DocumentRecurredMassCreateComponent', () => { DocumentID: 2, ItemID: 1, HomeID: fakeData.chosedHome.ID, - TransactionDate: moment().add(1, 'weeks').format(momentDateFormat), + TransactionDate: format(addWeeks(new Date(), 1), dateFormat), DocumentDesp: 'doc 2', AccountID: fakeData.finAccounts[0].Id, TransactionType: fakeData.finTranTypes[0].Id, @@ -429,7 +430,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); expect(component.searchFormGroup.valid).toBeFalsy(); @@ -450,7 +451,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.markAsDirty(); expect(component.searchFormGroup.valid).toBeFalsy(); @@ -474,7 +475,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -512,7 +513,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -548,7 +549,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -576,7 +577,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -610,7 +611,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -652,7 +653,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -694,7 +695,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -736,7 +737,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -778,7 +779,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -829,7 +830,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -878,7 +879,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); @@ -946,7 +947,7 @@ describe('DocumentRecurredMassCreateComponent', () => { // Step 0. Input search criteria component.searchFormGroup .get('dateRangeControl') - ?.setValue([moment().startOf('month').toDate(), moment().endOf('month').toDate()]); + ?.setValue([startOfMonth(new Date()), endOfMonth(new Date())]); component.searchFormGroup.get('frqControl')?.setValue(component.arFrequencies[0].value); component.searchFormGroup.get('accountControl')?.setValue(fakeData.finAccounts[0].Id); component.searchFormGroup.markAsDirty(); diff --git a/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.ts b/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.ts index 02ddf4ce..c73b9e12 100644 --- a/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.ts +++ b/src/app/pages/finance/document/document-recurred-mass-create/document-recurred-mass-create.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { UntypedFormGroup, UntypedFormControl, Validators, UntypedFormArray, UntypedFormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Router } from '@angular/router'; import { ReplaySubject, forkJoin } from 'rxjs'; -import moment from 'moment'; +import { format, parse, isWithinInterval, addDays } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { takeUntil, finalize } from 'rxjs/operators'; import { translate, TranslocoModule } from '@jsverse/transloco'; @@ -27,7 +27,7 @@ import { UIDisplayStringUtil, GeneralFilterItem, GeneralFilterOperatorEnum, - momentDateFormat, + dateFormat, GeneralFilterValueType, DocumentItemView, RepeatedDatesAPIInput, @@ -56,13 +56,13 @@ import { NzDatePickerModule } from 'ng-zorro-antd/date-picker'; import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; class DocumentCountByDateRange { - StartDate: moment.Moment | null = null; + StartDate: Date | null = null; get StartDateString(): string { - return this.StartDate ? this.StartDate.format(momentDateFormat) : ''; + return this.StartDate ? format(this.StartDate, dateFormat) : ''; } - EndDate: moment.Moment | null = null; + EndDate: Date | null = null; get EndDateString(): string { - return this.EndDate ? this.EndDate.format(momentDateFormat) : ''; + return this.EndDate ? format(this.EndDate, dateFormat) : ''; } expand = false; Items: DocumentItemView[] = []; @@ -332,9 +332,9 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment(dtrange[0] as Date).format(momentDateFormat), + lowValue: format(new Date(dtrange[0] as Date), dateFormat), valueType: GeneralFilterValueType.date, - highValue: moment(dtrange[1] as Date).format(momentDateFormat), + highValue: format(new Date(dtrange[1] as Date), dateFormat), }); // Tran. type let idval = this.searchFormGroup.get('tranTypeControl')?.value; @@ -382,8 +382,8 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { } const datinput: RepeatedDatesAPIInput = { - StartDate: moment(dtrange[0] as Date), - EndDate: moment(dtrange[1] as Date), + StartDate: new Date(dtrange[0] as Date), + EndDate: new Date(dtrange[1] as Date), RepeatType: this.searchFormGroup.get('frqControl')?.value as RepeatFrequencyEnum, }; @@ -403,14 +403,14 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { this.listDates.forEach((datrange) => { const aritems: DocumentItemView[] = []; arallitems.forEach((div: DocumentItemView) => { - if (moment(div.TransactionDate).isBetween(datrange.StartDate, datrange.EndDate)) { + if (div.TransactionDate && isWithinInterval(new Date(div.TransactionDate), { start: datrange.StartDate, end: datrange.EndDate })) { aritems.push(div); } }); const itm = new DocumentCountByDateRange(); - itm.StartDate = datrange.StartDate.clone(); - itm.EndDate = datrange.EndDate.clone(); + itm.StartDate = new Date(datrange.StartDate.getTime()); + itm.EndDate = new Date(datrange.EndDate.getTime()); itm.expand = false; itm.Items = aritems ? aritems : []; this.listExistingDocItems.push(itm); @@ -459,11 +459,11 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { if (docitems.ItemsCount === 0) { const newItem: SafeAny = this.initItem(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - let stdat = docitems.StartDate!.clone(); + let stdat = new Date(docitems.StartDate!.getTime()); if (defval.dayOffsetControl) { - stdat = stdat.add(defval.dayOffsetControl, 'days'); + stdat = addDays(stdat, defval.dayOffsetControl); } - newItem.get('dateControl').setValue(stdat.toDate()); + newItem.get('dateControl').setValue(stdat); // Desp newItem.get('despControl').setValue(defval.despControl + ' ' + docitems.StartDateString); @@ -558,7 +558,7 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { const docitem = new FinanceNormalDocItemMassCreate(); if (control.dateControl) { - docitem.tranDate = moment(control.dateControl); + docitem.tranDate = new Date(control.dateControl); } if (control.accountControl) { docitem.accountID = control.accountControl; @@ -587,7 +587,7 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { this.arItems.forEach((item: FinanceNormalDocItemMassCreate) => { let docObj = this.confirmInfo.find((val) => { - return val.TranDateFormatString === item.tranDate.format(momentDateFormat); + return val.TranDateFormatString === format(item.tranDate, dateFormat); }); if (docObj !== undefined) { @@ -609,11 +609,11 @@ export class DocumentRecurredMassCreateComponent implements OnInit, OnDestroy { docObj.Items.push(docitem); } else { docObj = new Document(); - docObj.Desp = item.tranDate.format(momentDateFormat); + docObj.Desp = format(item.tranDate, dateFormat); docObj.DocType = financeDocTypeNormal; docObj.HID = this.homeService.ChosedHome?.ID ?? 0; docObj.TranCurr = this.baseCurrency; - docObj.TranDate = moment(item.tranDate); + docObj.TranDate = new Date(item.tranDate); const docitem = new DocumentItem(); docitem.ItemId = 1; docitem.AccountId = item.accountID; diff --git a/src/app/pages/finance/document/document-transfer-create/document-transfer-create.component.spec.ts b/src/app/pages/finance/document/document-transfer-create/document-transfer-create.component.spec.ts index 2a344b5e..e1e2a6bf 100644 --- a/src/app/pages/finance/document/document-transfer-create/document-transfer-create.component.spec.ts +++ b/src/app/pages/finance/document/document-transfer-create/document-transfer-create.component.spec.ts @@ -519,7 +519,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); component.headerFormGroup.get('amountControl')?.setValue(100); @@ -556,7 +556,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); expect(component.headerFormGroup.get('headerControl')?.valid, 'Expect a valid header').toBeTruthy(); @@ -595,7 +595,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); expect(component.headerFormGroup.get('headerControl')?.valid, 'Expect a valid header').toBeTruthy(); @@ -637,7 +637,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); expect(component.headerFormGroup.get('headerControl')?.valid, 'Expect a valid header form') @@ -687,7 +687,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); expect(component.headerFormGroup.get('headerControl')?.valid, 'Expect a valid header').toBeTruthy(); @@ -731,7 +731,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); component.headerFormGroup.get('amountControl')?.setValue(100); @@ -777,7 +777,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); component.headerFormGroup.get('amountControl')?.setValue(100); @@ -912,7 +912,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); component.headerFormGroup.get('amountControl')?.setValue(100); @@ -991,7 +991,7 @@ describe('DocumentTransferCreateComponent', () => { const curdoc: Document = new Document(); curdoc.TranCurr = fakeData.chosedHome.BaseCurrency; curdoc.Desp = 'test'; - // curdoc.TranDate = moment(); + // curdoc.TranDate = new Date(); component.headerFormGroup.get('headerControl')?.setValue(curdoc); component.headerFormGroup.get('headerControl')?.updateValueAndValidity(); component.headerFormGroup.get('amountControl')?.setValue(100); diff --git a/src/app/pages/finance/finance.component.spec.ts b/src/app/pages/finance/finance.component.spec.ts index 83f4bfc7..12d9af2e 100644 --- a/src/app/pages/finance/finance.component.spec.ts +++ b/src/app/pages/finance/finance.component.spec.ts @@ -9,7 +9,7 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; import { OverlayContainer } from '@angular/cdk/overlay'; -import moment from 'moment'; +import { startOfMonth, endOfMonth, format } from 'date-fns'; import {createSpyObj, getTranslocoModule, FakeDataHelper, @@ -17,7 +17,7 @@ import {createSpyObj, getTranslocoModule, ElementClass_DialogContent, ElementClass_DialogCloseButton,} from '../../../testing'; import { AuthService, UIStatusService, HomeDefOdataService, FinanceOdataService } from '../../services'; -import { UserAuthInfo, momentDateFormat, TemplateDocADP, TemplateDocLoan } from '../../model'; +import { UserAuthInfo, dateFormat, TemplateDocADP, TemplateDocLoan } from '../../model'; import { FinanceComponent } from './finance.component'; import { SafeAny } from '@common/any'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; @@ -127,15 +127,15 @@ describe('FinanceComponent', () => { }); it('Should work for DP and Loan docs', async () => { - const dat1 = moment().startOf('month'); - const dat2 = moment().endOf('month'); + const dat1 = startOfMonth(new Date()); + const dat2 = endOfMonth(new Date()); arLoanTmpDoc = []; arDPTmpDoc = []; const dp1: TemplateDocADP = new TemplateDocADP(); dp1.DocId = 1; dp1.HID = fakeData.chosedHome.ID; dp1.TranAmount = 100; - dp1.TranDate = dat1.clone(); + dp1.TranDate = dat1; dp1.AccountId = 1; dp1.Desp = 'test1'; arDPTmpDoc.push(dp1); @@ -143,14 +143,14 @@ describe('FinanceComponent', () => { dp2.HID = fakeData.chosedHome.ID; dp2.DocId = 2; dp2.TranAmount = 200; - dp2.TranDate = dat2.clone(); + dp2.TranDate = new Date(dat2); dp2.AccountId = 1; dp2.Desp = 'test2'; arDPTmpDoc.push(dp2); const loan1: TemplateDocLoan = new TemplateDocLoan(); loan1.HID = fakeData.chosedHome.ID; loan1.Desp = 'Loan 1'; - loan1.TranDate = dat2.clone(); + loan1.TranDate = new Date(dat2); loan1.DocId = 3; loan1.AccountId = 1; loan1.TranAmount = 300; @@ -159,7 +159,7 @@ describe('FinanceComponent', () => { fetchAllLoanTmpDocsSpy.and.returnValue(of(arLoanTmpDoc)); createDocumentFromDPTemplateSpy.and.returnValue( of({ - TranDate: dat1.clone(), + TranDate: new Date(dat1), }) ); fixture.detectChanges(); @@ -177,7 +177,7 @@ describe('FinanceComponent', () => { expect(createDocumentFromDPTemplateSpy).toHaveBeenCalled(); expect(component.listDate.length).toEqual(1); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - expect(component.listDate[0].CurrentDate!.format(momentDateFormat)).toEqual(dat2.format(momentDateFormat)); + expect(format(component.listDate[0].CurrentDate!, dateFormat)).toEqual(format(dat2, dateFormat)); // Post the Loan doc const routerstub = TestBed.inject(Router); diff --git a/src/app/pages/finance/finance.component.ts b/src/app/pages/finance/finance.component.ts index 009e5793..cd2116f5 100644 --- a/src/app/pages/finance/finance.component.ts +++ b/src/app/pages/finance/finance.component.ts @@ -5,7 +5,7 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { NzModalModule, NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzMessageService } from 'ng-zorro-antd/message'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format, parse, isBefore, startOfDay, startOfMonth, startOfYear, endOfDay, endOfMonth, endOfYear, addMonths, getDate } from 'date-fns'; import { ModelUtility, @@ -18,7 +18,7 @@ import { FinanceAssetDepreciationCreationItem, Account, BuildupOrderForSelection, - momentDateFormat, + dateFormat, } from '../../model'; import { FinanceOdataService, UIStatusService, HomeDefOdataService } from '../../services'; import { SafeAny } from '@common/any'; @@ -47,7 +47,7 @@ import { NzTypographyModule } from 'ng-zorro-antd/typography'; import { NzDrawerModule } from 'ng-zorro-antd/drawer'; class DateCellData { - public CurrentDate: moment.Moment | null = null; + public CurrentDate: Date | null = null; public DPDocs: TemplateDocADP[] = []; public LoanDocs: TemplateDocLoan[] = []; } @@ -152,10 +152,9 @@ export class FinanceComponent implements OnInit, OnDestroy { getDPDocsByDate(date: Date): TemplateDocADP[] { const dpdocs: TemplateDocADP[] = []; - const mcell = moment(date); this.listDate.forEach((cell: DateCellData) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - if (cell.CurrentDate!.isSame(mcell)) { + if (!isBefore(cell.CurrentDate!, date) && isBefore(cell.CurrentDate!, new Date(date.getTime() + 86400000))) { dpdocs.push(...cell.DPDocs); } }); @@ -165,10 +164,9 @@ export class FinanceComponent implements OnInit, OnDestroy { getLoanDocsByDate(date: Date): TemplateDocLoan[] { const dpdocs: TemplateDocLoan[] = []; - const mcell = moment(date); this.listDate.forEach((cell: DateCellData) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - if (cell.CurrentDate!.isSame(mcell)) { + if (!isBefore(cell.CurrentDate!, date) && isBefore(cell.CurrentDate!, new Date(date.getTime() + 86400000))) { dpdocs.push(...cell.LoanDocs); } }); @@ -176,8 +174,8 @@ export class FinanceComponent implements OnInit, OnDestroy { return dpdocs; } isLastDateInMonth(seledDate: Date): boolean { - const mdate = moment(seledDate); - return mdate.daysInMonth() === mdate.date(); + const eom = endOfMonth(seledDate); + return getDate(seledDate) === getDate(eom); } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -198,9 +196,8 @@ export class FinanceComponent implements OnInit, OnDestroy { } onAssetDeprec(seldate: Date): void { - const ment = moment(seldate); - const year = ment.year(); - const month = ment.month() + 1; + const year = seldate.getFullYear(); + const month = seldate.getMonth() + 1; forkJoin([ this.odataService.fetchAllAccountCategories(), @@ -222,7 +219,8 @@ export class FinanceComponent implements OnInit, OnDestroy { TranAmount: rst.TranAmount!, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion TranCurr: rst.TranCurr!, - TranDate: moment(rst.TranDate).format(momentDateFormat), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + TranDate: format(rst.TranDate!, dateFormat), HID: rst.HID, Desp: '', }); @@ -293,10 +291,8 @@ export class FinanceComponent implements OnInit, OnDestroy { } fetchData(forceReload = false): void { - const dtbgn: moment.Moment = moment(this.selectedDate); - const dtend: moment.Moment = moment(this.selectedDate); - dtbgn.startOf('month'); - dtend.endOf('month'); + const dtbgn: Date = startOfMonth(this.selectedDate as Date); + const dtend: Date = endOfMonth(this.selectedDate as Date); this.isLoadingResults = true; forkJoin([ @@ -326,12 +322,12 @@ export class FinanceComponent implements OnInit, OnDestroy { rsts[0].forEach((val: TemplateDocADP) => { const idx = this.listDate.findIndex((cell) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return cell.CurrentDate!.startOf('date').isSame(val.TranDate!.startOf('date')); + return !isBefore(startOfDay(cell.CurrentDate!), startOfDay(val.TranDate!)); }); if (idx === -1) { const ncell = new DateCellData(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ncell.CurrentDate = val.TranDate!.clone(); + ncell.CurrentDate = val.TranDate!; ncell.DPDocs.push(val); this.listDate.push(ncell); } else { @@ -344,12 +340,12 @@ export class FinanceComponent implements OnInit, OnDestroy { rsts[1].forEach((val: TemplateDocLoan) => { const idx = this.listDate.findIndex((cell) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return cell.CurrentDate!.startOf('date').isSame(val.TranDate!.startOf('date')); + return !isBefore(startOfDay(cell.CurrentDate!), startOfDay(val.TranDate!)); }); if (idx === -1) { const ncell = new DateCellData(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ncell.CurrentDate = val.TranDate!.clone(); + ncell.CurrentDate = val.TranDate!; ncell.LoanDocs.push(val); this.listDate.push(ncell); } else { @@ -385,7 +381,7 @@ export class FinanceComponent implements OnInit, OnDestroy { // Remove the doc const idx = this.listDate.findIndex((cell) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return cell.CurrentDate!.startOf('date').isSame(val.TranDate.startOf('date')); + return !isBefore(startOfDay(cell.CurrentDate!), startOfDay(val.TranDate)); }); if (idx !== -1) { const secidx = this.listDate[idx].DPDocs.findIndex((doc) => { @@ -414,13 +410,13 @@ export class FinanceComponent implements OnInit, OnDestroy { // Open the insight onOpenInsight(ncell: number) { - const dtbgn: moment.Moment = moment(this.selectedDate); - const dtend: moment.Moment = moment(this.selectedDate); + let dtbgn: Date; + let dtend: Date; switch (ncell) { case 1: - dtbgn.startOf('month'); - dtend.endOf('month'); + dtbgn = startOfMonth(this.selectedDate as Date); + dtend = endOfMonth(this.selectedDate as Date); this.uiService.docInsightOption = { SelectedDataRange: [dtbgn, dtend], ExcludeTransfer: this.ExcludeTransfer, @@ -428,8 +424,8 @@ export class FinanceComponent implements OnInit, OnDestroy { }; break; case 2: - dtbgn.startOf('month'); - dtend.endOf('month'); + dtbgn = startOfMonth(this.selectedDate as Date); + dtend = endOfMonth(this.selectedDate as Date); this.uiService.docInsightOption = { SelectedDataRange: [dtbgn, dtend], ExcludeTransfer: this.ExcludeTransfer, @@ -437,8 +433,8 @@ export class FinanceComponent implements OnInit, OnDestroy { }; break; case 3: - dtbgn.startOf('year'); - dtend.endOf('year'); + dtbgn = startOfYear(this.selectedDate as Date); + dtend = endOfYear(this.selectedDate as Date); this.uiService.docInsightOption = { SelectedDataRange: [dtbgn, dtend], ExcludeTransfer: this.ExcludeTransfer, @@ -446,8 +442,8 @@ export class FinanceComponent implements OnInit, OnDestroy { }; break; case 4: - dtbgn.startOf('year'); - dtend.endOf('year'); + dtbgn = startOfYear(this.selectedDate as Date); + dtend = endOfYear(this.selectedDate as Date); this.uiService.docInsightOption = { SelectedDataRange: [dtbgn, dtend], ExcludeTransfer: this.ExcludeTransfer, @@ -461,9 +457,9 @@ export class FinanceComponent implements OnInit, OnDestroy { } private _updateSelectedDate() { - const mt = moment(this.selectedDate); - this._selectedYear = mt.year(); - this._selectedMonth = mt.month(); + const mt = this.selectedDate as Date; + this._selectedYear = mt.getFullYear(); + this._selectedMonth = mt.getMonth(); } } diff --git a/src/app/pages/finance/order/order-detail/order-detail.component.spec.ts b/src/app/pages/finance/order/order-detail/order-detail.component.spec.ts index 66f7c285..41a371d2 100644 --- a/src/app/pages/finance/order/order-detail/order-detail.component.spec.ts +++ b/src/app/pages/finance/order/order-detail/order-detail.component.spec.ts @@ -7,7 +7,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; import { BehaviorSubject, of } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; -import moment from 'moment'; +import { addYears, subYears } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { OrderDetailComponent } from './order-detail.component'; @@ -178,9 +178,9 @@ describe('OrderDetailComponent', () => { // Name // component.detailFormGroup.get('nameControl').setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); @@ -205,15 +205,15 @@ describe('OrderDetailComponent', () => { // Name component.detailFormGroup.get('nameControl')?.setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().subtract(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(subYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); expect(component.detailFormGroup.valid).toBeFalsy(); - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); fixture.detectChanges(); expect(component.detailFormGroup.valid).toBeTruthy(); @@ -232,9 +232,9 @@ describe('OrderDetailComponent', () => { // Name component.detailFormGroup.get('nameControl')?.setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); @@ -274,9 +274,9 @@ describe('OrderDetailComponent', () => { // Name component.detailFormGroup.get('nameControl')?.setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); @@ -348,9 +348,9 @@ describe('OrderDetailComponent', () => { // Name component.detailFormGroup.get('nameControl')?.setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); @@ -419,9 +419,9 @@ describe('OrderDetailComponent', () => { // Name component.detailFormGroup.get('nameControl')?.setValue('test'); // Valid from - component.detailFormGroup.get('startDateControl')?.setValue(moment().toDate()); + component.detailFormGroup.get('startDateControl')?.setValue(new Date()); // Valid to - component.detailFormGroup.get('endDateControl')?.setValue(moment().add(1, 'y').toDate()); + component.detailFormGroup.get('endDateControl')?.setValue(addYears(new Date(), 1)); // Comment component.detailFormGroup.get('cmtControl')?.setValue('test'); fixture.detectChanges(); diff --git a/src/app/pages/finance/order/order-detail/order-detail.component.ts b/src/app/pages/finance/order/order-detail/order-detail.component.ts index c2475da9..b260e930 100644 --- a/src/app/pages/finance/order/order-detail/order-detail.component.ts +++ b/src/app/pages/finance/order/order-detail/order-detail.component.ts @@ -5,7 +5,7 @@ import { UntypedFormGroup, UntypedFormControl, Validators, FormsModule, Reactive import { takeUntil, finalize } from 'rxjs/operators'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { addYears } from 'date-fns'; import { UIMode, isUIEditable } from 'actslib'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; @@ -106,8 +106,8 @@ export class OrderDetailComponent implements OnInit, OnDestroy { { idControl: new UntypedFormControl(), nameControl: new UntypedFormControl('', [Validators.required, Validators.maxLength(30)]), - startDateControl: new UntypedFormControl(moment().toDate(), [Validators.required]), - endDateControl: new UntypedFormControl(moment().add(1, 'y').toDate(), [Validators.required]), + startDateControl: new UntypedFormControl(new Date(), [Validators.required]), + endDateControl: new UntypedFormControl(addYears(new Date(), 1), [Validators.required]), cmtControl: new UntypedFormControl(), }, [dateRangeValidator] @@ -164,9 +164,9 @@ export class OrderDetailComponent implements OnInit, OnDestroy { this.detailFormGroup.get('idControl')?.setValue(rsts[1].Id); this.detailFormGroup.get('nameControl')?.setValue(rsts[1].Name); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.detailFormGroup.get('startDateControl')?.setValue(rsts[1].ValidFrom!.toDate()); + this.detailFormGroup.get('startDateControl')?.setValue(rsts[1].ValidFrom!); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.detailFormGroup.get('endDateControl')?.setValue(rsts[1].ValidTo!.toDate()); + this.detailFormGroup.get('endDateControl')?.setValue(rsts[1].ValidTo!); if (rsts[1].Comment) { this.detailFormGroup.get('cmtControl')?.setValue(rsts[1].Comment); } @@ -474,8 +474,8 @@ export class OrderDetailComponent implements OnInit, OnDestroy { ordInstance.Id = this.routerID; } ordInstance.Name = this.detailFormGroup.get('nameControl')?.value; - ordInstance.ValidFrom = moment(this.detailFormGroup.get('startDateControl')?.value); - ordInstance.ValidTo = moment(this.detailFormGroup.get('endDateControl')?.value); + ordInstance.ValidFrom = this.detailFormGroup.get('startDateControl')?.value as Date; + ordInstance.ValidTo = this.detailFormGroup.get('endDateControl')?.value as Date; ordInstance.Comment = this.detailFormGroup.get('cmtControl')?.value; ordInstance.SRules = []; ordInstance.SRules = this.listRules.slice(); diff --git a/src/app/pages/finance/order/order-list/order-list.component.ts b/src/app/pages/finance/order/order-list/order-list.component.ts index 1ba18646..589fa995 100644 --- a/src/app/pages/finance/order/order-list/order-list.component.ts +++ b/src/app/pages/finance/order/order-list/order-list.component.ts @@ -5,7 +5,7 @@ import { Router, RouterModule } from '@angular/router'; import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { NzDrawerModule, NzDrawerService } from 'ng-zorro-antd/drawer'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { isBefore, isAfter } from 'date-fns'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzResultModule } from 'ng-zorro-antd/result'; @@ -65,8 +65,8 @@ export class OrderListComponent implements OnInit, OnDestroy { } invalidOrder(ord: Order): boolean { if (ord) { - const cur: moment.Moment = moment(); - if (ord.ValidFrom && ord.ValidFrom.isBefore(cur) && ord.ValidTo && ord.ValidTo.isAfter(cur)) { + const cur = new Date(); + if (ord.ValidFrom && isBefore(ord.ValidFrom, cur) && ord.ValidTo && isAfter(ord.ValidTo, cur)) { return false; } } diff --git a/src/app/pages/finance/pipes/order-validity-filter.pipe.spec.ts b/src/app/pages/finance/pipes/order-validity-filter.pipe.spec.ts index 1ed92388..555979ec 100644 --- a/src/app/pages/finance/pipes/order-validity-filter.pipe.spec.ts +++ b/src/app/pages/finance/pipes/order-validity-filter.pipe.spec.ts @@ -1,4 +1,4 @@ -import moment from 'moment'; +import { addMonths, subMonths, addDays, subDays } from 'date-fns'; import { OrderValidityFilterPipe } from './order-validity-filter.pipe'; import { Order } from '../../../model'; @@ -13,14 +13,14 @@ describe('OrderValidityFilterPipe', () => { const ofs: Order = new Order(); ofs.Id = i; if (i === 1) { - ofs.ValidFrom = moment().subtract(1, 'M'); - ofs.ValidTo = moment().add(1, 'M'); + ofs.ValidFrom = subMonths(new Date(), 1); + ofs.ValidTo = addMonths(new Date(), 1); } else if (i === 2) { - ofs.ValidFrom = moment().subtract(2, 'M'); - ofs.ValidTo = moment().subtract(1, 'M'); + ofs.ValidFrom = subMonths(new Date(), 2); + ofs.ValidTo = subMonths(new Date(), 1); } else if (i === 3) { - ofs.ValidFrom = moment().add(1, 'M'); - ofs.ValidTo = moment().add(2, 'M'); + ofs.ValidFrom = addMonths(new Date(), 1); + ofs.ValidTo = addMonths(new Date(), 2); } ofs.Name = 'LastMonth'; arorders.push(ofs); @@ -35,15 +35,15 @@ describe('OrderValidityFilterPipe', () => { expect(arrsts.length).toEqual(arorders.length); }); it('3. Filter shall work for today', () => { - const arrsts: Order[] = pipe.transform(arorders, moment()); + const arrsts: Order[] = pipe.transform(arorders, new Date()); expect(arrsts.length).toEqual(1); }); it('4. Filter shall work for 40 days later', () => { - const arrsts: Order[] = pipe.transform(arorders, moment().add(40, 'd')); + const arrsts: Order[] = pipe.transform(arorders, addDays(new Date(), 40)); expect(arrsts.length).toEqual(1); }); it('5. Filter shall work for 40 days earlier', () => { - const arrsts: Order[] = pipe.transform(arorders, moment().subtract(40, 'd')); + const arrsts: Order[] = pipe.transform(arorders, subDays(new Date(), 40)); expect(arrsts.length).toEqual(1); }); }); diff --git a/src/app/pages/finance/pipes/order-validity-filter.pipe.ts b/src/app/pages/finance/pipes/order-validity-filter.pipe.ts index 15852514..bbe6c649 100644 --- a/src/app/pages/finance/pipes/order-validity-filter.pipe.ts +++ b/src/app/pages/finance/pipes/order-validity-filter.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core'; -import moment from 'moment'; +import { isBefore, isAfter } from 'date-fns'; import { Order } from '../../../model'; @@ -8,17 +8,17 @@ import { Order } from '../../../model'; standalone: true }) export class OrderValidityFilterPipe implements PipeTransform { - transform(allOrders: Order[], args?: moment.Moment | boolean): Order[] { + transform(allOrders: Order[], args?: Date | boolean): Order[] { return allOrders ? allOrders.filter((value: Order) => { if (args !== undefined) { - if (moment.isMoment(args)) { + if (args instanceof Date) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return value.ValidFrom!.isBefore(args) && value.ValidTo!.isAfter(args); + return isBefore(value.ValidFrom!, args) && isAfter(value.ValidTo!, args); } else if (args) { - const dt = moment(); + const dt = new Date(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return value.ValidFrom!.isBefore(dt) && value.ValidTo!.isAfter(dt); + return isBefore(value.ValidFrom!, dt) && isAfter(value.ValidTo!, dt); } } diff --git a/src/app/pages/finance/plan/plan-detail/plan-detail.component.ts b/src/app/pages/finance/plan/plan-detail/plan-detail.component.ts index eabb1afc..6cbaf2a2 100644 --- a/src/app/pages/finance/plan/plan-detail/plan-detail.component.ts +++ b/src/app/pages/finance/plan/plan-detail/plan-detail.component.ts @@ -5,7 +5,7 @@ import { UntypedFormGroup, UntypedFormControl, Validators, FormsModule, Reactive import { takeUntil, finalize } from 'rxjs/operators'; import { NzModalService } from 'ng-zorro-antd/modal'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { addYears } from 'date-fns'; import { UIMode, isUIEditable } from 'actslib'; import { NzPageHeaderModule } from 'ng-zorro-antd/page-header'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; @@ -141,8 +141,8 @@ export class PlanDetailComponent implements OnInit, OnDestroy { { idControl: new UntypedFormControl({ value: undefined, disabled: true }), typeControl: new UntypedFormControl(undefined, [Validators.required]), - startDateControl: new UntypedFormControl(moment().toDate(), [Validators.required]), - endDateControl: new UntypedFormControl(moment().add(1, 'y').toDate(), [Validators.required]), + startDateControl: new UntypedFormControl(new Date(), [Validators.required]), + endDateControl: new UntypedFormControl(addYears(new Date(), 1), [Validators.required]), despControl: new UntypedFormControl('', [Validators.required]), accountControl: new UntypedFormControl({ value: undefined, @@ -225,9 +225,9 @@ export class PlanDetailComponent implements OnInit, OnDestroy { const planObj = rsts[5] as Plan; this.detailFormGroup.get('idControl')?.setValue(planObj.ID); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.detailFormGroup.get('startDateControl')?.setValue(planObj.StartDate!.toDate()); + this.detailFormGroup.get('startDateControl')?.setValue(planObj.StartDate!); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.detailFormGroup.get('endDateControl')?.setValue(planObj.TargetDate!.toDate()); + this.detailFormGroup.get('endDateControl')?.setValue(planObj.TargetDate!); this.detailFormGroup.get('despControl')?.setValue(planObj.Description); this.detailFormGroup.get('accountControl')?.setValue(planObj.AccountID); this.detailFormGroup.get('acntCtgyControl')?.setValue(planObj.AccountCategoryID); @@ -498,8 +498,8 @@ export class PlanDetailComponent implements OnInit, OnDestroy { if (this.uiMode === UIMode.Update) { dataInstance.ID = this.detailFormGroup.get('idControl')?.value; } - dataInstance.StartDate = moment(this.detailFormGroup.get('startDateControl')?.value as Date); - dataInstance.TargetDate = moment(this.detailFormGroup.get('endDateControl')?.value as Date); + dataInstance.StartDate = this.detailFormGroup.get('startDateControl')?.value as Date; + dataInstance.TargetDate = this.detailFormGroup.get('endDateControl')?.value as Date; dataInstance.Description = this.detailFormGroup.get('despControl')?.value; dataInstance.PlanType = this.detailFormGroup.get('typeControl')?.value as PlanTypeEnum; switch (dataInstance.PlanType) { diff --git a/src/app/pages/finance/report/account-month-on-month-report/account-month-on-month-report.component.ts b/src/app/pages/finance/report/account-month-on-month-report/account-month-on-month-report.component.ts index b16a4dc6..7a155490 100644 --- a/src/app/pages/finance/report/account-month-on-month-report/account-month-on-month-report.component.ts +++ b/src/app/pages/finance/report/account-month-on-month-report/account-month-on-month-report.component.ts @@ -3,7 +3,7 @@ import { ReplaySubject, forkJoin, takeUntil } from 'rxjs'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NumberUtility } from 'actslib'; import { EChartsOption } from 'echarts'; -import moment from 'moment'; +import { format, subMonths } from 'date-fns'; import { NzModalService } from 'ng-zorro-antd/modal'; import { FinanceOdataService } from '@services/index'; @@ -124,13 +124,13 @@ export class AccountMonthOnMonthReportComponent implements OnInit, OnDestroy { if (this.selectedPeriod === financePeriodLast12Months) { // Last 12 months for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = val.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = val.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); @@ -144,13 +144,13 @@ export class AccountMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast6Months) { // Last 6 months for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = val.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = val.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); @@ -164,13 +164,13 @@ export class AccountMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast3Months) { // Last 3 months for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = val.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = val.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); diff --git a/src/app/pages/finance/report/cash-month-on-month-report/cash-month-on-month-report.component.ts b/src/app/pages/finance/report/cash-month-on-month-report/cash-month-on-month-report.component.ts index a971d220..1110beb6 100644 --- a/src/app/pages/finance/report/cash-month-on-month-report/cash-month-on-month-report.component.ts +++ b/src/app/pages/finance/report/cash-month-on-month-report/cash-month-on-month-report.component.ts @@ -5,7 +5,7 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { Router } from '@angular/router'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { EChartsOption } from 'echarts'; -import moment from 'moment'; +import { format, subMonths, endOfMonth, parse } from 'date-fns'; import { NumberUtility } from 'actslib'; import { NzDrawerService } from 'ng-zorro-antd/drawer'; @@ -19,7 +19,7 @@ import { GeneralFilterOperatorEnum, GeneralFilterValueType, ModelUtility, - momentDateFormat, + dateFormat, } from '@model/index'; import { FinanceOdataService, UIStatusService } from '@services/index'; import { DocumentItemViewComponent } from '../../document/document-item-view'; @@ -144,13 +144,13 @@ export class CashMonthOnMonthReportComponent implements OnInit, OnDestroy { if (this.selectedPeriod === financePeriodLast12Months) { // Last 12 months for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -164,13 +164,13 @@ export class CashMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast6Months) { // Last 6 months for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -184,13 +184,13 @@ export class CashMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast3Months) { // Last 3 months for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -306,13 +306,13 @@ export class CashMonthOnMonthReportComponent implements OnInit, OnDestroy { // seriesType: "bar" // type: "click" // value: -200 - const dtmonth = moment((event.name + '.01').replace('.', '-')); + const dtmonth = parse((event.name + '.01').replace('.', '-'), 'yyyy-MM-dd', new Date()); if (event.seriesId === 'in') { - this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.endOf('M').format(momentDateFormat), false); + this.onDisplayDocItem(format(dtmonth, dateFormat), format(endOfMonth(dtmonth), dateFormat), false); } else if (event.seriesId === 'out') { - this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.endOf('M').format(momentDateFormat), true); + this.onDisplayDocItem(format(dtmonth, dateFormat), format(endOfMonth(dtmonth), dateFormat), true); } else if (event.seriesId === 'total') { - // this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.add(1, 'M').format(momentDateFormat), true); + // this.onDisplayDocItem(format(dtmonth, dateFormat), format(addMonths(dtmonth, 1), dateFormat), true); } else { console.error(event.toString()); } @@ -320,8 +320,8 @@ export class CashMonthOnMonthReportComponent implements OnInit, OnDestroy { onDisplayDocItem(beginDate: string, endDate: string, isexp: boolean) { this.uiStatusService.docInsightOption = { SelectedDataRange: [ - moment(beginDate), - moment(endDate), + parse(beginDate, dateFormat, new Date()), + parse(endDate, dateFormat, new Date()), ], TransactionDirection: isexp ? false : true, ExcludeTransfer: true, diff --git a/src/app/pages/finance/report/control-center-month-on-month-report/control-center-month-on-month-report.component.ts b/src/app/pages/finance/report/control-center-month-on-month-report/control-center-month-on-month-report.component.ts index 545844a2..d2be87e1 100644 --- a/src/app/pages/finance/report/control-center-month-on-month-report/control-center-month-on-month-report.component.ts +++ b/src/app/pages/finance/report/control-center-month-on-month-report/control-center-month-on-month-report.component.ts @@ -4,7 +4,7 @@ import { ReplaySubject, takeUntil } from 'rxjs'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { NumberUtility } from 'actslib'; import { EChartsOption } from 'echarts'; -import moment from 'moment'; +import { format, subMonths } from 'date-fns'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzCascaderModule, NzCascaderOption } from 'ng-zorro-antd/cascader'; @@ -160,8 +160,8 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr if (this.selectedPeriod === financePeriodLast12Months) { // Last 12 months for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arControlCenterIDs.forEach((ccid) => { @@ -170,9 +170,9 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr const arBal: number[] = []; for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); - const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.month() + 1); + const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); @@ -231,8 +231,8 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr } else if (this.selectedPeriod === financePeriodLast6Months) { // Last 6 months for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arControlCenterIDs.forEach((ccid) => { @@ -241,9 +241,9 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr const arBal: number[] = []; for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); - const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.month() + 1); + const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); @@ -302,8 +302,8 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr } else if (this.selectedPeriod === financePeriodLast3Months) { // Last 3 months for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arControlCenterIDs.forEach((ccid) => { @@ -312,9 +312,9 @@ export class ControlCenterMonthOnMonthReportComponent implements OnInit, OnDestr const arBal: number[] = []; for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); - const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.month() + 1); + const validx = val.findIndex((p) => p.ControlCenterId === ccid && p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(val[validx].DebitBalance); arOut.push(val[validx].CreditBalance); diff --git a/src/app/pages/finance/report/order-report/order-report.component.ts b/src/app/pages/finance/report/order-report/order-report.component.ts index 2f10f3af..d873bbe7 100644 --- a/src/app/pages/finance/report/order-report/order-report.component.ts +++ b/src/app/pages/finance/report/order-report/order-report.component.ts @@ -5,7 +5,7 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { NzDrawerService } from 'ng-zorro-antd/drawer'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { Router } from '@angular/router'; -import moment from 'moment'; +import { isBefore, isAfter } from 'date-fns'; import { FinanceReportByOrder, @@ -263,10 +263,10 @@ export class OrderReportComponent implements OnInit, OnDestroy { } private buildReportList(): void { this.dataSet = []; - const dt = moment(); + const dt = new Date(); const ords = this.arOrder.filter((value) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.validOrderOnly ? value.ValidFrom!.isBefore(dt) && value.ValidTo!.isAfter(dt) : true; + return this.validOrderOnly ? isBefore(value.ValidFrom!, dt) && isAfter(value.ValidTo!, dt) : true; }); this.arReportByOrder.forEach((bal: FinanceReportByOrder) => { const ordobj = ords.find((cc: Order) => { diff --git a/src/app/pages/finance/report/report.component.ts b/src/app/pages/finance/report/report.component.ts index a70041b3..8627f432 100644 --- a/src/app/pages/finance/report/report.component.ts +++ b/src/app/pages/finance/report/report.component.ts @@ -21,7 +21,7 @@ import { FinanceReportByAccount, ModelUtility, ConsoleLogTypeEnum, - momentDateFormat, + dateFormat, Account, AccountCategory, FinanceReportByControlCenter, @@ -34,7 +34,7 @@ import { GeneralFilterValueType, } from '../../../model'; import { FinanceOdataService, HomeDefOdataService } from '../../../services'; -import moment from 'moment'; +import { format, startOfMonth, endOfMonth, subMonths, addMonths } from 'date-fns'; import { NumberUtility } from 'actslib'; import { DocumentItemViewComponent } from '../document/document-item-view'; import { SafeAny } from '@common/any'; @@ -165,18 +165,17 @@ export class ReportComponent implements OnInit, OnDestroy { private buildData(): void { this.isLoadingResults = true; - const today = moment(); + const today = new Date(); this.reportByMostIncomeInCurrentMonth = []; this.totalOutgoInCurrentMonth = 0; this.reportByMostOutgoInCurrentMonth = []; this.totalIncomeInCurrentMonth = 0; // Current month - const dateInLastMonth = today.clone(); - dateInLastMonth.subtract(1, 'month'); + const dateInLastMonth = subMonths(today, 1); forkJoin([ - this.odataService.fetchReportByTransactionType(today.year(), today.month() + 1), - this.odataService.fetchReportByTransactionType(dateInLastMonth.year(), dateInLastMonth.month() + 1), + this.odataService.fetchReportByTransactionType(today.getFullYear(), today.getMonth() + 1), + this.odataService.fetchReportByTransactionType(dateInLastMonth.getFullYear(), dateInLastMonth.getMonth() + 1), ]) .pipe( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -271,21 +270,18 @@ export class ReportComponent implements OnInit, OnDestroy { onShowDetail(ttid: number, monthDiff: number, isexp: boolean) { let bgn = ''; let end = ''; + const today = new Date(); if (monthDiff === 0) { - bgn = moment().startOf('M').format(momentDateFormat); - end = moment().endOf('M').format(momentDateFormat); + bgn = format(startOfMonth(today), dateFormat); + end = format(endOfMonth(today), dateFormat); } else if (monthDiff < 0) { - bgn = moment() - .subtract(-1 * monthDiff, 'M') - .startOf('M') - .format(momentDateFormat); - end = moment() - .subtract(-1 * monthDiff, 'M') - .endOf('M') - .format(momentDateFormat); + const adjustedDate = subMonths(today, -1 * monthDiff); + bgn = format(startOfMonth(adjustedDate), dateFormat); + end = format(endOfMonth(adjustedDate), dateFormat); } else if (monthDiff > 0) { - bgn = moment().add(monthDiff, 'M').startOf('M').format(momentDateFormat); - end = moment().add(monthDiff, 'M').endOf('M').format(momentDateFormat); + const adjustedDate = addMonths(today, monthDiff); + bgn = format(startOfMonth(adjustedDate), dateFormat); + end = format(endOfMonth(adjustedDate), dateFormat); } this.onDisplayDocItem(bgn, end, ttid, isexp); diff --git a/src/app/pages/finance/report/statement-of-income-expense-month-on-month/statement-of-income-expense-month-on-month.component.ts b/src/app/pages/finance/report/statement-of-income-expense-month-on-month/statement-of-income-expense-month-on-month.component.ts index 8fabc7d0..d67700da 100644 --- a/src/app/pages/finance/report/statement-of-income-expense-month-on-month/statement-of-income-expense-month-on-month.component.ts +++ b/src/app/pages/finance/report/statement-of-income-expense-month-on-month/statement-of-income-expense-month-on-month.component.ts @@ -5,7 +5,7 @@ import { NzModalService } from 'ng-zorro-antd/modal'; import { NzDrawerService } from 'ng-zorro-antd/drawer'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { EChartsOption } from 'echarts'; -import moment from 'moment'; +import { format, subMonths, endOfMonth, parse } from 'date-fns'; import { Router } from '@angular/router'; import { @@ -18,7 +18,7 @@ import { GeneralFilterOperatorEnum, GeneralFilterValueType, ModelUtility, - momentDateFormat, + dateFormat, } from '@model/index'; import { FinanceOdataService, UIStatusService } from '@services/index'; import { NumberUtility } from 'actslib'; @@ -147,13 +147,13 @@ export class StatementOfIncomeExpenseMonthOnMonthComponent implements OnInit, On if (this.selectedPeriod === financePeriodLast12Months) { // Last 12 months for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -167,13 +167,13 @@ export class StatementOfIncomeExpenseMonthOnMonthComponent implements OnInit, On } else if (this.selectedPeriod === financePeriodLast6Months) { // Last 6 months for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -187,13 +187,13 @@ export class StatementOfIncomeExpenseMonthOnMonthComponent implements OnInit, On } else if (this.selectedPeriod === financePeriodLast3Months) { // Last 3 months for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - const validx = this.reportData.findIndex((p) => p.Month === monthinuse.month() + 1); + const monthinuse = subMonths(new Date(), imonth); + const validx = this.reportData.findIndex((p) => p.Month === monthinuse.getMonth() + 1); if (validx !== -1) { arIn.push(this.reportData[validx].InAmount); arOut.push(this.reportData[validx].OutAmount); @@ -289,13 +289,13 @@ export class StatementOfIncomeExpenseMonthOnMonthComponent implements OnInit, On } onChartClick(event: SafeAny) { - const dtmonth = moment((event.name + '.01').replace('.', '-')); + const dtmonth = parse((event.name + '.01').replace('.', '-'), 'yyyy-MM-dd', new Date()); if (event.seriesId === 'in') { - this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.endOf('M').format(momentDateFormat), false); + this.onDisplayDocItem(format(dtmonth, dateFormat), format(endOfMonth(dtmonth), dateFormat), false); } else if (event.seriesId === 'out') { - this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.endOf('M').format(momentDateFormat), true); + this.onDisplayDocItem(format(dtmonth, dateFormat), format(endOfMonth(dtmonth), dateFormat), true); } else if (event.seriesId === 'total') { - // this.onDisplayDocItem(dtmonth.format(momentDateFormat), dtmonth.add(1, 'M').format(momentDateFormat), true); + // this.onDisplayDocItem(format(dtmonth, dateFormat), format(addMonths(dtmonth, 1), dateFormat), true); } else { console.error(event.toString()); } @@ -303,8 +303,8 @@ export class StatementOfIncomeExpenseMonthOnMonthComponent implements OnInit, On onDisplayDocItem(beginDate: string, endDate: string, isexp: boolean) { this.uiStatusService.docInsightOption = { SelectedDataRange: [ - moment(beginDate), - moment(endDate), + parse(beginDate, dateFormat, new Date()), + parse(endDate, dateFormat, new Date()), ], TransactionDirection: isexp ? false : true, }; diff --git a/src/app/pages/finance/report/tran-type-month-on-month-report/tran-type-month-on-month-report.component.ts b/src/app/pages/finance/report/tran-type-month-on-month-report/tran-type-month-on-month-report.component.ts index 54a230b4..23f91e8b 100644 --- a/src/app/pages/finance/report/tran-type-month-on-month-report/tran-type-month-on-month-report.component.ts +++ b/src/app/pages/finance/report/tran-type-month-on-month-report/tran-type-month-on-month-report.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { ReplaySubject, takeUntil } from 'rxjs'; import { translate, TranslocoModule } from '@jsverse/transloco'; import { EChartsOption } from 'echarts'; -import moment from 'moment'; +import { format, subMonths, parse } from 'date-fns'; import { NzCascaderModule, NzCascaderOption } from 'ng-zorro-antd/cascader'; import { NzDrawerService } from 'ng-zorro-antd/drawer'; import { NzModalService } from 'ng-zorro-antd/modal'; @@ -17,7 +17,7 @@ import { financePeriodLast12Months, financePeriodLast6Months, financePeriodLast3Months, - momentDateFormat, + dateFormat, GeneralFilterItem, GeneralFilterOperatorEnum, GeneralFilterValueType, @@ -176,17 +176,17 @@ export class TranTypeMonthOnMonthReportComponent implements OnInit, OnDestroy { if (this.selectedPeriod === financePeriodLast12Months) { // Last 12 months for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arTranTypeNames.forEach((ttname) => { const ardata: number[] = []; for (let imonth = 11; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); const validx = val.findIndex( - (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.month() + 1 + (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.getMonth() + 1 ); if (validx !== -1) { ardata.push(isexpense ? Math.abs(val[validx].OutAmount) : val[validx].InAmount); @@ -208,17 +208,17 @@ export class TranTypeMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast6Months) { // Last 6 months for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arTranTypeNames.forEach((ttname) => { const ardata: number[] = []; for (let imonth = 5; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); const validx = val.findIndex( - (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.month() + 1 + (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.getMonth() + 1 ); if (validx !== -1) { ardata.push(isexpense ? Math.abs(val[validx].OutAmount) : val[validx].InAmount); @@ -240,17 +240,17 @@ export class TranTypeMonthOnMonthReportComponent implements OnInit, OnDestroy { } else if (this.selectedPeriod === financePeriodLast3Months) { // Last 3 months for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); - arAxis.push(monthinuse.format('YYYY.MM')); + const monthinuse = subMonths(new Date(), imonth); + arAxis.push(format(monthinuse, 'yyyy.MM')); } arTranTypeNames.forEach((ttname) => { const ardata: number[] = []; for (let imonth = 2; imonth >= 0; imonth--) { - const monthinuse = moment().subtract(imonth, 'month'); + const monthinuse = subMonths(new Date(), imonth); const validx = val.findIndex( - (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.month() + 1 + (p) => p.TransactionTypeName === ttname && p.Month === monthinuse.getMonth() + 1 ); if (validx !== -1) { ardata.push(isexpense ? Math.abs(val[validx].OutAmount) : val[validx].InAmount); @@ -344,10 +344,10 @@ export class TranTypeMonthOnMonthReportComponent implements OnInit, OnDestroy { onChartClick(event: SafeAny) { console.log(event); // Month - const dtmonth = moment(event.name + '.01'); + const dtmonth = parse(event.name + '.01', 'yyyy.MM.dd', new Date()); this.onDisplayDocItem( - dtmonth.format(momentDateFormat), - dtmonth.add(1, 'M').format(momentDateFormat), + format(dtmonth, dateFormat), + format(subMonths(dtmonth, -1), dateFormat), this.selectedTranTypes ); } diff --git a/src/app/pages/finance/report/tran-type-report/tran-type-report.component.ts b/src/app/pages/finance/report/tran-type-report/tran-type-report.component.ts index e2dfac5e..843f6a33 100644 --- a/src/app/pages/finance/report/tran-type-report/tran-type-report.component.ts +++ b/src/app/pages/finance/report/tran-type-report/tran-type-report.component.ts @@ -4,7 +4,7 @@ import { takeUntil, finalize } from 'rxjs/operators'; import { NzModalService } from 'ng-zorro-antd/modal'; import { NzDrawerService } from 'ng-zorro-antd/drawer'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format, subMonths, startOfYear, startOfMonth, parse, addYears, addMonths } from 'date-fns'; import { ModelUtility, @@ -13,7 +13,7 @@ import { GeneralFilterOperatorEnum, GeneralFilterValueType, GeneralFilterItem, - momentDateFormat, + dateFormat, TranType, FinanceReportEntryByTransactionType, } from '../../../../model'; @@ -108,8 +108,8 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { ); this.isLoadingResults = true; - let tnow = moment(); - let year = tnow.year(); + let tnow = new Date(); + let year = tnow.getFullYear(); let month: number | undefined = undefined; if (this.selectedScope === '1') { // Previous year @@ -120,13 +120,13 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { month = undefined; } else if (this.selectedScope === '3') { // Previous month - tnow = moment().subtract(1, 'month'); - year = tnow.year(); - month = tnow.month() + 1; + tnow = subMonths(new Date(), 1); + year = tnow.getFullYear(); + month = tnow.getMonth() + 1; } else if (this.selectedScope === '4') { // Current month - year = tnow.year(); - month = tnow.startOf('month').month() + 1; + year = tnow.getFullYear(); + month = startOfMonth(tnow).getMonth() + 1; } forkJoin([this.odataService.fetchReportByTransactionType(year, month), this.odataService.fetchAllTranTypes()]) @@ -344,8 +344,8 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().startOf('year').subtract(1, 'year').format(momentDateFormat), - highValue: moment().startOf('year').format(momentDateFormat), + lowValue: format(subMonths(startOfYear(new Date()), 12), dateFormat), + highValue: format(startOfYear(new Date()), dateFormat), valueType: GeneralFilterValueType.date, }); } else if (this.selectedScope === '2') { @@ -353,8 +353,8 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().startOf('year').format(momentDateFormat), - highValue: moment().startOf('year').add(1, 'year').format(momentDateFormat), + lowValue: format(startOfYear(new Date()), dateFormat), + highValue: format(startOfYear(addYears(new Date(), 1)), dateFormat), valueType: GeneralFilterValueType.date, }); } else if (this.selectedScope === '3') { @@ -362,8 +362,8 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().startOf('month').subtract(1, 'month').format(momentDateFormat), - highValue: moment().startOf('month').format(momentDateFormat), + lowValue: format(subMonths(startOfMonth(new Date()), 1), dateFormat), + highValue: format(startOfMonth(new Date()), dateFormat), valueType: GeneralFilterValueType.date, }); } else if (this.selectedScope === '4') { @@ -371,8 +371,8 @@ export class TranTypeReportComponent implements OnInit, OnDestroy { fltrs.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().startOf('month').format(momentDateFormat), - highValue: moment().startOf('month').add(1, 'month').format(momentDateFormat), + lowValue: format(startOfMonth(new Date()), dateFormat), + highValue: format(addMonths(startOfMonth(new Date()), 1), dateFormat), valueType: GeneralFilterValueType.date, }); } diff --git a/src/app/pages/library/borrow-record-create-dlg/borrow-record-create-dlg.component.ts b/src/app/pages/library/borrow-record-create-dlg/borrow-record-create-dlg.component.ts index 4537fc9f..cdc49b5c 100644 --- a/src/app/pages/library/borrow-record-create-dlg/borrow-record-create-dlg.component.ts +++ b/src/app/pages/library/borrow-record-create-dlg/borrow-record-create-dlg.component.ts @@ -1,7 +1,8 @@ import { ChangeDetectorRef, Component, Input, OnInit, ViewContainerRef } from '@angular/core'; import { FormsModule, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '@model/index'; import { NzModalModule, NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; import { NzFormModule } from 'ng-zorro-antd/form'; import { NzDividerModule } from 'ng-zorro-antd/divider'; @@ -133,8 +134,8 @@ export class BorrowRecordCreateDlgComponent implements OnInit { record.Comment = this.detailFormGroup.get('cmtControl')?.value; // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateRangeControl')?.value; - record.FromDate = moment(startdt); - record.ToDate = moment(enddt); + record.FromDate = new Date(startdt); + record.ToDate = new Date(enddt); record.HasReturned = this.detailFormGroup.get('hasRtnedControl')?.value; this.storageService.createBookBorrowRecord(record).subscribe({ diff --git a/src/app/pages/library/borrow-record/borrow-record-create-dlg/borrow-record-create-dlg.component.ts b/src/app/pages/library/borrow-record/borrow-record-create-dlg/borrow-record-create-dlg.component.ts index 2e1bbe1a..aa71c20c 100644 --- a/src/app/pages/library/borrow-record/borrow-record-create-dlg/borrow-record-create-dlg.component.ts +++ b/src/app/pages/library/borrow-record/borrow-record-create-dlg/borrow-record-create-dlg.component.ts @@ -1,7 +1,8 @@ import { ChangeDetectorRef, Component, Input, OnInit, ViewContainerRef } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms'; import { translate, TranslocoModule } from '@jsverse/transloco'; -import moment from 'moment'; +import { format } from 'date-fns'; +import { dateFormat } from '@model/index'; import { NzModalRef, NzModalModule, NzModalService } from 'ng-zorro-antd/modal'; import { NzGridModule } from 'ng-zorro-antd/grid'; import { NzSpaceModule } from 'ng-zorro-antd/space'; @@ -135,8 +136,8 @@ export class BorrowRecordCreateDlgComponent implements OnInit { record.Comment = this.detailFormGroup.get('cmtControl')?.value; // eslint-disable-next-line no-unsafe-optional-chaining const [startdt, enddt] = this.detailFormGroup.get('dateRangeControl')?.value; - record.FromDate = moment(startdt); - record.ToDate = moment(enddt); + record.FromDate = new Date(startdt); + record.ToDate = new Date(enddt); record.HasReturned = this.detailFormGroup.get('hasRtnedControl')?.value; this.storageService.createBookBorrowRecord(record).subscribe({ diff --git a/src/app/pages/reusable-components/markdown-editor/markdown-editor.component.ts b/src/app/pages/reusable-components/markdown-editor/markdown-editor.component.ts index acfb813c..cf4d407f 100644 --- a/src/app/pages/reusable-components/markdown-editor/markdown-editor.component.ts +++ b/src/app/pages/reusable-components/markdown-editor/markdown-editor.component.ts @@ -20,7 +20,7 @@ import { import { KatexOptions, MarkdownModule } from 'ngx-markdown'; import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload'; import { NzModalService } from 'ng-zorro-antd/modal'; -import moment from 'moment'; +import { format } from 'date-fns'; import { Observable, Observer } from 'rxjs'; import { editor } from 'monaco-editor'; @@ -774,7 +774,7 @@ export class MarkdownEditorComponent implements OnInit, OnDestroy, ControlValueA cursels!.forEach((sel) => { arrst.push({ range: sel, - text: curmodel.getValueInRange(sel) + moment().toString(), + text: curmodel.getValueInRange(sel) + format(new Date(), 'yyyy-MM-dd'), }); }); curmodel.pushEditOperations(cursels, arrst, () => null); diff --git a/src/app/services/event-storage.service.spec.ts b/src/app/services/event-storage.service.spec.ts index 61af8ab9..e82bfba3 100644 --- a/src/app/services/event-storage.service.spec.ts +++ b/src/app/services/event-storage.service.spec.ts @@ -1,12 +1,12 @@ import { TestBed } from '@angular/core/testing'; import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { BehaviorSubject } from 'rxjs'; -import moment from 'moment'; +import { addMonths, addYears, format } from 'date-fns'; import { EventStorageService } from './event-storage.service'; import { AuthService } from './auth.service'; import { HomeDefOdataService } from './home-def-odata.service'; -import { EventHabit, EventHabitDetail, BaseListModel, GeneralEvent } from '../model'; +import { EventHabit, EventHabitDetail, BaseListModel, GeneralEvent, dateFormat } from '../model'; import {createSpyObj, FakeDataHelper} from '../../testing'; import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; @@ -410,8 +410,8 @@ describe('EventStorageService', () => { beforeEach(() => { hevnt = new EventHabit(); hevnt.Name = 'test'; - hevnt.StartDate = moment(); - hevnt.EndDate = moment().add(1, 'y'); + hevnt.StartDate = new Date(); + hevnt.EndDate = addYears(new Date(), 1); hevnt.content = 'test'; service = TestBed.inject(EventStorageService); }); @@ -437,14 +437,14 @@ describe('EventStorageService', () => { ); }); - // Respond with the mock data - const arDetail: EventHabitDetail[] = []; + // Respond with the mock data — API returns objects with startTimePoint/endTimePoint as strings + const arDetail: any[] = []; for (let idx = 0; idx < 3; idx++) { - const detail: EventHabitDetail = new EventHabitDetail(); - detail.StartDate = moment().add(idx + 1, 'M'); - detail.EndDate = moment().add(idx + 2, 'M'); - detail.Name = 'test'; - arDetail.push(detail); + arDetail.push({ + startTimePoint: format(addMonths(new Date(), idx + 1), dateFormat), + endTimePoint: format(addMonths(new Date(), idx + 2), dateFormat), + name: 'test', + }); } req.flush(arDetail); }); @@ -479,8 +479,8 @@ describe('EventStorageService', () => { beforeEach(() => { hevnt = new EventHabit(); hevnt.Name = 'test'; - hevnt.StartDate = moment(); - hevnt.EndDate = moment().add(1, 'y'); + hevnt.StartDate = new Date(); + hevnt.EndDate = addYears(new Date(), 1); hevnt.content = 'test'; service = TestBed.inject(EventStorageService); }); @@ -532,8 +532,8 @@ describe('EventStorageService', () => { beforeEach(() => { hevnt = new EventHabit(); hevnt.Name = 'test'; - hevnt.StartDate = moment(); - hevnt.EndDate = moment().add(1, 'y'); + hevnt.StartDate = new Date(); + hevnt.EndDate = addYears(new Date(), 1); hevnt.content = 'test'; hevnt.ID = 11; service = TestBed.inject(EventStorageService); diff --git a/src/app/services/event-storage.service.ts b/src/app/services/event-storage.service.ts index 37a74a5f..b5213dbc 100644 --- a/src/app/services/event-storage.service.ts +++ b/src/app/services/event-storage.service.ts @@ -2,12 +2,12 @@ import { inject, Injectable } from '@angular/core'; import { HttpParams, HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { environment } from '../../environments/environment'; import { LogLevel, - momentDateFormat, + dateFormat, GeneralEvent, RecurEvent, EventHabit, @@ -63,8 +63,8 @@ export class EventStorageService { skip?: number, orderby?: { field: string; order: string }, skipfinished?: boolean, - dtbgn?: moment.Moment, - dtend?: moment.Moment + dtbgn?: Date, + dtend?: Date ): Observable> { let headers: HttpHeaders = new HttpHeaders(); headers = headers @@ -89,10 +89,10 @@ export class EventStorageService { // params = params.append('skipfinished', skipfinished.toString()); } if (dtbgn) { - // params = params.append('dtbgn', dtbgn.format(momentDateFormat)); + // params = params.append('dtbgn', format(dtbgn, dateFormat)); } if (dtend) { - // params = params.append('dtend', dtend.format(momentDateFormat)); + // params = params.append('dtend', format(dtend, dateFormat)); } return this._http.get(this.generalEventUrl, { headers: headers, params: params }).pipe( @@ -158,7 +158,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -200,7 +200,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -235,7 +235,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -397,7 +397,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -438,7 +438,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -477,7 +477,7 @@ export class EventStorageService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -525,11 +525,11 @@ export class EventStorageService { ); } - public fetchHabitDetailWithCheckIn(bgn: moment.Moment, end: moment.Moment): Observable { + public fetchHabitDetailWithCheckIn(bgn: Date, end: Date): Observable { const apiurl: string = environment.ApiUrl + '/HabitEventDetailWithCheckIn'; const curhid: number = this._homeService.ChosedHome?.ID ?? 0; - const bgnstr: string = bgn.format(momentDateFormat); - const endstr: string = end.format(momentDateFormat); + const bgnstr: string = format(bgn, dateFormat); + const endstr: string = format(end, dateFormat); const requestUrl = `${apiurl}?hid=${curhid}&dtbgn=${bgnstr}&dtend=${endstr}`; let headers: HttpHeaders = new HttpHeaders(); @@ -575,7 +575,7 @@ export class EventStorageService { console.error(`AC_HIH_UI [Error]: Entering EventStorageService readHabitEvent failed ${error}`); } - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -606,8 +606,8 @@ export class EventStorageService { if (val instanceof Array && val.length > 0) { for (const dtl of val) { const ndtl: EventHabitDetail = new EventHabitDetail(); - ndtl.StartDate = moment(dtl.startTimePoint, momentDateFormat); - ndtl.EndDate = moment(dtl.endTimePoint, momentDateFormat); + ndtl.StartDate = parse(dtl.startTimePoint, dateFormat, new Date()); + ndtl.EndDate = parse(dtl.endTimePoint, dateFormat, new Date()); ndtl.Name = dtl.name; arDetail.push(ndtl); } @@ -619,7 +619,7 @@ export class EventStorageService { console.error(`AC_HIH_UI [Error]: Entering EventStorageService generateHabitEvent failed ${error}`); } - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -654,7 +654,7 @@ export class EventStorageService { console.error(`AC_HIH_UI [Error]: Entering EventStorageService generateHabitEvent failed ${error}`); } - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } @@ -690,7 +690,7 @@ export class EventStorageService { console.error(`AC_HIH_UI [Error]: Entering EventStorageService generateHabitEvent failed ${error}`); } - return throwError(() => new Error(error.statusText + '; ' + error.error + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error ?? error.message) + '; ' + error.message)); }) ); } diff --git a/src/app/services/finance-odata.service.spec.ts b/src/app/services/finance-odata.service.spec.ts index f946c292..cf86f7aa 100644 --- a/src/app/services/finance-odata.service.spec.ts +++ b/src/app/services/finance-odata.service.spec.ts @@ -2,14 +2,14 @@ import { TestBed } from '@angular/core/testing'; import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs'; -import moment from 'moment'; +import { parse, format, addMonths, addYears, addWeeks } from 'date-fns'; import { Document, DocumentItem, financeDocTypeNormal, RepeatFrequencyEnum, - momentDateFormat, + dateFormat, RepeatedDatesAPIInput, RepeatedDatesAPIOutput, RepeatedDatesWithAmountAPIInput, @@ -1887,23 +1887,23 @@ describe('FinanceOdataService', () => { req.flush({ value: [ { - id: 1, - hid: 1, - planType: 0, - accountID: 4, - startDate: '2019-03-23', - targetDate: '2019-04-23', - targetBalance: 10.0, - tranCurr: 'CNY', - description: 'Test plan 1', - createdBy: 'aaa', - createdAt: '2019-03-23', + ID: 1, + HomeID: 1, + PlanType: 0, + AccountID: 4, + StartDate: '2019-03-23', + TargetDate: '2019-04-23', + TargetBalance: 10.0, + TranCurr: 'CNY', + Description: 'Test plan 1', + CreatedBy: 'aaa', + CreatedAt: '2019-03-23', }, ], }); }); - it('should fetch data only once (call multiple times)', () => { + it('should fetch data only once (call multiple times)', async () => { service.fetchAllPlans().subscribe({ next: (data: Plan[]) => { expect(data.length).toEqual(1); @@ -1919,22 +1919,22 @@ describe('FinanceOdataService', () => { req.flush({ value: [ { - id: 1, - hid: 1, - planType: 0, - accountID: 4, - startDate: '2019-03-23', - targetDate: '2019-04-23', - targetBalance: 10.0, - tranCurr: 'CNY', - description: 'Test plan 1', - createdBy: 'aaa', - createdAt: '2019-03-23', + ID: 1, + HomeID: 1, + PlanType: 0, + AccountID: 4, + StartDate: '2019-03-23', + TargetDate: '2019-04-23', + TargetBalance: 10.0, + TranCurr: 'CNY', + Description: 'Test plan 1', + CreatedBy: 'aaa', + CreatedAt: '2019-03-23', }, ], }); - httpTestingController.verify(); + await new Promise(r => setTimeout(r, 0)); // Second call service.fetchAllPlans().subscribe(); @@ -1988,7 +1988,7 @@ describe('FinanceOdataService', () => { // Respond with the mock data const planData: Plan = new Plan(); - planData.StartDate = moment(); + planData.StartDate = new Date(); planData.AccountCategoryID = 1; planData.AccountID = 21; planData.Description = 'test'; @@ -2025,7 +2025,7 @@ describe('FinanceOdataService', () => { let planData: Plan; beforeEach(() => { planData = new Plan(); - planData.StartDate = moment(); + planData.StartDate = new Date(); planData.AccountCategoryID = 1; planData.AccountID = 21; planData.Description = 'test'; @@ -2086,7 +2086,7 @@ describe('FinanceOdataService', () => { doc.DocType = financeDocTypeNormal; doc.Desp = 'Test'; doc.TranCurr = fakeData.chosedHome.BaseCurrency; - doc.TranDate = moment(); + doc.TranDate = new Date(); const ditem: DocumentItem = new DocumentItem(); ditem.ItemId = 1; ditem.AccountId = 11; @@ -2151,7 +2151,7 @@ describe('FinanceOdataService', () => { doc.DocType = financeDocTypeNormal; doc.Desp = 'Test'; doc.TranCurr = fakeData.chosedHome.BaseCurrency; - doc.TranDate = moment(); + doc.TranDate = new Date(); const ditem: DocumentItem = new DocumentItem(); ditem.ItemId = 1; ditem.AccountId = 11; @@ -2310,8 +2310,8 @@ describe('FinanceOdataService', () => { filterDocItem.push({ fieldName: 'TranDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().format(momentDateFormat), - highValue: moment().add(1, 'M').format(momentDateFormat), + lowValue: format(new Date(), dateFormat), + highValue: format(addMonths(new Date(), 1), dateFormat), valueType: GeneralFilterValueType.number, }); @@ -2372,8 +2372,8 @@ describe('FinanceOdataService', () => { filterDocItem.push({ fieldName: 'TranDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: moment().format(momentDateFormat), - highValue: moment().add(1, 'M').format(momentDateFormat), + lowValue: format(new Date(), dateFormat), + highValue: format(addMonths(new Date(), 1), dateFormat), valueType: GeneralFilterValueType.number, }); service.fetchAllDocuments(filterDocItem, 10, 0).subscribe( @@ -2419,8 +2419,8 @@ describe('FinanceOdataService', () => { it('should return doc for success case', () => { service .fetchAllDPTmpDocs({ - TransactionDateBegin: moment(), - TransactionDateEnd: moment().add(1, 'w'), + TransactionDateBegin: new Date(), + TransactionDateEnd: addWeeks(new Date(), 1), }) .subscribe({ next: (data) => { @@ -2522,8 +2522,8 @@ describe('FinanceOdataService', () => { const msg = 'server failed'; service .fetchAllDPTmpDocs({ - TransactionDateBegin: moment(), - TransactionDateEnd: moment().add(1, 'w'), + TransactionDateBegin: new Date(), + TransactionDateEnd: addWeeks(new Date(), 1), }) .subscribe({ next: () => { @@ -2558,8 +2558,8 @@ describe('FinanceOdataService', () => { it('should return doc for success case', () => { service .fetchAllLoanTmpDocs({ - TransactionDateBegin: moment(), - TransactionDateEnd: moment().add(1, 'w'), + TransactionDateBegin: new Date(), + TransactionDateEnd: addWeeks(new Date(), 1), }) .subscribe({ next: (data) => { @@ -2582,8 +2582,8 @@ describe('FinanceOdataService', () => { const msg = 'server failed'; service .fetchAllLoanTmpDocs({ - TransactionDateBegin: moment(), - TransactionDateEnd: moment().add(1, 'w'), + TransactionDateBegin: new Date(), + TransactionDateEnd: addWeeks(new Date(), 1), }) .subscribe({ next: () => { @@ -3177,25 +3177,25 @@ describe('FinanceOdataService', () => { describe('calcADPTmpDocs', () => { const calcADPTmpAPIURL: any = environment.ApiUrl + '/GetRepeatedDatesWithAmount'; let inputData: RepeatedDatesWithAmountAPIInput; - let outputData: RepeatedDatesWithAmountAPIOutput[]; + let outputData: SafeAny[]; beforeEach(() => { service = TestBed.inject(FinanceOdataService); inputData = { TotalAmount: 200, - StartDate: moment(), - EndDate: moment().add(1, 'y'), + StartDate: new Date(), + EndDate: addYears(new Date(), 1), RepeatType: RepeatFrequencyEnum.Month, Desp: 'test', }; outputData = []; for (let i = 0; i < 10; i++) { - const rst: RepeatedDatesWithAmountAPIOutput = { - TranDate: moment().add(i, 'M'), + // API returns TranDate as a string, not Date + outputData.push({ + TranDate: format(addMonths(new Date(), i), dateFormat), TranAmount: 20, Desp: `test${i}`, - }; - outputData.push(rst); + }); } }); @@ -3252,19 +3252,19 @@ describe('FinanceOdataService', () => { TotalAmount: 10000, TotalMonths: 12, InterestRate: 0, - StartDate: moment(), - EndDate: moment().add(1, 'y'), + StartDate: new Date(), + EndDate: addYears(new Date(), 1), InterestFreeLoan: true, RepaymentMethod: 1, - FirstRepayDate: moment(), + FirstRepayDate: new Date(), RepayDayInMonth: 1, }; outputData = []; for (let i = 0; i < 10; i++) { const od: any = { - tranDate: moment().add(i, 'M'), - tranAmount: 100, - interestAmount: 0, + TranDate: format(addMonths(new Date(), i), dateFormat), + TranAmount: 100, + InterestAmount: 0, }; outputData.push(od); } @@ -3322,7 +3322,7 @@ describe('FinanceOdataService', () => { }); it('should return data in success case', () => { - service.getDocumentItemByAccount(21, 100, 100, moment(), moment().add(1, 'y')).subscribe({ + service.getDocumentItemByAccount(21, 100, 100, new Date(), addYears(new Date(), 1)).subscribe({ next: (data) => { expect(data).toBeTruthy(); }, @@ -3380,7 +3380,7 @@ describe('FinanceOdataService', () => { }); it('should return data in success case', () => { - service.getDocumentItemByControlCenter(21, 100, 100, moment(), moment().add(1, 'y')).subscribe({ + service.getDocumentItemByControlCenter(21, 100, 100, new Date(), addYears(new Date(), 1)).subscribe({ next: (data) => { expect(data).toBeTruthy(); }, @@ -3438,7 +3438,7 @@ describe('FinanceOdataService', () => { }); it('should return data in success case', () => { - service.getDocumentItemByOrder(21, 100, 0, moment(), moment().add(1, 'y')).subscribe({ + service.getDocumentItemByOrder(21, 100, 0, new Date(), addYears(new Date(), 1)).subscribe({ next: (data) => { expect(data).toBeTruthy(); }, @@ -3764,15 +3764,15 @@ describe('FinanceOdataService', () => { service = TestBed.inject(FinanceOdataService); inputData = { - StartDate: moment(), - EndDate: moment().add(1, 'y'), + StartDate: new Date(), + EndDate: addYears(new Date(), 1), RepeatType: RepeatFrequencyEnum.Month, }; outputData = []; for (let i = 0; i < 10; i++) { const od: any = { - StartDate: moment().add(i, 'M'), - EndDate: moment().add(i + 1, 'M'), + StartDate: format(addMonths(new Date(), i), dateFormat), + EndDate: format(addMonths(new Date(), i + 1), dateFormat), }; outputData.push(od); } @@ -3883,7 +3883,7 @@ describe('FinanceOdataService', () => { }); it('shall work properly', () => { - service.changeDocumentDateViaPatch(22, moment()).subscribe({ + service.changeDocumentDateViaPatch(22, new Date()).subscribe({ next: () => { // TBD. }, @@ -3906,7 +3906,7 @@ describe('FinanceOdataService', () => { it('should return error in case error appear', () => { const msg = 'Error occurred'; - service.changeDocumentDateViaPatch(22, moment()).subscribe({ + service.changeDocumentDateViaPatch(22, new Date()).subscribe({ next: () => { throw new Error('Shall not occur'); }, diff --git a/src/app/services/finance-odata.service.ts b/src/app/services/finance-odata.service.ts index 3d5cb454..7c500b7a 100644 --- a/src/app/services/finance-odata.service.ts +++ b/src/app/services/finance-odata.service.ts @@ -2,7 +2,7 @@ import { inject, Injectable } from '@angular/core'; import { HttpParams, HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { Observable, of, throwError, forkJoin } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; -import moment from 'moment'; +import { format, parse } from 'date-fns'; import { environment } from '../../environments/environment'; import { @@ -17,7 +17,7 @@ import { Order, Document, Account, - momentDateFormat, + dateFormat, BaseListModel, RepeatedDatesWithAmountAPIInput, RepeatedDatesWithAmountAPIOutput, @@ -874,7 +874,7 @@ export class FinanceOdataService { */ public settleAccount( accountId: number, - settledDate: moment.Moment, + settledDate: Date, amount: number, ccid: number ): Observable { @@ -886,7 +886,7 @@ export class FinanceOdataService { const jdata = { HomeID: this.homeService.ChosedHome?.ID, AccountID: accountId, - SettledDate: settledDate.format(momentDateFormat), + SettledDate: format(settledDate, dateFormat), InitialAmount: amount, ControlCenterID: ccid, Currency: this.homeService.ChosedHome?.BaseCurrency, @@ -1577,7 +1577,7 @@ export class FinanceOdataService { this.isPlanListLoaded = false; - return throwError(() => new Error(error.statusText + '; ' + error.error.toString() + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error?.toString() ?? error.message) + '; ' + error.message)); }) ); } else { @@ -1617,7 +1617,7 @@ export class FinanceOdataService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error.toString() + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error?.toString() ?? error.message) + '; ' + error.message)); }) ); } @@ -1794,8 +1794,8 @@ export class FinanceOdataService { const filterstrs: string[] = []; filterstrs.push(`HomeID eq ${hid}`); if (filter.TransactionDateBegin && filter.TransactionDateEnd) { - const dtbgnfmt = filter.TransactionDateBegin.format(momentDateFormat); - const dtendfmt = filter.TransactionDateEnd.format(momentDateFormat); + const dtbgnfmt = format(filter.TransactionDateBegin, dateFormat); + const dtendfmt = format(filter.TransactionDateEnd, dateFormat); filterstrs.push(`TransactionDate ge ${dtbgnfmt}`); filterstrs.push(`TransactionDate le ${dtendfmt}`); } @@ -1907,8 +1907,8 @@ export class FinanceOdataService { const filterstrs: string[] = []; filterstrs.push(`HomeID eq ${hid}`); if (filter.TransactionDateBegin && filter.TransactionDateEnd) { - const dtbgnfmt = filter.TransactionDateBegin.format(momentDateFormat); - const dtendfmt = filter.TransactionDateEnd.format(momentDateFormat); + const dtbgnfmt = format(filter.TransactionDateBegin, dateFormat); + const dtendfmt = format(filter.TransactionDateEnd, dateFormat); filterstrs.push(`TransactionDate ge ${dtbgnfmt}`); filterstrs.push(`TransactionDate le ${dtendfmt}`); } @@ -2473,7 +2473,7 @@ export class FinanceOdataService { /** * Change document's date */ - public changeDocumentDateViaPatch(docid: number, docdate: moment.Moment): Observable { + public changeDocumentDateViaPatch(docid: number, docdate: Date): Observable { let headers: HttpHeaders = new HttpHeaders(); headers = headers .append('Content-Type', 'application/json') @@ -2482,7 +2482,7 @@ export class FinanceOdataService { .append('Authorization', 'Bearer ' + this.authService.authSubject.getValue().getAccessToken()); const objcontent = { - TranDate: docdate.format(momentDateFormat), + TranDate: format(docdate, dateFormat), }; return this.http .patch(`${this.documentAPIUrl}/${docid}`, objcontent, { @@ -3000,7 +3000,7 @@ export class FinanceOdataService { .append('Accept', 'application/json') .append('Authorization', 'Bearer ' + this.authService.authSubject.getValue().getAccessToken()); - const today = moment(); + const today = new Date(); const jdata = { HomeID: this.homeService.ChosedHome?.ID, @@ -3052,7 +3052,7 @@ export class FinanceOdataService { .append('Accept', 'application/json') .append('Authorization', 'Bearer ' + this.authService.authSubject.getValue().getAccessToken()); - const today = moment(); + const today = new Date(); const jdata = { HomeID: this.homeService.ChosedHome?.ID, @@ -3076,7 +3076,7 @@ export class FinanceOdataService { if (rjs instanceof Array && rjs.length > 0) { rjs.forEach((data: SafeAny) => { listrst.push({ - currentMonth: moment(data.BalanceDate).format(momentDateFormat), + currentMonth: format(parse(data.BalanceDate, dateFormat, new Date()), dateFormat), actualAmount: data.Balance, }); }); @@ -3105,12 +3105,12 @@ export class FinanceOdataService { .append('Accept', 'application/json') .append('Authorization', 'Bearer ' + this.authService.authSubject.getValue().getAccessToken()); - const today = moment(); + const today = new Date(); const jdata = { HomeID: this.homeService.ChosedHome?.ID, - Year: today.year(), - Month: today.month() + 1, + Year: today.getFullYear(), + Month: today.getMonth() + 1, ExcludeTransfer: excludeTransfer, }; @@ -3142,7 +3142,7 @@ export class FinanceOdataService { ConsoleLogTypeEnum.error ); - return throwError(() => new Error(error.statusText + '; ' + error.error.toString() + '; ' + error.message)); + return throwError(() => new Error(error.statusText + '; ' + (error.error?.toString() ?? error.message) + '; ' + error.message)); }) ); } else { @@ -3556,9 +3556,9 @@ export class FinanceOdataService { const apiurl: string = environment.ApiUrl + '/GetRepeatedDatesWithAmount'; const jobject: SafeAny = { - StartDate: datainput.StartDate.format(momentDateFormat), + StartDate: format(datainput.StartDate, dateFormat), TotalAmount: datainput.TotalAmount, - EndDate: datainput.EndDate.format(momentDateFormat), + EndDate: format(datainput.EndDate, dateFormat), RepeatType: RepeatFrequencyEnum[datainput.RepeatType], Desp: datainput.Desp, }; @@ -3582,7 +3582,7 @@ export class FinanceOdataService { if (repdata && repdata.value instanceof Array && repdata.value.length > 0) { for (const tt of repdata.value) { const rst: RepeatedDatesWithAmountAPIOutput = { - TranDate: moment(tt.TranDate, momentDateFormat), + TranDate: parse(tt.TranDate, dateFormat, new Date()), TranAmount: tt.TranAmount, Desp: tt.Desp, }; @@ -3623,7 +3623,7 @@ export class FinanceOdataService { // Month: datainput.StartDate.month() + 1, // Day: datainput.StartDate.date(), // }, - StartDate: datainput.StartDate.format(momentDateFormat), + StartDate: format(datainput.StartDate, dateFormat), TotalAmount: datainput.TotalAmount, TotalMonths: datainput.TotalMonths, }; @@ -3633,10 +3633,10 @@ export class FinanceOdataService { // Month: datainput.EndDate.month() + 1, // Day: datainput.EndDate.date(), // }; - jobject.EndDate = datainput.EndDate.format(momentDateFormat); + jobject.EndDate = format(datainput.EndDate, dateFormat); } if (datainput.FirstRepayDate) { - jobject.FirstRepayDate = datainput.FirstRepayDate.format(momentDateFormat); + jobject.FirstRepayDate = format(datainput.FirstRepayDate, dateFormat); } if (datainput.RepayDayInMonth) { jobject.RepayDayInMonth = +datainput.RepayDayInMonth; @@ -3660,7 +3660,7 @@ export class FinanceOdataService { if (repdata && repdata.value instanceof Array && repdata.value.length > 0) { for (const tt of repdata.value) { const rst: RepeatDatesWithAmountAndInterestAPIOutput = { - TranDate: moment(tt.TranDate, momentDateFormat), + TranDate: parse(tt.TranDate, dateFormat, new Date()), TranAmount: tt.TranAmount, InterestAmount: tt.InterestAmount, }; @@ -3691,8 +3691,8 @@ export class FinanceOdataService { const apiurl: string = environment.ApiUrl + '/GetRepeatedDates'; const jobject: SafeAny = { - StartDate: datainput.StartDate.format(momentDateFormat), - EndDate: datainput.EndDate.format(momentDateFormat), + StartDate: format(datainput.StartDate, dateFormat), + EndDate: format(datainput.EndDate, dateFormat), RepeatType: RepeatFrequencyEnum[+datainput.RepeatType], }; const jdata: string = JSON && JSON.stringify(jobject); @@ -3714,8 +3714,8 @@ export class FinanceOdataService { if (y && y.value && y.value instanceof Array && y.value.length > 0) { for (const tt of y.value) { const rst: RepeatedDatesAPIOutput = { - StartDate: moment(tt.StartDate, momentDateFormat), - EndDate: moment(tt.EndDate, momentDateFormat), + StartDate: parse(tt.StartDate, dateFormat, new Date()), + EndDate: parse(tt.EndDate, dateFormat, new Date()), }; results.push(rst); @@ -3747,8 +3747,8 @@ export class FinanceOdataService { acntid: number, top?: number, skip?: number, - dtbgn?: moment.Moment, - dtend?: moment.Moment + dtbgn?: Date, + dtend?: Date ): Observable> { const filters: GeneralFilterItem[] = []; filters.push({ @@ -3762,15 +3762,15 @@ export class FinanceOdataService { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } else if (dtbgn && !dtend) { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.LargerEqual, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, highValue: '', }); @@ -3780,7 +3780,7 @@ export class FinanceOdataService { operator: GeneralFilterOperatorEnum.LessEqual, lowValue: '', valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } return this.searchDocItem(filters, top, skip); @@ -3799,8 +3799,8 @@ export class FinanceOdataService { ccid: number, top?: number, skip?: number, - dtbgn?: moment.Moment, - dtend?: moment.Moment + dtbgn?: Date, + dtend?: Date ): Observable> { const filters: GeneralFilterItem[] = []; filters.push({ @@ -3814,15 +3814,15 @@ export class FinanceOdataService { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } else if (dtbgn && !dtend) { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.LargerEqual, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, highValue: '', }); @@ -3832,7 +3832,7 @@ export class FinanceOdataService { operator: GeneralFilterOperatorEnum.LessEqual, lowValue: '', valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } return this.searchDocItem(filters, top, skip); @@ -3851,8 +3851,8 @@ export class FinanceOdataService { ordid: number, top?: number, skip?: number, - dtbgn?: moment.Moment, - dtend?: moment.Moment + dtbgn?: Date, + dtend?: Date ): Observable> { const filters: GeneralFilterItem[] = []; filters.push({ @@ -3866,15 +3866,15 @@ export class FinanceOdataService { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.Between, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } else if (dtbgn && !dtend) { filters.push({ fieldName: 'TransactionDate', operator: GeneralFilterOperatorEnum.LargerEqual, - lowValue: dtbgn.format(momentDateFormat), + lowValue: format(dtbgn, dateFormat), valueType: GeneralFilterValueType.date, highValue: '', }); @@ -3884,7 +3884,7 @@ export class FinanceOdataService { operator: GeneralFilterOperatorEnum.LessEqual, lowValue: '', valueType: GeneralFilterValueType.date, - highValue: dtend.format(momentDateFormat), + highValue: format(dtend, dateFormat), }); } diff --git a/src/app/services/finance-storage.service.spec.ts b/src/app/services/finance-storage.service.spec.ts index 4d8aed13..03a5f468 100644 --- a/src/app/services/finance-storage.service.spec.ts +++ b/src/app/services/finance-storage.service.spec.ts @@ -2,6 +2,7 @@ import { TestBed } from '@angular/core/testing'; import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs'; +import { parse } from 'date-fns'; import { FinanceStorageService } from './finance-storage.service'; import { AuthService } from './auth.service'; @@ -9,7 +10,6 @@ import { HomeDefOdataService } from './home-def-odata.service'; import { DocumentWithPlanExgRateForUpdate } from '../model'; import { environment } from '../../environments/environment'; import { FakeDataHelper } from '../../testing'; -import moment from 'moment'; /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars */ @@ -135,8 +135,8 @@ describe('FinanceStorageService', () => { }); it('should call API with date params', () => { - const mDtbgn = moment('2024-01-01'); - const mDtend = moment('2024-12-31'); + const mDtbgn = parse('2024-01-01', 'yyyy-MM-dd', new Date()); + const mDtend = parse('2024-12-31', 'yyyy-MM-dd', new Date()); service.getReportTranType(mDtbgn, mDtend).subscribe((data: any) => { expect(data).toBeTruthy(); }); @@ -148,7 +148,7 @@ describe('FinanceStorageService', () => { }); it('should call API with only start date', () => { - const mDtbgn = moment('2024-01-01'); + const mDtbgn = parse('2024-01-01', 'yyyy-MM-dd', new Date()); service.getReportTranType(mDtbgn).subscribe((data: any) => { expect(data).toBeTruthy(); }); diff --git a/src/app/services/finance-storage.service.ts b/src/app/services/finance-storage.service.ts index 5f7e3585..b146c893 100644 --- a/src/app/services/finance-storage.service.ts +++ b/src/app/services/finance-storage.service.ts @@ -2,14 +2,14 @@ import { inject, Injectable } from '@angular/core'; import { HttpParams, HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; -import moment from 'moment'; +import { format } from 'date-fns'; import { environment } from '../../environments/environment'; import { LogLevel, Account, DocumentWithPlanExgRateForUpdate, - momentDateFormat, + dateFormat, TranTypeReport, UINameValuePair, } from '../model'; @@ -78,7 +78,7 @@ export class FinanceStorageService { /** * Get tran type report */ - public getReportTranType(dtbgn?: moment.Moment, dtend?: moment.Moment): Observable { + public getReportTranType(dtbgn?: Date, dtend?: Date): Observable { let headers: HttpHeaders = new HttpHeaders(); headers = headers .append('Content-Type', 'application/json') @@ -89,10 +89,10 @@ export class FinanceStorageService { let params: HttpParams = new HttpParams(); params = params.append('hid', (this._homeService.ChosedHome?.ID ?? 0).toString()); if (dtbgn) { - params = params.append('dtbgn', dtbgn.format(momentDateFormat)); + params = params.append('dtbgn', format(dtbgn, dateFormat)); } if (dtend) { - params = params.append('dtend', dtend.format(momentDateFormat)); + params = params.append('dtend', format(dtend, dateFormat)); } return this._http diff --git a/src/app/services/uistatus.service.ts b/src/app/services/uistatus.service.ts index 60e40239..7d8b1702 100644 --- a/src/app/services/uistatus.service.ts +++ b/src/app/services/uistatus.service.ts @@ -3,10 +3,9 @@ import { Injectable, EventEmitter, inject } from '@angular/core'; import { TemplateDocLoan, CheckVersionResult, ModelUtility, ConsoleLogTypeEnum } from '../model'; import { TranslocoService } from '@jsverse/transloco'; import { Router } from '@angular/router'; -import moment from 'moment'; export interface DocInsightOption { - SelectedDataRange: moment.Moment[]; + SelectedDataRange: Date[]; SelectedAccount?: number; TransactionDirection?: boolean; TrnasactionType?: number; diff --git a/src/app/uimodel/uimodel.ts b/src/app/uimodel/uimodel.ts index 7e34cfd4..ca7b05d4 100644 --- a/src/app/uimodel/uimodel.ts +++ b/src/app/uimodel/uimodel.ts @@ -5,7 +5,7 @@ */ import { ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms'; -import moment from 'moment'; +import { startOfDay, isBefore } from 'date-fns'; import { NzTableSortOrder, NzTableSortFn, NzTableFilterList, NzTableFilterFn } from 'ng-zorro-antd/table'; /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -23,9 +23,9 @@ export const dateRangeValidator: ValidatorFn = (group: AbstractControl): Validat if (!enddt) { return { invalidEndDate: true }; } - const startDate: moment.Moment = moment(strdt).startOf('day'); - const endDate: moment.Moment = moment(enddt).startOf('day'); - if (!endDate.isSameOrAfter(startDate)) { + const startDate: Date = startOfDay(strdt); + const endDate: Date = startOfDay(enddt); + if (isBefore(endDate, startDate)) { return { invalidDateRange: true }; } diff --git a/src/testing/fake-data-helper.ts b/src/testing/fake-data-helper.ts index f7ef13ec..b9dffd26 100644 --- a/src/testing/fake-data-helper.ts +++ b/src/testing/fake-data-helper.ts @@ -40,7 +40,7 @@ import { FinanceAssetBuyinDocumentAPI, AccountExtraAsset, FinanceAssetSoldoutDocumentAPI, - momentDateFormat, + dateFormat, financeAccountCategoryAsset, FinanceAssetValChgDocumentAPI, financeAccountCategoryBorrowFrom, @@ -59,7 +59,15 @@ import { PersonRole, OrganizationType, } from '../app/model'; -import moment from 'moment'; +import { + addMonths, + addYears, + subMonths, + subYears, + startOfDay, + format, + parse, +} from 'date-fns'; export class FakeDataHelper { /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ @@ -996,8 +1004,8 @@ export class FakeDataHelper { brwInfo.RepayMethod = RepaymentMethodEnum.EqualPrincipal; brwInfo.TotalMonths = 12; brwInfo.annualRate = 0.0435; - brwInfo.startDate = moment().subtract(1, 'M').startOf('day'); - brwInfo.endDate = brwInfo.startDate.add(1, 'y'); + brwInfo.startDate = startOfDay(subMonths(new Date(), 1)); + brwInfo.endDate = addYears(brwInfo.startDate, 1); brwInfo.loanTmpDocs = []; for (let i = 0; i < 12; i++) { const tmpdoc: TemplateDocLoan = new TemplateDocLoan(); @@ -1006,7 +1014,7 @@ export class FakeDataHelper { tmpdoc.InterestAmount = 362.5; tmpdoc.Desp = `test${i + 1}`; tmpdoc.TranType = 28; - tmpdoc.TranDate = brwInfo.startDate.add(i + 1, 'M'); + tmpdoc.TranDate = addMonths(brwInfo.startDate, i + 1); tmpdoc.ControlCenterId = 1; tmpdoc.AccountId = 22; brwInfo.loanTmpDocs.push(tmpdoc); @@ -1025,8 +1033,8 @@ export class FakeDataHelper { lendto.RepayMethod = RepaymentMethodEnum.EqualPrincipal; lendto.TotalMonths = 12; lendto.annualRate = 0.0435; - lendto.startDate = moment().subtract(1, 'M').startOf('day'); - lendto.endDate = brwInfo.startDate.add(1, 'y'); + lendto.startDate = startOfDay(subMonths(new Date(), 1)); + lendto.endDate = addYears(lendto.startDate, 1); for (let i = 0; i < 5; i++) { const tmpdoc: TemplateDocLoan = new TemplateDocLoan(); tmpdoc.DocId = i + 1; @@ -1034,7 +1042,7 @@ export class FakeDataHelper { tmpdoc.InterestAmount = 362.5; tmpdoc.Desp = `test${i + 1}`; tmpdoc.TranType = 28; - tmpdoc.TranDate = lendto.startDate.add(i + 1, 'M'); + tmpdoc.TranDate = addMonths(lendto.startDate, i + 1); tmpdoc.ControlCenterId = 1; tmpdoc.AccountId = 23; lendto.loanTmpDocs.push(tmpdoc); @@ -1057,7 +1065,7 @@ export class FakeDataHelper { } item.DocId = i + 1; item.TranType = 2; - item.TranDate = moment().add(i + 1, 'M'); + item.TranDate = addMonths(new Date(), i + 1); item.TranAmount = 20; item.Desp = `item ${i + 1}`; item.AccountId = 24; @@ -1277,7 +1285,8 @@ export class FakeDataHelper { ctgy = new Order(); ctgy.Id = i + 1; ctgy.HID = this._chosedHome ? this._chosedHome.ID : 0; - // ctgy.ValidFrom = + ctgy.ValidFrom = subYears(new Date(), 1); + ctgy.ValidTo = addYears(new Date(), 1); ctgy.Name = `Order ${i + 1}`; // S. rules if (i === 0) { @@ -1311,8 +1320,8 @@ export class FakeDataHelper { obj = new Plan(); obj.ID = i + 1; obj.HID = this._chosedHome ? this._chosedHome.ID : 0; - obj.StartDate = moment(); - obj.TargetDate = moment().add(1, 'y'); + obj.StartDate = new Date(); + obj.TargetDate = addYears(new Date(), 1); obj.TargetBalance = 500; obj.TranCurrency = this._chosedHome ? this._chosedHome.BaseCurrency : ''; obj.Description = `Desp ${i + 1}`; @@ -1333,7 +1342,7 @@ export class FakeDataHelper { this._finADPDocumentForCreate.DocType = financeDocTypeAdvancePayment; this._finADPDocumentForCreate.Desp = 'Test'; this._finADPDocumentForCreate.TranCurr = 'CNY'; - this._finADPDocumentForCreate.TranDate = moment(); + this._finADPDocumentForCreate.TranDate = new Date(); const ditem: DocumentItem = new DocumentItem(); ditem.ItemId = 1; @@ -1355,7 +1364,7 @@ export class FakeDataHelper { } item.DocId = i + 1; item.TranType = 2; - item.TranDate = moment().add(i + 1, 'M'); + item.TranDate = addMonths(new Date(), i + 1); item.TranAmount = 20; item.Desp = `item ${i + 1}`; item.AccountId = 24; @@ -1365,7 +1374,7 @@ export class FakeDataHelper { public buildFinAssetBuyInDocumentForCreate(): FinanceAssetBuyinDocumentAPI { const apidetail: FinanceAssetBuyinDocumentAPI = new FinanceAssetBuyinDocumentAPI(); apidetail.HID = this._chosedHome.ID; - apidetail.TranDate = moment().format(momentDateFormat); + apidetail.TranDate = format(new Date(), dateFormat); apidetail.TranCurr = this._chosedHome.BaseCurrency; apidetail.TranAmount = 100; apidetail.Desp = 'test'; @@ -1382,7 +1391,7 @@ export class FakeDataHelper { public buildFinAssetSoldoutDocumentForCreate(): FinanceAssetSoldoutDocumentAPI { const detail: FinanceAssetSoldoutDocumentAPI = new FinanceAssetSoldoutDocumentAPI(); detail.HID = this._chosedHome.ID; - detail.TranDate = moment().format(momentDateFormat); + detail.TranDate = format(new Date(), dateFormat); detail.TranCurr = this._chosedHome.BaseCurrency; detail.TranAmount = 20; detail.Desp = 'test'; @@ -1394,7 +1403,7 @@ export class FakeDataHelper { public buildFinAssetValueChangeDocumentForCreate(): FinanceAssetValChgDocumentAPI { const detailObject: FinanceAssetValChgDocumentAPI = new FinanceAssetValChgDocumentAPI(); detailObject.HID = this._chosedHome.ID; - detailObject.TranDate = moment().format(momentDateFormat); + detailObject.TranDate = format(new Date(), dateFormat); detailObject.TranCurr = this._chosedHome.BaseCurrency; detailObject.Desp = 'test'; detailObject.AssetAccountID = 21; @@ -1412,7 +1421,7 @@ export class FakeDataHelper { doc.DocType = financeDocTypeNormal; doc.Desp = 'Test'; doc.TranCurr = this.chosedHome ? this.chosedHome.BaseCurrency : 'CNY'; - doc.TranDate = moment(); + doc.TranDate = new Date(); const ditem: DocumentItem = new DocumentItem(); ditem.ItemId = 1;